diff --git a/install-headless.txt b/INSTALL-headless.txt similarity index 55% rename from install-headless.txt rename to INSTALL-headless.txt index 6def73d54..d4b066d73 100644 --- a/install-headless.txt +++ b/INSTALL-headless.txt @@ -1,13 +1,17 @@ -$Id: install-headless.txt,v 1.5 2005/09/29 14:19:23 jrandom Exp $ Headless I2P installation instructions -1) tar xjf i2p.tar.bz2 (you've already done this) -2) cd i2p ; vi install-headless.txt (you're doing this now) -3) sh postinstall.sh (this launches the router) -4) lynx http://localhost:7657/index.jsp (configure the router) +1) java -jar i2pinstall.exe -console (you've already done this) -If you're having trouble, swing by http://forum.i2p.net/, check the -website at http://www.i2p.net/, or get on irc://irc.freenode.net/#i2p +This will run the installer in text mode, including running the postinstall.sh +script, which will start the router and launch a browser. + +If you do not have an X server running, the browser launch will fail, and +you may use: + lynx http://localhost:7657/index.jsp +to configure the router. + +If you're having trouble, swing by http://forum.i2p2.de/, check the +website at http://www.i2p2.de/, or get on irc://irc.freenode.net/#i2p To run I2P explicitly: (*nix): sh i2prouter start diff --git a/install.txt b/INSTALL.txt similarity index 56% rename from install.txt rename to INSTALL.txt index 22f631bfe..15a962df2 100644 --- a/install.txt +++ b/INSTALL.txt @@ -6,16 +6,20 @@ and package up the appropriate installer by running: ant pkg This will produce a few key files: -* i2p.tar.bz2: the headless installation -* install.jar: the GUI installer -* i2pupdate.zip: the update package +* install.jar: the GUI and console installer +* i2pinstall.exe: the GUI and console installer wrapped for cross-platform execution +* i2pupdate.zip: the update package -From there, you can follow the headless installation instructions -with the headless installer, run the GUI installer, or deploy -the update into an existing installation. +From there, you can run the headless (console mode) installer: + java -jar i2pinstall.exe -console + +Or run the GUI installer: + java -jar i2pinstall.exe + +Or move the update file into an existing installation directory and restart. You will need to have ant installed from http://ant.apache.org/ -(1.5 or newer) +(1.7.0 or newer) Supported JVMs: Windows: Latest available from http://java.sun.com/ (1.5+ supported) diff --git a/LICENSE.txt b/LICENSE.txt index 00e231a78..c8667b006 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -72,28 +72,59 @@ Public domain except as listed below: From freenet See licenses/LICENSE-GPLv2.txt - UPnP subsystem: + UPnP subsystem 1.7: Copyright (C) 2003-2006 Satoshi Konno See licenses/LICENSE-UPnP.txt XMLPull library used by UPnP: See licenses/LICENSE-Apache2.0.txt + GeoIP data free to use, courtesy http://ip-to-country.webhosting.info/ Installer: - Launch4j: + Launch4j 2.0.RC3: Copyright (C) 2005 Grzegorz Kowal See licenses/LICENSE-GPLv2.txt + The following projects are used by Launch4j... + MinGW binutils (http://www.mingw.org/) - Izpack: - See licenses/LICENSE-Apache1.1.txt + Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/) + + Commons Logging (http://jakarta.apache.org/commons/logging/) + See licenses/LICENSE-Apache1.1.txt + See licenses/NOTICE-Commons-Logging.txt + + XStream (http://xstream.codehaus.org/) + Copyright (c) 2003-2004, Joe Walnes + See licenses/LICENSE-XStream.txt + + JGoodies Forms (http://www.jgoodies.com/freeware/forms/) + Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All rights reserved. + See licenses/LICENSE-JGoodies-Forms.txt + + JGoodies Looks (http://www.jgoodies.com/freeware/looks/) + Copyright (c) 2003 JGoodies Karsten Lentzsch. All rights reserved. + See licenses/LICENSE-JGoodies-Looks.txt + + Foxtrot (http://foxtrot.sourceforge.net/) + Copyright (c) 2002, Simone Bordet & Marco Cravero. All rights reserved. + See licenses/LICENSE-Foxtrot.txt + + Nuvola Icon Theme (http://www.icon-king.com) + See licenses/LICENSE-LGPLv2.1.txt + + Forms were created using Abeille Forms Designer (https://abeille.dev.java.net/) + + Izpack 4.3.0: + Copyright (c) 2001-2008 Julien Ponge + See licenses/LICENSE-Apache2.0.txt -Wrapper: -Copyright (c) 1999, 2004 Tanuki Software -See licenses/LICENSE-Wrapper.txt +Wrapper 3.1.1: + Copyright (c) 1999, 2004 Tanuki Software + See licenses/LICENSE-Wrapper.txt @@ -123,11 +154,14 @@ Applications: See licenses/LICENSE-I2PTunnel.txt See licenses/LICENSE-GPLv2.txt + I2PTunnel UDP and Streamr: + By welterde. + See licenses/LICENSE-GPLv2.txt + Jetty 5.1.12: Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. See licenses/LICENSE-Apache1.1.txt See licenses/LICENSE-Apache2.0.txt - See licenses/NOTICE-Ant.txt See licenses/NOTICE-Commons-Logging.txt JRobin 1.4.0: @@ -143,6 +177,11 @@ Applications: Router console: Public domain. + Flag icons: public domain, courtesy mjames@gmail.com http://www.famfamfam.com/ + + GeoIP Data: + Copyright (c) 2003 Direct Information Pvt. Ltd. All Rights Reserved. + See licenses/LICENSE-GeoIP.txt SAM: Public domain. @@ -174,6 +213,10 @@ distributions. See the source package for the additional license information. Atalk: Public domain + Desktopgui + Copyright (c) Mathias De Maré + See apps/desktopgui/LICENSE + SAM C Library: Copyright (c) 2004, Matthew P. Cashdollar See apps/sam/c/doc/license.txt diff --git a/README.txt b/README.txt index 49a62ee5b..3aa2141bb 100644 --- a/README.txt +++ b/README.txt @@ -25,7 +25,5 @@ Need help? http://forum.i2p2.de/ Licenses: - http://www.i2p2.de/licenses.html - Also http://localhost:7657/help.jsp - Also see licenses for the individual bundled apps in apps/* + See LICENSE.txt diff --git a/Slackware/i2p/doinst.sh b/Slackware/i2p/doinst.sh index 91dd09721..0f5c9f335 100644 --- a/Slackware/i2p/doinst.sh +++ b/Slackware/i2p/doinst.sh @@ -49,16 +49,21 @@ echo echo "FINISHING I2P INSTALLATION. PLEASE WAIT." cd $INST_DIR -sh postinstall.sh || ( - echo "ERROR: failed execution of postinstall.sh. Please" - echo "cd into i2p installation directory and run " - echo "postinstall.sh manually with ./postinstall.sh" - exit 1 -) -sleep 10 -sh i2prouter stop || exit 1 + +OS_ARCH=`uname -m` +X86_64=`echo "$OS_ARCH" | grep x86_64` +if [ "X$X86_64" = "X" ]; then + wrapperpath="./lib/wrapper/linux" +else + wrapperpath="./lib/wrapper/linux64" +fi +cp $wrapperpath/libwrapper.so ./lib/ +cp $wrapperpath/wrapper.jar ./lib/ +cp $wrapperpath/i2psvc . +rm -rf ./lib/wrapper +chmod 744 ./i2psvc echo echo "Installation finished." diff --git a/Slackware/i2p/i2p.SlackBuild b/Slackware/i2p/i2p.SlackBuild index 421033356..f7ced54bf 100755 --- a/Slackware/i2p/i2p.SlackBuild +++ b/Slackware/i2p/i2p.SlackBuild @@ -18,7 +18,7 @@ BUILD=1sim # put here installation dir, without first and last / -# es: usr/local +# eg: usr/local INSTALL_DIR=opt NAME=i2p ARCH=noarch @@ -64,8 +64,8 @@ mkdir -p $PKG cd $CWD/../../ ant distclean -ant dist - +#ant dist +ant tarball tar xjvf i2p.tar.bz2 -C $TMP @@ -76,6 +76,34 @@ mkdir -p $PKG/$INSTALL_DIR/ cp -a ../i2p $PKG/$INSTALL_DIR/ mkdir -p $PKG/install + +############################################################################# +# Preconfigureation to make package smaller +############################################################################# +cd $PKG/$INSTALL_DIR/i2p + +# wrapper.config $INSTALL_PATH and $SYSTEM_java_io_tmpdir +sed "s|\$INSTALL_PATH|$INSTALL_DIR/i2p|g" wrapper.config > a +sed "s|\$SYSTEM_java_io_tmpdir|/var/tmp|g" a > wrapper.config +# eepget %INSTALL_PATH +sed "s|\$INSTALL_PATH|$INSTALL_DIR/i2p|g" eepget > a +rm eepget +mv a eepget +# runplain.sh %INSTALL_PATH and %SYSTEM_java_io_tmpdir +sed "s|%INSTALL_PATH|$INSTALL_DIR/i2p|g" runplain.sh > a +sed "s|%SYSTEM_java_io_tmpdir|/var/tmp|g" a > runplain.sh +# i2prouter %INSTALL_PATH and %SYSTEM_java_io_tmpdir +sed "s|%INSTALL_PATH|$INSTALL_DIR/i2p|g" i2prouter > a +sed "s|%SYSTEM_java_io_tmpdir|/var/tmp|g" a > i2prouter + +chmod 744 ./i2prouter +chmod 744 ./osid +chmod 744 ./runplain.sh +chmod 744 ./eepget +chmod 744 ./scripts/i2pbench.sh +chmod 744 ./scripts/i2ptest.sh +rm -Rf ./lib/*.dll ./*.bat ./*.exe ./installer ./icons ./a postinstall.sh + mv $PKG/$INSTALL_DIR/i2p/*.config $PKG/install mv $PKG/$INSTALL_DIR/i2p/blocklist.txt $PKG/$INSTALL_DIR/i2p/blocklist.txt.new mv $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml.new @@ -83,6 +111,7 @@ mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/index.html $PKG/$INSTALL_DIR/i2p/eepsit mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico.new sed "s|directory|/$INSTALL_DIR/i2p/|g" $CWD/doinst.sh > $PKG/install/doinst.sh cat $CWD/slack-desc > $PKG/install/slack-desc + cd $PKG requiredbuilder -v -y -s $CWD $PKG makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 000000000..de77168d0 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + diff --git a/android/README.txt b/android/README.txt new file mode 100644 index 000000000..e8886a579 --- /dev/null +++ b/android/README.txt @@ -0,0 +1,25 @@ +These instructions are for the 1.5 SDK. +The build file is not compatible with the 1.1 SDK any more. + +#Unzip the android SDK in ../../ +#So then the android tools will be in ../../android-sdk-linux_x86-1.5_r2/tools/ + +#then build the android apk file: +ant debug + +# Create the android 1.5 virtual device +# (don't make a custom hardware profile) +../../android-sdk-linux_x86-1.5_r2/tools/android create avd --name i2p --target 2 + +#then run the emulator: +../../android-sdk-linux_x86-1.5_r2/tools/emulator -avd i2p & + +#then wait a couple minutes until the emulator is up +#then install the I2P app +ant install + +#then run the debugger +../../android-sdk-linux_x86-1.5_r2/tools/ddms & + +#to rebuild and reinstall to emulator: +ant reinstall diff --git a/android/build.xml b/android/build.xml new file mode 100644 index 000000000..2b8664dca --- /dev/null +++ b/android/build.xml @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Creating output directories if needed... + + + + + + + + + + Generating R.java / Manifest.java from the resources... + + + + + + + + + + + + + + + + + Compiling aidl files into Java classes... + + + + + + + + + + + + + + + + + + + + + + + + + + + Converting compiled files and external libraries into ${out-folder}/${dex-file}... + + + + + + + + + + + + + Packaging resources + + + + + + + + + + + + + + + + + + + + + + All generated packages need to be signed with jarsigner before they are published. + + + + + Installing ${out-debug-package} onto default emulator... + + + + + + + + Installing ${out-debug-package} onto default emulator... + + + + + + + + + + Uninstalling ${application-package} from the default emulator... + + + + + + + + + Android Ant Build. Available targets: + help: Displays this help. + debug: Builds the application and sign it with a debug key. + release: Builds the application. The generated apk file must be + signed before it is published. + install: Installs the debug package onto a running emulator or + device. This can only be used if the application has + not yet been installed. + reinstall: Installs the debug package on a running emulator or + device that already has the application. + The signatures must match. + uninstall: uninstall the application from a running emulator or + device. + + diff --git a/android/default.properties b/android/default.properties new file mode 100644 index 000000000..eba5c59ff --- /dev/null +++ b/android/default.properties @@ -0,0 +1,11 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-2 diff --git a/android/res/layout/main.xml b/android/res/layout/main.xml new file mode 100644 index 000000000..d76411527 --- /dev/null +++ b/android/res/layout/main.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/android/res/raw/logger_config b/android/res/raw/logger_config new file mode 100644 index 000000000..2aeabb9f6 --- /dev/null +++ b/android/res/raw/logger_config @@ -0,0 +1,3 @@ +logger.defaultLevel=INFO +logger.record.net.i2p.router.transport.FIFOBandwidthRefiller=ERROR +logger.record.net.i2p.stat.Rate=ERROR diff --git a/android/res/raw/router_config b/android/res/raw/router_config new file mode 100644 index 000000000..cf63ed56a --- /dev/null +++ b/android/res/raw/router_config @@ -0,0 +1,16 @@ +# initial router.config +# temp directory +i2p.dir.temp=/data/data/net.i2p.router/files/tmp +i2p.dir.pid=/data/data/net.i2p.router/files/tmp +# save memory +router.prng.buffers=2 +router.decayingBloomFilterM=20 +stat.full=false +i2np.udp.maxConnections=30 +# no I2CP +i2p.dummyClientFacade=true +# for now +i2np.ntcp.enable=false +# not on android +i2np.upnp.enable=false +routerconsole.geoip.enable=false diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml new file mode 100644 index 000000000..983a304b9 --- /dev/null +++ b/android/res/values/strings.xml @@ -0,0 +1,4 @@ + + + I2PAndroid + diff --git a/android/src/net/i2p/router/I2PAndroid.java b/android/src/net/i2p/router/I2PAndroid.java new file mode 100644 index 000000000..ed626639c --- /dev/null +++ b/android/src/net/i2p/router/I2PAndroid.java @@ -0,0 +1,142 @@ +package net.i2p.router; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; +import android.os.Bundle; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.IOException; +import java.util.List; + +import net.i2p.router.Router; +import net.i2p.router.RouterLaunch; +// import net.i2p.util.NativeBigInteger; + +public class I2PAndroid extends Activity +{ + static Context _context; + private static final String DIR = "/data/data/net.i2p.router/files"; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + _context = this; // Activity extends Context + debugStuff(); + initialize(); + // 300ms per run + // 5x slower than java on my server and 50x slower than native on my server + // NativeBigInteger.main(null); + } + + public void onRestart() + { + System.err.println("onRestart called"); + super.onRestart(); + } + + public void onStart() + { + System.err.println("onStart called"); + super.onStart(); + RouterLaunch.main(null); + System.err.println("Router.main finished"); + } + + public void onResume() + { + System.err.println("onResume called"); + super.onResume(); + } + + public void onPause() + { + System.err.println("onPause called"); + super.onPause(); + } + + public void onStop() + { + System.err.println("onStop called"); + super.onStop(); + + // from routerconsole ContextHelper + List contexts = RouterContext.listContexts(); + if ( (contexts == null) || (contexts.size() <= 0) ) + throw new IllegalStateException("No contexts. This is usually because the router is either starting up or shutting down."); + RouterContext ctx = (RouterContext)contexts.get(0); + + // shutdown() doesn't return so use shutdownGracefully() + ctx.router().shutdownGracefully(Router.EXIT_HARD); + System.err.println("shutdown complete"); + } + + public void onDestroy() + { + System.err.println("onDestroy called"); + super.onDestroy(); + } + + public static Context getContext() { + return _context; + } + + private void debugStuff() { + System.err.println("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir")); + System.err.println("java.vendor" + ": " + System.getProperty("java.vendor")); + System.err.println("java.version" + ": " + System.getProperty("java.version")); + System.err.println("os.arch" + ": " + System.getProperty("os.arch")); + System.err.println("os.name" + ": " + System.getProperty("os.name")); + System.err.println("os.version" + ": " + System.getProperty("os.version")); + System.err.println("user.dir" + ": " + System.getProperty("user.dir")); + System.err.println("user.home" + ": " + System.getProperty("user.home")); + System.err.println("user.name" + ": " + System.getProperty("user.name")); + } + + private void initialize() { + // Until we can edit the router.config on the device, + // copy it from the resource every time. + // File f = new I2PFile("router.config"); + // if (!f.exists()) { + copyResourceToFile(R.raw.router_config, "router.config"); + copyResourceToFile(R.raw.logger_config, "logger.config"); + copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt"); + // } + + // Set up the locations so Router and WorkingDir can find them + System.setProperty("i2p.dir.base", DIR); + System.setProperty("i2p.dir.config", DIR); + System.setProperty("wrapper.logfile", DIR + "/wrapper.log"); + } + + private void copyResourceToFile(int resID, String f) { + InputStream in = null; + FileOutputStream out = null; + + System.err.println("Creating file " + f + " from resource"); + byte buf[] = new byte[4096]; + try { + // Context methods + in = getResources().openRawResource(resID); + out = openFileOutput(f, 0); + + int read = 0; + while ( (read = in.read(buf)) != -1) + out.write(buf, 0, read); + + } catch (IOException ioe) { + } catch (Resources.NotFoundException nfe) { + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + if (out != null) try { out.close(); } catch (IOException ioe) {} + } + } + +} diff --git a/android/src/net/i2p/util/LogWriter.java b/android/src/net/i2p/util/LogWriter.java new file mode 100644 index 000000000..0babfab37 --- /dev/null +++ b/android/src/net/i2p/util/LogWriter.java @@ -0,0 +1,163 @@ +package net.i2p.util; + +/* + * public domain + * + */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; + +/** + * bridge to android logging + * + * @author zzz + */ +class LogWriter implements Runnable { + private final static long CONFIG_READ_ITERVAL = 10 * 1000; + private long _lastReadConfig = 0; + private long _numBytesInCurrentFile = 0; + private OutputStream _currentOut; // = System.out + private int _rotationNum = -1; + private String _logFilenamePattern; + private File _currentFile; + private LogManager _manager; + + private boolean _write; + + private LogWriter() { // nop + } + + public LogWriter(LogManager manager) { + _manager = manager; + } + + public void stopWriting() { + _write = false; + } + + public void run() { + _write = true; + try { + while (_write) { + flushRecords(); + rereadConfig(); + } + System.err.println("Done writing"); + } catch (Exception e) { + System.err.println("Error writing the logs: " + e.getMessage()); + e.printStackTrace(); + } + } + + public void flushRecords() { flushRecords(true); } + public void flushRecords(boolean shouldWait) { + try { + List records = _manager._removeAll(); + if (records == null) return; + for (int i = 0; i < records.size(); i++) { + LogRecord rec = (LogRecord) records.get(i); + writeRecord(rec); + } + } catch (Throwable t) { + t.printStackTrace(); + } finally { + if (shouldWait) { + try { + synchronized (this) { + this.wait(10*1000); + } + } catch (InterruptedException ie) { // nop + } + } + } + } + + public String currentFile() { + return _currentFile != null ? _currentFile.getAbsolutePath() : "uninitialized"; + } + + private void rereadConfig() { + long now = Clock.getInstance().now(); + if (now - _lastReadConfig > CONFIG_READ_ITERVAL) { + _manager.rereadConfig(); + _lastReadConfig = now; + } + } + + private void writeRecord(LogRecord rec) { + if (rec.getThrowable() == null) + log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage()); + else + log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable()); + } + + public void log(int priority, Class src, String name, String threadName, String msg) { + if (src != null) { + String tag = src.getName(); + int dot = tag.lastIndexOf("."); + if (dot >= 0) + tag = tag.substring(dot + 1); + android.util.Log.println(toAndroidLevel(priority), + tag, + '[' + threadName + "] " + msg); + } else if (name != null) + android.util.Log.println(toAndroidLevel(priority), + name, + '[' + threadName + "] " + msg); + else + android.util.Log.println(toAndroidLevel(priority), + threadName, msg); + } + + public void log(int priority, Class src, String name, String threadName, String msg, Throwable t) { + if (src != null) { + String tag = src.getName(); + int dot = tag.lastIndexOf("."); + if (dot >= 0) + tag = tag.substring(dot + 1); + android.util.Log.println(toAndroidLevel(priority), + tag, + '[' + threadName + "] " + msg + + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t)); + } else if (name != null) + android.util.Log.println(toAndroidLevel(priority), + name, + '[' + threadName + "] " + msg + + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t)); + else + android.util.Log.println(toAndroidLevel(priority), + threadName, + msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t)); + } + + private static int toAndroidLevel(int level) { + switch (level) { + case Log.DEBUG: + return android.util.Log.DEBUG; + case Log.INFO: + return android.util.Log.INFO; + case Log.WARN: + return android.util.Log.WARN; + case Log.ERROR: + case Log.CRIT: + default: + return android.util.Log.ERROR; + } + } + + private static final String replace(String pattern, int num) { + char c[] = pattern.toCharArray(); + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < c.length; i++) { + if ( (c[i] != '#') && (c[i] != '@') ) + buf.append(c[i]); + else + buf.append(num); + } + return buf.toString(); + } +} diff --git a/apps/BOB/bob.config b/apps/BOB/bob.config index f9c28d382..810d65b29 100644 --- a/apps/BOB/bob.config +++ b/apps/BOB/bob.config @@ -7,7 +7,7 @@ i2cp.tcp.port=7654 BOB.host=localhost inbound.lengthVariance=0 i2cp.messageReliability=BestEffort -BOB.port=45067 +BOB.port=45678 outbound.length=1 inbound.length=1 outbound.lengthVariance=0 diff --git a/apps/BOB/nbproject/build-impl.xml b/apps/BOB/nbproject/build-impl.xml index 9feea8e03..d8ed4de11 100644 --- a/apps/BOB/nbproject/build-impl.xml +++ b/apps/BOB/nbproject/build-impl.xml @@ -152,7 +152,7 @@ is divided into following sections: - + diff --git a/apps/BOB/nbproject/genfiles.properties b/apps/BOB/nbproject/genfiles.properties index dfc3734b8..ca344b0d3 100644 --- a/apps/BOB/nbproject/genfiles.properties +++ b/apps/BOB/nbproject/genfiles.properties @@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=958a1d3e # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=209349b6 -nbproject/build-impl.xml.script.CRC32=75fac64c -nbproject/build-impl.xml.stylesheet.CRC32=e55b27f5 +nbproject/build-impl.xml.script.CRC32=c51e188e +nbproject/build-impl.xml.stylesheet.CRC32=65b8de21 diff --git a/apps/BOB/nbproject/project.properties b/apps/BOB/nbproject/project.properties index 76e318ff0..9eeffd29f 100644 --- a/apps/BOB/nbproject/project.properties +++ b/apps/BOB/nbproject/project.properties @@ -24,43 +24,24 @@ dist.dir=dist dist.jar=${dist.dir}/BOB.jar dist.javadoc.dir=${dist.dir}/javadoc excludes= -file.reference.core.jar=../i2p.i2p/core/dist/core.jar -file.reference.i2p.jar=../../bob/i2p/i2p.i2p/build/i2p.jar -file.reference.i2p.jar-1=../../core/java/build/i2p.jar -file.reference.i2p.jar-2=../i2p.i2p/core/java/build/i2p.jar +file.reference.build-javadoc=../../i2p.i2p/build/javadoc +file.reference.i2p.jar=../../core/java/build/i2p.jar file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar -file.reference.java-src=../i2p.i2p/core/java/src/ -file.reference.jbigi.jar=../../bob/i2p/i2p.i2p/build/jbigi.jar -file.reference.mstreaming.jar=../../bob/i2p/i2p.i2p/build/mstreaming.jar -file.reference.mstreaming.jar-1=../ministreaming/java/build/mstreaming.jar -file.reference.NetBeansProjects-i2p.i2p=../i2p.i2p/ -file.reference.streaming.jar=../../bob/i2p/i2p.i2p/build/streaming.jar -file.reference.streaming.jar-1=../streaming/java/build/streaming.jar -file.reference.wrapper-freebsd=../../installer/lib/wrapper/freebsd/ -file.reference.wrapper-linux=../../installer/lib/wrapper/linux/ -file.reference.wrapper-linux64=../../installer/lib/wrapper/linux64/ -file.reference.wrapper-macosx=../../installer/lib/wrapper/macosx/ -file.reference.wrapper-solaris=../../installer/lib/wrapper/solaris/ -file.reference.wrapper-win32=../../installer/lib/wrapper/win32/ +file.reference.jbigi.jar=../../installer/lib/jbigi/jbigi.jar +file.reference.mstreaming.jar=../ministreaming/java/build/mstreaming.jar +file.reference.router.jar=../../router/java/build/router.jar +file.reference.streaming.jar=../streaming/java/build/streaming.jar file.reference.wrapper.jar=../../installer/lib/wrapper/linux/wrapper.jar -file.reference.wrapper.jar-1=../../installer/lib/wrapper/freebsd/wrapper.jar -file.reference.wrapper.jar-2=../../installer/lib/wrapper/linux64/wrapper.jar -file.reference.wrapper.jar-3=../../installer/lib/wrapper/macosx/wrapper.jar -file.reference.wrapper.jar-4=../../installer/lib/wrapper/solaris/wrapper.jar -file.reference.wrapper.jar-5=../../installer/lib/wrapper/win32/wrapper.jar includes=** jar.compress=false javac.classpath=\ - ${file.reference.i2p.jar-1}:\ + ${file.reference.router.jar}:\ ${file.reference.i2ptunnel.jar}:\ - ${file.reference.mstreaming.jar-1}:\ - ${file.reference.streaming.jar-1}:\ - ${file.reference.wrapper.jar-1}:\ + ${file.reference.mstreaming.jar}:\ + ${file.reference.streaming.jar}:\ ${file.reference.wrapper.jar}:\ - ${file.reference.wrapper.jar-2}:\ - ${file.reference.wrapper.jar-3}:\ - ${file.reference.wrapper.jar-4}:\ - ${file.reference.wrapper.jar-5} + ${file.reference.i2p.jar}:\ + ${file.reference.router.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false diff --git a/apps/BOB/src/net/i2p/BOB/BOB.java b/apps/BOB/src/net/i2p/BOB/BOB.java index 59b46b8d7..ee3f5937a 100644 --- a/apps/BOB/src/net/i2p/BOB/BOB.java +++ b/apps/BOB/src/net/i2p/BOB/BOB.java @@ -23,17 +23,26 @@ */ package net.i2p.BOB; +import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.net.ConnectException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; +import java.net.SocketTimeoutException; import java.util.Properties; +import java.util.concurrent.atomic.AtomicBoolean; + +import net.i2p.I2PAppContext; import net.i2p.client.I2PClient; import net.i2p.client.streaming.RetransmissionTimer; import net.i2p.util.Log; +import net.i2p.util.SimpleScheduler; +import net.i2p.util.SimpleTimer2; + /** * * ################################################################################
@@ -111,10 +120,15 @@ public class BOB { public final static String PROP_CONFIG_LOCATION = "BOB.config"; public final static String PROP_BOB_PORT = "BOB.port"; public final static String PROP_BOB_HOST = "BOB.host"; - private static int maxConnections = 0; private static NamedDB database; private static Properties props = new Properties(); - + private static AtomicBoolean spin = new AtomicBoolean(true); + private static final String P_RUNNING = "RUNNING"; + private static final String P_STARTING = "STARTING"; + private static final String P_STOPPING = "STOPPING"; + private static AtomicBoolean lock = new AtomicBoolean(false); + // no longer used. + // private static int maxConnections = 0; /** * Log a warning @@ -146,6 +160,13 @@ public class BOB { _log.error(arg); } + /** + * Stop BOB gracefully + */ + public static void stop() { + spin.set(false); + } + /** * Listen for incoming connections and handle them * @@ -153,86 +174,195 @@ public class BOB { */ public static void main(String[] args) { database = new NamedDB(); + ServerSocket listener = null; int i = 0; boolean save = false; // Set up all defaults to be passed forward to other threads. // Re-reading the config file in each thread is pretty damn stupid. - // I2PClient client = I2PClientFactory.createClient(); String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config"); - // This is here just to ensure there is no interference with our threadgroups. RetransmissionTimer Y = RetransmissionTimer.getInstance(); + SimpleScheduler Y1 = SimpleScheduler.getInstance(); + SimpleTimer2 Y2 = SimpleTimer2.getInstance(); i = Y.hashCode(); - { - try { - FileInputStream fi = new FileInputStream(configLocation); - props.load(fi); - fi.close(); - } catch(FileNotFoundException fnfe) { - warn("Unable to load up the BOB config file " + configLocation + ", Using defaults."); - warn(fnfe.toString()); - save = true; - } catch(IOException ioe) { - warn("IOException on BOB config file " + configLocation + ", using defaults."); - warn(ioe.toString()); - } - } - // Global router and client API configurations that are missing are set to defaults here. - if(!props.containsKey(I2PClient.PROP_TCP_HOST)) { - props.setProperty(I2PClient.PROP_TCP_HOST, "localhost"); - } - if(!props.containsKey(I2PClient.PROP_TCP_PORT)) { - props.setProperty(I2PClient.PROP_TCP_PORT, "7654"); - } - if(!props.containsKey(I2PClient.PROP_RELIABILITY)) { - props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT); - } - if(!props.containsKey(PROP_BOB_PORT)) { - props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B - } - if(!props.containsKey("inbound.length")) { - props.setProperty("inbound.length", "1"); - } - if(!props.containsKey("outbound.length")) { - props.setProperty("outbound.length", "1"); - } - if(!props.containsKey("inbound.lengthVariance")) { - props.setProperty("inbound.lengthVariance", "0"); - } - if(!props.containsKey("outbound.lengthVariance")) { - props.setProperty("outbound.lengthVariance", "0"); - } - if(!props.containsKey(PROP_BOB_HOST)) { - props.setProperty(PROP_BOB_HOST, "localhost"); - } - if(save) { - try { - warn("Writing new defaults file " + configLocation); - FileOutputStream fo = new FileOutputStream(configLocation); - props.store(fo, configLocation); - fo.close(); - } catch(IOException ioe) { - error("IOException on BOB config file " + configLocation + ", " + ioe); - } - } - - i = 0; + i = Y1.hashCode(); + i = Y2.hashCode(); try { - info("BOB is now running."); - ServerSocket listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST))); - Socket server; - - while((i++ < maxConnections) || (maxConnections == 0)) { - //DoCMDS connection; - - server = listener.accept(); - DoCMDS conn_c = new DoCMDS(server, props, database, _log); - Thread t = new Thread(conn_c); - t.start(); + { + File cfg = new File(configLocation); + if (!cfg.isAbsolute()) { + cfg = new File(I2PAppContext.getGlobalContext().getConfigDir(), configLocation); + } + try { + FileInputStream fi = new FileInputStream(cfg); + props.load(fi); + fi.close(); + } catch (FileNotFoundException fnfe) { + warn("Unable to load up the BOB config file " + cfg.getAbsolutePath() + ", Using defaults."); + warn(fnfe.toString()); + save = true; + } catch (IOException ioe) { + warn("IOException on BOB config file " + cfg.getAbsolutePath() + ", using defaults."); + warn(ioe.toString()); + } } - } catch(IOException ioe) { - error("IOException on socket listen: " + ioe); - ioe.printStackTrace(); + // Global router and client API configurations that are missing are set to defaults here. + if (!props.containsKey(I2PClient.PROP_TCP_HOST)) { + props.setProperty(I2PClient.PROP_TCP_HOST, "localhost"); + } + if (!props.containsKey(I2PClient.PROP_TCP_PORT)) { + props.setProperty(I2PClient.PROP_TCP_PORT, "7654"); + } + if (!props.containsKey(I2PClient.PROP_RELIABILITY)) { + props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT); + } + if (!props.containsKey(PROP_BOB_PORT)) { + props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B + } + if (!props.containsKey("inbound.length")) { + props.setProperty("inbound.length", "1"); + } + if (!props.containsKey("outbound.length")) { + props.setProperty("outbound.length", "1"); + } + if (!props.containsKey("inbound.lengthVariance")) { + props.setProperty("inbound.lengthVariance", "0"); + } + if (!props.containsKey("outbound.lengthVariance")) { + props.setProperty("outbound.lengthVariance", "0"); + } + if (!props.containsKey(PROP_BOB_HOST)) { + props.setProperty(PROP_BOB_HOST, "localhost"); + } + if (save) { + File cfg = new File(configLocation); + if (!cfg.isAbsolute()) { + cfg = new File(I2PAppContext.getGlobalContext().getConfigDir(), configLocation); + } + try { + warn("Writing new defaults file " + cfg.getAbsolutePath()); + FileOutputStream fo = new FileOutputStream(cfg); + props.store(fo, cfg.getAbsolutePath()); + fo.close(); + } catch (IOException ioe) { + error("IOException on BOB config file " + cfg.getAbsolutePath() + ", " + ioe); + } + } + + i = 0; + boolean g = false; + try { + info("BOB is now running."); + listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST))); + Socket server = null; + listener.setSoTimeout(500); // .5 sec + while (spin.get()) { + //DoCMDS connection; + + try { + server = listener.accept(); + g = true; + } catch (ConnectException ce) { + g = false; + } catch (SocketTimeoutException ste) { + g = false; + } + + if (g) { + DoCMDS conn_c = new DoCMDS(spin, lock, server, props, database, _log); + Thread t = new Thread(conn_c); + t.setName("BOB.DoCMDS " + i); + t.start(); + i++; + } + } + } catch (IOException ioe) { + error("IOException on socket listen: " + ioe); + ioe.printStackTrace(); + } + } finally { + info("BOB is now shutting down..."); + // Clean up everything. + try { + listener.close(); + } catch (Exception ex) { + // nop + } + // Find all our "BOB.DoCMDS" threads, wait for them to be finished. + // We could order them to stop, but that could cause nasty issues in the locks. + visitAllThreads(); + database.getReadLock(); + int all = database.getcount(); + database.releaseReadLock(); + NamedDB nickinfo; + for (i = 0; i < all; i++) { + database.getReadLock(); + nickinfo = (NamedDB) database.getnext(i); + nickinfo.getReadLock(); + if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) { + nickinfo.releaseReadLock(); + database.releaseReadLock(); + database.getWriteLock(); + nickinfo.getWriteLock(); + nickinfo.add(P_STOPPING, new Boolean(true)); + nickinfo.releaseWriteLock(); + database.releaseWriteLock(); + } else { + nickinfo.releaseReadLock(); + database.releaseReadLock(); + } + } + info("BOB is now stopped."); + + } + } + + /** + * Find the root thread group, + * then find all theads with certain names and wait for them all to be dead. + * + */ + private static void visitAllThreads() { + ThreadGroup root = Thread.currentThread().getThreadGroup().getParent(); + while (root.getParent() != null) { + root = root.getParent(); + } + + // Visit each thread group + waitjoin(root, 0, root.getName()); + } + + private static void waitjoin(ThreadGroup group, int level, String tn) { + // Get threads in `group' + int numThreads = group.activeCount(); + Thread[] threads = new Thread[numThreads * 2]; + numThreads = group.enumerate(threads, false); + // Enumerate each thread in `group' and wait for it to stop if it is one of ours. + for (int i = 0; i < numThreads; i++) { + // Get thread + Thread thread = threads[i]; + if (thread.getName().startsWith("BOB.DoCMDS ")) { + try { + if (thread.isAlive()) { + try { + thread.join(); + } catch (InterruptedException ex) { + } + } + } catch (SecurityException se) { + //nop + } + } + } + + // Get thread subgroups of `group' + int numGroups = group.activeGroupCount(); + ThreadGroup[] groups = new ThreadGroup[numGroups * 2]; + numGroups = group.enumerate(groups, false); + + // Recursively visit each subgroup + for (int i = 0; i < numGroups; i++) { + waitjoin(groups[i], level + 1, groups[i].getName()); } } } diff --git a/apps/BOB/src/net/i2p/BOB/DoCMDS.java b/apps/BOB/src/net/i2p/BOB/DoCMDS.java index 6033e303b..8e4afb143 100644 --- a/apps/BOB/src/net/i2p/BOB/DoCMDS.java +++ b/apps/BOB/src/net/i2p/BOB/DoCMDS.java @@ -31,10 +31,14 @@ import java.io.PrintStream; import java.net.Socket; import java.util.Properties; import java.util.StringTokenizer; +import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.I2PException; import net.i2p.client.I2PClientFactory; import net.i2p.data.Destination; import net.i2p.util.Log; +// needed only for debugging. +// import java.util.logging.Level; +// import java.util.logging.Logger; /** * Simplistic command parser for BOB @@ -46,7 +50,7 @@ public class DoCMDS implements Runnable { // FIX ME // I need a better way to do versioning, but this will do for now. - public static final String BMAJ = "00", BMIN = "00", BREV = "03", BEXT = ""; + public static final String BMAJ = "00", BMIN = "00", BREV = "08", BEXT = ""; public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT; private Socket server; private Properties props; @@ -57,6 +61,8 @@ public class DoCMDS implements Runnable { private boolean dk, ns, ip, op; private NamedDB nickinfo; private Log _log; + private AtomicBoolean LIVE; + private AtomicBoolean lock; /* database strings */ private static final String P_DEST = "DESTINATION"; private static final String P_INHOST = "INHOST"; @@ -94,6 +100,8 @@ public class DoCMDS implements Runnable { private static final String C_status = "status"; private static final String C_stop = "stop"; private static final String C_verify = "verify"; + private static final String C_visit = "visit"; + private static final String C_zap = "zap"; /* all the coomands available, plus description */ private static final String C_ALL[][] = { @@ -119,6 +127,8 @@ public class DoCMDS implements Runnable { {C_status, C_status + " nickname * Display status of a nicknamed tunnel."}, {C_stop, C_stop + " * Stops the current nicknamed tunnel."}, {C_verify, C_verify + " BASE64_key * Verifies BASE64 destination."}, + {C_visit, C_visit + " * Thread dump to wrapper.log."}, + {C_zap, C_zap + " * Shuts down BOB."}, {"", "COMMANDS: " + // this is ugly, but... C_help + " " + C_clear + " " + @@ -141,19 +151,23 @@ public class DoCMDS implements Runnable { C_start + " " + C_status + " " + C_stop + " " + - C_verify + C_verify + " " + + C_visit + " " + + C_zap }, {" ", " "} // end of list }; /** - * + * @param LIVE * @param server * @param props * @param database * @param _log */ - DoCMDS(Socket server, Properties props, NamedDB database, Log _log) { + DoCMDS(AtomicBoolean LIVE, AtomicBoolean lock, Socket server, Properties props, NamedDB database, Log _log) { + this.lock = lock; + this.LIVE = LIVE; this.server = server; this.props = new Properties(); this.database = database; @@ -393,445 +407,545 @@ public class DoCMDS implements Runnable { */ public void run() { dk = ns = ip = op = false; - try { - // Get input from the client - BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream())); - PrintStream out = new PrintStream(server.getOutputStream()); - quit: - { - die: + try { + // Get input from the client + BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream())); + PrintStream out = new PrintStream(server.getOutputStream()); + quit: { - prikey = new ByteArrayOutputStream(); - out.println("BOB " + BOBversion); - out.println("OK"); - while ((line = in.readLine()) != null) { - StringTokenizer token = new StringTokenizer(line, " "); // use a space as a delimiter - String Command = ""; - String Arg = ""; - NamedDB info; + die: + { + prikey = new ByteArrayOutputStream(); + out.println("BOB " + BOBversion); + out.println("OK"); + while ((line = in.readLine()) != null) { + StringTokenizer token = new StringTokenizer(line, " "); // use a space as a delimiter + String Command = ""; + String Arg = ""; + NamedDB info; - if (token.countTokens() != 0) { - Command = token.nextToken(); - Command = - Command.toLowerCase(); if (token.countTokens() != 0) { - Arg = token.nextToken(); - } else { - Arg = ""; - } - // The rest of the tokens are considered junk, - // and discarded without any warnings. - if (Command.equals(C_help)) { - for (int i = 0; !C_ALL[i][0].equals(" "); i++) { - if (C_ALL[i][0].equalsIgnoreCase(Arg)) { - out.println("OK " + C_ALL[i][1]); - } - + Command = token.nextToken(); + Command = + Command.toLowerCase(); + if (token.countTokens() != 0) { + Arg = token.nextToken(); + } else { + Arg = ""; } - } else if (Command.equals(C_getdest)) { - if (ns) { - if (dk) { - try { - rlock(); - } catch (Exception ex) { - break die; + // The rest of the tokens are considered junk, + // and discarded without any warnings. + if (Command.equals(C_help)) { + for (int i = 0; !C_ALL[i][0].equals(" "); i++) { + if (C_ALL[i][0].equalsIgnoreCase(Arg)) { + out.println("OK " + C_ALL[i][1]); } - try { - out.println("OK " + nickinfo.get(P_DEST)); - } catch (Exception e) { + } + } else if (Command.equals(C_visit)) { + visitAllThreads(); + out.println("OK "); + } else if (Command.equals(C_getdest)) { + if (ns) { + if (dk) { + try { + rlock(); + } catch (Exception ex) { + break die; + } + + try { + out.println("OK " + nickinfo.get(P_DEST)); + } catch (Exception e) { + try { + runlock(); + } catch (Exception ex) { + break die; + } + break die; + } + try { runlock(); } catch (Exception ex) { break die; } - break die; - } - try { - runlock(); - } catch (Exception ex) { - break die; + } else { + out.println("ERROR keys not set."); } } else { - out.println("ERROR keys not set."); + nns(out); } - } else { - nns(out); - } - - } else if (Command.equals(C_list)) { - // Produce a formatted list of all nicknames - database.getReadLock(); - for (int i = 0; i < - database.getcount(); i++) { - try { - info = (NamedDB) database.getnext(i); - out.print("DATA"); - } catch (Exception e) { - database.releaseReadLock(); - break die; - } - - try { - info.getReadLock(); - } catch (Exception ex) { - break die; - } - try { - nickprint(out, info); - } catch (Exception e) { + } else if (Command.equals(C_list)) { + // Produce a formatted list of all nicknames + database.getReadLock(); + for (int i = 0; i < + database.getcount(); i++) { try { - info.releaseReadLock(); + info = (NamedDB) database.getnext(i); + out.print("DATA"); + } catch (Exception e) { database.releaseReadLock(); + break die; + } + + try { + info.getReadLock(); + } catch (Exception ex) { + break die; + } + try { + nickprint(out, info); + } catch (Exception e) { + try { + info.releaseReadLock(); + database.releaseReadLock(); + } catch (Exception ex) { + break die; + } + break die; + } + + try { + info.releaseReadLock(); } catch (Exception ex) { break die; } - break die; } try { - info.releaseReadLock(); + database.releaseReadLock(); } catch (Exception ex) { break die; } - } - - try { - database.releaseReadLock(); - } catch (Exception ex) { - break die; - } - out.println("OK Listing done"); - } else if (Command.equals(C_quit)) { - // End the command session - break quit; - } else if (Command.equals(C_newkeys)) { - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - try { - // Make a new PublicKey and PrivateKey - prikey = new ByteArrayOutputStream(); - d = I2PClientFactory.createClient().createDestination(prikey); + out.println("OK Listing done"); + } else if (Command.equals(C_quit)) { + // End the command session + break quit; + } else if (Command.equals(C_zap)) { + // Kill BOB!! (let's hope this works!) + LIVE.set(false); + // End the command session + break quit; + } else if (Command.equals(C_newkeys)) { + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { try { - wlock(); - } catch (Exception e) { - break die; - } + // Make a new PublicKey and PrivateKey + prikey = new ByteArrayOutputStream(); + d = I2PClientFactory.createClient().createDestination(prikey); + try { + wlock(); + } catch (Exception e) { + break die; + } - try { - nickinfo.add(P_KEYS, prikey.toByteArray()); - nickinfo.add(P_DEST, d.toBase64()); - } catch (Exception e) { + try { + nickinfo.add(P_KEYS, prikey.toByteArray()); + nickinfo.add(P_DEST, d.toBase64()); + } catch (Exception e) { + try { + wunlock(); + } catch (Exception ex) { + break die; + } + break die; + } + + dk = true; try { wunlock(); } catch (Exception ex) { break die; } - break die; - } - dk = true; - try { - wunlock(); - } catch (Exception ex) { - break die; - } - - try { - rlock(); - } catch (Exception ex) { - break die; - } - - try { - out.println("OK " + nickinfo.get(P_DEST)); - } catch (Exception e) { - runlock(); - break die; - } - - try { - runlock(); - } catch (Exception ex) { - break die; - } - } catch (I2PException ipe) { - BOB.error("Error generating keys" + ipe); - out.println("ERROR generating keys"); - } - - } - } catch (Exception e) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception ex) { - break die; - } - } - - } else if (Command.equals(C_getkeys)) { - // Return public key - if (dk) { - prikey = new ByteArrayOutputStream(); - try { - rlock(); - } catch (Exception e) { - break die; - } - try { - prikey.write(((byte[]) nickinfo.get(P_KEYS))); - } catch (Exception ex) { - try { - runlock(); - } catch (Exception ee) { - break die; - } - break die; - } - try { - runlock(); - } catch (Exception e) { - break die; - } - - out.println("OK " + net.i2p.data.Base64.encode(prikey.toByteArray())); - } else { - out.println("ERROR no public key has been set"); - } - - } else if (Command.equals(C_quiet)) { - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - try { - wlock(); - } catch (Exception ex) { - break die; - } - try { - nickinfo.add(P_QUIET, new Boolean(Boolean.parseBoolean(Arg) == true)); - } catch (Exception ex) { - try { - wunlock(); - } catch (Exception ee) { - break die; - } - break die; - } - - try { - wunlock(); - } catch (Exception ex) { - break die; - } - - out.println("OK Quiet set"); - } - - } catch (Exception ex) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception ex) { - break die; - } - } - - } else if (Command.equals(C_verify)) { - if (is64ok(Arg)) { - out.println("OK"); - } else { - out.println("ERROR not in BASE64 format"); - } - } else if (Command.equals(C_setkeys)) { - // Set the NamedDB to a privatekey in BASE64 format - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - try { - prikey = new ByteArrayOutputStream(); - prikey.write(net.i2p.data.Base64.decode(Arg)); - d.fromBase64(Arg); - } catch (Exception ex) { - Arg = ""; - } - - if ((Arg.length() == 884) && is64ok(Arg)) { - try { - wlock(); - } catch (Exception ex) { - break die; - } - try { - nickinfo.add(P_KEYS, prikey.toByteArray()); - nickinfo.add(P_DEST, d.toBase64()); - } catch (Exception ex) { try { - wunlock(); - } catch (Exception ee) { + rlock(); + } catch (Exception ex) { break die; } - break die; - } - dk = true; - try { - wunlock(); - } catch (Exception ex) { - break die; - } - try { - rlock(); - } catch (Exception ex) { - break die; - } + try { + out.println("OK " + nickinfo.get(P_DEST)); + } catch (Exception e) { + runlock(); + break die; + } - try { - out.println("OK " + nickinfo.get(P_DEST)); - } catch (Exception e) { try { runlock(); } catch (Exception ex) { break die; } + } catch (I2PException ipe) { + BOB.error("Error generating keys" + ipe); + out.println("ERROR generating keys"); + } + + } + } catch (Exception e) { + break die; + } + + } else { + try { + nns(out); + } catch (Exception ex) { + break die; + } + } + + } else if (Command.equals(C_getkeys)) { + // Return public key + if (dk) { + prikey = new ByteArrayOutputStream(); + try { + rlock(); + } catch (Exception e) { + break die; + } + try { + prikey.write(((byte[]) nickinfo.get(P_KEYS))); + } catch (Exception ex) { + try { + runlock(); + } catch (Exception ee) { + break die; + } + break die; + } + try { + runlock(); + } catch (Exception e) { + break die; + } + + out.println("OK " + net.i2p.data.Base64.encode(prikey.toByteArray())); + } else { + out.println("ERROR no public key has been set"); + } + + } else if (Command.equals(C_quiet)) { + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { + try { + wlock(); + } catch (Exception ex) { + break die; + } + try { + nickinfo.add(P_QUIET, new Boolean(Boolean.parseBoolean(Arg) == true)); + } catch (Exception ex) { + try { + wunlock(); + } catch (Exception ee) { + break die; + } break die; } try { - runlock(); + wunlock(); } catch (Exception ex) { break die; } + + out.println("OK Quiet set"); + } + + } catch (Exception ex) { + break die; + } + + } else { + try { + nns(out); + } catch (Exception ex) { + break die; + } + } + + } else if (Command.equals(C_verify)) { + if (is64ok(Arg)) { + out.println("OK"); + } else { + out.println("ERROR not in BASE64 format"); + } + } else if (Command.equals(C_setkeys)) { + // Set the NamedDB to a privatekey in BASE64 format + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); } else { - out.println("ERROR not in BASE64 format"); + try { + prikey = new ByteArrayOutputStream(); + prikey.write(net.i2p.data.Base64.decode(Arg)); + d.fromBase64(Arg); + } catch (Exception ex) { + Arg = ""; + } + + if ((Arg.length() == 884) && is64ok(Arg)) { + try { + wlock(); + } catch (Exception ex) { + break die; + } + try { + nickinfo.add(P_KEYS, prikey.toByteArray()); + nickinfo.add(P_DEST, d.toBase64()); + } catch (Exception ex) { + try { + wunlock(); + } catch (Exception ee) { + break die; + } + break die; + } + dk = true; + try { + wunlock(); + } catch (Exception ex) { + break die; + } + + try { + rlock(); + } catch (Exception ex) { + break die; + } + + try { + out.println("OK " + nickinfo.get(P_DEST)); + } catch (Exception e) { + try { + runlock(); + } catch (Exception ex) { + break die; + } + break die; + } + + try { + runlock(); + } catch (Exception ex) { + break die; + } + } else { + out.println("ERROR not in BASE64 format"); + } + + } + } catch (Exception ex) { + break die; + } + + } else { + try { + nns(out); + } catch (Exception ex) { + break die; + } + } + + } else if (Command.equals(C_setnick)) { + ns = dk = ip = op = false; + try { + database.getReadLock(); + } catch (Exception ex) { + break die; + } + try { + nickinfo = (NamedDB) database.get(Arg); + if (!tunnelactive(nickinfo)) { + nickinfo = null; + ns = true; + } + + } catch (Exception b) { + nickinfo = null; + ns = true; + } + + try { + database.releaseReadLock(); + } catch (Exception ex) { + break die; + } + // Clears and Sets the initial NamedDB structure to work with + if (ns) { + nickinfo = new NamedDB(); + try { + wlock(); + } catch (Exception e) { + break die; + } + + try { + database.add(Arg, nickinfo); + nickinfo.add(P_NICKNAME, Arg); + nickinfo.add(P_STARTING, new Boolean(false)); + nickinfo.add(P_RUNNING, new Boolean(false)); + nickinfo.add(P_STOPPING, new Boolean(false)); + nickinfo.add(P_QUIET, new Boolean(false)); + nickinfo.add(P_INHOST, "localhost"); + nickinfo.add(P_OUTHOST, "localhost"); + Properties Q = new Properties(); + Lifted.copyProperties(this.props, Q); + Q.setProperty("inbound.nickname", Arg); + Q.setProperty("outbound.nickname", Arg); + nickinfo.add(P_PROPERTIES, Q); + } catch (Exception e) { + try { + wunlock(); + break die; + } catch (Exception ee) { + break die; } } - } catch (Exception ex) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception ex) { - break die; - } - } - - } else if (Command.equals(C_setnick)) { - ns = dk = ip = op = false; - try { - database.getReadLock(); - } catch (Exception ex) { - break die; - } - try { - nickinfo = (NamedDB) database.get(Arg); - if (!tunnelactive(nickinfo)) { - nickinfo = null; - ns = - true; - } - - } catch (Exception b) { - nickinfo = null; - ns = - true; - } - - try { - database.releaseReadLock(); - } catch (Exception ex) { - break die; - } - // Clears and Sets the initial NamedDB structure to work with - if (ns) { - nickinfo = new NamedDB(); - try { - wlock(); - } catch (Exception e) { - break die; - } - - try { - database.add(Arg, nickinfo); - nickinfo.add(P_NICKNAME, Arg); - nickinfo.add(P_STARTING, Boolean.FALSE); - nickinfo.add(P_RUNNING, Boolean.FALSE); - nickinfo.add(P_STOPPING, Boolean.FALSE); - nickinfo.add(P_QUIET, Boolean.FALSE); - nickinfo.add(P_INHOST, "localhost"); - nickinfo.add(P_OUTHOST, "localhost"); - Properties Q = new Properties(); - Lifted.copyProperties(this.props, Q); - Q.setProperty("inbound.nickname", Arg); - Q.setProperty("outbound.nickname", Arg); - nickinfo.add(P_PROPERTIES, Q); - } catch (Exception e) { try { wunlock(); - break die; - } catch (Exception ee) { + } catch (Exception e) { break die; } + out.println("OK Nickname set to " + Arg); + } else { + out.println("ERROR tunnel is active"); } + + } else if (Command.equals(C_option)) { + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { + StringTokenizer otoken = new StringTokenizer(Arg, "="); // use an equal sign as a delimiter + if (otoken.countTokens() != 2) { + out.println("ERROR to many or no options."); + } else { + String pname = otoken.nextToken(); + String pval = otoken.nextToken(); + try { + rlock(); + } catch (Exception ex) { + break die; + } + + Properties Q = (Properties) nickinfo.get(P_PROPERTIES); + try { + runlock(); + } catch (Exception ex) { + break die; + } + + Q.setProperty(pname, pval); + try { + wlock(); + } catch (Exception ex) { + break die; + } + + try { + nickinfo.add(P_PROPERTIES, Q); + } catch (Exception ex) { + try { + wunlock(); + } catch (Exception ee) { + break die; + } + break die; + } + try { + wunlock(); + } catch (Exception ex) { + break die; + } + + out.println("OK " + pname + " set to " + pval); + } + + } + } catch (Exception ex) { + break die; + } + + } else { + nns(out); + } + + } else if (Command.equals(C_getnick)) { + // Get the NamedDB to work with... try { - wunlock(); - } catch (Exception e) { + database.getReadLock(); + } catch (Exception ex) { break die; } - - out.println("OK Nickname set to " + Arg); - } else { - out.println("ERROR tunnel is active"); - } - - } else if (Command.equals(C_option)) { - if (ns) { try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - StringTokenizer otoken = new StringTokenizer(Arg, "="); // use an equal sign as a delimiter - if (otoken.countTokens() != 2) { - out.println("ERROR to many or no options."); + nickinfo = (NamedDB) database.get(Arg); + ns = true; + } catch (RuntimeException b) { + try { + nns(out); + } catch (Exception ex) { + try { + database.releaseReadLock(); + } catch (Exception ee) { + break die; + } + break die; + } + } + + database.releaseReadLock(); + if (ns) { + try { + rlock(); + } catch (Exception e) { + break die; + } + try { + dk = nickinfo.exists(P_KEYS); + ip = nickinfo.exists(P_INPORT); + op = nickinfo.exists(P_OUTPORT); + } catch (Exception ex) { + try { + runlock(); + } catch (Exception ee) { + break die; + } + break die; + } + try { + runlock(); + } catch (Exception e) { + break die; + } +// Finally say OK. + out.println("OK Nickname set to " + Arg); + } + + } else if (Command.equals(C_inport)) { + // Set the NamedDB inbound TO the router port + // app --> BOB + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); } else { - String pname = otoken.nextToken(); - String pval = otoken.nextToken(); - try { - rlock(); - } catch (Exception ex) { - break die; - } - - Properties Q = (Properties) nickinfo.get(P_PROPERTIES); - try { - runlock(); - } catch (Exception ex) { - break die; - } - - Q.setProperty(pname, pval); + int prt; try { wlock(); } catch (Exception ex) { @@ -839,7 +953,181 @@ public class DoCMDS implements Runnable { } try { - nickinfo.add(P_PROPERTIES, Q); + nickinfo.kill(P_INPORT); + } catch (Exception ex) { + try { + wunlock(); + } catch (Exception ee) { + break die; + } + + break die; + } + try { + prt = Integer.parseInt(Arg); + if (prt > 1 && prt < 65536) { + try { + nickinfo.add(P_INPORT, new Integer(prt)); + } catch (Exception ex) { + try { + wunlock(); + } catch (Exception ee) { + break die; + } + + break die; + } + } + + } catch (NumberFormatException nfe) { + out.println("ERROR not a number"); + } + + try { + wunlock(); + } catch (Exception ex) { + break die; + } + try { + rlock(); + } catch (Exception ex) { + break die; + } + + try { + ip = nickinfo.exists(P_INPORT); + } catch (Exception ex) { + try { + runlock(); + } catch (Exception ee) { + break die; + } + break die; + } + try { + runlock(); + } catch (Exception ex) { + break die; + } + + if (ip) { + out.println("OK inbound port set"); + } else { + out.println("ERROR port out of range"); + } + + } + } catch (Exception ex) { + break die; + } + + } else { + nns(out); + } + + } else if (Command.equals(C_outport)) { + // Set the NamedDB outbound FROM the router port + // BOB --> app + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { + int prt; + try { + wlock(); + } catch (Exception ex) { + break die; + } + + try { + nickinfo.kill(P_OUTPORT); + } catch (Exception ex) { + try { + wunlock(); + } catch (Exception ee) { + break die; + } + break die; + } + try { + prt = Integer.parseInt(Arg); + if (prt > 1 && prt < 65536) { + try { + nickinfo.add(P_OUTPORT, new Integer(prt)); + } catch (Exception ex) { + try { + wunlock(); + } catch (Exception ee) { + break die; + } + break die; + } + } + + } catch (NumberFormatException nfe) { + out.println("ERROR not a number"); + } + + try { + wunlock(); + } catch (Exception ex) { + break die; + } + try { + rlock(); + } catch (Exception ex) { + break die; + } + + try { + ip = nickinfo.exists(P_OUTPORT); + } catch (Exception ex) { + try { + runlock(); + } catch (Exception ee) { + break die; + } + break die; + } + try { + runlock(); + } catch (Exception ex) { + break die; + } + + if (ip) { + out.println("OK outbound port set"); + } else { + out.println("ERROR port out of range"); + } + + } + } catch (Exception ex) { + break die; + } + + } else { + try { + nns(out); + } catch (Exception ex) { + break die; + } + } + + } else if (Command.equals(C_inhost)) { + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { + try { + wlock(); + } catch (Exception ex) { + break die; + } + try { + nickinfo.add(P_INHOST, Arg); } catch (Exception ex) { try { wunlock(); @@ -854,546 +1142,92 @@ public class DoCMDS implements Runnable { break die; } - out.println("OK " + pname + " set to " + pval); + out.println("OK inhost set"); } - } - } catch (Exception ex) { - break die; - } - - } else { - nns(out); - } - - } else if (Command.equals(C_getnick)) { - // Get the NamedDB to work with... - try { - database.getReadLock(); - } catch (Exception ex) { - break die; - } - try { - nickinfo = (NamedDB) database.get(Arg); - ns = true; - } catch (RuntimeException b) { - try { - nns(out); - } catch (Exception ex) { - try { - database.releaseReadLock(); - } catch (Exception ee) { + } catch (Exception ex) { break die; } - break die; - } - } - database.releaseReadLock(); - if (ns) { - try { - rlock(); - } catch (Exception e) { - break die; - } - try { - dk = nickinfo.exists(P_KEYS); - ip = nickinfo.exists(P_INPORT); - op = nickinfo.exists(P_OUTPORT); - } catch (Exception ex) { + } else { try { - runlock(); - } catch (Exception ee) { + nns(out); + } catch (Exception ex) { break die; } - break die; } - try { - runlock(); - } catch (Exception e) { - break die; - } -// Finally say OK. - out.println("OK Nickname set to " + Arg); - } - } else if (Command.equals(C_inport)) { - // Set the NamedDB inbound TO the router port - // app --> BOB - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - int prt; - try { - wlock(); - } catch (Exception ex) { - break die; - } - - try { - nickinfo.kill(P_INPORT); - } catch (Exception ex) { + } else if (Command.equals(C_outhost)) { + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { try { - wunlock(); - } catch (Exception ee) { + wlock(); + } catch (Exception ex) { break die; } - - break die; - } - try { - prt = Integer.parseInt(Arg); - if (prt > 1 && prt < 65536) { + try { + nickinfo.add(P_OUTHOST, Arg); + } catch (Exception ex) { try { - nickinfo.add(P_INPORT, new Integer(prt)); - } catch (Exception ex) { - try { - wunlock(); - } catch (Exception ee) { - break die; - } - + wunlock(); + } catch (Exception ee) { break die; } - } - - } catch (NumberFormatException nfe) { - out.println("ERROR not a number"); - } - - try { - wunlock(); - } catch (Exception ex) { - break die; - } - try { - rlock(); - } catch (Exception ex) { - break die; - } - - try { - ip = nickinfo.exists(P_INPORT); - } catch (Exception ex) { - try { - runlock(); - } catch (Exception ee) { break die; } - break die; - } - try { - runlock(); - } catch (Exception ex) { - break die; - } - - if (ip) { - out.println("OK inbound port set"); - } else { - out.println("ERROR port out of range"); - } - - } - } catch (Exception ex) { - break die; - } - - } else { - nns(out); - } - - } else if (Command.equals(C_outport)) { - // Set the NamedDB outbound FROM the router port - // BOB --> app - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - int prt; - try { - wlock(); - } catch (Exception ex) { - break die; - } - - try { - nickinfo.kill(P_OUTPORT); - } catch (Exception ex) { try { wunlock(); - } catch (Exception ee) { + } catch (Exception ex) { break die; } - break die; - } - try { - prt = Integer.parseInt(Arg); - if (prt > 1 && prt < 65536) { - try { - nickinfo.add(P_OUTPORT, new Integer(prt)); - } catch (Exception ex) { - try { - wunlock(); - } catch (Exception ee) { - break die; - } - break die; - } - } - } catch (NumberFormatException nfe) { - out.println("ERROR not a number"); + out.println("OK outhost set"); } - try { - wunlock(); - } catch (Exception ex) { - break die; - } - try { - rlock(); - } catch (Exception ex) { - break die; - } - - try { - ip = nickinfo.exists(P_OUTPORT); - } catch (Exception ex) { - try { - runlock(); - } catch (Exception ee) { - break die; - } - break die; - } - try { - runlock(); - } catch (Exception ex) { - break die; - } - - if (ip) { - out.println("OK outbound port set"); - } else { - out.println("ERROR port out of range"); - } - - } - } catch (Exception ex) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception ex) { - break die; - } - } - - } else if (Command.equals(C_inhost)) { - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - try { - wlock(); - } catch (Exception ex) { - break die; - } - try { - nickinfo.add(P_INHOST, Arg); - } catch (Exception ex) { - try { - wunlock(); - } catch (Exception ee) { - break die; - } - break die; - } - try { - wunlock(); - } catch (Exception ex) { - break die; - } - - out.println("OK inhost set"); - } - - } catch (Exception ex) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception ex) { - break die; - } - } - - } else if (Command.equals(C_outhost)) { - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - try { - wlock(); - } catch (Exception ex) { - break die; - } - try { - nickinfo.add(P_OUTHOST, Arg); - } catch (Exception ex) { - try { - wunlock(); - } catch (Exception ee) { - break die; - } - break die; - } - try { - wunlock(); - } catch (Exception ex) { - break die; - } - - out.println("OK outhost set"); - } - - } catch (Exception ex) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception ex) { - break die; - } - } - - } else if (Command.equals(C_show)) { - // Get the current NamedDB properties - if (ns) { - out.print("OK"); - try { - rlock(); - } catch (Exception e) { - break die; - } - - try { - nickprint(out, nickinfo); - } catch (Exception e) { - try { - runlock(); - } catch (Exception ee) { + } catch (Exception ex) { break die; } - out.println(); // this will cause an IOE if IOE - break die; - } - - try { - runlock(); - } catch (Exception e) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception e) { - break die; - } - } - - } else if (Command.equals(C_show_props)) { - // Get the current options properties - if (ns) { - out.print("OK"); - try { - rlock(); - } catch (Exception e) { - break die; - } - - try { - propprint(out, nickinfo); - } catch (Exception e) { + } else { try { - runlock(); - } catch (Exception ee) { + nns(out); + } catch (Exception ex) { break die; } - - out.println(); // this will cause an IOE if IOE - break die; } - try { - runlock(); - } catch (Exception e) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception e) { - break die; - } - } - - } else if (Command.equals(C_start)) { - // Start the tunnel, if we have all the information - if (ns && dk && (ip || op)) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - MUXlisten tunnel; - try { - tunnel = new MUXlisten(database, nickinfo, _log); - Thread t = new Thread(tunnel); - t.start(); - out.println("OK tunnel starting"); - } catch (I2PException e) { - out.println("ERROR starting tunnel: " + e); - } catch (IOException e) { - out.println("ERROR starting tunnel: " + e); - } - - } - } catch (Exception ex) { - break die; - } - - } else { - out.println("ERROR tunnel settings incomplete"); - } - - } else if (Command.equals(C_stop)) { - // Stop the tunnel, if it is running - if (ns) { - try { - rlock(); - } catch (Exception e) { - break die; - } - - try { - if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) { - try { - runlock(); - } catch (Exception e) { - break die; - } - - try { - wlock(); - } catch (Exception e) { - break die; - } - - nickinfo.add(P_STOPPING, Boolean.TRUE); - try { - wunlock(); - - } catch (Exception e) { - break die; - } - - out.println("OK tunnel stopping"); - } else { - try { - runlock(); - } catch (Exception e) { - break die; - } - - out.println("ERROR tunnel is inactive"); - } - } catch (Exception e) { + } else if (Command.equals(C_show)) { + // Get the current NamedDB properties + if (ns) { + out.print("OK"); try { - runlock(); - } catch (Exception ee) { - break die; - } - break die; - } - - } else { - try { - nns(out); - } catch (Exception e) { - break die; - } - } - - } else if (Command.equals(C_clear)) { - // Clear use of the NamedDB if stopped - if (ns) { - try { - if (tunnelactive(nickinfo)) { - out.println("ERROR tunnel is active"); - } else { - try { - database.getWriteLock(); - } catch (Exception e) { - break die; - } - try { - database.kill(nickinfo.get(P_NICKNAME)); - } catch (Exception e) { - try { - database.releaseWriteLock(); - } catch (Exception ee) { - break die; - } - break die; - } - try { - database.releaseWriteLock(); - } catch (Exception e) { - break die; - } - dk = ns = ip = op = false; - out.println("OK cleared"); - } - - } catch (Exception ex) { - break die; - } - - } else { - try { - nns(out); - } catch (Exception e) { - break die; - } - } - - } else if (Command.equals(C_status)) { - try { - if (database.exists(Arg)) { - // Show status of a NamedDB - out.print("OK "); - try { - ttlpnt(out, Arg); + rlock(); } catch (Exception e) { + break die; + } + + try { + nickprint(out, nickinfo); + } catch (Exception e) { + try { + runlock(); + } catch (Exception ee) { + break die; + } + out.println(); // this will cause an IOE if IOE break die; } + try { + runlock(); + } catch (Exception e) { + break die; + } + } else { try { nns(out); @@ -1401,27 +1235,273 @@ public class DoCMDS implements Runnable { break die; } } - } catch (Exception e) { - break die; + + } else if (Command.equals(C_show_props)) { + // Get the current options properties + if (ns) { + out.print("OK"); + try { + rlock(); + } catch (Exception e) { + break die; + } + + try { + propprint(out, nickinfo); + } catch (Exception e) { + try { + runlock(); + } catch (Exception ee) { + break die; + } + + out.println(); // this will cause an IOE if IOE + break die; + } + + try { + runlock(); + } catch (Exception e) { + break die; + } + + } else { + try { + nns(out); + } catch (Exception e) { + break die; + } + } + + } else if (Command.equals(C_start)) { + // Start the tunnel, if we have all the information + if (ns && dk && (ip || op)) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { + MUXlisten tunnel; + try { + while (!lock.compareAndSet(false, true)) { + // wait + } + tunnel = new MUXlisten(lock, database, nickinfo, _log); + Thread t = new Thread(tunnel); + t.start(); + // try { + // Thread.sleep(1000 * 10); // Slow down the startup. + // } catch(InterruptedException ie) { + // // ignore it + // } + out.println("OK tunnel starting"); + } catch (I2PException e) { + lock.set(false); + out.println("ERROR starting tunnel: " + e); + } catch (IOException e) { + lock.set(false); + out.println("ERROR starting tunnel: " + e); + } + } + } catch (Exception ex) { + break die; + } + + } else { + out.println("ERROR tunnel settings incomplete"); + } + + } else if (Command.equals(C_stop)) { + // Stop the tunnel, if it is running + if (ns) { + try { + rlock(); + } catch (Exception e) { + break die; + } + + try { + if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) { + try { + runlock(); + } catch (Exception e) { + break die; + } + + try { + wlock(); + } catch (Exception e) { + break die; + } + + nickinfo.add(P_STOPPING, new Boolean(true)); + try { + wunlock(); + + } catch (Exception e) { + break die; + } + + out.println("OK tunnel stopping"); + } else { + try { + runlock(); + } catch (Exception e) { + break die; + } + + out.println("ERROR tunnel is inactive"); + } + } catch (Exception e) { + try { + runlock(); + } catch (Exception ee) { + break die; + } + break die; + } + + } else { + try { + nns(out); + } catch (Exception e) { + break die; + } + } + + } else if (Command.equals(C_clear)) { + // Clear use of the NamedDB if stopped + if (ns) { + try { + if (tunnelactive(nickinfo)) { + out.println("ERROR tunnel is active"); + } else { + try { + database.getWriteLock(); + } catch (Exception e) { + break die; + } + try { + database.kill(nickinfo.get(P_NICKNAME)); + } catch (Exception e) { + try { + database.releaseWriteLock(); + } catch (Exception ee) { + break die; + } + break die; + } + try { + database.releaseWriteLock(); + } catch (Exception e) { + break die; + } + dk = ns = ip = op = false; + out.println("OK cleared"); + } + + } catch (Exception ex) { + break die; + } + + } else { + try { + nns(out); + } catch (Exception e) { + break die; + } + } + + } else if (Command.equals(C_status)) { + try { + if (database.exists(Arg)) { + // Show status of a NamedDB + out.print("OK "); + try { + ttlpnt(out, Arg); + } catch (Exception e) { + out.println(); // this will cause an IOE if IOE + break die; + } + + } else { + try { + nns(out); + } catch (Exception e) { + break die; + } + } + } catch (Exception e) { + break die; + } + + } else { + out.println("ERROR UNKNOWN COMMAND! Try help"); } - } else { - out.println("ERROR UNKNOWN COMMAND! Try help"); } - } - } - } // die - out.print("ERROR A really bad error just happened, "); - } // quit + } // die + out.print("ERROR A really bad error just happened, "); + } // quit // Say goodbye. - out.println("OK Bye!"); + out.println("OK Bye!"); - server.close(); - } catch (IOException ioe) { - BOB.warn("IOException on socket listen: " + ioe); - ioe.printStackTrace(); + } catch (IOException ioe) { + // not really needed, except to debug. + // BOB.warn("IOException on socket listen: " + ioe); + // ioe.printStackTrace(); + } + } finally { + try { + server.close(); + } catch (IOException ex) { + // nop + } + } + } + // Debugging... None of this is normally used. + + /** + * Find the root thread group and print them all. + * + */ + private void visitAllThreads() { + ThreadGroup root = Thread.currentThread().getThreadGroup().getParent(); + while (root.getParent() != null) { + root = root.getParent(); + } + + // Visit each thread group + visit(root, 0, root.getName()); + } + + /** + * Recursively visits all thread groups under `group' and dumps them. + * @param group ThreadGroup to visit + * @param level Current level + */ + private static void visit(ThreadGroup group, int level, String tn) { + // Get threads in `group' + int numThreads = group.activeCount(); + Thread[] threads = new Thread[numThreads * 2]; + numThreads = group.enumerate(threads, false); + String indent = "------------------------------------".substring(0, level) + "-> "; + // Enumerate each thread in `group' and print it. + for (int i = 0; i < numThreads; i++) { + // Get thread + Thread thread = threads[i]; + System.out.println("BOB: " + indent + tn + ": " + thread.toString()); + } + + // Get thread subgroups of `group' + int numGroups = group.activeGroupCount(); + ThreadGroup[] groups = new ThreadGroup[numGroups * 2]; + numGroups = group.enumerate(groups, false); + + // Recursively visit each subgroup + for (int i = 0; i < numGroups; i++) { + visit(groups[i], level + 1, groups[i].getName()); } } } diff --git a/apps/BOB/src/net/i2p/BOB/I2Plistener.java b/apps/BOB/src/net/i2p/BOB/I2Plistener.java index 1561b7a22..e55e54b9d 100644 --- a/apps/BOB/src/net/i2p/BOB/I2Plistener.java +++ b/apps/BOB/src/net/i2p/BOB/I2Plistener.java @@ -25,9 +25,8 @@ package net.i2p.BOB; import java.net.ConnectException; import java.net.SocketTimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.I2PException; -import net.i2p.client.I2PSession; -import net.i2p.client.I2PSessionException; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; @@ -42,24 +41,37 @@ public class I2Plistener implements Runnable { private NamedDB info, database; private Log _log; - private int tgwatch; +// private int tgwatch; public I2PSocketManager socketManager; public I2PServerSocket serverSocket; + private AtomicBoolean lives; /** * Constructor + * @param SS * @param S * @param info * @param database * @param _log */ - I2Plistener(I2PSocketManager S, NamedDB info, NamedDB database, Log _log) { + I2Plistener(I2PServerSocket SS, I2PSocketManager S, NamedDB info, NamedDB database, Log _log, AtomicBoolean lives) { this.database = database; this.info = info; this._log = _log; this.socketManager = S; - serverSocket = this.socketManager.getServerSocket(); - tgwatch = 1; + this.serverSocket = SS; +// tgwatch = 1; + this.lives = lives; + } + + private void rlock() throws Exception { + database.getReadLock(); + info.getReadLock(); + } + + private void runlock() throws Exception { + database.releaseReadLock(); + info.releaseReadLock(); } /** @@ -69,69 +81,43 @@ public class I2Plistener implements Runnable { public void run() { boolean g = false; I2PSocket sessSocket = null; - - serverSocket.setSoTimeout(100); - database.getReadLock(); - info.getReadLock(); - if(info.exists("INPORT")) { - tgwatch = 2; - } - info.releaseReadLock(); - database.releaseReadLock(); - boolean spin = true; - while(spin) { - - database.getReadLock(); - info.getReadLock(); - spin = info.get("RUNNING").equals(Boolean.TRUE); - info.releaseReadLock(); - database.releaseReadLock(); - try { - try { - sessSocket = serverSocket.accept(); - g = true; - } catch(ConnectException ce) { - g = false; - } catch(SocketTimeoutException ste) { - g = false; - } - if(g) { - g = false; - // toss the connection to a new thread. - I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database); - Thread t = new Thread(conn_c, "BOBI2PtoTCP"); - t.start(); - } - - } catch(I2PException e) { - // System.out.println("Exception " + e); - } - } - // System.out.println("I2Plistener: Close"); + int conn = 0; try { - serverSocket.close(); - } catch(I2PException e) { - // nop - } - // need to kill off the socket manager too. - I2PSession session = socketManager.getSession(); - if(session != null) { - // System.out.println("I2Plistener: destroySession"); - try { - session.destroySession(); - } catch(I2PSessionException ex) { - // nop - } - } - // System.out.println("I2Plistener: Waiting for children"); - while(Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish - try { - Thread.sleep(100); //sleep for 100 ms (One tenth second) - } catch(Exception e) { - // nop - } - } + die: + { + try { + serverSocket.setSoTimeout(50); - // System.out.println("I2Plistener: Done."); + while (lives.get()) { + try { + sessSocket = serverSocket.accept(); + g = true; + } catch (ConnectException ce) { + g = false; + } catch (SocketTimeoutException ste) { + g = false; + } + if (g) { + g = false; + conn++; + // toss the connection to a new thread. + I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database, lives); + Thread t = new Thread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn); + t.start(); + } + + } + } catch (I2PException e) { + // bad shit + System.out.println("Exception " + e); + } + } + } finally { + try { + serverSocket.close(); + } catch (I2PException ex) { + } + // System.out.println("I2Plistener: Close"); + } } } diff --git a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java index 5d24e19d3..85dcf5b41 100644 --- a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java +++ b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java @@ -26,6 +26,7 @@ package net.i2p.BOB; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; +import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.client.streaming.I2PSocket; /** @@ -38,6 +39,7 @@ public class I2PtoTCP implements Runnable { private I2PSocket I2P; private NamedDB info, database; private Socket sock; + private AtomicBoolean lives; /** * Constructor @@ -46,18 +48,19 @@ public class I2PtoTCP implements Runnable { * @param info * @param database */ - I2PtoTCP(I2PSocket I2Psock, NamedDB info, NamedDB database) { + I2PtoTCP(I2PSocket I2Psock, NamedDB info, NamedDB database, AtomicBoolean lives) { this.I2P = I2Psock; this.info = info; this.database = database; + this.lives = lives; } - private void rlock() throws Exception { + private void rlock() { database.getReadLock(); info.getReadLock(); } - private void runlock() throws Exception { + private void runlock() { database.releaseReadLock(); info.releaseReadLock(); } @@ -70,75 +73,109 @@ public class I2PtoTCP implements Runnable { String host; int port; boolean tell; -die: { - try { + InputStream in = null; + OutputStream out = null; + InputStream Iin = null; + OutputStream Iout = null; + Thread t = null; + Thread q = null; + try { + die: + { try { - rlock(); - } catch(Exception e) { - break die; - } - try { - host = info.get("OUTHOST").toString(); - port = Integer.parseInt(info.get("OUTPORT").toString()); - tell = info.get("QUIET").equals(Boolean.FALSE); - } catch(Exception e) { - runlock(); - break die; - } - try { - runlock(); - } catch(Exception e) { - break die; - } - sock = new Socket(host, port); - // make readers/writers - InputStream in = sock.getInputStream(); - OutputStream out = sock.getOutputStream(); - InputStream Iin = I2P.getInputStream(); - OutputStream Iout = I2P.getOutputStream(); - I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default - - if(tell) { - // tell who is connecting - out.write(I2P.getPeerDestination().toBase64().getBytes()); - out.write(10); // nl - out.flush(); // not really needed, but... - } - // setup to cross the streams - TCPio conn_c = new TCPio(in, Iout, info, database); // app -> I2P - TCPio conn_a = new TCPio(Iin, out, info, database); // I2P -> app - Thread t = new Thread(conn_c, "TCPioA"); - Thread q = new Thread(conn_a, "TCPioB"); - // Fire! - t.start(); - q.start(); - while(t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread try { - Thread.sleep(10); //sleep for 10 ms - } catch(InterruptedException e) { - // nop + rlock(); + } catch (Exception e) { + break die; + } + try { + host = info.get("OUTHOST").toString(); + port = Integer.parseInt(info.get("OUTPORT").toString()); + tell = info.get("QUIET").equals(Boolean.FALSE); + } catch (Exception e) { + runlock(); + break die; + } + try { + runlock(); + } catch (Exception e) { + break die; + } + sock = new Socket(host, port); + // make readers/writers + in = sock.getInputStream(); + out = sock.getOutputStream(); + Iin = I2P.getInputStream(); + Iout = I2P.getOutputStream(); + I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default + + if (tell) { + // tell who is connecting + out.write(I2P.getPeerDestination().toBase64().getBytes()); + out.write(10); // nl + out.flush(); // not really needed, but... + } + // setup to cross the streams + TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P + TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app + t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA"); + q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB"); + // Fire! + t.start(); + q.start(); + while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread + try { + Thread.sleep(10); //sleep for 10 ms + } catch (InterruptedException e) { + break die; + } } - } // System.out.println("I2PtoTCP: Going away..."); - } catch(Exception e) { - // System.out.println("I2PtoTCP: Owch! damn!"); - break die; + } catch (Exception e) { + // System.out.println("I2PtoTCP: Owch! damn!"); + break die; + } + } // die + } finally { + try { + in.close(); + } catch (Exception ex) { + } + try { + out.close(); + } catch (Exception ex) { + } + try { + Iin.close(); + } catch (Exception ex) { + } + try { + Iout.close(); + } catch (Exception ex) { + } + try { + t.interrupt(); + } catch (Exception e) { + } + try { + q.interrupt(); + } catch (Exception e) { + } + try { + // System.out.println("I2PtoTCP: Close I2P"); + I2P.close(); + } catch (Exception e) { + tell = false; + } + //System.out.println("I2PtoTCP: Closed I2P"); + try { + // System.out.println("I2PtoTCP: Close sock"); + sock.close(); + } catch (Exception e) { + tell = false; } - } // die - try { - // System.out.println("I2PtoTCP: Close I2P"); - I2P.close(); - } catch(Exception e) { - tell = false; - } - //System.out.println("I2PtoTCP: Closed I2P"); - try { - // System.out.println("I2PtoTCP: Close sock"); - sock.close(); - } catch(Exception e) { - tell = false; - } // System.out.println("I2PtoTCP: Done"); + } } } diff --git a/apps/BOB/src/net/i2p/BOB/MUXlisten.java b/apps/BOB/src/net/i2p/BOB/MUXlisten.java index bd52e27fd..c91a8743c 100644 --- a/apps/BOB/src/net/i2p/BOB/MUXlisten.java +++ b/apps/BOB/src/net/i2p/BOB/MUXlisten.java @@ -28,11 +28,12 @@ import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.util.Properties; +import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.I2PException; +import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManagerFactory; import net.i2p.util.Log; -import org.tanukisoftware.wrapper.WrapperManager; /** * @@ -48,61 +49,103 @@ public class MUXlisten implements Runnable { private ByteArrayInputStream prikey; private ThreadGroup tg; private String N; - private ServerSocket listener; + private ServerSocket listener = null; private int backlog = 50; // should this be more? less? boolean go_out; boolean come_in; + private AtomicBoolean lock; + private AtomicBoolean lives; /** * Constructor Will fail if INPORT is occupied. * - * @param info - * @param database + * @param info DB entry for this tunnel + * @param database master database of tunnels * @param _log * @throws net.i2p.I2PException * @throws java.io.IOException */ - MUXlisten(NamedDB database, NamedDB info, Log _log) throws I2PException, IOException, RuntimeException { - int port = 0; - InetAddress host = null; - this.tg = null; - this.database = database; - this.info = info; - this._log = _log; + MUXlisten(AtomicBoolean lock, NamedDB database, NamedDB info, Log _log) throws I2PException, IOException, RuntimeException { + try { + int port = 0; + InetAddress host = null; + this.lock = lock; + this.tg = null; + this.database = database; + this.info = info; + this._log = _log; + lives = new AtomicBoolean(false); - this.database.getReadLock(); - this.info.getReadLock(); - N = this.info.get("NICKNAME").toString(); - prikey = new ByteArrayInputStream((byte[])info.get("KEYS")); - // Make a new copy so that anything else won't muck with our database. - Properties R = (Properties)info.get("PROPERTIES"); - Properties Q = new Properties(); - Lifted.copyProperties(R, Q); - this.database.releaseReadLock(); - this.info.releaseReadLock(); + this.database.getWriteLock(); + this.info.getWriteLock(); + this.info.add("STARTING", new Boolean(true)); + this.info.releaseWriteLock(); + this.database.releaseWriteLock(); + this.database.getReadLock(); + this.info.getReadLock(); - this.database.getReadLock(); - this.info.getReadLock(); - this.go_out = info.exists("OUTPORT"); - this.come_in = info.exists("INPORT"); - if(this.come_in) { - port = Integer.parseInt(info.get("INPORT").toString()); - host = InetAddress.getByName(info.get("INHOST").toString()); + N = this.info.get("NICKNAME").toString(); + prikey = new ByteArrayInputStream((byte[]) info.get("KEYS")); + // Make a new copy so that anything else won't muck with our database. + Properties R = (Properties) info.get("PROPERTIES"); + Properties Q = new Properties(); + Lifted.copyProperties(R, Q); + this.database.releaseReadLock(); + this.info.releaseReadLock(); + + this.database.getReadLock(); + this.info.getReadLock(); + this.go_out = info.exists("OUTPORT"); + this.come_in = info.exists("INPORT"); + if (this.come_in) { + port = Integer.parseInt(info.get("INPORT").toString()); + host = InetAddress.getByName(info.get("INHOST").toString()); + } + this.database.releaseReadLock(); + this.info.releaseReadLock(); + + socketManager = I2PSocketManagerFactory.createManager(prikey, Q); + if (this.come_in) { + this.listener = new ServerSocket(port, backlog, host); + } + // I2PException, IOException, RuntimeException + // To bad we can't just catch and enumerate.... + // } catch (I2PException e) { + // Something went bad. + // this.database.getWriteLock(); + // this.info.getWriteLock(); + // this.info.add("STARTING", new Boolean(false)); + // this.info.releaseWriteLock(); + // this.database.releaseWriteLock(); + // throw new I2PException(e); + } catch (IOException e) { + // Something went bad. + this.database.getWriteLock(); + this.info.getWriteLock(); + this.info.add("STARTING", new Boolean(false)); + this.info.releaseWriteLock(); + this.database.releaseWriteLock(); + throw new IOException(e.toString()); + } catch (RuntimeException e) { + // Something went bad. + this.database.getWriteLock(); + this.info.getWriteLock(); + this.info.add("STARTING", new Boolean(false)); + this.info.releaseWriteLock(); + this.database.releaseWriteLock(); + throw new RuntimeException(e); + } catch (Exception e) { + // Something else went bad. + this.database.getWriteLock(); + this.info.getWriteLock(); + this.info.add("STARTING", new Boolean(false)); + this.info.releaseWriteLock(); + this.database.releaseWriteLock(); + // throw new Exception(e); + // Debugging, I guess. + e.printStackTrace(); + throw new RuntimeException(e); } - this.database.releaseReadLock(); - this.info.releaseReadLock(); - - socketManager = I2PSocketManagerFactory.createManager(prikey, Q); - if(this.come_in) { - this.listener = new ServerSocket(port, backlog, host); - } - - // Everything is OK as far as we can tell. - this.database.getWriteLock(); - this.info.getWriteLock(); - this.info.add("STARTING", Boolean.TRUE); - this.info.releaseWriteLock(); - this.database.releaseWriteLock(); } private void rlock() throws Exception { @@ -130,147 +173,252 @@ public class MUXlisten implements Runnable { * */ public void run() { - + I2PServerSocket SS = null; + Thread t = null; + Thread q = null; try { - wlock(); try { - info.add("RUNNING", Boolean.TRUE); - info.add("STARTING", Boolean.FALSE); - } catch(Exception e) { - wunlock(); + wlock(); + try { + info.add("RUNNING", new Boolean(true)); + } catch (Exception e) { + lock.set(false); + wunlock(); + return; + } + } catch (Exception e) { + lock.set(false); return; } - } catch(Exception e) { - return; - } - try { - wunlock(); - } catch(Exception e) { - return; - } - -quit: { try { - tg = new ThreadGroup(N); -die: { - // toss the connections to a new threads. - // will wrap with TCP and UDP when UDP works + wunlock(); + } catch (Exception e) { + lock.set(false); + return; + } +// socketManager.addDisconnectListener(new DisconnectListener()); + lives.set(true); + lock.set(false); + quit: + { + try { + tg = new ThreadGroup(N); + { + // toss the connections to a new threads. + // will wrap with TCP and UDP when UDP works - if(go_out) { - // I2P -> TCP - I2Plistener conn = new I2Plistener(socketManager, info, database, _log); - Thread t = new Thread(tg, conn, "BOBI2Plistener " + N); - t.start(); - } + if (go_out) { + // I2P -> TCP + SS = socketManager.getServerSocket(); + I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log, lives); + t = new Thread(tg, conn, "BOBI2Plistener " + N); + t.start(); + } - if(come_in) { - // TCP -> I2P - TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log); - Thread q = new Thread(tg, conn, "BOBTCPlistener" + N); - q.start(); - } + if (come_in) { + // TCP -> I2P + TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log, lives); + q = new Thread(tg, conn, "BOBTCPlistener " + N); + q.start(); + } - boolean spin = true; - while(spin) { try { - Thread.sleep(1000); //sleep for 1000 ms (One second) - } catch(InterruptedException e) { + wlock(); + try { + info.add("STARTING", new Boolean(false)); + } catch (Exception e) { + wunlock(); + break quit; + } + } catch (Exception e) { + break quit; + } + try { + wunlock(); + } catch (Exception e) { + break quit; + } + boolean spin = true; + while (spin && lives.get()) { + try { + Thread.sleep(1000); //sleep for 1 second + } catch (InterruptedException e) { + break quit; + } + try { + rlock(); + try { + spin = info.get("STOPPING").equals(Boolean.FALSE); + } catch (Exception e) { + runlock(); + break quit; + } + } catch (Exception e) { + break quit; + } + try { + runlock(); + } catch (Exception e) { + break quit; + } + } + } // die + + } catch (Exception e) { + // System.out.println("MUXlisten: Caught an exception" + e); + break quit; + } + } // quit + } finally { + lives.set(false); + // Some grace time. + try { + Thread.sleep(100); + } catch (InterruptedException ex) { + } + try { + wlock(); + try { + info.add("STARTING", new Boolean(false)); + info.add("STOPPING", new Boolean(true)); + info.add("RUNNING", new Boolean(false)); + } catch (Exception e) { + lock.set(false); + wunlock(); + return; + } + wunlock(); + } catch (Exception e) { + } + // Start cleanup. + while (!lock.compareAndSet(false, true)) { + // wait + } + if (SS != null) { + try { + SS.close(); + } catch (I2PException ex) { + } + } + if (listener != null) { + try { + listener.close(); + } catch (IOException e) { + } + } + + // Some grace time. + try { + Thread.sleep(100); + } catch (InterruptedException ex) { + } + + // zero out everything. + try { + wlock(); + try { + info.add("STARTING", new Boolean(false)); + info.add("STOPPING", new Boolean(false)); + info.add("RUNNING", new Boolean(false)); + } catch (Exception e) { + lock.set(false); + wunlock(); + return; + } + wunlock(); + } catch (Exception e) { + } + + lock.set(false); // Should we force waiting for all threads?? + + // Wait around till all threads are collected. + if (tg != null) { + String boner = tg.getName(); + // System.out.println("BOB: MUXlisten: Starting thread collection for: " + boner); + _log.warn("BOB: MUXlisten: Starting thread collection for: " + boner); + // tg.interrupt(); // give my stuff a small smack again. + if (tg.activeCount() + tg.activeGroupCount() != 0) { + // visit(tg, 0, boner); + int foo = tg.activeCount() + tg.activeGroupCount(); + // hopefully no longer needed! + // int bar = lives; + // System.out.println("BOB: MUXlisten: Waiting on threads for " + boner); + // System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner); + // visit(tg, 0, boner); + // System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n"); + // Happily spin forever :-( + while (foo != 0) { + foo = tg.activeCount() + tg.activeGroupCount(); + // if (lives != bar && lives != 0) { + // System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner); + // visit(tg, 0, boner); + // System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n"); + // } + // bar = lives; + try { + Thread.sleep(100); //sleep for 100 ms (One tenth second) + } catch (InterruptedException ex) { // nop } - try { - rlock(); - try { - spin = info.get("STOPPING").equals(Boolean.FALSE); - } catch(Exception e) { - runlock(); - break die; - } - } catch(Exception e) { - break die; - } - try { - runlock(); - } catch(Exception e) { - break die; - } - } - - try { - wlock(); - try { - info.add("RUNNING", Boolean.FALSE); - } catch(Exception e) { - wunlock(); - break die; - } - } catch(Exception e) { - break die; - } - try { - wunlock(); - } catch(Exception e) { - break die; - } - } // die - - // wait for child threads and thread groups to die - // System.out.println("MUXlisten: waiting for children"); - while(tg.activeCount() + tg.activeGroupCount() != 0) { - tg.interrupt(); // unwedge any blocking threads. - try { - Thread.sleep(100); //sleep for 100 ms (One tenth second) - } catch(InterruptedException ex) { - // nop } } + // System.out.println("BOB: MUXlisten: Threads went away. Success: " + boner); + _log.warn("BOB: MUXlisten: Threads went away. Success: " + boner); tg.destroy(); // Zap reference to the ThreadGroup so the JVM can GC it. tg = null; - } catch(Exception e) { - // System.out.println("MUXlisten: Caught an exception" + e); - break quit; } - } // quit - // This is here to catch when something fucks up REALLY bad. - if(tg != null) { - System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!"); - System.out.println("BOB: MUXlisten: Please email the following dump to sponge@mail.i2p"); - WrapperManager.requestThreadDump(); - System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!"); - System.out.println("BOB: MUXlisten: Please email the above dump to sponge@mail.i2p"); - } - // zero out everything, just incase. - try { - socketManager.destroySocketManager(); - } catch(Exception e) { - // nop - } - try { - wlock(); try { - info.add("STARTING", Boolean.FALSE); - info.add("STOPPING", Boolean.FALSE); - info.add("RUNNING", Boolean.FALSE); - } catch(Exception e) { - wunlock(); - return; + socketManager.destroySocketManager(); + } catch (Exception e) { + // nop } - wunlock(); - } catch(Exception e) { + } - // This is here to catch when something fucks up REALLY bad. - if(tg != null) { - while(tg.activeCount() + tg.activeGroupCount() != 0) { - tg.interrupt(); // unwedge any blocking threads. - try { - Thread.sleep(100); //sleep for 100 ms (One tenth second) - } catch(InterruptedException ex) { - // nop - } - } - tg.destroy(); - // Zap reference to the ThreadGroup so the JVM can GC it. - tg = null; + } + + + // Debugging... None of this is normally used. + /** + * Find the root thread group and print them all. + * + */ + private void visitAllThreads() { + ThreadGroup root = Thread.currentThread().getThreadGroup().getParent(); + while (root.getParent() != null) { + root = root.getParent(); + } + + // Visit each thread group + visit(root, 0, root.getName()); + } + + /** + * Recursively visits all thread groups under `group' and dumps them. + * @param group ThreadGroup to visit + * @param level Current level + */ + private static void visit(ThreadGroup group, int level, String tn) { + // Get threads in `group' + int numThreads = group.activeCount(); + Thread[] threads = new Thread[numThreads * 2]; + numThreads = group.enumerate(threads, false); + String indent = "------------------------------------".substring(0, level) + "-> "; + // Enumerate each thread in `group' and print it. + for (int i = 0; i < numThreads; i++) { + // Get thread + Thread thread = threads[i]; + System.out.println("BOB: MUXlisten: " + tn + ": " + indent + thread.toString()); + } + + // Get thread subgroups of `group' + int numGroups = group.activeGroupCount(); + ThreadGroup[] groups = new ThreadGroup[numGroups * 2]; + numGroups = group.enumerate(groups, false); + + // Recursively visit each subgroup + for (int i = 0; i < numGroups; i++) { + visit(groups[i], level + 1, groups[i].getName()); } } } diff --git a/apps/BOB/src/net/i2p/BOB/Main.java b/apps/BOB/src/net/i2p/BOB/Main.java index 2d81fb30e..53a7d9e71 100644 --- a/apps/BOB/src/net/i2p/BOB/Main.java +++ b/apps/BOB/src/net/i2p/BOB/Main.java @@ -24,6 +24,8 @@ package net.i2p.BOB; import net.i2p.client.streaming.RetransmissionTimer; +import net.i2p.util.SimpleScheduler; +import net.i2p.util.SimpleTimer2; /** * Start from command line @@ -39,7 +41,13 @@ public class Main { public static void main(String[] args) { // THINK THINK THINK THINK THINK THINK RetransmissionTimer Y = RetransmissionTimer.getInstance(); + SimpleScheduler Y1 = SimpleScheduler.getInstance(); + SimpleTimer2 Y2 = SimpleTimer2.getInstance(); + BOB.main(args); + + Y2.stop(); + Y1.stop(); Y.stop(); } } diff --git a/apps/BOB/src/net/i2p/BOB/NamedDB.java b/apps/BOB/src/net/i2p/BOB/NamedDB.java index 8b0ba35df..b5189647b 100644 --- a/apps/BOB/src/net/i2p/BOB/NamedDB.java +++ b/apps/BOB/src/net/i2p/BOB/NamedDB.java @@ -43,10 +43,10 @@ public class NamedDB { } synchronized public void getReadLock() { - while((writersWaiting != 0)) { + while ((writersWaiting != 0)) { try { wait(); - } catch(InterruptedException ie) { + } catch (InterruptedException ie) { } } readers++; @@ -59,10 +59,10 @@ public class NamedDB { synchronized public void getWriteLock() { writersWaiting++; - while(readers != 0 && writersWaiting != 1 ) { + while (readers != 0 && writersWaiting != 1) { try { wait(); - } catch(InterruptedException ie) { + } catch (InterruptedException ie) { } } } @@ -79,8 +79,8 @@ public class NamedDB { * @throws ArrayIndexOutOfBoundsException when key does not exist */ public int idx(Object key) throws ArrayIndexOutOfBoundsException { - for(int i = 0; i < index; i++) { - if(key.equals(data[i][0])) { + for (int i = 0; i < index; i++) { + if (key.equals(data[i][0])) { return i; } } @@ -100,17 +100,17 @@ public class NamedDB { try { k = idx(key); - } catch(ArrayIndexOutOfBoundsException b) { + } catch (ArrayIndexOutOfBoundsException b) { return; } olddata = new Object[index + 2][2]; // copy to olddata, skipping 'k' - for(i = 0 , l = 0; l < index; i++, l++) { - if(i == k) { + for (i = 0, l = 0; l < index; i++, l++) { + if (i == k) { l++; didsomething++; } - for(j = 0; j < 2; j++) { + for (j = 0; j < 2; j++) { olddata[i][j] = data[l][j]; } } @@ -132,13 +132,13 @@ public class NamedDB { olddata = new Object[index + 2][2]; // copy to olddata - for(i = 0; i < index; i++) { - for(j = 0; j < 2; j++) { + for (i = 0; i < index; i++) { + for (j = 0; j < 2; j++) { olddata[i][j] = data[i][j]; } } data = olddata; - data[index++] = new Object[] {key, val}; + data[index++] = new Object[]{key, val}; } /** @@ -149,8 +149,8 @@ public class NamedDB { * @throws java.lang.RuntimeException */ public Object get(Object key) throws RuntimeException { - for(int i = 0; i < index; i++) { - if(key.equals(data[i][0])) { + for (int i = 0; i < index; i++) { + if (key.equals(data[i][0])) { return data[i][1]; } } @@ -164,8 +164,8 @@ public class NamedDB { * @return true if an object exists, else returns false */ public boolean exists(Object key) { - for(int i = 0; i < index; i++) { - if(key.equals(data[i][0])) { + for (int i = 0; i < index; i++) { + if (key.equals(data[i][0])) { return true; } } @@ -180,7 +180,7 @@ public class NamedDB { * @throws java.lang.RuntimeException */ public Object getnext(int i) throws RuntimeException { - if(i < index && i > -1) { + if (i < index && i > -1) { return data[i][1]; } throw new RuntimeException("No more data"); diff --git a/apps/BOB/src/net/i2p/BOB/TCPio.java b/apps/BOB/src/net/i2p/BOB/TCPio.java index 25290bcdc..d501759ef 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPio.java +++ b/apps/BOB/src/net/i2p/BOB/TCPio.java @@ -23,8 +23,10 @@ */ package net.i2p.BOB; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.concurrent.atomic.AtomicBoolean; /** * Shove data from one stream to the other. @@ -35,71 +37,91 @@ public class TCPio implements Runnable { private InputStream Ain; private OutputStream Aout; - private NamedDB info, database; + private AtomicBoolean lives; /** * Constructor * - * @param Ain - * @param Aout - * @param info - * @param database + * @param Ain InputStream + * @param Aout OutputStream + * + * param database */ - TCPio(InputStream Ain, OutputStream Aout, NamedDB info, NamedDB database) { + TCPio(InputStream Ain, OutputStream Aout, AtomicBoolean lives) { this.Ain = Ain; this.Aout = Aout; - this.info = info; - this.database = database; + this.lives = lives; } /** * Copy from source to destination... * and yes, we are totally OK to block here on writes, * The OS has buffers, and I intend to use them. + * We send an interrupt signal to the threadgroup to + * unwedge any pending writes. * */ public void run() { + /* + * NOTE: + * The write method of OutputStream calls the write method of + * one argument on each of the bytes to be written out. + * Subclasses are encouraged to override this method and provide + * a more efficient implementation. + * + * So, is this really a performance problem? + * Should we expand to several bytes? + * I don't believe there would be any gain, since read method + * has the same reccomendations. If anyone has a better way to + * do this, I'm interested in performance improvements. + * + * --Sponge + * + * Tested with 128 bytes, and there was no performance gain. + * + * --Sponge + */ + int b; byte a[] = new byte[1]; - boolean spin = true; try { - while(spin) { - database.getReadLock(); - info.getReadLock(); - spin = info.get("RUNNING").equals(Boolean.TRUE); - info.releaseReadLock(); - database.releaseReadLock(); - b = Ain.read(a, 0, 1); - // System.out.println(info.get("NICKNAME").toString() + " " + b); - if(b > 0) { - Aout.write(a, 0, b); - } else if(b == 0) { - Thread.yield(); // this should act like a mini sleep. - if(Ain.available() == 0) { - try { - // Thread.yield(); + try { + while (lives.get()) { + b = Ain.read(a, 0, 1); + if (b > 0) { + Aout.write(a, 0, b); + } else if (b == 0) { + Thread.yield(); // this should act like a mini sleep. + if (Ain.available() == 0) { Thread.sleep(10); - } catch(InterruptedException ex) { } + } else { + /* according to the specs: + * + * The total number of bytes read into the buffer, + * or -1 if there is no more data because the end of + * the stream has been reached. + * + */ + // System.out.println("TCPio: End Of Stream"); + break; } - } else { - /* according to the specs: - * - * The total number of bytes read into the buffer, - * or -1 if there is no more data because the end of - * the stream has been reached. - * - */ - // System.out.println("TCPio: End Of Stream"); - return; } + } catch (Exception e) { } - // System.out.println("TCPio: RUNNING = false"); - } catch(Exception e) { + // System.out.println("TCPio: Leaving."); + } finally { // Eject!!! Eject!!! - // System.out.println("TCPio: Caught an exception " + e); + //System.out.println("TCPio: Caught an exception " + e); + try { + Ain.close(); + } catch (IOException ex) { + } + try { + Aout.close(); + } catch (IOException ex) { + } return; } - // System.out.println("TCPio: Leaving."); } } diff --git a/apps/BOB/src/net/i2p/BOB/TCPlistener.java b/apps/BOB/src/net/i2p/BOB/TCPlistener.java index 99ae047d3..b5addc27b 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPlistener.java +++ b/apps/BOB/src/net/i2p/BOB/TCPlistener.java @@ -27,8 +27,9 @@ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; -import net.i2p.client.I2PSession; -import net.i2p.client.I2PSessionException; +// import net.i2p.client.I2PSession; +// import net.i2p.client.I2PSessionException; +import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.util.Log; @@ -42,10 +43,10 @@ public class TCPlistener implements Runnable { private NamedDB info, database; private Log _log; - private int tgwatch; public I2PSocketManager socketManager; public I2PServerSocket serverSocket; private ServerSocket listener; + private AtomicBoolean lives; /** * Constructor @@ -54,13 +55,23 @@ public class TCPlistener implements Runnable { * @param database * @param _log */ - TCPlistener(ServerSocket listener, I2PSocketManager S, NamedDB info, NamedDB database, Log _log) { + TCPlistener(ServerSocket listener, I2PSocketManager S, NamedDB info, NamedDB database, Log _log, AtomicBoolean lives) { this.database = database; this.info = info; this._log = _log; this.socketManager = S; this.listener = listener; - tgwatch = 1; + this.lives = lives; + } + + private void rlock() throws Exception { + database.getReadLock(); + info.getReadLock(); + } + + private void runlock() throws Exception { + database.releaseReadLock(); + info.releaseReadLock(); } /** @@ -69,79 +80,38 @@ public class TCPlistener implements Runnable { */ public void run() { boolean g = false; - boolean spin = true; - database.getReadLock(); - info.getReadLock(); - if(info.exists("OUTPORT")) { - tgwatch = 2; - } + int conn = 0; try { - Socket server = new Socket(); - listener.setSoTimeout(1000); - info.releaseReadLock(); - database.releaseReadLock(); - while(spin) { - database.getReadLock(); - info.getReadLock(); - spin = info.get("RUNNING").equals(Boolean.TRUE); - info.releaseReadLock(); - database.releaseReadLock(); + die: + { try { - server = listener.accept(); - g = true; - } catch(SocketTimeoutException ste) { - g = false; - } - if(g) { - // toss the connection to a new thread. - TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database); - Thread t = new Thread(conn_c, "BOBTCPtoI2P"); - t.start(); - g = false; + Socket server = new Socket(); + listener.setSoTimeout(50); // We don't block, we cycle and check. + while (lives.get()) { + try { + server = listener.accept(); + g = true; + } catch (SocketTimeoutException ste) { + g = false; + } + if (g) { + conn++; + // toss the connection to a new thread. + TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database, lives); + Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn); + t.start(); + g = false; + } + } + } catch (IOException ioe) { } } - //System.out.println("TCPlistener: destroySession"); - listener.close(); - } catch(IOException ioe) { + } finally { try { listener.close(); - } catch(IOException e) { - } - // Fatal failure, cause a stop event - database.getReadLock(); - info.getReadLock(); - spin = info.get("RUNNING").equals(Boolean.TRUE); - info.releaseReadLock(); - database.releaseReadLock(); - if(spin) { - database.getWriteLock(); - info.getWriteLock(); - info.add("STOPPING", new Boolean(true)); - info.add("RUNNING", new Boolean(false)); - info.releaseWriteLock(); - database.releaseWriteLock(); + } catch (IOException ex) { } + //System.out.println("TCPlistener: " + Thread.currentThread().getName() + "Done."); } - - // need to kill off the socket manager too. - I2PSession session = socketManager.getSession(); - if(session != null) { - try { - session.destroySession(); - } catch(I2PSessionException ex) { - // nop - } - } - //System.out.println("TCPlistener: Waiting for children"); - while(Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish - try { - Thread.sleep(100); //sleep for 100 ms (One tenth second) - } catch(Exception e) { - // nop - } - } - //System.out.println("TCPlistener: Done."); } } - - diff --git a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java index df61e78e1..a4a851c54 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java +++ b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java @@ -30,9 +30,11 @@ import java.io.OutputStream; import java.net.ConnectException; import java.net.NoRouteToHostException; import java.net.Socket; +import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; +import net.i2p.data.DataFormatException; import net.i2p.data.Destination; import net.i2p.i2ptunnel.I2PTunnel; @@ -48,6 +50,22 @@ public class TCPtoI2P implements Runnable { private NamedDB info, database; private Socket sock; private I2PSocketManager socketManager; + private AtomicBoolean lives; + + /** + * Constructor + * @param i2p + * @param socket + * param info + * param database + */ + TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database, AtomicBoolean lives) { + this.sock = socket; + this.info = info; + this.database = database; + this.socketManager = i2p; + this.lives = lives; + } /** * This is a more forgiving readline, @@ -55,45 +73,31 @@ public class TCPtoI2P implements Runnable { * * @param in * @return line of text as a String - * @throws Exception + * @throws IOException */ - private static String lnRead(InputStream in) throws Exception { + private static String lnRead(InputStream in) throws IOException { String S; int b; char c; S = new String(); - while(true) { + while (true) { b = in.read(); - if(b == 13) { + if (b == 13) { //skip CR continue; } - if(b < 20 || b > 126) { + if (b < 20 || b > 126) { // exit on anything not legal break; } - c = (char)(b & 0x7f); // We only really give a fuck about ASCII + c = (char) (b & 0x7f); // We only really give a fuck about ASCII S = new String(S + c); } return S; } - /** - * Constructor - * @param i2p - * @param socket - * @param info - * @param database - */ - TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database) { - this.sock = socket; - this.info = info; - this.database = database; - this.socketManager = i2p; - } - /** * Print an error message to out * @@ -103,27 +107,45 @@ public class TCPtoI2P implements Runnable { */ private void Emsg(String e, OutputStream out) throws IOException { // Debugging System.out.println("ERROR TCPtoI2P: " + e); - out.write("ERROR".concat(e).getBytes()); - out.write(13); // cr + out.write("ERROR ".concat(e).getBytes()); + out.write(13); + out.write(10); out.flush(); } +// private void rlock() throws Exception { + private void rlock() { + database.getReadLock(); + info.getReadLock(); + } + +// private void runlock() throws Exception { + private void runlock() { + info.releaseReadLock(); + database.releaseReadLock(); + } + /** * TCP stream to I2P stream thread starter + * */ public void run() { String line, input; - + InputStream Iin = null; + OutputStream Iout = null; + InputStream in = null; + OutputStream out = null; + Thread t = null; + Thread q = null; try { - - InputStream in = sock.getInputStream(); - OutputStream out = sock.getOutputStream(); try { + + in = sock.getInputStream(); + out = sock.getOutputStream(); line = lnRead(in); input = line.toLowerCase(); Destination dest = null; - - if(input.endsWith(".i2p")) { + if (input.endsWith(".i2p")) { dest = I2PTunnel.destFromName(input); line = dest.toBase64(); } @@ -135,52 +157,82 @@ public class TCPtoI2P implements Runnable { I2P = socketManager.connect(dest); I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default // make readers/writers - InputStream Iin = I2P.getInputStream(); - OutputStream Iout = I2P.getOutputStream(); + Iin = I2P.getInputStream(); + Iout = I2P.getOutputStream(); // setup to cross the streams - TCPio conn_c = new TCPio(in, Iout, info, database); // app -> I2P - TCPio conn_a = new TCPio(Iin, out, info, database); // I2P -> app - Thread t = new Thread(conn_c, "TCPioA"); - Thread q = new Thread(conn_a, "TCPioB"); + TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P + TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app + t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA"); + q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB"); // Fire! t.start(); q.start(); - while(t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread - try { - Thread.sleep(10); //sleep for 10 ms - } catch(InterruptedException e) { - // nop - } + while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread + Thread.sleep(10); //sleep for 10 ms } - // System.out.println("TCPtoI2P: Going away..."); - - } catch(I2PException e) { - Emsg("ERROR " + e.toString(), out); - } catch(ConnectException e) { - Emsg("ERROR " + e.toString(), out); - } catch(NoRouteToHostException e) { - Emsg("ERROR " + e.toString(), out); - } catch(InterruptedIOException e) { - Emsg("ERROR " + e.toString(), out); + } catch (I2PException e) { + Emsg(e.toString(), out); + } catch (ConnectException e) { + Emsg(e.toString(), out); + } catch (NoRouteToHostException e) { + Emsg(e.toString(), out); } - } catch(Exception e) { - Emsg("ERROR " + e.toString(), out); + } catch (InterruptedIOException e) { + // We're breaking away. + } catch (InterruptedException e) { + // ditto + } catch (IOException e) { + try { + Emsg(e.toString(), out); + } catch (IOException ex) { + // ditto + } + } catch (DataFormatException e) { + try { + Emsg(e.toString(), out); + } catch (IOException ex) { + // ditto + } } - } catch(IOException ioe) { - } - try { - // System.out.println("TCPtoI2P: Close I2P"); - I2P.close(); - } catch(Exception e) { - } - try { - // System.out.println("TCPtoI2P: Close sock"); - sock.close(); - } catch(Exception e) { - } - // System.out.println("TCPtoI2P: Done."); + } finally { + try { + t.interrupt(); + } catch (Exception e) { + } + try { + q.interrupt(); + } catch (Exception e) { + } + try { + in.close(); + } catch (Exception e) { + } + try { + out.close(); + } catch (Exception e) { + } + try { + Iin.close(); + } catch (Exception e) { + } + try { + Iout.close(); + } catch (Exception e) { + } + try { + // System.out.println("TCPtoI2P: Close I2P"); + I2P.close(); + } catch (Exception e) { + } + try { + // System.out.println("TCPtoI2P: Close sock"); + sock.close(); + } catch (Exception e) { + } + } + // System.out.println("TCPtoI2P: Done."); } } diff --git a/apps/BOB/src/net/i2p/BOB/UDPIOthread.java b/apps/BOB/src/net/i2p/BOB/UDPIOthread.java index 687fe8089..ff1a1f1ab 100644 --- a/apps/BOB/src/net/i2p/BOB/UDPIOthread.java +++ b/apps/BOB/src/net/i2p/BOB/UDPIOthread.java @@ -78,26 +78,26 @@ public class UDPIOthread implements I2PSessionListener, Runnable { try { in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); - while(up) { + while (up) { int c = in.read(data); // Note: could do a loopback test here with a wrapper. boolean ok = _session.sendMessage(_peerDestination, data, 0, c); - if(!ok) { + if (!ok) { up = false; // Is this the right thing to do?? } } - } catch(IOException ioe) { + } catch (IOException ioe) { _log.error("Error running", ioe); - } catch(I2PSessionException ise) { + } catch (I2PSessionException ise) { _log.error("Error communicating", ise); // } catch(DataFormatException dfe) { // _log.error("Peer destination file is not valid", dfe); } finally { - if(_session != null) { + if (_session != null) { try { _session.destroySession(); - } catch(I2PSessionException ise) { + } catch (I2PSessionException ise) { // ignored } } @@ -116,9 +116,9 @@ public class UDPIOthread implements I2PSessionListener, Runnable { byte msg[] = session.receiveMessage(msgId); out.write(msg); out.flush(); - } catch(I2PSessionException ise) { + } catch (I2PSessionException ise) { up = false; - } catch(IOException ioe) { + } catch (IOException ioe) { up = false; } } diff --git a/apps/addressbook/build.xml b/apps/addressbook/build.xml index b28cec2dc..6332c5bcc 100644 --- a/apps/addressbook/build.xml +++ b/apps/addressbook/build.xml @@ -6,6 +6,7 @@ + @@ -38,6 +39,7 @@ + diff --git a/apps/addressbook/java/src/addressbook/AddressBook.java b/apps/addressbook/java/src/addressbook/AddressBook.java index a46c256c8..2694cae78 100644 --- a/apps/addressbook/java/src/addressbook/AddressBook.java +++ b/apps/addressbook/java/src/addressbook/AddressBook.java @@ -94,20 +94,21 @@ public class AddressBook { * @param proxyPort port number of proxy */ public AddressBook(Subscription subscription, String proxyHost, int proxyPort) { + File tmp = new File(I2PAppContext.getGlobalContext().getTempDir(), "addressbook.tmp"); this.location = subscription.getLocation(); EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true, - proxyHost, proxyPort, 0, -1l, MAX_SUB_SIZE, "addressbook.tmp", null, + proxyHost, proxyPort, 0, -1l, MAX_SUB_SIZE, tmp.getAbsolutePath(), null, subscription.getLocation(), true, subscription.getEtag(), subscription.getLastModified(), null); if (get.fetch()) { subscription.setEtag(get.getETag()); subscription.setLastModified(get.getLastModified()); } try { - this.addresses = ConfigParser.parse(new File("addressbook.tmp")); + this.addresses = ConfigParser.parse(tmp); } catch (IOException exp) { this.addresses = new HashMap(); } - new File("addressbook.tmp").delete(); + tmp.delete(); } /** diff --git a/apps/addressbook/java/src/addressbook/Daemon.java b/apps/addressbook/java/src/addressbook/Daemon.java index 7b690eb17..a8a9a2da6 100644 --- a/apps/addressbook/java/src/addressbook/Daemon.java +++ b/apps/addressbook/java/src/addressbook/Daemon.java @@ -28,6 +28,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import net.i2p.I2PAppContext; + /** * Main class of addressbook. Performs updates, and runs the main loop. * @@ -125,15 +127,17 @@ public class Daemon { public void run(String[] args) { String settingsLocation = "config.txt"; - String home; + File homeFile; if (args.length > 0) { - home = args[0]; + homeFile = new File(args[0]); + if (!homeFile.isAbsolute()) + homeFile = new File(I2PAppContext.getGlobalContext().getRouterDir(), args[0]); } else { - home = "."; + homeFile = new File(System.getProperty("user.dir")); } Map defaultSettings = new HashMap(); - defaultSettings.put("proxy_host", "localhost"); + defaultSettings.put("proxy_host", "127.0.0.1"); defaultSettings.put("proxy_port", "4444"); defaultSettings.put("master_addressbook", "../userhosts.txt"); defaultSettings.put("router_addressbook", "../hosts.txt"); @@ -145,7 +149,6 @@ public class Daemon { defaultSettings.put("last_modified", "last_modified"); defaultSettings.put("update_delay", "12"); - File homeFile = new File(home); if (!homeFile.exists()) { boolean created = homeFile.mkdirs(); if (created) @@ -169,7 +172,7 @@ public class Daemon { delay = 1; } - update(settings, home); + update(settings, homeFile.getAbsolutePath()); try { synchronized (this) { wait(delay * 60 * 60 * 1000); diff --git a/apps/addressbook/java/src/addressbook/Servlet.java b/apps/addressbook/java/src/addressbook/Servlet.java index 50bc1eb6d..34af69c1c 100644 --- a/apps/addressbook/java/src/addressbook/Servlet.java +++ b/apps/addressbook/java/src/addressbook/Servlet.java @@ -54,9 +54,10 @@ public class Servlet extends GenericServlet { args[0] = config.getInitParameter("home"); DaemonThread thread = new DaemonThread(args); thread.setDaemon(true); + thread.setName("Addressbook"); thread.start(); System.out.println("INFO: Starting Addressbook " + Daemon.VERSION); System.out.println("INFO: config root under " + args[0]); } -} \ No newline at end of file +} diff --git a/router/java/src/net/i2p/router/admin/AdminListener.java b/apps/admin/java/src/net/i2p/router/admin/AdminListener.java similarity index 100% rename from router/java/src/net/i2p/router/admin/AdminListener.java rename to apps/admin/java/src/net/i2p/router/admin/AdminListener.java diff --git a/router/java/src/net/i2p/router/admin/AdminManager.java b/apps/admin/java/src/net/i2p/router/admin/AdminManager.java similarity index 100% rename from router/java/src/net/i2p/router/admin/AdminManager.java rename to apps/admin/java/src/net/i2p/router/admin/AdminManager.java diff --git a/router/java/src/net/i2p/router/admin/AdminRunner.java b/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java similarity index 98% rename from router/java/src/net/i2p/router/admin/AdminRunner.java rename to apps/admin/java/src/net/i2p/router/admin/AdminRunner.java index c515f8976..2851d7d86 100644 --- a/router/java/src/net/i2p/router/admin/AdminRunner.java +++ b/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java @@ -73,7 +73,7 @@ class AdminRunner implements Runnable { } private void reply(OutputStream out, String content) throws IOException { - StringBuffer reply = new StringBuffer(10240); + StringBuilder reply = new StringBuilder(10240); reply.append("HTTP/1.1 200 OK\n"); reply.append("Connection: close\n"); reply.append("Cache-control: no-cache\n"); @@ -90,7 +90,7 @@ class AdminRunner implements Runnable { } private void replyText(OutputStream out, String content) throws IOException { - StringBuffer reply = new StringBuffer(10240); + StringBuilder reply = new StringBuilder(10240); reply.append("HTTP/1.1 200 OK\n"); reply.append("Connection: close\n"); reply.append("Cache-control: no-cache\n"); diff --git a/apps/desktopgui/LICENSE b/apps/desktopgui/LICENSE new file mode 100644 index 000000000..61febe901 --- /dev/null +++ b/apps/desktopgui/LICENSE @@ -0,0 +1,15 @@ +Desktop GUI: provides a simple GUI for I2P. +Copyright (C) 2009 Mathias De Maré + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; only version 2 of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. \ No newline at end of file diff --git a/apps/desktopgui/build.xml b/apps/desktopgui/build.xml new file mode 100644 index 000000000..8138f14c5 --- /dev/null +++ b/apps/desktopgui/build.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + Builds, tests, and runs the project desktopgui. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/desktopgui/desktopgui/resources/howto/howto.html b/apps/desktopgui/desktopgui/resources/howto/howto.html new file mode 100644 index 000000000..ea1b025c7 --- /dev/null +++ b/apps/desktopgui/desktopgui/resources/howto/howto.html @@ -0,0 +1,261 @@ + + + Small Guide to I2P + + +

Small Guide to I2P

+ +

So, what's this all about?

+ +

I2P builds up a new net inside the usual internet, connecting nodes together + via encrypted connections. + It is a JAVA prgram with its most used part (the encryption of the data) written + in handoptimized assembler code. + It will use your bandwith, your RAM and your CPU. It will use them all up if you + do not limit it. + I2P will route unknown traffic through your node, even stuff you dislike. + As that data is encrypted, nobody knows whats data went to or drom your node. +

+ +

+ First, ALWAYS use the latest stable release. + Development releases are called "mtn version" and are marked with a -, e.g. + 0.6.5-1. Those are usually useable by all but could do harm to your I2P + experience. + You can get the latest MTN builds from my eepsite echelon.i2p, but always + remember: I built them, you need to trust me not to changed the code! + After you get the right "i2pupdate.zip" file, put that file into the I2P + directory and hit restart on the router console http://127.0.0.1:7657. + Do NOT deflate the zip file! +

+ +

+ I2P is very dynamic - after startup it tries to get known to other I2P routers + and measures their speed - you need to wait some 10-120 minutes until your + I2P router knows enough other ones to obtain full power of I2P. +

+ +

Filesharing

+ +

+ I2P is able to do anonymous filesharing. + But as there are NO gateways between real net and I2P, you can only share/ + download torrents from within I2P. Look e.g. postman.i2p or planet.i2p. + You CANNOT use azureus, utorrent or any other usual client. + You cannot download anonymous torrents from mininova, piratebay or else. + You need to use I2P internal torrents and I2P aware programs like + I2Psnark (builtin, suitable for 1-20 torrents) + I2PRufus (external, python, high CPU load, suitable >20 torrents) http://echelon.i2p/i2prufus + I2P-BT (external, python) + I2PsnarkXL (mod of I2Psnark made by fwd) +

+ +

+ There are also gnutella and edonkey clients: + i2phex for gnutella (http://echelon.i2p/i2phex) + imule for edonkey (http://echelon.i2p/imule) +

+ +

+ Remember, as I2P uses other routers to route your traffic via 1-6 other PCs, + your transferrates in P2P are slower than in usual internet. + But you are anonymous, no one can easily (within 2 months-2 years) get your IP! + torrents inside of I2P reaches up to 50 kb/sec, usual are 10-20 kb/sec per torrent + i2phex reaches up to 20 kb/sec, usually 5-10 kb/sec + imule in times reaches 10 kb/sec, usually 5-10 kb/sec +

+ +

+ In I2PHex and imule you can just tell "share file or directory", in torrent + you need to create a .torrent file and upload that (and ONLY that small .torrent) + file to the trackers like tracker.postman.i2p/ +

+ +

+ I2P is a smaller net (1000 users) which grows slowly. As of which amount of shared + data will slowly rise. +

+ +

+ I2P is anonymous and it does not censor - there is no administrator. + There IS unwanted stuff like kiddyporn, nazism, or else. + If you dislike all this, do not use I2P. + There is NO way to prohibite this stuff to appear in a anonymous net like I2P. + (as that stuff is available shows the anonymity and transfer function of I2P + is working well enough) + You can delete the destinations in question from your local hosts.txt file (or + deface them) which will partly prevent you to reach those bad sies by accident. +

+ +

Internet (the websites)

+ +

+ Only one outproxy (gateway I2P - webpages in usual Internet) is working. + It is NOT official from I2P, I2P does work without. + If that outproxy is slow, offline, gone,.. I2P still works on and cannot do + anything to change that failure. + That outproxy translates usual internet webpages into the I2P net and you can + reach them via your Router. + The best way for usual webpages is TOR, not that outproxy. + Remember: the owner of the outproxy got ALL traffic from all I2P users + visiting Internet pages and will risk that into the police! +

+ +

+ This proxy is false.i2p. In newer I2P routers it is enabled, but not in + older ones. Go to http://127.0.0.1:7657/i2ptunnel/index.jsp tunnels page and + click on the eepProxy tunnel. Change the entry for the "Outproxies" to false.i2p + and save. On the tunnels page, stop the epproxy tunnel and start it again, + now your router will use the false.i2p outproxy. +

+ +

+ No other (known) gateways are setup and running. No one we know will run + the gateway for torrent or any other P2P data (and risk his life). +

+ +

Bandwidth

+ +

http://127.0.0.1:7657/config.jsp

+ +

Setup your bandwith wisely. Know your linespeed!

+ +

+ E.g. most common terms are: + 1Mbit = roughly 100 kbyte/sec + 10 MBit = roughly 1100 kbyte/sec + 512 kbit = roughly 50 kbyte/sec + or in germany: + 16000er = roughly 1500 kbyte/sec + 6000er = roughly 600 kbyte/sec + 1000er = roughly 100 kb/sec +

+ +

+ Set your bandwith limits to 10% under your line speed and burst rate to + your line speed. + Set the bandwith share percentage to: + >80% if lowest bandwith setting is >50k + >50% if lowest bandwith setting is >30k + >20% if lowest bandwith setting is >16k +

+ +

There is no shared bandwith under 16k.

+ +

+ Limit your participating tunnels (shared bandwith) on: + http://127.0.0.1:7657/configadvanced.jsp + with the line: + router.maxParticipatingTunnels=500 +

+ +

+ 2000 is for roughly 600 kb/sec - very high value with high CPU load + 1000 is for roughly 300 kb/sec + 600 is a good value for 150-200kb/sec + 300 is roughly 90 kb/sec + 150 roughly 50 kb/sec + Remember: even failed tunnel requests will result in a part tunnel on the hops in between! + Those said, there are far more part tunnels unused than used in the live net under load, which + results in slower bandwith per tunnel in the end. + It is wise to first limit the bandwith and afterwards the part tunnels, e.g. set some more part + tunnels and let I2P reach the bandwith limit instead of the part tunnels limit! +

+ +

What is shared bandwidth?

+ +

+ I2P transports your date from the client to the server through 1-6 hops + (other I2P routers). Each of this hops sees the data from you as "participating + tunnel" - which is the shared bandwith of them. + With this in mind, I2P needs some amount of this shared bandwith at some + amount of routers. + Share as much as you are able of - others will thank you! +

+ +

+ With the "share percentage" set like above, you will obtain enough speed for + your own traffic and obtain some participating tunnels (if >16kb/sec) with some + noise traffic to hide your traffic in the stream. +

+ +

+ With release 0.6.5 there is some method to prefer your own traffic ahead + of shared traffic which will result in better experience to you! +

+ +

Addressbook

+ +

+ I2P uses a local addressbook to link short DNS names with the internal used 512bit + hashes (which are destination IDs). + Those links are saved insside the hosts.txt and userhosts.txt files in the i2p + directory. + Hosts which are not in those files cannot be reached via the short DNS names + and a error message with "jumper links" will appear. Those links will ask + some hosts services and forward to the correct site (if the site is known to them). + Those hosts services just made a form to add new "hosts" and those results public + available. + You can subscribe to those hosts service and let your hosts.txt file be updated + automatic. Go to http://127.0.0.1:7657/susidns/subscriptions.jsp SusiDNS + and enter the hosts services into the textbox (and save afterwards): + http://www.i2p2.i2p/hosts.txt + http://stats.i2p/cgi-bin/newhosts.txt + http://tino.i2p/hosts.txt + http://i2host.i2p/cgi-bin/i2hostag + You can add one of them, two or all. + SusiDNS will now ask those hosts for new entries to the hosts.txt and those + will be added to your hosts.txt. The userhosts.txt will ONLY be updated by + yourself (the user) and not be published into the net! + Remember, names once set could not be changed! If you loose your key (destination + ID) to your eepsite, service,..., there is no way to change the linking + between the DNS name and the (lost) destination ID automatic! Only manual by each + user itself - great topic to discuss of need to renew DNS hostnames. + As this subscription will not update old entries, you can "deface" unwanted + eepsites with a false key and if you hit the bad name in browser by accident, + you will not see the bad stuff! +

+ +

Out of Memory errors

+ +

+ If your router hits the Out of Memory error - check your logs! + Usual point for OOM are to much torrents in i2psnark - i2psnark is a real + memory hogg and >10 torrents it requiers hell a lot of memory! +

+ +

+ Maybe it is possible for you to increase the wrapper memory config. + This ONLY works if you start the I2P service restartable with console + (on Windows). + In I2P directory edit the wrapper.config file and change the values: + wrapper.java.maxmemory=256 (or even to 512, IF possible) + Afterwards shutdown I2P complete (the service) and restart it. +

+ +

Blocklists

+ +

+ Sometimes attackers trying to flood the I2P net and try to do some harm. + And some folks setting localnet IPs as their internet reachable address. + To prevent those bad router to harm the local router, I2P implemented + a local blocklist system. It is NOT integrated automatic as it could + really harm your I2P experience if setup the wrong way. + The way to enable blocklists is: + Get the file http://zzz.i2p/files/blocklist.txt and copy this file into the + I2P directory. + On http://127.0.0.1:7657/configadvanced.jsp set the option + router.blocklist.enable=true - click on Apply and restart the router + with the restart link left on router console. + The blockfile.txt file follows a special order, you´ll get it if you read it. + The first entry is the reason to be shown on http://127.0.0.1:7657/profiles.jsp + at the bottom in the shitlist section. + The second entry is the IP or the dest ID of a router. + Right now there are only private subnets in the blocklist AND one chinese router + which floods the floodfill DB while restarting every few minutes with a different + router ID and far to less bandwith for being a floodfill router. +

+ +

(By echelon -- echelon.i2p )

+ + diff --git a/apps/desktopgui/desktopgui/resources/logo/logo.jpg b/apps/desktopgui/desktopgui/resources/logo/logo.jpg new file mode 100644 index 000000000..f1b5ccfc8 Binary files /dev/null and b/apps/desktopgui/desktopgui/resources/logo/logo.jpg differ diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_green.jpg b/apps/desktopgui/desktopgui/resources/logo/logo_green.jpg new file mode 100644 index 000000000..d558efcea Binary files /dev/null and b/apps/desktopgui/desktopgui/resources/logo/logo_green.jpg differ diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg b/apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg new file mode 100644 index 000000000..d131f21b6 Binary files /dev/null and b/apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg differ diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_red.jpg b/apps/desktopgui/desktopgui/resources/logo/logo_red.jpg new file mode 100644 index 000000000..c1a60b8bb Binary files /dev/null and b/apps/desktopgui/desktopgui/resources/logo/logo_red.jpg differ diff --git a/apps/desktopgui/lib/appframework.jar b/apps/desktopgui/lib/appframework.jar new file mode 100644 index 000000000..0b8ff0145 Binary files /dev/null and b/apps/desktopgui/lib/appframework.jar differ diff --git a/apps/desktopgui/lib/swing-worker.jar b/apps/desktopgui/lib/swing-worker.jar new file mode 100644 index 000000000..bcdd9d910 Binary files /dev/null and b/apps/desktopgui/lib/swing-worker.jar differ diff --git a/apps/desktopgui/manifest.mf b/apps/desktopgui/manifest.mf new file mode 100644 index 000000000..328e8e5bc --- /dev/null +++ b/apps/desktopgui/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/apps/desktopgui/nbproject/build-impl.xml b/apps/desktopgui/nbproject/build-impl.xml new file mode 100644 index 000000000..039f8788f --- /dev/null +++ b/apps/desktopgui/nbproject/build-impl.xml @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + diff --git a/apps/desktopgui/nbproject/genfiles.properties b/apps/desktopgui/nbproject/genfiles.properties new file mode 100644 index 000000000..f6b0f837b --- /dev/null +++ b/apps/desktopgui/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=c4b345cd +build.xml.script.CRC32=9785bb9a +build.xml.stylesheet.CRC32=be360661 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=f630f8db +nbproject/build-impl.xml.script.CRC32=8c02c081 +nbproject/build-impl.xml.stylesheet.CRC32=65b8de21 diff --git a/apps/desktopgui/nbproject/project.properties b/apps/desktopgui/nbproject/project.properties new file mode 100644 index 000000000..a02ea8207 --- /dev/null +++ b/apps/desktopgui/nbproject/project.properties @@ -0,0 +1,81 @@ +application.desc=An anonymous communication network. +application.homepage=http://www.i2p2.de +application.title=I2P Desktop GUI +application.vendor=I2P Developers +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/desktopgui.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +file.reference.appframework.jar=lib/appframework.jar +file.reference.i2p.jar=../../core/java/build/i2p.jar +file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar +file.reference.router.jar=../../router/java/build/router.jar +file.reference.routerconsole.jar=../routerconsole/java/build/routerconsole.jar +file.reference.swing-worker.jar=lib/swing-worker.jar +includes=** +jar.compress=false +javac.classpath=\ + ${file.reference.router.jar}:\ + ${file.reference.appframework.jar}:\ + ${file.reference.swing-worker.jar}:\ + ${file.reference.i2p.jar}:\ + ${file.reference.routerconsole.jar}:\ + ${file.reference.i2ptunnel.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.6 +javac.target=1.6 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit.classpath}:\ + ${libs.junit_4.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.encoding.used=${javadoc.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +jnlp.codebase.type=local +jnlp.codebase.url=file:/home/mathias/Documenten/Programmeren/i2p_monotone/repo/i2p.i2p/apps/desktopgui/dist/ +jnlp.enabled=false +jnlp.offline-allowed=false +jnlp.signed=false +main.class=net.i2p.desktopgui.desktopgui.Main +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/apps/desktopgui/nbproject/project.xml b/apps/desktopgui/nbproject/project.xml new file mode 100644 index 000000000..9dba9493c --- /dev/null +++ b/apps/desktopgui/nbproject/project.xml @@ -0,0 +1,19 @@ + + + org.netbeans.modules.java.j2seproject + + + desktopgui + 1.6.5 + + + + + + + + + + + + diff --git a/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application b/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application new file mode 100644 index 000000000..6cd2ac1fb --- /dev/null +++ b/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application @@ -0,0 +1 @@ +desktopgui.Main \ No newline at end of file diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java new file mode 100644 index 000000000..21f0e04cf --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java @@ -0,0 +1,14 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.desktopgui.desktopgui; + +/** + * + * @author mathias + */ +public class GUIVersion { + public static final String VERSION = "0.0.2"; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java new file mode 100644 index 000000000..c3078163d --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java @@ -0,0 +1,109 @@ +package net.i2p.desktopgui.desktopgui; + +/* + * Main.java + */ + + + +import net.i2p.desktopgui.gui.Tray; +import net.i2p.desktopgui.gui.SpeedSelector; +import java.awt.SystemTray; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import org.jdesktop.application.Application; +import org.jdesktop.application.SingleFrameApplication; +import net.i2p.desktopgui.persistence.PropertyManager; + +/** + * The main class of the application. + */ +public class Main extends SingleFrameApplication { + + /** + * At startup create and show the main frame of the application. + */ + @Override protected void startup() { + Properties props = PropertyManager.loadProps(); + + //First load: present screen with information (to help choose I2P settings) + if(props.getProperty(FIRSTLOAD).equals("true")) { + props.setProperty(FIRSTLOAD, "false"); + PropertyManager.saveProps(props); + new SpeedSelector(); //Start speed selector GUI + } + + if(SystemTray.isSupported()) { + tray = new Tray(); + } + else { //Alternative if SystemTray is not supported on the platform + } + } + + /** + * This method is to initialize the specified window by injecting resources. + * Windows shown in our application come fully initialized from the GUI + * builder, so this additional configuration is not needed. + */ + @Override protected void configureWindow(java.awt.Window root) { + } + + /** + * A convenient static getter for the application instance. + * @return the instance of Main + */ + public static Main getApplication() { + return Application.getInstance(Main.class); + } + + /** + * Main method launching the application. + */ + public static void main(String[] args) { + System.setProperty("java.awt.headless", "false"); //Make sure I2P is running in GUI mode for our application + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } catch (InstantiationException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } catch (IllegalAccessException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } catch (UnsupportedLookAndFeelException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + + Main main = getApplication(); + main.launchForeverLoop(); + main.startup(); + } + + /** + * Avoids the app terminating because no Window is opened anymore. + * More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown + */ + public void launchForeverLoop() { + Runnable r = new Runnable() { + public void run() { + try { + Object o = new Object(); + synchronized (o) { + o.wait(); + } + } catch (InterruptedException ie) { + } + } + }; + Thread t = new Thread(r); + t.setDaemon(false); + t.start(); + } + + private Tray tray = null; + ///Indicates if this is the first time the application loads + ///(is only true at the very start of loading the first time!) + private static final String FIRSTLOAD = "firstLoad"; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties new file mode 100644 index 000000000..fb7218cea --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties @@ -0,0 +1,11 @@ +# Application global resources + +Application.name = desktopgui +Application.title = I2P Desktop GUI +Application.version = 0.7.1 +Application.vendor = I2P Developers +Application.homepage = http://www.i2p2.de +Application.description = An anonymous communication network. +Application.vendorId = I2P +Application.id = desktopgui +Application.lookAndFeel = system diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties new file mode 100644 index 000000000..81107aca9 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties @@ -0,0 +1,11 @@ +# Application global resources + +Application.name = desktopgui +Application.title = I2P Desktop GUI +Application.version = 0.7.1 +Application.vendor = I2P Ontwikkelaars +Application.homepage = http://www.i2p2.de +Application.description = Een anoniem communicatienetwerk. +Application.vendorId = I2P +Application.id = desktopgui +Application.lookAndFeel = system diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form new file mode 100644 index 000000000..0f07284d5 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form @@ -0,0 +1,396 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java new file mode 100644 index 000000000..b7102b3ce --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java @@ -0,0 +1,434 @@ +/* + * ClientTunnelWindow.java + * + * Created on 10-jun-2009, 16:49:12 + */ + +package net.i2p.desktopgui.gui; + +import net.i2p.i2ptunnel.web.EditBean; +import java.awt.event.ActionListener; + +/** + * + * @author mathias + */ +public class ClientTunnelWindow extends javax.swing.JFrame { + + /** Creates new form ClientTunnelWindow */ + public ClientTunnelWindow(int tunnelNumber, ActionListener al) { + initComponents(); + this.tunnelNumber = tunnelNumber; + this.al = al; + extraInitComponents(); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setSize(600, 600); + this.setLocationRelativeTo(null); + this.requestFocus(); + this.changeTunnelState.setVisible(false); //TODO: implement tunnel state change + this.setVisible(true); + } + + public void extraInitComponents() { + EditBean bean = new EditBean(); + if(!bean.isClient(tunnelNumber)) { + this.dispose(); + } + else { + this.tunnelName.setText(bean.getTunnelName(tunnelNumber)); + this.tunnelType.setText(bean.getTunnelType(tunnelNumber)); + this.tunnelPort.setText(bean.getClientPort(tunnelNumber)); + this.tunnelDestination.setText(bean.getClientDestination(tunnelNumber)); + + if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + tunnelProfile.setVisible(false); + tunnelProfileLabel.setVisible(false); + this.delayConnect.setVisible(false); + this.sharedClient.setVisible(false); + this.autoStart.setVisible(false); + } + else { + if(bean.isInteractive(tunnelNumber)) { + tunnelProfile.setSelectedIndex(TUNNEL_INTERACTIVE); + } + else { + tunnelProfile.setSelectedIndex(TUNNEL_BULK); + } + + this.delayConnect.setSelected(bean.shouldDelay(tunnelNumber)); + this.sharedClient.setSelected(bean.isSharedClient(tunnelNumber)); + this.autoStart.setSelected(bean.startAutomatically(tunnelNumber)); + } + + this.tunnelDepth.setSelectedIndex(bean.getTunnelDepth(tunnelNumber, 2)); + + int variance = bean.getTunnelVariance(tunnelNumber, 0); + if(variance == 0) { + this.depthVariance.setSelectedIndex(0); + } + else if(variance == 1) { + this.depthVariance.setSelectedIndex(1); + } + else if(variance == 2) { + this.depthVariance.setSelectedIndex(2); + } + else if(variance == -1) { + this.depthVariance.setSelectedIndex(3); + } + else if(variance == -2) { + this.depthVariance.setSelectedIndex(4); + } + + int tunnelQuantity = bean.getTunnelQuantity(tunnelNumber, 2) - 1; + if(tunnelQuantity >= 0 && tunnelQuantity <= 2) { + this.tunnelCount.setSelectedIndex(tunnelQuantity); + } + + int backupTunnelQuantity = bean.getTunnelBackupQuantity(tunnelNumber, 0); + if(backupTunnelQuantity >= 0 && backupTunnelQuantity <= 3) { + this.backupTunnelCount.setSelectedIndex(backupTunnelQuantity); + } + + + if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + this.reduceIdle.setVisible(false); + this.closeIdle.setVisible(false); + this.delayIdle.setVisible(false); + } + else { + this.reduceIdle.setSelected(bean.getReduce(tunnelNumber)); + this.closeIdle.setSelected(bean.getClose(tunnelNumber)); + this.delayIdle.setSelected(bean.getDelayOpen(tunnelNumber)); + } + } + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + tunnelNameLabel = new javax.swing.JLabel(); + tunnelTypeLabel = new javax.swing.JLabel(); + tunnelPortLabel = new javax.swing.JLabel(); + tunnelDestinationLabel = new javax.swing.JLabel(); + tunnelProfileLabel = new javax.swing.JLabel(); + delayConnect = new javax.swing.JCheckBox(); + sharedClient = new javax.swing.JCheckBox(); + autoStart = new javax.swing.JCheckBox(); + jSeparator1 = new javax.swing.JSeparator(); + tunnelDepthLabel = new javax.swing.JLabel(); + depthVarianceLabel = new javax.swing.JLabel(); + tunnelCountLabel = new javax.swing.JLabel(); + backupTunnelCountLabel = new javax.swing.JLabel(); + jSeparator2 = new javax.swing.JSeparator(); + reduceIdle = new javax.swing.JCheckBox(); + closeIdle = new javax.swing.JCheckBox(); + delayIdle = new javax.swing.JCheckBox(); + jSeparator3 = new javax.swing.JSeparator(); + save = new javax.swing.JButton(); + cancel = new javax.swing.JButton(); + tunnelName = new javax.swing.JTextField(); + tunnelType = new javax.swing.JLabel(); + tunnelPort = new javax.swing.JTextField(); + tunnelDestination = new javax.swing.JTextField(); + tunnelProfile = new javax.swing.JComboBox(); + tunnelDepth = new javax.swing.JComboBox(); + depthVariance = new javax.swing.JComboBox(); + tunnelCount = new javax.swing.JComboBox(); + backupTunnelCount = new javax.swing.JComboBox(); + changeTunnelState = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ClientTunnelWindow.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setName("Form"); // NOI18N + getContentPane().setLayout(null); + + tunnelNameLabel.setText(resourceMap.getString("tunnelNameLabel.text")); // NOI18N + tunnelNameLabel.setName("tunnelNameLabel"); // NOI18N + getContentPane().add(tunnelNameLabel); + tunnelNameLabel.setBounds(20, 20, 120, 17); + + tunnelTypeLabel.setText(resourceMap.getString("tunnelTypeLabel.text")); // NOI18N + tunnelTypeLabel.setName("tunnelTypeLabel"); // NOI18N + getContentPane().add(tunnelTypeLabel); + tunnelTypeLabel.setBounds(20, 50, 120, 17); + + tunnelPortLabel.setText(resourceMap.getString("tunnelPortLabel.text")); // NOI18N + tunnelPortLabel.setName("tunnelPortLabel"); // NOI18N + getContentPane().add(tunnelPortLabel); + tunnelPortLabel.setBounds(20, 80, 110, 17); + + tunnelDestinationLabel.setText(resourceMap.getString("tunnelDestinationLabel.text")); // NOI18N + tunnelDestinationLabel.setName("tunnelDestinationLabel"); // NOI18N + getContentPane().add(tunnelDestinationLabel); + tunnelDestinationLabel.setBounds(20, 110, 110, 17); + + tunnelProfileLabel.setText(resourceMap.getString("tunnelProfileLabel.text")); // NOI18N + tunnelProfileLabel.setName("tunnelProfileLabel"); // NOI18N + getContentPane().add(tunnelProfileLabel); + tunnelProfileLabel.setBounds(20, 140, 110, 17); + + delayConnect.setText(resourceMap.getString("delayConnect.text")); // NOI18N + delayConnect.setName("delayConnect"); // NOI18N + getContentPane().add(delayConnect); + delayConnect.setBounds(20, 170, 160, 22); + + sharedClient.setText(resourceMap.getString("sharedClient.text")); // NOI18N + sharedClient.setName("sharedClient"); // NOI18N + getContentPane().add(sharedClient); + sharedClient.setBounds(20, 200, 160, 22); + + autoStart.setText(resourceMap.getString("autoStart.text")); // NOI18N + autoStart.setName("autoStart"); // NOI18N + getContentPane().add(autoStart); + autoStart.setBounds(20, 230, 160, 22); + + jSeparator1.setName("jSeparator1"); // NOI18N + getContentPane().add(jSeparator1); + jSeparator1.setBounds(0, 510, 750, 10); + + tunnelDepthLabel.setText(resourceMap.getString("tunnelDepthLabel.text")); // NOI18N + tunnelDepthLabel.setName("tunnelDepthLabel"); // NOI18N + getContentPane().add(tunnelDepthLabel); + tunnelDepthLabel.setBounds(20, 280, 160, 17); + + depthVarianceLabel.setText(resourceMap.getString("depthVarianceLabel.text")); // NOI18N + depthVarianceLabel.setName("depthVarianceLabel"); // NOI18N + getContentPane().add(depthVarianceLabel); + depthVarianceLabel.setBounds(20, 310, 160, 17); + + tunnelCountLabel.setText(resourceMap.getString("tunnelCountLabel.text")); // NOI18N + tunnelCountLabel.setName("tunnelCountLabel"); // NOI18N + getContentPane().add(tunnelCountLabel); + tunnelCountLabel.setBounds(20, 340, 160, 17); + + backupTunnelCountLabel.setText(resourceMap.getString("backupTunnelCountLabel.text")); // NOI18N + backupTunnelCountLabel.setName("backupTunnelCountLabel"); // NOI18N + getContentPane().add(backupTunnelCountLabel); + backupTunnelCountLabel.setBounds(20, 370, 170, 17); + + jSeparator2.setName("jSeparator2"); // NOI18N + getContentPane().add(jSeparator2); + jSeparator2.setBounds(0, 260, 750, 10); + + reduceIdle.setText(resourceMap.getString("reduceIdle.text")); // NOI18N + reduceIdle.setName("reduceIdle"); // NOI18N + getContentPane().add(reduceIdle); + reduceIdle.setBounds(20, 420, 300, 22); + + closeIdle.setText(resourceMap.getString("closeIdle.text")); // NOI18N + closeIdle.setName("closeIdle"); // NOI18N + getContentPane().add(closeIdle); + closeIdle.setBounds(20, 450, 370, 22); + + delayIdle.setText(resourceMap.getString("delayIdle.text")); // NOI18N + delayIdle.setName("delayIdle"); // NOI18N + getContentPane().add(delayIdle); + delayIdle.setBounds(20, 480, 400, 22); + + jSeparator3.setName("jSeparator3"); // NOI18N + getContentPane().add(jSeparator3); + jSeparator3.setBounds(0, 400, 760, 10); + + save.setText(resourceMap.getString("save.text")); // NOI18N + save.setName("save"); // NOI18N + save.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + saveActionPerformed(evt); + } + }); + getContentPane().add(save); + save.setBounds(10, 520, 44, 29); + + cancel.setText(resourceMap.getString("cancel.text")); // NOI18N + cancel.setName("cancel"); // NOI18N + cancel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelActionPerformed(evt); + } + }); + getContentPane().add(cancel); + cancel.setBounds(60, 520, 55, 29); + + tunnelName.setText(resourceMap.getString("tunnelName.text")); // NOI18N + tunnelName.setName("tunnelName"); // NOI18N + getContentPane().add(tunnelName); + tunnelName.setBounds(200, 20, 340, 27); + + tunnelType.setText(resourceMap.getString("tunnelType.text")); // NOI18N + tunnelType.setName("tunnelType"); // NOI18N + getContentPane().add(tunnelType); + tunnelType.setBounds(200, 50, 340, 20); + + tunnelPort.setText(resourceMap.getString("tunnelPort.text")); // NOI18N + tunnelPort.setName("tunnelPort"); // NOI18N + getContentPane().add(tunnelPort); + tunnelPort.setBounds(200, 70, 340, 27); + + tunnelDestination.setText(resourceMap.getString("tunnelDestination.text")); // NOI18N + tunnelDestination.setName("tunnelDestination"); // NOI18N + getContentPane().add(tunnelDestination); + tunnelDestination.setBounds(200, 100, 340, 27); + + tunnelProfile.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Interactive connection (Instant messaging)", "Bulk connection (Downloads, websites...)" })); + tunnelProfile.setName("tunnelProfile"); // NOI18N + getContentPane().add(tunnelProfile); + tunnelProfile.setBounds(200, 130, 340, 27); + + tunnelDepth.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop tunnel (no anonymity, low latency)", "1 hop tunnel (low anonymity, low latency)", "2 hop tunnel (medium anonymity, medium latency)", "3 hop tunnel (high anonymity, high latency)" })); + tunnelDepth.setName("tunnelDepth"); // NOI18N + getContentPane().add(tunnelDepth); + tunnelDepth.setBounds(200, 280, 350, 27); + + depthVariance.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop variance (no random, good performance)", "+ 0-1 hop variance (slightly random, lower performance)", "+ 0-2 hop variance (very random, lower performance)", "+/- 0-1 hop variance (slightly random, standard performance)", "+/- 0-2 hop variance (not recommended)" })); + depthVariance.setName("depthVariance"); // NOI18N + getContentPane().add(depthVariance); + depthVariance.setBounds(200, 310, 350, 27); + + tunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1 tunnel (low bandwidth usage, low reliability)", "2 tunnels (standard bandwidth usage, standard reliability)", "3 tunnels (high bandwidth usage, high reliability)" })); + tunnelCount.setName("tunnelCount"); // NOI18N + getContentPane().add(tunnelCount); + tunnelCount.setBounds(200, 340, 350, 27); + + backupTunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 backup tunnels (no redundancy, no resource usage)", "1 backup tunnel (low redundancy, low resource usage)", "2 backup tunnels (medium redundancy, medium resource usage)", "3 backup tunnels (high redundancy, high resource usage)" })); + backupTunnelCount.setName("backupTunnelCount"); // NOI18N + getContentPane().add(backupTunnelCount); + backupTunnelCount.setBounds(200, 370, 350, 27); + + changeTunnelState.setText(resourceMap.getString("changeTunnelState.text")); // NOI18N + changeTunnelState.setName("changeTunnelState"); // NOI18N + getContentPane().add(changeTunnelState); + changeTunnelState.setBounds(160, 520, 150, 29); + + pack(); + }// //GEN-END:initComponents + + private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed + EditBean bean = new EditBean(); + if(!bean.isClient(tunnelNumber)) { + al.actionPerformed(evt); + this.dispose(); + } + else { + bean.setTunnel("" + tunnelNumber); + bean.setName(tunnelName.getText()); + bean.setPort(tunnelPort.getText()); + bean.setTargetDestination(tunnelDestination.getText()); + if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + if(tunnelProfile.getSelectedIndex() == TUNNEL_INTERACTIVE) { + bean.setProfile("interactive"); + } + else { + bean.setProfile("bulk"); + } + + if(delayConnect.isSelected()) { + bean.setConnectDelay("true"); + } + else { + bean.setConnectDelay("false"); + } + + if(sharedClient.isSelected()) { + bean.setShared(true); + } + else { + bean.setShared(false); + } + + if(autoStart.isSelected()) { + bean.setStartOnLoad("true"); + } + else { + } + } + bean.setTunnelDepth("" + tunnelDepth.getSelectedIndex()); + + int variance = depthVariance.getSelectedIndex(); + if(variance >= 0 && variance <= 2) { + bean.setTunnelVariance("" + variance); + } + else if(variance == 3) { + bean.setTunnelVariance("-1"); + } + else if(variance == 4) { + bean.setTunnelVariance("-2"); + } + + bean.setTunnelQuantity("" + tunnelCount.getSelectedIndex() + 1); + + bean.setTunnelBackupQuantity("" + backupTunnelCount.getSelectedIndex()); + + if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + if(reduceIdle.isSelected()) { + bean.setReduce("true"); + } + else { + } + + if(closeIdle.isSelected()) { + bean.setClose("true"); + } + else { + } + + if(delayIdle.isSelected()) { + bean.setDelayOpen("true"); + } + } + + } + + al.actionPerformed(evt); + this.dispose(); +}//GEN-LAST:event_saveActionPerformed + + private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed + al.actionPerformed(evt); + this.dispose(); + }//GEN-LAST:event_cancelActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox autoStart; + private javax.swing.JComboBox backupTunnelCount; + private javax.swing.JLabel backupTunnelCountLabel; + private javax.swing.JButton cancel; + private javax.swing.JButton changeTunnelState; + private javax.swing.JCheckBox closeIdle; + private javax.swing.JCheckBox delayConnect; + private javax.swing.JCheckBox delayIdle; + private javax.swing.JComboBox depthVariance; + private javax.swing.JLabel depthVarianceLabel; + private javax.swing.JSeparator jSeparator1; + private javax.swing.JSeparator jSeparator2; + private javax.swing.JSeparator jSeparator3; + private javax.swing.JCheckBox reduceIdle; + private javax.swing.JButton save; + private javax.swing.JCheckBox sharedClient; + private javax.swing.JComboBox tunnelCount; + private javax.swing.JLabel tunnelCountLabel; + private javax.swing.JComboBox tunnelDepth; + private javax.swing.JLabel tunnelDepthLabel; + private javax.swing.JTextField tunnelDestination; + private javax.swing.JLabel tunnelDestinationLabel; + private javax.swing.JTextField tunnelName; + private javax.swing.JLabel tunnelNameLabel; + private javax.swing.JTextField tunnelPort; + private javax.swing.JLabel tunnelPortLabel; + private javax.swing.JComboBox tunnelProfile; + private javax.swing.JLabel tunnelProfileLabel; + private javax.swing.JLabel tunnelType; + private javax.swing.JLabel tunnelTypeLabel; + // End of variables declaration//GEN-END:variables + private int tunnelNumber; + private ActionListener al; + private static final int TUNNEL_INTERACTIVE = 0; + private static final int TUNNEL_BULK = 1; + private static final String TYPE_STREAMR_CLIENT = "Streamr client"; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form new file mode 100644 index 000000000..589f5cee2 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form @@ -0,0 +1,645 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="clientTable.columnModel.title1"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="clientTable.columnModel.title2"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="clientTable.columnModel.title3"/> + <Editor/> + <Renderer/> + </Column> + </TableColumnModel> + </Property> + <Property name="name" type="java.lang.String" value="clientTable" noResource="true"/> + <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> + <TableHeader reorderingAllowed="true" resizingAllowed="true"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="clientTableMouseClicked"/> + </Events> + </Component> + </SubComponents> + </Container> + <Container class="javax.swing.JScrollPane" name="serverFrame"> + <Properties> + <Property name="name" type="java.lang.String" value="serverFrame" noResource="true"/> + </Properties> + + <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> + <SubComponents> + <Component class="javax.swing.JTable" name="serverTable"> + <Properties> + <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor"> + <Table columnCount="3" rowCount="4"> + <Column editable="true" title="Name" type="java.lang.Object"/> + <Column editable="true" title="Address" type="java.lang.Object"/> + <Column editable="true" title="Status" type="java.lang.Object"/> + </Table> + </Property> + <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor"> + <TableColumnModel selectionModel="0"> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="serverTable.columnModel.title0"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="serverTable.columnModel.title1"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="serverTable.columnModel.title2"/> + <Editor/> + <Renderer/> + </Column> + </TableColumnModel> + </Property> + <Property name="name" type="java.lang.String" value="serverTable" noResource="true"/> + <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> + <TableHeader reorderingAllowed="true" resizingAllowed="true"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="serverTableMouseClicked"/> + </Events> + </Component> + </SubComponents> + </Container> + <Component class="javax.swing.JLabel" name="tunnelsExplanation"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="tunnelsExplanation.text"/> + <Property name="name" type="java.lang.String" value="tunnelsExplanation" noResource="true"/> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="clientTunnelLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="clientTunnelLabel.text"/> + <Property name="name" type="java.lang.String" value="clientTunnelLabel" noResource="true"/> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="serverTunnelLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="serverTunnelLabel.text"/> + <Property name="name" type="java.lang.String" value="serverTunnelLabel" noResource="true"/> + </Properties> + </Component> + </SubComponents> + </Container> + <Container class="javax.swing.JPanel" name="networkPanel"> + <Properties> + <Property name="name" type="java.lang.String" value="networkPanel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> + <JTabbedPaneConstraints tabName="Network"> + <Property name="tabTitle" type="java.lang.String" resourceKey="networkPanel.TabConstraints.tabTitle"/> + </JTabbedPaneConstraints> + </Constraint> + </Constraints> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <EmptySpace min="0" pref="562" max="32767" attributes="0"/> + </Group> + </DimensionLayout> + <DimensionLayout dim="1"> + <Group type="103" groupAlignment="0" attributes="0"> + <EmptySpace min="0" pref="388" max="32767" attributes="0"/> + </Group> + </DimensionLayout> + </Layout> + </Container> + <Container class="javax.swing.JPanel" name="advancedPanel"> + <Properties> + <Property name="name" type="java.lang.String" value="advancedPanel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> + <JTabbedPaneConstraints tabName="Advanced"> + <Property name="tabTitle" type="java.lang.String" resourceKey="advancedPanel.TabConstraints.tabTitle"/> + </JTabbedPaneConstraints> + </Constraint> + </Constraints> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <EmptySpace min="0" pref="562" max="32767" attributes="0"/> + </Group> + </DimensionLayout> + <DimensionLayout dim="1"> + <Group type="103" groupAlignment="0" attributes="0"> + <EmptySpace min="0" pref="388" max="32767" attributes="0"/> + </Group> + </DimensionLayout> + </Layout> + </Container> + </SubComponents> + </Container> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java new file mode 100644 index 000000000..3e4a17fd2 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java @@ -0,0 +1,839 @@ +/* + * GeneralConfiguration.java + * + * Created on 10 april 2009, 19:04 + */ + +package net.i2p.desktopgui.gui; + +import java.awt.Desktop; +import java.awt.event.ActionEvent; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.i2p.desktopgui.router.configuration.SpeedHelper; +import javax.swing.JComboBox; +import javax.swing.ButtonModel; +import javax.swing.JTextField; +import net.i2p.desktopgui.router.RouterHelper; +import net.i2p.desktopgui.router.configuration.SpeedHandler; +import net.i2p.desktopgui.router.configuration.UpdateHelper; +import net.i2p.router.web.NewsFetcher; +import net.i2p.desktopgui.router.configuration.UpdateHandler; +import java.util.Date; +import javax.swing.SwingWorker; +import net.i2p.i2ptunnel.web.IndexBean; +import javax.swing.table.DefaultTableModel; +import java.awt.event.ActionListener; + +/** + * + * @author mathias + */ +public class GeneralConfiguration extends javax.swing.JFrame { + + /** Creates new form GeneralConfiguration */ + public GeneralConfiguration() { + initComponents(); + extraInitComponents(); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setLocationRelativeTo(null); + this.requestFocus(); + this.setVisible(true); + } + + private void extraInitComponents() { + initSpeedTab(); + initUpdateTab(); + initTunnelTab(); + } + + private void initSpeedTab() { + try { + String inbound = SpeedHelper.getInboundBandwidth(); + String outbound = SpeedHelper.getOutboundBandwidth(); + + initSpeeds("" + Integer.parseInt(inbound)*8, "" + Integer.parseInt(outbound)*8); + initUsage("" + Integer.parseInt(inbound), "" + Integer.parseInt(outbound)); + } + catch(Exception e) { + e.printStackTrace(); + System.out.println("Exception noticed, probably running desktopgui in a debugger instead of along with I2P!?"); + initSpeeds("100", "100"); + initUsage("12", "12"); + } + } + + private void initUpdateTab() { + //Set update policy + String updatePolicy = UpdateHelper.getUpdatePolicy(); + if(updatePolicy.equals(UpdateHelper.NOTIFY_UPDATE_POLICY)) { + updateButtonGroup.setSelected(updateInform.getModel(), true); + } + else if(updatePolicy.equals(UpdateHelper.DOWNLOAD_UPDATE_POLICY)) { + updateButtonGroup.setSelected(updateDownload.getModel(), true); + } + else if(updatePolicy.equals(UpdateHelper.INSTALL_UPDATE_POLICY)) { + updateButtonGroup.setSelected(updateDownloadRestart.getModel(), true); + } + else { + System.out.println("desktopgui: no updates for you!"); + } + + //Check if an update is available + //TODO: move this method out of the routerconsole so desktopgui doesn't depend on routerconsole!!! + if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) { + updateNow.setVisible(true); + } + else { + updateNow.setVisible(false); + } + } + + private void initTunnelTab() { + while(((DefaultTableModel) clientTable.getModel()).getRowCount() > 0) { + ((DefaultTableModel) clientTable.getModel()).removeRow(0); + } + while(((DefaultTableModel) serverTable.getModel()).getRowCount() > 0) { + ((DefaultTableModel) serverTable.getModel()).removeRow(0); + } + IndexBean bean = new IndexBean(); + for(int i=0; i<bean.getTunnelCount(); i++) { + if(bean.isClient(i)) { + Object[] row = {bean.getTunnelName(i), bean.getTunnelType(i), + bean.getClientInterface(i) + ":" + bean.getClientPort(i), + getTunnelStatus(bean.getTunnelStatus(i))}; + ((DefaultTableModel) clientTable.getModel()).addRow(row); + } + else { + Object[] row = {bean.getTunnelName(i), + bean.getServerTarget(i), + getTunnelStatus(bean.getTunnelStatus(i))}; + ((DefaultTableModel) serverTable.getModel()).addRow(row); + } + } + } + + public String getTunnelStatus(int status) { + if(status == IndexBean.NOT_RUNNING) { + return "Not running"; + } + else if(status == IndexBean.RUNNING) { + return "Running"; + } + else if(status == IndexBean.STANDBY) { + return "Standby"; + } + else if(status == IndexBean.STARTING) { + return "Starting"; + } + else { + return "Error: status not found"; + } + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + updateButtonGroup = new javax.swing.ButtonGroup(); + applyPanel = new javax.swing.JPanel(); + cancel = new javax.swing.JToggleButton(); + ok = new javax.swing.JToggleButton(); + settingsPanel = new javax.swing.JTabbedPane(); + speedPanel = new javax.swing.JPanel(); + uploadSpeedLabel = new javax.swing.JLabel(); + downloadSpeedLabel = new javax.swing.JLabel(); + uploadspeed = new javax.swing.JTextField(); + downloadspeed = new javax.swing.JTextField(); + uploadkbps = new javax.swing.JComboBox(); + downloadkbps = new javax.swing.JComboBox(); + uploadUsageLabel = new javax.swing.JLabel(); + downloadUsageLabel = new javax.swing.JLabel(); + uploadgb = new javax.swing.JTextField(); + downloadgb = new javax.swing.JTextField(); + gbUploadLabel = new javax.swing.JLabel(); + gbDownloadLabel = new javax.swing.JLabel(); + uploadDownloadExplanation = new javax.swing.JLabel(); + updatesPanel = new javax.swing.JPanel(); + updateMethod = new javax.swing.JLabel(); + updateInform = new javax.swing.JRadioButton(); + updateDownload = new javax.swing.JRadioButton(); + updateDownloadRestart = new javax.swing.JRadioButton(); + checkUpdates = new javax.swing.JToggleButton(); + updateNow = new javax.swing.JToggleButton(); + advancedUpdateConfig = new javax.swing.JToggleButton(); + tunnelPanel = new javax.swing.JPanel(); + clientFrame = new javax.swing.JScrollPane(); + clientTable = new javax.swing.JTable(); + serverFrame = new javax.swing.JScrollPane(); + serverTable = new javax.swing.JTable(); + tunnelsExplanation = new javax.swing.JLabel(); + clientTunnelLabel = new javax.swing.JLabel(); + serverTunnelLabel = new javax.swing.JLabel(); + networkPanel = new javax.swing.JPanel(); + advancedPanel = new javax.swing.JPanel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setName("Form"); // NOI18N + + applyPanel.setName("applyPanel"); // NOI18N + + cancel.setText(resourceMap.getString("cancel.text")); // NOI18N + cancel.setName("cancel"); // NOI18N + cancel.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + cancelMouseClicked(evt); + } + }); + + ok.setText(resourceMap.getString("ok.text")); // NOI18N + ok.setName("ok"); // NOI18N + ok.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + okMouseClicked(evt); + } + }); + + javax.swing.GroupLayout applyPanelLayout = new javax.swing.GroupLayout(applyPanel); + applyPanel.setLayout(applyPanelLayout); + applyPanelLayout.setHorizontalGroup( + applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, applyPanelLayout.createSequentialGroup() + .addContainerGap(475, Short.MAX_VALUE) + .addComponent(ok) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cancel) + .addContainerGap()) + ); + applyPanelLayout.setVerticalGroup( + applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(applyPanelLayout.createSequentialGroup() + .addGroup(applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cancel) + .addComponent(ok)) + .addContainerGap(14, Short.MAX_VALUE)) + ); + + settingsPanel.setName("settingsPanel"); // NOI18N + + speedPanel.setName("speedPanel"); // NOI18N + speedPanel.setLayout(null); + + uploadSpeedLabel.setText(resourceMap.getString("uploadSpeedLabel.text")); // NOI18N + uploadSpeedLabel.setName("uploadSpeedLabel"); // NOI18N + speedPanel.add(uploadSpeedLabel); + uploadSpeedLabel.setBounds(20, 20, 140, 30); + + downloadSpeedLabel.setText(resourceMap.getString("downloadSpeedLabel.text")); // NOI18N + downloadSpeedLabel.setName("downloadSpeedLabel"); // NOI18N + speedPanel.add(downloadSpeedLabel); + downloadSpeedLabel.setBounds(20, 60, 140, 30); + + uploadspeed.setText(resourceMap.getString("uploadspeed.text")); // NOI18N + uploadspeed.setName("uploadspeed"); // NOI18N + uploadspeed.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + speedKeyReleased(evt); + } + }); + speedPanel.add(uploadspeed); + uploadspeed.setBounds(160, 20, 77, 27); + + downloadspeed.setText(resourceMap.getString("downloadspeed.text")); // NOI18N + downloadspeed.setName("downloadspeed"); // NOI18N + downloadspeed.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + speedKeyReleased(evt); + } + }); + speedPanel.add(downloadspeed); + downloadspeed.setBounds(160, 60, 77, 27); + + uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + uploadkbps.setName("uploadkbps"); // NOI18N + uploadkbps.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + uploadkbpsActionPerformed(evt); + } + }); + speedPanel.add(uploadkbps); + uploadkbps.setBounds(240, 20, 68, 27); + + downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + downloadkbps.setName("downloadkbps"); // NOI18N + downloadkbps.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + downloadkbpsActionPerformed(evt); + } + }); + speedPanel.add(downloadkbps); + downloadkbps.setBounds(240, 60, 68, 27); + + uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N + uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N + speedPanel.add(uploadUsageLabel); + uploadUsageLabel.setBounds(330, 20, 97, 30); + + downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N + downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N + speedPanel.add(downloadUsageLabel); + downloadUsageLabel.setBounds(330, 60, 97, 30); + + uploadgb.setText(resourceMap.getString("uploadgb.text")); // NOI18N + uploadgb.setName("uploadgb"); // NOI18N + uploadgb.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + monthKeyReleased(evt); + } + }); + speedPanel.add(uploadgb); + uploadgb.setBounds(440, 20, 60, 27); + + downloadgb.setText(resourceMap.getString("downloadgb.text")); // NOI18N + downloadgb.setName("downloadgb"); // NOI18N + downloadgb.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + monthKeyReleased(evt); + } + }); + speedPanel.add(downloadgb); + downloadgb.setBounds(440, 60, 60, 27); + + gbUploadLabel.setText(resourceMap.getString("gbUploadLabel.text")); // NOI18N + gbUploadLabel.setName("gbUploadLabel"); // NOI18N + speedPanel.add(gbUploadLabel); + gbUploadLabel.setBounds(510, 20, 19, 30); + + gbDownloadLabel.setText(resourceMap.getString("gbDownloadLabel.text")); // NOI18N + gbDownloadLabel.setName("gbDownloadLabel"); // NOI18N + speedPanel.add(gbDownloadLabel); + gbDownloadLabel.setBounds(510, 60, 19, 30); + + uploadDownloadExplanation.setText(resourceMap.getString("uploadDownloadExplanation.text")); // NOI18N + uploadDownloadExplanation.setName("uploadDownloadExplanation"); // NOI18N + speedPanel.add(uploadDownloadExplanation); + uploadDownloadExplanation.setBounds(20, 100, 520, 70); + + settingsPanel.addTab(resourceMap.getString("speedPanel.TabConstraints.tabTitle"), speedPanel); // NOI18N + + updatesPanel.setName("updatesPanel"); // NOI18N + + updateMethod.setText(resourceMap.getString("updateMethod.text")); // NOI18N + updateMethod.setName("updateMethod"); // NOI18N + + updateButtonGroup.add(updateInform); + updateInform.setText(resourceMap.getString("updateInform.text")); // NOI18N + updateInform.setName("updateInform"); // NOI18N + + updateButtonGroup.add(updateDownload); + updateDownload.setText(resourceMap.getString("updateDownload.text")); // NOI18N + updateDownload.setName("updateDownload"); // NOI18N + + updateButtonGroup.add(updateDownloadRestart); + updateDownloadRestart.setText(resourceMap.getString("updateDownloadRestart.text")); // NOI18N + updateDownloadRestart.setName("updateDownloadRestart"); // NOI18N + + checkUpdates.setText(resourceMap.getString("checkUpdates.text")); // NOI18N + checkUpdates.setName("checkUpdates"); // NOI18N + checkUpdates.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + checkUpdatesActionPerformed(evt); + } + }); + + updateNow.setText(resourceMap.getString("updateNow.text")); // NOI18N + updateNow.setName("updateNow"); // NOI18N + updateNow.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + updateNowActionPerformed(evt); + } + }); + + advancedUpdateConfig.setText(resourceMap.getString("advancedUpdateConfig.text")); // NOI18N + advancedUpdateConfig.setName("advancedUpdateConfig"); // NOI18N + advancedUpdateConfig.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + advancedUpdateConfigActionPerformed(evt); + } + }); + + javax.swing.GroupLayout updatesPanelLayout = new javax.swing.GroupLayout(updatesPanel); + updatesPanel.setLayout(updatesPanelLayout); + updatesPanelLayout.setHorizontalGroup( + updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(updatesPanelLayout.createSequentialGroup() + .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(updatesPanelLayout.createSequentialGroup() + .addGap(20, 20, 20) + .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(updateMethod) + .addGroup(updatesPanelLayout.createSequentialGroup() + .addComponent(checkUpdates) + .addGap(18, 18, 18) + .addComponent(updateNow)))) + .addGroup(updatesPanelLayout.createSequentialGroup() + .addGap(40, 40, 40) + .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(updateInform, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE) + .addComponent(updateDownload, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(updateDownloadRestart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addContainerGap()) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatesPanelLayout.createSequentialGroup() + .addContainerGap(339, Short.MAX_VALUE) + .addComponent(advancedUpdateConfig) + .addContainerGap()) + ); + updatesPanelLayout.setVerticalGroup( + updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(updatesPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(updateMethod) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(updateInform) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(updateDownload) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(updateDownloadRestart) + .addGap(18, 18, 18) + .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(checkUpdates) + .addComponent(updateNow)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE) + .addComponent(advancedUpdateConfig) + .addContainerGap()) + ); + + settingsPanel.addTab(resourceMap.getString("updatesPanel.TabConstraints.tabTitle"), updatesPanel); // NOI18N + + tunnelPanel.setName("tunnelPanel"); // NOI18N + + clientFrame.setName("clientFrame"); // NOI18N + + clientTable.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + + }, + new String [] { + "Name", "Type", "Address", "Status" + } + )); + clientTable.setName("clientTable"); // NOI18N + clientTable.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + clientTableMouseClicked(evt); + } + }); + clientFrame.setViewportView(clientTable); + clientTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("clientTable.columnModel.title0")); // NOI18N + clientTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("clientTable.columnModel.title1")); // NOI18N + clientTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("clientTable.columnModel.title2")); // NOI18N + clientTable.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("clientTable.columnModel.title3")); // NOI18N + + serverFrame.setName("serverFrame"); // NOI18N + + serverTable.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null} + }, + new String [] { + "Name", "Address", "Status" + } + )); + serverTable.setName("serverTable"); // NOI18N + serverTable.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + serverTableMouseClicked(evt); + } + }); + serverFrame.setViewportView(serverTable); + serverTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("serverTable.columnModel.title0")); // NOI18N + serverTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("serverTable.columnModel.title1")); // NOI18N + serverTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("serverTable.columnModel.title2")); // NOI18N + + tunnelsExplanation.setText(resourceMap.getString("tunnelsExplanation.text")); // NOI18N + tunnelsExplanation.setName("tunnelsExplanation"); // NOI18N + + clientTunnelLabel.setText(resourceMap.getString("clientTunnelLabel.text")); // NOI18N + clientTunnelLabel.setName("clientTunnelLabel"); // NOI18N + + serverTunnelLabel.setText(resourceMap.getString("serverTunnelLabel.text")); // NOI18N + serverTunnelLabel.setName("serverTunnelLabel"); // NOI18N + + javax.swing.GroupLayout tunnelPanelLayout = new javax.swing.GroupLayout(tunnelPanel); + tunnelPanel.setLayout(tunnelPanelLayout); + tunnelPanelLayout.setHorizontalGroup( + tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, tunnelPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(tunnelsExplanation, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) + .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) + .addComponent(clientTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(clientFrame, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) + .addComponent(serverTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING)) + .addContainerGap()) + ); + tunnelPanelLayout.setVerticalGroup( + tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(tunnelPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(clientTunnelLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(clientFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(serverTunnelLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 122, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(tunnelsExplanation, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(32, 32, 32)) + ); + + settingsPanel.addTab(resourceMap.getString("tunnelPanel.TabConstraints.tabTitle"), tunnelPanel); // NOI18N + + networkPanel.setName("networkPanel"); // NOI18N + + javax.swing.GroupLayout networkPanelLayout = new javax.swing.GroupLayout(networkPanel); + networkPanel.setLayout(networkPanelLayout); + networkPanelLayout.setHorizontalGroup( + networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 562, Short.MAX_VALUE) + ); + networkPanelLayout.setVerticalGroup( + networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 388, Short.MAX_VALUE) + ); + + settingsPanel.addTab(resourceMap.getString("networkPanel.TabConstraints.tabTitle"), networkPanel); // NOI18N + + advancedPanel.setName("advancedPanel"); // NOI18N + + javax.swing.GroupLayout advancedPanelLayout = new javax.swing.GroupLayout(advancedPanel); + advancedPanel.setLayout(advancedPanelLayout); + advancedPanelLayout.setHorizontalGroup( + advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 562, Short.MAX_VALUE) + ); + advancedPanelLayout.setVerticalGroup( + advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 388, Short.MAX_VALUE) + ); + + settingsPanel.addTab(resourceMap.getString("advancedPanel.TabConstraints.tabTitle"), advancedPanel); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(applyPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGap(12, 12, 12) + .addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(settingsPanel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(applyPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + + pack(); + }// </editor-fold>//GEN-END:initComponents + + private void speedKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyReleased + try { + String upload = ""; + if(uploadkbps.getSelectedIndex() == KILOBIT) + upload = "" + Integer.parseInt(uploadspeed.getText())/8; + else + upload = uploadspeed.getText(); + String download = ""; + if(downloadkbps.getSelectedIndex() == KILOBIT) + download = "" + Integer.parseInt(downloadspeed.getText())/8; + else + download = downloadspeed.getText(); + initUsage(upload, download); + } + catch(NumberFormatException e) { + e.printStackTrace(); + return; + } +}//GEN-LAST:event_speedKeyReleased + +private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed + kbpsSwitchPerformed(uploadkbps, uploadspeed); +}//GEN-LAST:event_uploadkbpsActionPerformed + +private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed + kbpsSwitchPerformed(downloadkbps, downloadspeed); +}//GEN-LAST:event_downloadkbpsActionPerformed + +private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased + try { + int uploadMonthValue = Integer.parseInt(uploadgb.getText()); + int downloadMonthValue = Integer.parseInt(downloadgb.getText()); + + String upload = ""; + String burstUpload = ""; + String download = ""; + String burstDownload = ""; + + if(uploadkbps.getSelectedIndex() == KILOBIT) + upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit + else + upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte + + if(downloadkbps.getSelectedIndex() == KILOBIT) + download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit + else + download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte + + initSpeeds(upload, download); + } + catch(NumberFormatException e) { + e.printStackTrace(); + return; + } +}//GEN-LAST:event_monthKeyReleased + +private void cancelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelMouseClicked + this.dispose(); +}//GEN-LAST:event_cancelMouseClicked + +private void okMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okMouseClicked + saveSpeeds(); + saveUpdatePolicy(); + this.dispose(); +}//GEN-LAST:event_okMouseClicked + +private void checkUpdatesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkUpdatesActionPerformed + long current = new Date().getTime(); + if(current < newsLastFetched + 5*60*1000) { + return; + } + checkUpdates.setText("Checking for updates"); + checkUpdates.setEnabled(false); + newsLastFetched = current; + SwingWorker sw = new SwingWorker() { + + @Override + protected Object doInBackground() throws Exception { + NewsFetcher.getInstance(RouterHelper.getContext()).fetchNews(); + return null; + } + + @Override + protected void done() { + checkUpdates.setText("Check for updates now"); + checkUpdates.setEnabled(true); + if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) { + updateNow.setVisible(true); + } + } + + }; +}//GEN-LAST:event_checkUpdatesActionPerformed + +private void updateNowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateNowActionPerformed + SwingWorker sw = new SwingWorker() { + + @Override + protected Object doInBackground() throws Exception { + new net.i2p.router.web.UpdateHandler().update(); + return null; + } + + }; + updateNow.setEnabled(false); + updateNow.setText("Updating..."); + checkUpdates.setEnabled(false); + +}//GEN-LAST:event_updateNowActionPerformed + +private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_advancedUpdateConfigActionPerformed + try { + Desktop.getDesktop().browse(new URI("http://127.0.0.1:7657/configupdate.jsp")); + } catch (URISyntaxException ex) { + Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex); + } + catch (IOException ex) { + Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex); + } +}//GEN-LAST:event_advancedUpdateConfigActionPerformed + +private void clientTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_clientTableMouseClicked + int row = clientTable.getSelectedRow(); + if(row == -1) { //No selected row + return; + } + else { + IndexBean bean = new IndexBean(); + /* + * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong + */ + int clientNumber = 0; + int i = 0; + for(clientNumber=0; clientNumber<bean.getTunnelCount(); clientNumber++) { + if(bean.isClient(clientNumber)) { + if(i == row) { + break; + } + i++; + } + } + new ClientTunnelWindow(clientNumber, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + initTunnelTab(); + } + + }); + } +}//GEN-LAST:event_clientTableMouseClicked + +private void serverTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_serverTableMouseClicked + int row = serverTable.getSelectedRow(); + if(row == -1) { //No selected row + return; + } + else { + IndexBean bean = new IndexBean(); + /* + * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong + */ + int serverNumber = 0; + int i = 0; + for(serverNumber=0; serverNumber<bean.getTunnelCount(); serverNumber++) { + if(!bean.isClient(serverNumber)) { + if(i == row) { + break; + } + i++; + } + } + new ServerTunnelWindow(serverNumber, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + initTunnelTab(); + } + + }); + } +}//GEN-LAST:event_serverTableMouseClicked + + protected void initUsage(String upload, String download) { + uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload))); + downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download))); + } + + protected void initSpeeds(String upload, String download) { + uploadspeed.setText(upload); + downloadspeed.setText(download); + } + + private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) { + int index = kbps.getSelectedIndex(); + int previous = Integer.parseInt(speed.getText()); + if(index == KILOBIT) { + speed.setText("" + previous*8); + } + else { + speed.setText("" + previous/8); + } + } + + protected void saveSpeeds() { + int maxDownload = Integer.parseInt(downloadspeed.getText()); + int maxUpload = Integer.parseInt(uploadspeed.getText()); + if(uploadkbps.getSelectedIndex() == KILOBIT) { + SpeedHandler.setOutboundBandwidth(maxUpload/8); + SpeedHandler.setOutboundBurstBandwidth(maxUpload/8); + } + else { + SpeedHandler.setOutboundBandwidth(maxUpload); + SpeedHandler.setOutboundBurstBandwidth(maxUpload); + } + if(downloadkbps.getSelectedIndex() == KILOBIT) { + SpeedHandler.setInboundBandwidth(maxDownload/8); + SpeedHandler.setInboundBurstBandwidth(maxDownload/8); + } + else { + SpeedHandler.setInboundBandwidth(maxDownload); + SpeedHandler.setInboundBurstBandwidth(maxDownload); + } + } + + protected void saveUpdatePolicy() { + ButtonModel policyButton = updateButtonGroup.getSelection(); + if(policyButton.equals(updateInform.getModel())) { + UpdateHandler.setUpdatePolicy(UpdateHelper.NOTIFY_UPDATE_POLICY); + } + else if(policyButton.equals(updateDownload.getModel())) { + UpdateHandler.setUpdatePolicy(UpdateHelper.DOWNLOAD_UPDATE_POLICY); + } + else if(policyButton.equals(updateDownloadRestart.getModel())) { + UpdateHandler.setUpdatePolicy(UpdateHelper.INSTALL_UPDATE_POLICY); + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel advancedPanel; + private javax.swing.JToggleButton advancedUpdateConfig; + private javax.swing.JPanel applyPanel; + private javax.swing.JToggleButton cancel; + private javax.swing.JToggleButton checkUpdates; + private javax.swing.JScrollPane clientFrame; + private javax.swing.JTable clientTable; + private javax.swing.JLabel clientTunnelLabel; + private javax.swing.JLabel downloadSpeedLabel; + private javax.swing.JLabel downloadUsageLabel; + private javax.swing.JTextField downloadgb; + private javax.swing.JComboBox downloadkbps; + private javax.swing.JTextField downloadspeed; + private javax.swing.JLabel gbDownloadLabel; + private javax.swing.JLabel gbUploadLabel; + private javax.swing.JPanel networkPanel; + private javax.swing.JToggleButton ok; + private javax.swing.JScrollPane serverFrame; + private javax.swing.JTable serverTable; + private javax.swing.JLabel serverTunnelLabel; + private javax.swing.JTabbedPane settingsPanel; + private javax.swing.JPanel speedPanel; + private javax.swing.JPanel tunnelPanel; + private javax.swing.JLabel tunnelsExplanation; + private javax.swing.ButtonGroup updateButtonGroup; + private javax.swing.JRadioButton updateDownload; + private javax.swing.JRadioButton updateDownloadRestart; + private javax.swing.JRadioButton updateInform; + private javax.swing.JLabel updateMethod; + private javax.swing.JToggleButton updateNow; + private javax.swing.JPanel updatesPanel; + private javax.swing.JLabel uploadDownloadExplanation; + private javax.swing.JLabel uploadSpeedLabel; + private javax.swing.JLabel uploadUsageLabel; + private javax.swing.JTextField uploadgb; + private javax.swing.JComboBox uploadkbps; + private javax.swing.JTextField uploadspeed; + // End of variables declaration//GEN-END:variables + + public static final int KILOBIT = 0; + public static final int KILOBYTE = 1; + + private long newsLastFetched = 0; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java new file mode 100644 index 000000000..1f62df2c2 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java @@ -0,0 +1,185 @@ +/* +* Created on Sep 15, 2008 5:51:33 PM +*/ + +/* + * This class is part of fishfarm project: https://fishfarm.dev.java.net/ + * It is licensed under the GPL version 2.0 with Classpath Exception. + * + * Copyright (C) 2008 Michael Bien + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +package net.i2p.desktopgui.gui; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GraphicsEnvironment; +import java.awt.Image; +import java.awt.Point; +import java.awt.PopupMenu; +import java.awt.TrayIcon; +import java.awt.Window; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.JDialog; +import javax.swing.JPopupMenu; +import javax.swing.JWindow; +import javax.swing.RootPaneContainer; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import java.util.Date; + + + +/** + * JPopupMenu compatible TrayIcon based on Alexander Potochkin's JXTrayIcon + * (http://weblogs.java.net/blog/alexfromsun/archive/2008/02/jtrayicon_updat.html) + * but uses a JWindow instead of a JDialog to workaround some bugs on linux. + * + * @author Michael Bien + */ +public class JPopupTrayIcon extends TrayIcon { + + private JPopupMenu menu; + + private Window window; + private PopupMenuListener popupListener; + + private final static boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows"); + + private static MouseEvent previous = null; + private static Date previousTime = new Date(); + private static Date time = new Date(); + + public JPopupTrayIcon(Image image) { + super(image); + init(); + } + + public JPopupTrayIcon(Image image, String tooltip) { + super(image, tooltip); + init(); + } + + public JPopupTrayIcon(Image image, String tooltip, PopupMenu popup) { + super(image, tooltip, popup); + init(); + } + + public JPopupTrayIcon(Image image, String tooltip, JPopupMenu popup) { + super(image, tooltip); + init(); + setJPopupMenu(popup); + } + + + private final void init() { + + + popupListener = new PopupMenuListener() { + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + //System.out.println("popupMenuWillBecomeVisible"); + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + //System.out.println("popupMenuWillBecomeInvisible"); + if(window != null) { + window.dispose(); + window = null; + } + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { +// System.out.println("popupMenuCanceled"); + if(window != null) { + window.dispose(); + window = null; + } + } + }; + + addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + //System.out.println("Pressed " + e.getPoint()); + showJPopupMenu(e, previous); + previous = e; + previousTime = time; + time = new Date(); + } + + @Override + public void mouseReleased(MouseEvent e) { + //System.out.println("Released " + e.getPoint()); + showJPopupMenu(e, previous); + previous = e; + previousTime = time; + time = new Date(); + } + }); + + } + + private final void showJPopupMenu(MouseEvent e, MouseEvent previous) { + if((e.isPopupTrigger() || previous.isPopupTrigger()) && (time.getTime() - previousTime.getTime() < 1000) && menu != null) { + if (window == null) { + + if(IS_WINDOWS) { + window = new JDialog((Frame)null); + ((JDialog)window).setUndecorated(true); + }else{ + window = new JWindow((Frame)null); + } + window.setAlwaysOnTop(true); + Dimension size = menu.getPreferredSize(); + + Point centerPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint(); + if(e.getY() > centerPoint.getY()) + window.setLocation(e.getX(), e.getY() - size.height); + else + window.setLocation(e.getX(), e.getY()); + + window.setVisible(true); + + menu.show(((RootPaneContainer)window).getContentPane(), 0, 0); + + // popup works only for focused windows + window.toFront(); + + } + } + } + + + public final JPopupMenu getJPopupMenu() { + return menu; + } + + public final void setJPopupMenu(JPopupMenu menu) { + if (this.menu != null) { + this.menu.removePopupMenuListener(popupListener); + } + this.menu = menu; + menu.addPopupMenuListener(popupListener); + } + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form new file mode 100644 index 000000000..ed2441319 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> + <Properties> + <Property name="defaultCloseOperation" type="int" value="3"/> + <Property name="title" type="java.lang.String" resourceKey="Form.title"/> + <Property name="name" type="java.lang.String" value="Form" noResource="true"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + </AuxValues> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace min="12" pref="12" max="12" attributes="0"/> + <Component id="explanationText" min="-2" pref="561" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + </Group> + <Component id="textScroll" alignment="1" pref="722" max="32767" attributes="0"/> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace max="-2" attributes="0"/> + <Component id="refreshButton" min="-2" max="-2" attributes="0"/> + <EmptySpace type="separate" max="-2" attributes="0"/> + <Component id="clearButton" min="-2" max="-2" attributes="0"/> + <EmptySpace pref="587" max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + <DimensionLayout dim="1"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace min="-2" max="-2" attributes="0"/> + <Component id="explanationText" min="-2" pref="45" max="-2" attributes="0"/> + <EmptySpace type="unrelated" max="-2" attributes="0"/> + <Group type="103" groupAlignment="3" attributes="0"> + <Component id="refreshButton" alignment="3" min="-2" max="-2" attributes="0"/> + <Component id="clearButton" alignment="3" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace min="-2" pref="14" max="-2" attributes="0"/> + <Component id="textScroll" pref="330" max="32767" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Container class="javax.swing.JScrollPane" name="textScroll"> + <Properties> + <Property name="name" type="java.lang.String" value="textScroll" noResource="true"/> + </Properties> + <AuxValues> + <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> + <SubComponents> + <Component class="javax.swing.JTextArea" name="logText"> + <Properties> + <Property name="columns" type="int" value="20"/> + <Property name="rows" type="int" value="5"/> + <Property name="name" type="java.lang.String" value="logText" noResource="true"/> + </Properties> + </Component> + </SubComponents> + </Container> + <Component class="javax.swing.JLabel" name="explanationText"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="explanationText.text"/> + <Property name="name" type="java.lang.String" value="explanationText" noResource="true"/> + </Properties> + </Component> + <Component class="javax.swing.JButton" name="refreshButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="refreshButton.text"/> + <Property name="name" type="java.lang.String" value="refreshButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="refreshButtonActionPerformed"/> + </Events> + </Component> + <Component class="javax.swing.JButton" name="clearButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="clearButton.text"/> + <Property name="name" type="java.lang.String" value="clearButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearButtonActionPerformed"/> + </Events> + </Component> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java new file mode 100644 index 000000000..1edf85b3b --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java @@ -0,0 +1,164 @@ +/* + * LogViewer.java + * + * Created on 10 april 2009, 19:17 + */ + +package net.i2p.desktopgui.gui; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.WindowConstants; + +/** + * + * @author mathias + */ +public class LogViewer extends javax.swing.JFrame { + + /** Creates new form LogViewer */ + public LogViewer() { + initComponents(); + readLogText(); + this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + this.setVisible(true); + } + + private void readLogText() { + Thread t = new Thread(new Runnable() { + + @Override + public void run() { + String s = ""; + File f = new File(LOGLOCATION); + if(f.exists()) { + try { + BufferedReader br = new BufferedReader(new FileReader(f)); + while(true) { + String line = br.readLine(); + if(line != null) + s += JTEXTNEWLINE + line; + else + break; + } + } + catch(Exception e) { + s = "An error has occurred while loading the logfiles:" + JTEXTNEWLINE + e.getMessage(); + } + } + logText.setText(s); + } + + }); + t.start(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + textScroll = new javax.swing.JScrollPane(); + logText = new javax.swing.JTextArea(); + explanationText = new javax.swing.JLabel(); + refreshButton = new javax.swing.JButton(); + clearButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(LogViewer.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setName("Form"); // NOI18N + + textScroll.setName("textScroll"); // NOI18N + + logText.setColumns(20); + logText.setRows(5); + logText.setName("logText"); // NOI18N + textScroll.setViewportView(logText); + + explanationText.setText(resourceMap.getString("explanationText.text")); // NOI18N + explanationText.setName("explanationText"); // NOI18N + + refreshButton.setText(resourceMap.getString("refreshButton.text")); // NOI18N + refreshButton.setName("refreshButton"); // NOI18N + refreshButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + refreshButtonActionPerformed(evt); + } + }); + + clearButton.setText(resourceMap.getString("clearButton.text")); // NOI18N + clearButton.setName("clearButton"); // NOI18N + clearButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + clearButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(12, 12, 12) + .addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 561, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + .addComponent(textScroll, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 722, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(refreshButton) + .addGap(18, 18, 18) + .addComponent(clearButton) + .addContainerGap(587, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(refreshButton) + .addComponent(clearButton)) + .addGap(14, 14, 14) + .addComponent(textScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 330, Short.MAX_VALUE)) + ); + + pack(); + }// </editor-fold>//GEN-END:initComponents + +private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed + File f = new File(LOGLOCATION); + f.delete(); + try { + f.createNewFile();//GEN-LAST:event_clearButtonActionPerformed + } catch (IOException ex) { + Logger.getLogger(LogViewer.class.getName()).log(Level.SEVERE, null, ex); + } + readLogText(); +} + +private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed + readLogText(); +}//GEN-LAST:event_refreshButtonActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton clearButton; + private javax.swing.JLabel explanationText; + private javax.swing.JTextArea logText; + private javax.swing.JButton refreshButton; + private javax.swing.JScrollPane textScroll; + // End of variables declaration//GEN-END:variables + + private static final String LOGLOCATION = "wrapper.log"; + private static final String JTEXTNEWLINE = "\n"; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form new file mode 100644 index 000000000..303f49a7f --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> + <Properties> + <Property name="defaultCloseOperation" type="int" value="3"/> + <Property name="name" type="java.lang.String" value="Form" noResource="true"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> + <Property name="useNullLayout" type="boolean" value="true"/> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="jLabel1"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/> + <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="10" y="10" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java new file mode 100644 index 000000000..765210148 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java @@ -0,0 +1,60 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * ServerTunnelWindow.java + * + * Created on 11-jun-2009, 14:55:53 + */ + +package net.i2p.desktopgui.gui; + +import java.awt.event.ActionListener; + +/** + * + * @author mathias + */ +public class ServerTunnelWindow extends javax.swing.JFrame { + + /** Creates new form ServerTunnelWindow */ + public ServerTunnelWindow(int tunnelNumber, ActionListener al) { + initComponents(); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setSize(600, 600); + this.setLocationRelativeTo(null); + this.requestFocus(); + this.setVisible(true); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setName("Form"); // NOI18N + getContentPane().setLayout(null); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ServerTunnelWindow.class); + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + getContentPane().add(jLabel1); + jLabel1.setBounds(10, 10, 43, 17); + + pack(); + }// </editor-fold>//GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form new file mode 100644 index 000000000..5ee7b94ac --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form @@ -0,0 +1,179 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> + <Properties> + <Property name="defaultCloseOperation" type="int" value="2"/> + <Property name="title" type="java.lang.String" resourceKey="Form.title"/> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[610, 330]"/> + </Property> + <Property name="name" type="java.lang.String" value="Form" noResource="true"/> + <Property name="resizable" type="boolean" value="false"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,56,0,0,2,102"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> + <Property name="useNullLayout" type="boolean" value="true"/> + </Layout> + <SubComponents> + <Component class="javax.swing.JButton" name="nextButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="nextButton.text"/> + <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[72, 29]"/> + </Property> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[72, 29]"/> + </Property> + <Property name="name" type="java.lang.String" value="nextButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="440" y="250" width="90" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="uploadLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/> + <Property name="name" type="java.lang.String" value="uploadLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="60" width="-1" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="downloadLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/> + <Property name="name" type="java.lang.String" value="downloadLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="110" width="-1" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="uploadChoice"> + <Properties> + <Property name="editable" type="boolean" value="true"/> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="11"> + <StringItem index="0" value="100"/> + <StringItem index="1" value="200"/> + <StringItem index="2" value="500"/> + <StringItem index="3" value="1000"/> + <StringItem index="4" value="2000"/> + <StringItem index="5" value="4000"/> + <StringItem index="6" value="8000"/> + <StringItem index="7" value="10000"/> + <StringItem index="8" value="20000"/> + <StringItem index="9" value="50000"/> + <StringItem index="10" value="100000"/> + </StringArray> + </Property> + <Property name="selectedIndex" type="int" value="3"/> + <Property name="name" type="java.lang.String" value="uploadChoice" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="300" y="60" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="downloadChoice"> + <Properties> + <Property name="editable" type="boolean" value="true"/> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="11"> + <StringItem index="0" value="100"/> + <StringItem index="1" value="200"/> + <StringItem index="2" value="500"/> + <StringItem index="3" value="1000"/> + <StringItem index="4" value="2000"/> + <StringItem index="5" value="4000"/> + <StringItem index="6" value="8000"/> + <StringItem index="7" value="10000"/> + <StringItem index="8" value="20000"/> + <StringItem index="9" value="50000"/> + <StringItem index="10" value="100000"/> + </StringArray> + </Property> + <Property name="selectedIndex" type="int" value="3"/> + <Property name="name" type="java.lang.String" value="downloadChoice" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="300" y="110" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="speedExplanation"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="speedExplanation.text"/> + <Property name="name" type="java.lang.String" value="speedExplanation" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="160" width="570" height="60"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="uploadkbps"> + <Properties> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="2"> + <StringItem index="0" value="kbps"/> + <StringItem index="1" value="kBps"/> + </StringArray> + </Property> + <Property name="name" type="java.lang.String" value="uploadKbit" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="470" y="60" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="downloadkbps"> + <Properties> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="2"> + <StringItem index="0" value="kbps"/> + <StringItem index="1" value="kBps"/> + </StringArray> + </Property> + <Property name="name" type="java.lang.String" value="downloadKbit" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="470" y="110" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java new file mode 100644 index 000000000..335812e2a --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java @@ -0,0 +1,194 @@ +/* + * ProfileSelector.java + * + * Created on 3 april 2009, 13:57 + */ + +package net.i2p.desktopgui.gui; + +import java.awt.Point; +import java.util.Properties; +import javax.swing.JComboBox; +import javax.swing.JTextField; +import net.i2p.desktopgui.persistence.PropertyManager; +import net.i2p.desktopgui.util.IntegerVerifier; + +/** + * + * @author mathias + */ +public class SpeedSelector extends javax.swing.JFrame { + + /** Creates new form ProfileSelector */ + public SpeedSelector() { + this.props = PropertyManager.getProps(); + initComponents(); + initComponentsCustom(); + initSpeeds(props); + this.setVisible(true); + this.setLocationRelativeTo(null); + this.requestFocus(); + } + + public SpeedSelector(Point point) { + this(); + this.setLocation(point); + } + + public void initComponentsCustom() { + ((JTextField)uploadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier()); + ((JTextField)downloadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier()); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + nextButton = new javax.swing.JButton(); + uploadLabel = new javax.swing.JLabel(); + downloadLabel = new javax.swing.JLabel(); + uploadChoice = new javax.swing.JComboBox(); + downloadChoice = new javax.swing.JComboBox(); + speedExplanation = new javax.swing.JLabel(); + uploadkbps = new javax.swing.JComboBox(); + downloadkbps = new javax.swing.JComboBox(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setMinimumSize(new java.awt.Dimension(610, 330)); + setName("Form"); // NOI18N + setResizable(false); + getContentPane().setLayout(null); + + nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N + nextButton.setMaximumSize(new java.awt.Dimension(72, 29)); + nextButton.setMinimumSize(new java.awt.Dimension(72, 29)); + nextButton.setName("nextButton"); // NOI18N + nextButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + nextButtonMouseClicked(evt); + } + }); + getContentPane().add(nextButton); + nextButton.setBounds(440, 250, 90, 29); + + uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N + uploadLabel.setName("uploadLabel"); // NOI18N + getContentPane().add(uploadLabel); + uploadLabel.setBounds(20, 60, 246, 30); + + downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N + downloadLabel.setName("downloadLabel"); // NOI18N + getContentPane().add(downloadLabel); + downloadLabel.setBounds(20, 110, 263, 30); + + uploadChoice.setEditable(true); + uploadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" })); + uploadChoice.setSelectedIndex(3); + uploadChoice.setName("uploadChoice"); // NOI18N + getContentPane().add(uploadChoice); + uploadChoice.setBounds(300, 60, 154, 27); + + downloadChoice.setEditable(true); + downloadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" })); + downloadChoice.setSelectedIndex(3); + downloadChoice.setName("downloadChoice"); // NOI18N + getContentPane().add(downloadChoice); + downloadChoice.setBounds(300, 110, 154, 27); + + speedExplanation.setText(resourceMap.getString("speedExplanation.text")); // NOI18N + speedExplanation.setName("speedExplanation"); // NOI18N + getContentPane().add(speedExplanation); + speedExplanation.setBounds(20, 160, 570, 60); + + uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + uploadkbps.setName("uploadKbit"); // NOI18N + uploadkbps.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + uploadkbpsActionPerformed(evt); + } + }); + getContentPane().add(uploadkbps); + uploadkbps.setBounds(470, 60, 68, 27); + + downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + downloadkbps.setName("downloadKbit"); // NOI18N + downloadkbps.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + downloadkbpsActionPerformed(evt); + } + }); + getContentPane().add(downloadkbps); + downloadkbps.setBounds(470, 110, 68, 27); + + pack(); + }// </editor-fold>//GEN-END:initComponents + +private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked + if(uploadkbps.getSelectedIndex() == KILOBIT) + props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, uploadChoice.getSelectedItem().toString()); + else + props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "" + Integer.parseInt(uploadChoice.getSelectedItem().toString())*8); + if(downloadkbps.getSelectedIndex() == KILOBIT) + props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, downloadChoice.getSelectedItem().toString()); + else + props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "" + Integer.parseInt(downloadChoice.getSelectedItem().toString())*8); + PropertyManager.saveProps(props); + new SpeedSelector2(this.getLocationOnScreen()); + this.dispose(); +}//GEN-LAST:event_nextButtonMouseClicked + +private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed + kbpsSwitchPerformed(uploadkbps, uploadChoice); +}//GEN-LAST:event_uploadkbpsActionPerformed + +private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed + kbpsSwitchPerformed(downloadkbps, downloadChoice); +}//GEN-LAST:event_downloadkbpsActionPerformed + +private void kbpsSwitchPerformed(JComboBox kbps, JComboBox speed) { + int index = kbps.getSelectedIndex(); + int previous = Integer.parseInt(speed.getSelectedItem().toString()); + if(index == KILOBIT) { + speed.setSelectedItem("" + previous*8); + } + else { + speed.setSelectedItem("" + previous/8); + } +} + +private void initSpeeds(Properties props) { + String up = props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE); + String down = props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE); + + if(up == null) + props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "1000"); + if(down == null) + props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "1000"); + + uploadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE)); + downloadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE)); +} + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JComboBox downloadChoice; + private javax.swing.JLabel downloadLabel; + private javax.swing.JComboBox downloadkbps; + private javax.swing.JButton nextButton; + private javax.swing.JLabel speedExplanation; + private javax.swing.JComboBox uploadChoice; + private javax.swing.JLabel uploadLabel; + private javax.swing.JComboBox uploadkbps; + // End of variables declaration//GEN-END:variables + + Properties props; + private static final int KILOBIT = 0; + private static final int KILOBYTE = 1; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form new file mode 100644 index 000000000..54f5fa726 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form @@ -0,0 +1,118 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> + <NonVisualComponents> + <Component class="javax.swing.ButtonGroup" name="buttonGroup1"> + </Component> + </NonVisualComponents> + <Properties> + <Property name="defaultCloseOperation" type="int" value="2"/> + <Property name="title" type="java.lang.String" resourceKey="Form.title"/> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[610, 330]"/> + </Property> + <Property name="name" type="java.lang.String" value="Form" noResource="true"/> + <Property name="resizable" type="boolean" value="false"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,2,105"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> + <Property name="useNullLayout" type="boolean" value="true"/> + </Layout> + <SubComponents> + <Component class="javax.swing.JButton" name="nextButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="nextButton.text"/> + <Property name="name" type="java.lang.String" value="nextButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="440" y="250" width="90" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="returnButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="returnButton.text"/> + <Property name="name" type="java.lang.String" value="returnButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="returnButtonMouseClicked"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="336" y="250" width="90" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="questionLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="questionLabel.text"/> + <Property name="name" type="java.lang.String" value="questionLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="30" y="40" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JRadioButton" name="browseButton"> + <Properties> + <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> + <ComponentRef name="buttonGroup1"/> + </Property> + <Property name="text" type="java.lang.String" resourceKey="browseButton.text"/> + <Property name="actionCommand" type="java.lang.String" resourceKey="browseButton.actionCommand"/> + <Property name="name" type="java.lang.String" value="browseButton" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="40" y="120" width="-1" height="40"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JRadioButton" name="downloadButton"> + <Properties> + <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> + <ComponentRef name="buttonGroup1"/> + </Property> + <Property name="text" type="java.lang.String" resourceKey="downloadButton.text"/> + <Property name="actionCommand" type="java.lang.String" resourceKey="downloadButton.actionCommand"/> + <Property name="name" type="java.lang.String" value="downloadButton" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="40" y="70" width="-1" height="40"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="jLabel1"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/> + <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="30" y="170" width="530" height="70"/> + </Constraint> + </Constraints> + </Component> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java new file mode 100644 index 000000000..772d16918 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java @@ -0,0 +1,159 @@ +/* + * ProfileSelector2.java + * + * Created on 3 april 2009, 14:36 + */ + +package net.i2p.desktopgui.gui; + +import java.awt.Point; +import java.util.Enumeration; +import java.util.Properties; +import javax.swing.AbstractButton; +import net.i2p.desktopgui.persistence.PropertyManager; + +/** + * + * @author mathias + */ +public class SpeedSelector2 extends javax.swing.JFrame { + Properties props; + + /** Creates new form ProfileSelector2 */ + public SpeedSelector2(Point point) { + this.props = PropertyManager.getProps(); + initComponents(); + this.setLocation(point); + loadButtonSelection(); + this.setVisible(true); + this.requestFocus(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + nextButton = new javax.swing.JButton(); + returnButton = new javax.swing.JButton(); + questionLabel = new javax.swing.JLabel(); + browseButton = new javax.swing.JRadioButton(); + downloadButton = new javax.swing.JRadioButton(); + jLabel1 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector2.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setMinimumSize(new java.awt.Dimension(610, 330)); + setName("Form"); // NOI18N + setResizable(false); + getContentPane().setLayout(null); + + nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N + nextButton.setName("nextButton"); // NOI18N + nextButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + nextButtonMouseClicked(evt); + } + }); + getContentPane().add(nextButton); + nextButton.setBounds(440, 250, 90, 29); + + returnButton.setText(resourceMap.getString("returnButton.text")); // NOI18N + returnButton.setName("returnButton"); // NOI18N + returnButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + returnButtonMouseClicked(evt); + } + }); + getContentPane().add(returnButton); + returnButton.setBounds(336, 250, 90, 29); + + questionLabel.setText(resourceMap.getString("questionLabel.text")); // NOI18N + questionLabel.setName("questionLabel"); // NOI18N + getContentPane().add(questionLabel); + questionLabel.setBounds(30, 40, 265, 17); + + buttonGroup1.add(browseButton); + browseButton.setText(resourceMap.getString("browseButton.text")); // NOI18N + browseButton.setActionCommand(resourceMap.getString("browseButton.actionCommand")); // NOI18N + browseButton.setName("browseButton"); // NOI18N + getContentPane().add(browseButton); + browseButton.setBounds(40, 120, 520, 40); + + buttonGroup1.add(downloadButton); + downloadButton.setText(resourceMap.getString("downloadButton.text")); // NOI18N + downloadButton.setActionCommand(resourceMap.getString("downloadButton.actionCommand")); // NOI18N + downloadButton.setName("downloadButton"); // NOI18N + getContentPane().add(downloadButton); + downloadButton.setBounds(40, 70, 499, 40); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + getContentPane().add(jLabel1); + jLabel1.setBounds(30, 170, 530, 70); + + pack(); + }// </editor-fold>//GEN-END:initComponents + +private void returnButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_returnButtonMouseClicked + saveButtonSelection(); + PropertyManager.saveProps(props); + new SpeedSelector(this.getLocationOnScreen()); + this.dispose(); +}//GEN-LAST:event_returnButtonMouseClicked + +private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked + saveButtonSelection(); + PropertyManager.saveProps(props); + new SpeedSelector3(this.getLocationOnScreen(), this.getSize()); + this.dispose(); +}//GEN-LAST:event_nextButtonMouseClicked + +private void loadButtonSelection() { + + Enumeration<AbstractButton> elements = buttonGroup1.getElements(); + while(elements.hasMoreElements()) { + AbstractButton button = elements.nextElement(); + if(button == null) + continue; + if(props.getProperty(SpeedSelectorConstants.USERTYPE) == null) + break; + String type = button.getActionCommand(); + if(type.equals(props.getProperty(SpeedSelectorConstants.USERTYPE))) { + button.setSelected(true); + break; + } + } +} + +private void saveButtonSelection() { + Enumeration<AbstractButton> elements = buttonGroup1.getElements(); + while(elements.hasMoreElements()) { + AbstractButton button = elements.nextElement(); + if(button == null) + continue; + if(button.isSelected()) { + String type = button.getActionCommand(); + props.setProperty(SpeedSelectorConstants.USERTYPE, type); + break; + } + } +} + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JRadioButton browseButton; + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.JRadioButton downloadButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JButton nextButton; + private javax.swing.JLabel questionLabel; + private javax.swing.JButton returnButton; + // End of variables declaration//GEN-END:variables + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form new file mode 100644 index 000000000..8e4aa5b4e --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form @@ -0,0 +1,338 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> + <Properties> + <Property name="defaultCloseOperation" type="int" value="2"/> + <Property name="title" type="java.lang.String" resourceKey="Form.title"/> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[670, 330]"/> + </Property> + <Property name="name" type="java.lang.String" value="Form" noResource="true"/> + <Property name="resizable" type="boolean" value="false"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,74,0,0,2,-108"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> + <Property name="useNullLayout" type="boolean" value="true"/> + </Layout> + <SubComponents> + <Component class="javax.swing.JButton" name="finishButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="finishButton.text"/> + <Property name="name" type="java.lang.String" value="finishButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="finishButtonMouseClicked"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="440" y="250" width="90" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JButton" name="previousButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="previousButton.text"/> + <Property name="name" type="java.lang.String" value="previousButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="previousButtonMouseClicked"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="336" y="250" width="90" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="settingsInfo"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="settingsInfo.text"/> + <Property name="name" type="java.lang.String" value="settingsInfo" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="30" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="uploadLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/> + <Property name="name" type="java.lang.String" value="uploadLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="70" width="140" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="downloadLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/> + <Property name="name" type="java.lang.String" value="downloadLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="340" y="70" width="160" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="uploadBurstLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadBurstLabel.text"/> + <Property name="name" type="java.lang.String" value="uploadBurstLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="110" width="140" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="downloadBurstLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadBurstLabel.text"/> + <Property name="name" type="java.lang.String" value="downloadBurstLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="340" y="110" width="160" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="uploadUsageLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/> + <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="150" width="140" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="downloadUsageLabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/> + <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="340" y="150" width="160" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JTextField" name="uploadField"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadField.text"/> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[77, 27]"/> + </Property> + <Property name="name" type="java.lang.String" value="uploadField" noResource="true"/> + </Properties> + <Events> + <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="160" y="70" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JTextField" name="uploadBurstField"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadBurstField.text"/> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[77, 27]"/> + </Property> + <Property name="name" type="java.lang.String" value="uploadBurstField" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="160" y="110" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JTextField" name="downloadField"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadField.text"/> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[77, 27]"/> + </Property> + <Property name="name" type="java.lang.String" value="downloadField" noResource="true"/> + </Properties> + <Events> + <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="500" y="70" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JTextField" name="downloadBurstField"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadBurstField.text"/> + <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> + <Dimension value="[77, 27]"/> + </Property> + <Property name="name" type="java.lang.String" value="downloadBurstField" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="500" y="110" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="kbpsBurstDownload"> + <Properties> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="2"> + <StringItem index="0" value="kbps"/> + <StringItem index="1" value="kBps"/> + </StringArray> + </Property> + <Property name="name" type="java.lang.String" value="kbpsBurstDownload" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstDownloadActionPerformed"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="580" y="110" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="kbpsUpload"> + <Properties> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="2"> + <StringItem index="0" value="kbps"/> + <StringItem index="1" value="kBps"/> + </StringArray> + </Property> + <Property name="name" type="java.lang.String" value="kbpsUpload" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsUploadActionPerformed"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="240" y="70" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="kbpsBurstUpload"> + <Properties> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="2"> + <StringItem index="0" value="kbps"/> + <StringItem index="1" value="kBps"/> + </StringArray> + </Property> + <Property name="name" type="java.lang.String" value="kbpsBurstUpload" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstUploadActionPerformed"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="240" y="110" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JComboBox" name="kbpsDownload"> + <Properties> + <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> + <StringArray count="2"> + <StringItem index="0" value="kbps"/> + <StringItem index="1" value="kBps"/> + </StringArray> + </Property> + <Property name="name" type="java.lang.String" value="kbpsDownload" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsDownloadActionPerformed"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="580" y="70" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="uploadGB"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/> + <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="240" y="150" width="45" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JTextField" name="uploadMonth"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="uploadMonth.text"/> + <Property name="name" type="java.lang.String" value="uploadMonth" noResource="true"/> + </Properties> + <Events> + <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="160" y="150" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JTextField" name="downloadMonth"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadMonth.text"/> + <Property name="name" type="java.lang.String" value="downloadMonth" noResource="true"/> + </Properties> + <Events> + <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/> + </Events> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="500" y="150" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="downloadGB"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/> + <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="580" y="150" width="40" height="30"/> + </Constraint> + </Constraints> + </Component> + <Component class="javax.swing.JLabel" name="explanation"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="explanation.text"/> + <Property name="name" type="java.lang.String" value="explanation" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="20" y="180" width="600" height="70"/> + </Constraint> + </Constraints> + </Component> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java new file mode 100644 index 000000000..933ad3ff2 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java @@ -0,0 +1,439 @@ +/* + * ProfileSelector3.java + * + * Created on 3 april 2009, 15:17 + */ + +package net.i2p.desktopgui.gui; + +import java.awt.Dimension; +import java.awt.Point; +import java.util.Properties; +import javax.swing.JComboBox; +import javax.swing.JTextField; +import net.i2p.desktopgui.persistence.PropertyManager; +import net.i2p.desktopgui.router.configuration.SpeedHandler; +import net.i2p.desktopgui.router.configuration.SpeedHelper; + +/** + * + * @author mathias + */ +public class SpeedSelector3 extends javax.swing.JFrame { + Properties props; + + /** Creates new form ProfileSelector3 */ + public SpeedSelector3(Point point, Dimension dimension) { + this.props = PropertyManager.getProps(); + initComponents(); + this.setLocation(point); + this.setSize(dimension); + initSpeeds(); + initUsage(); + this.setVisible(true); + this.requestFocus(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + finishButton = new javax.swing.JButton(); + previousButton = new javax.swing.JButton(); + settingsInfo = new javax.swing.JLabel(); + uploadLabel = new javax.swing.JLabel(); + downloadLabel = new javax.swing.JLabel(); + uploadBurstLabel = new javax.swing.JLabel(); + downloadBurstLabel = new javax.swing.JLabel(); + uploadUsageLabel = new javax.swing.JLabel(); + downloadUsageLabel = new javax.swing.JLabel(); + uploadField = new javax.swing.JTextField(); + uploadBurstField = new javax.swing.JTextField(); + downloadField = new javax.swing.JTextField(); + downloadBurstField = new javax.swing.JTextField(); + kbpsBurstDownload = new javax.swing.JComboBox(); + kbpsUpload = new javax.swing.JComboBox(); + kbpsBurstUpload = new javax.swing.JComboBox(); + kbpsDownload = new javax.swing.JComboBox(); + uploadGB = new javax.swing.JLabel(); + uploadMonth = new javax.swing.JTextField(); + downloadMonth = new javax.swing.JTextField(); + downloadGB = new javax.swing.JLabel(); + explanation = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector3.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setMinimumSize(new java.awt.Dimension(670, 330)); + setName("Form"); // NOI18N + setResizable(false); + getContentPane().setLayout(null); + + finishButton.setText(resourceMap.getString("finishButton.text")); // NOI18N + finishButton.setName("finishButton"); // NOI18N + finishButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + finishButtonMouseClicked(evt); + } + }); + getContentPane().add(finishButton); + finishButton.setBounds(440, 250, 90, 29); + + previousButton.setText(resourceMap.getString("previousButton.text")); // NOI18N + previousButton.setName("previousButton"); // NOI18N + previousButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + previousButtonMouseClicked(evt); + } + }); + getContentPane().add(previousButton); + previousButton.setBounds(336, 250, 90, 29); + + settingsInfo.setText(resourceMap.getString("settingsInfo.text")); // NOI18N + settingsInfo.setName("settingsInfo"); // NOI18N + getContentPane().add(settingsInfo); + settingsInfo.setBounds(20, 30, 532, 17); + + uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N + uploadLabel.setName("uploadLabel"); // NOI18N + getContentPane().add(uploadLabel); + uploadLabel.setBounds(20, 70, 140, 30); + + downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N + downloadLabel.setName("downloadLabel"); // NOI18N + getContentPane().add(downloadLabel); + downloadLabel.setBounds(340, 70, 160, 30); + + uploadBurstLabel.setText(resourceMap.getString("uploadBurstLabel.text")); // NOI18N + uploadBurstLabel.setName("uploadBurstLabel"); // NOI18N + getContentPane().add(uploadBurstLabel); + uploadBurstLabel.setBounds(20, 110, 140, 30); + + downloadBurstLabel.setText(resourceMap.getString("downloadBurstLabel.text")); // NOI18N + downloadBurstLabel.setName("downloadBurstLabel"); // NOI18N + getContentPane().add(downloadBurstLabel); + downloadBurstLabel.setBounds(340, 110, 160, 30); + + uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N + uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N + getContentPane().add(uploadUsageLabel); + uploadUsageLabel.setBounds(20, 150, 140, 30); + + downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N + downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N + getContentPane().add(downloadUsageLabel); + downloadUsageLabel.setBounds(340, 150, 160, 30); + + uploadField.setText(resourceMap.getString("uploadField.text")); // NOI18N + uploadField.setMinimumSize(new java.awt.Dimension(77, 27)); + uploadField.setName("uploadField"); // NOI18N + uploadField.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + speedFieldKeyReleased(evt); + } + }); + getContentPane().add(uploadField); + uploadField.setBounds(160, 70, 77, 27); + + uploadBurstField.setText(resourceMap.getString("uploadBurstField.text")); // NOI18N + uploadBurstField.setMinimumSize(new java.awt.Dimension(77, 27)); + uploadBurstField.setName("uploadBurstField"); // NOI18N + getContentPane().add(uploadBurstField); + uploadBurstField.setBounds(160, 110, 77, 27); + + downloadField.setText(resourceMap.getString("downloadField.text")); // NOI18N + downloadField.setMinimumSize(new java.awt.Dimension(77, 27)); + downloadField.setName("downloadField"); // NOI18N + downloadField.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + speedFieldKeyReleased(evt); + } + }); + getContentPane().add(downloadField); + downloadField.setBounds(500, 70, 77, 27); + + downloadBurstField.setText(resourceMap.getString("downloadBurstField.text")); // NOI18N + downloadBurstField.setMinimumSize(new java.awt.Dimension(77, 27)); + downloadBurstField.setName("downloadBurstField"); // NOI18N + getContentPane().add(downloadBurstField); + downloadBurstField.setBounds(500, 110, 77, 27); + + kbpsBurstDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + kbpsBurstDownload.setName("kbpsBurstDownload"); // NOI18N + kbpsBurstDownload.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + kbpsBurstDownloadActionPerformed(evt); + } + }); + getContentPane().add(kbpsBurstDownload); + kbpsBurstDownload.setBounds(580, 110, 68, 27); + + kbpsUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + kbpsUpload.setName("kbpsUpload"); // NOI18N + kbpsUpload.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + kbpsUploadActionPerformed(evt); + } + }); + getContentPane().add(kbpsUpload); + kbpsUpload.setBounds(240, 70, 68, 27); + + kbpsBurstUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + kbpsBurstUpload.setName("kbpsBurstUpload"); // NOI18N + kbpsBurstUpload.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + kbpsBurstUploadActionPerformed(evt); + } + }); + getContentPane().add(kbpsBurstUpload); + kbpsBurstUpload.setBounds(240, 110, 68, 27); + + kbpsDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); + kbpsDownload.setName("kbpsDownload"); // NOI18N + kbpsDownload.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + kbpsDownloadActionPerformed(evt); + } + }); + getContentPane().add(kbpsDownload); + kbpsDownload.setBounds(580, 70, 68, 27); + + uploadGB.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N + uploadGB.setName("uploadUsageLabel"); // NOI18N + getContentPane().add(uploadGB); + uploadGB.setBounds(240, 150, 45, 30); + + uploadMonth.setText(resourceMap.getString("uploadMonth.text")); // NOI18N + uploadMonth.setName("uploadMonth"); // NOI18N + uploadMonth.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + monthKeyReleased(evt); + } + }); + getContentPane().add(uploadMonth); + uploadMonth.setBounds(160, 150, 77, 27); + + downloadMonth.setText(resourceMap.getString("downloadMonth.text")); // NOI18N + downloadMonth.setName("downloadMonth"); // NOI18N + downloadMonth.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + monthKeyReleased(evt); + } + }); + getContentPane().add(downloadMonth); + downloadMonth.setBounds(500, 150, 77, 27); + + downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N + downloadGB.setName("downloadUsageLabel"); // NOI18N + getContentPane().add(downloadGB); + downloadGB.setBounds(580, 150, 40, 30); + + explanation.setText(resourceMap.getString("explanation.text")); // NOI18N + explanation.setName("explanation"); // NOI18N + getContentPane().add(explanation); + explanation.setBounds(20, 180, 600, 70); + + pack(); + }// </editor-fold>//GEN-END:initComponents + +private void previousButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_previousButtonMouseClicked + saveSpeeds(); + PropertyManager.saveProps(props); + new SpeedSelector2(this.getLocationOnScreen()); + this.dispose(); +}//GEN-LAST:event_previousButtonMouseClicked + +private void finishButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_finishButtonMouseClicked + saveSpeeds(); + PropertyManager.saveProps(props); + + int maxDownload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOAD)); + int maxUpload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOAD)); + int maxUploadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOADBURST)); + int maxDownloadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADBURST)); + + //Working in kB, not kb! + SpeedHandler.setInboundBandwidth(maxDownload/8); + SpeedHandler.setOutboundBandwidth(maxUpload/8); + SpeedHandler.setInboundBurstBandwidth(maxDownloadBurst/8); + SpeedHandler.setOutboundBurstBandwidth(maxUploadBurst/8); + + this.dispose(); +}//GEN-LAST:event_finishButtonMouseClicked + +private void speedFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedFieldKeyReleased + try { + String upload = ""; + if(kbpsUpload.getSelectedIndex() == KILOBIT) + upload = uploadField.getText(); + else + upload = "" + Integer.parseInt(uploadField.getText())*8; + String download = ""; + if(kbpsDownload.getSelectedIndex() == KILOBIT) + download = downloadField.getText(); + else + download = "" + Integer.parseInt(downloadField.getText())*8; + initUsage(upload, download); + } + catch(NumberFormatException e) { + return; + } +}//GEN-LAST:event_speedFieldKeyReleased + +private void kbpsUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsUploadActionPerformed + kbpsSwitchPerformed(kbpsUpload, uploadField); +}//GEN-LAST:event_kbpsUploadActionPerformed + +private void kbpsBurstUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstUploadActionPerformed + kbpsSwitchPerformed(kbpsBurstUpload, uploadBurstField); +}//GEN-LAST:event_kbpsBurstUploadActionPerformed + +private void kbpsDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsDownloadActionPerformed + kbpsSwitchPerformed(kbpsDownload, downloadField); +}//GEN-LAST:event_kbpsDownloadActionPerformed + +private void kbpsBurstDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstDownloadActionPerformed + kbpsSwitchPerformed(kbpsBurstDownload, downloadBurstField); +}//GEN-LAST:event_kbpsBurstDownloadActionPerformed + +private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased + try { + int uploadMonthValue = Integer.parseInt(uploadMonth.getText()); + int downloadMonthValue = Integer.parseInt(downloadMonth.getText()); + + String upload = ""; + String burstUpload = ""; + String download = ""; + String burstDownload = ""; + + if(kbpsUpload.getSelectedIndex() == KILOBIT) + upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit + else + upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte + + if(kbpsBurstUpload.getSelectedIndex() == KILOBIT) + burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit + else + burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte + + if(kbpsDownload.getSelectedIndex() == KILOBIT) + download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit + else + download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte + + if(kbpsBurstDownload.getSelectedIndex() == KILOBIT) + burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit + else + burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte + + initSpeeds(upload, burstUpload, download, burstDownload); + } + catch(NumberFormatException e) { + e.printStackTrace(); + return; + } +}//GEN-LAST:event_monthKeyReleased + +private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) { + int index = kbps.getSelectedIndex(); + int previous = Integer.parseInt(speed.getText()); + if(index == KILOBIT) { + speed.setText("" + previous*8); + } + else { + speed.setText("" + previous/8); + } +} + + protected void initSpeeds() { + String up = "" + SpeedHelper.calculateSpeed( + props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); + String upBurst = "" + SpeedHelper.calculateSpeed( + props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); + String down = "" + SpeedHelper.calculateSpeed( + props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); + String downBurst = "" + SpeedHelper.calculateSpeed( + props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); + String userType = props.getProperty(SpeedSelectorConstants.USERTYPE); + + initSpeeds(up, upBurst, down, downBurst); + } + + protected void initSpeeds(String up, String upBurst, String down, String downBurst) { + uploadField.setText(up); + uploadBurstField.setText(upBurst); + downloadField.setText(down); + downloadBurstField.setText(downBurst); + } + + protected void saveSpeeds() { + if(kbpsUpload.getSelectedIndex() == KILOBIT) + props.setProperty(SpeedSelectorConstants.MAXUPLOAD, uploadField.getText()); + else + props.setProperty(SpeedSelectorConstants.MAXUPLOAD, "" + Integer.parseInt(uploadField.getText())*8); + if(kbpsBurstUpload.getSelectedIndex() == KILOBIT) + props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, uploadBurstField.getText()); + else + props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, "" + Integer.parseInt(uploadBurstField.getText())*8); + if(kbpsDownload.getSelectedIndex() == KILOBIT) + props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, downloadField.getText()); + else + props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, "" + Integer.parseInt(downloadField.getText())*8); + if(kbpsBurstDownload.getSelectedIndex() == KILOBIT) + props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, downloadBurstField.getText()); + else + props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, "" + Integer.parseInt(downloadBurstField.getText())*8); + } + + protected void initUsage(String upload, String download) { + uploadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)/8)); + downloadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)/8)); + } + + protected void initUsage() { + String upload = ""; + if(kbpsUpload.getSelectedIndex() == KILOBIT) + upload = uploadField.getText(); + else + upload = "" + Integer.parseInt(uploadField.getText())/8; + String download = ""; + if(kbpsDownload.getSelectedIndex() == KILOBIT) + download = downloadField.getText(); + else + download = "" + Integer.parseInt(downloadField.getText())/8; + initUsage(upload, download); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField downloadBurstField; + private javax.swing.JLabel downloadBurstLabel; + private javax.swing.JTextField downloadField; + private javax.swing.JLabel downloadGB; + private javax.swing.JLabel downloadLabel; + private javax.swing.JTextField downloadMonth; + private javax.swing.JLabel downloadUsageLabel; + private javax.swing.JLabel explanation; + private javax.swing.JButton finishButton; + private javax.swing.JComboBox kbpsBurstDownload; + private javax.swing.JComboBox kbpsBurstUpload; + private javax.swing.JComboBox kbpsDownload; + private javax.swing.JComboBox kbpsUpload; + private javax.swing.JButton previousButton; + private javax.swing.JLabel settingsInfo; + private javax.swing.JTextField uploadBurstField; + private javax.swing.JLabel uploadBurstLabel; + private javax.swing.JTextField uploadField; + private javax.swing.JLabel uploadGB; + private javax.swing.JLabel uploadLabel; + private javax.swing.JTextField uploadMonth; + private javax.swing.JLabel uploadUsageLabel; + // End of variables declaration//GEN-END:variables + + private static final int KILOBIT = 0; + private static final int KILOBYTE = 1; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java new file mode 100644 index 000000000..1088f6957 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java @@ -0,0 +1,25 @@ +package net.i2p.desktopgui.gui; + +/** + * + * @author mathias + */ +public class SpeedSelectorConstants { + ///Maximum upload speed for the internet connection + public static final String MAXUPLOADCAPABLE = "maxUploadCapable"; + ///Maximum download speed for the internet connection + public static final String MAXDOWNLOADCAPABLE = "maxDownloadCapable"; + + //User profile type: what behaviour does this user have while using IP2? + public static final String USERTYPE = "userType"; + + //Maximum upload speed for I2P + public static final String MAXUPLOAD = "maxUpload"; + //Maximum upload burst speed for I2P + public static final String MAXUPLOADBURST = "maxUploadBurst"; + + //Maximum download speed for I2P + public static final String MAXDOWNLOAD = "maxDownload"; + //Maximum download burst speed for I2P + public static final String MAXDOWNLOADBURST = "maxDownloadBurst"; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java new file mode 100644 index 000000000..02fb5b2df --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java @@ -0,0 +1,228 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.desktopgui.gui; + +import net.i2p.desktopgui.desktopgui.*; +import java.awt.AWTException; +import java.awt.Desktop; +import java.awt.Image; +import java.awt.SystemTray; +import java.awt.Toolkit; +import java.awt.TrayIcon; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import net.i2p.desktopgui.router.RouterHandler; +import net.i2p.desktopgui.router.RouterHelper; +import net.i2p.desktopgui.router.configuration.PeerHelper; + +/** + * + * @author mathias + */ +public class Tray { + + public Tray() { + tray = SystemTray.getSystemTray(); + loadSystemTray(); + } + + private void loadSystemTray() { + + Image image = Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo.jpg"); + + final JPopupMenu popup = new JPopupMenu(); + + //Create menu items to put in the popup menu + JMenuItem browserLauncher = new JMenuItem("Launch browser"); + browserLauncher.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + if(Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + try { + if(desktop.isSupported(Desktop.Action.BROWSE)) { + desktop.browse(new URI("http://localhost:7657")); + } + else { + trayIcon.displayMessage("Browser not found", "The default browser for your system was not found.", TrayIcon.MessageType.WARNING); + } + } catch (URISyntaxException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } catch(IOException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + }); + JMenuItem howto = new JMenuItem("How to use I2P"); + howto.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + if(Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + try { + File f = new File("desktopgui/resources/howto/howto.html"); + System.out.println(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null)); + desktop.browse(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null)); + //desktop.browse(new URI("file://" + f.getAbsolutePath())); + } catch (URISyntaxException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } catch(IOException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + }); + JMenu config = new JMenu("Configuration"); + JMenuItem speedConfig = new JMenuItem("Speed"); + speedConfig.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + (new SpeedSelector()).setVisible(true); + } + + }); + JMenuItem generalConfig = new JMenuItem("General Configuration"); + generalConfig.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new GeneralConfiguration(); + } + + }); + JMenuItem advancedConfig = new JMenuItem("Advanced Configuration"); + advancedConfig.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + if(Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + try { + desktop.browse(new URI("http://localhost:7657/config.jsp")); + } catch (URISyntaxException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } catch(IOException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + }); + JMenuItem viewLog = new JMenuItem("View log"); + viewLog.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new LogViewer(); + } + + }); + JMenuItem version = new JMenuItem("Version"); + version.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new Version(); + } + + }); + JMenuItem shutdown = new JMenuItem("Shutdown I2P"); + shutdown.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + RouterHandler.setStatus(RouterHandler.SHUTDOWN_GRACEFULLY); + long shutdownTime = RouterHelper.getGracefulShutdownTimeRemaining(); + System.out.println("Shutdowntime remaining: " + shutdownTime); + if(shutdownTime>0) { + trayIcon.displayMessage("Shutting down...", "Shutdown time remaining: " + shutdownTime/1000 + " seconds." + + System.getProperty("line.separator") + "Shutdown will not happen immediately, because we are still participating in the network.", TrayIcon.MessageType.INFO); + } + else { + trayIcon.displayMessage("Shutting down...", "Shutting down immediately.", TrayIcon.MessageType.INFO); + } + } + + }); + + //Add menu items to popup menu + popup.add(browserLauncher); + popup.add(howto); + + popup.addSeparator(); + + config.add(speedConfig); + config.add(generalConfig); + config.add(advancedConfig); + popup.add(config); + + popup.addSeparator(); + + popup.add(viewLog); + popup.add(version); + + popup.addSeparator(); + + popup.add(shutdown); + + //Add tray icon + trayIcon = new JPopupTrayIcon(image, "I2P: the anonymous network", popup); + + try { + tray.add(trayIcon); + } catch (AWTException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + + PeerHelper.addReachabilityListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + updateTooltip(); + } + + }); + PeerHelper.addActivePeerListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + updateTooltip(); + int activePeers = PeerHelper.getActivePeers(); + if(activePeers == 0) + trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_red.jpg")); + else if(activePeers < 10) + trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_orange.jpg")); + else + trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_green.jpg")); + + } + + }); + } + + public void updateTooltip() { + trayIcon.setToolTip("I2P Network status: " + PeerHelper.getReachability() + " / " + "Active Peers: " + PeerHelper.getActivePeers()); + } + + private SystemTray tray = null; + private JPopupTrayIcon trayIcon = null; + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form new file mode 100644 index 000000000..32ab90b31 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> + <Properties> + <Property name="defaultCloseOperation" type="int" value="2"/> + <Property name="title" type="java.lang.String" resourceKey="Form.title"/> + <Property name="name" type="java.lang.String" value="Form" noResource="true"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + </AuxValues> + + <Layout> + <DimensionLayout dim="0"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" attributes="0"> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <Group type="103" groupAlignment="1" max="-2" attributes="0"> + <Component id="I2Plabel" alignment="0" max="32767" attributes="0"/> + <Component id="GUILabel" alignment="0" max="32767" attributes="1"/> + </Group> + <EmptySpace type="separate" max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="I2PVersion" pref="126" max="32767" attributes="0"/> + <Component id="GUIVersion" pref="126" max="32767" attributes="0"/> + </Group> + </Group> + <Component id="okButton" alignment="1" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + <DimensionLayout dim="1"> + <Group type="103" groupAlignment="0" attributes="0"> + <Group type="102" alignment="0" attributes="0"> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="I2Plabel" min="-2" max="-2" attributes="0"/> + <Component id="I2PVersion" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace max="-2" attributes="0"/> + <Group type="103" groupAlignment="0" attributes="0"> + <Component id="GUILabel" min="-2" max="-2" attributes="0"/> + <Component id="GUIVersion" min="-2" max="-2" attributes="0"/> + </Group> + <EmptySpace max="32767" attributes="0"/> + <Component id="okButton" min="-2" max="-2" attributes="0"/> + <EmptySpace max="-2" attributes="0"/> + </Group> + </Group> + </DimensionLayout> + </Layout> + <SubComponents> + <Component class="javax.swing.JButton" name="okButton"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="okButton.text"/> + <Property name="name" type="java.lang.String" value="okButton" noResource="true"/> + </Properties> + <Events> + <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okButtonActionPerformed"/> + </Events> + </Component> + <Component class="javax.swing.JLabel" name="I2Plabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="I2Plabel.text"/> + <Property name="name" type="java.lang.String" value="I2Plabel" noResource="true"/> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="GUILabel"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="GUILabel.text"/> + <Property name="name" type="java.lang.String" value="GUILabel" noResource="true"/> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="I2PVersion"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="I2PVersion.text"/> + <Property name="name" type="java.lang.String" value="I2PVersion" noResource="true"/> + </Properties> + </Component> + <Component class="javax.swing.JLabel" name="GUIVersion"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="GUIVersion.text"/> + <Property name="name" type="java.lang.String" value="GUIVersion" noResource="true"/> + </Properties> + </Component> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java new file mode 100644 index 000000000..25a38d6b8 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java @@ -0,0 +1,123 @@ +/* + * Version.java + * + * Created on 13 april 2009, 13:48 + */ + +package net.i2p.desktopgui.gui; + +import javax.swing.JFrame; +import net.i2p.desktopgui.router.RouterHelper; + +/** + * + * @author mathias + */ +public class Version extends javax.swing.JDialog { + + public Version() { + this(new JFrame(), true); + } + + + private Version(java.awt.Frame parent, boolean modal) { + super(parent, modal); + initComponents(); + String i2pVersion = RouterHelper.getVersion(); + String guiVersion = net.i2p.desktopgui.desktopgui.GUIVersion.VERSION; + this.I2PVersion.setText("<html><h1>" + i2pVersion + "</h1></html>"); + this.GUIVersion.setText("<html><h1>" + guiVersion + "</h1></html>"); + this.setVisible(true); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + I2Plabel = new javax.swing.JLabel(); + GUILabel = new javax.swing.JLabel(); + I2PVersion = new javax.swing.JLabel(); + GUIVersion = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(Version.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setName("Form"); // NOI18N + + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + I2Plabel.setText(resourceMap.getString("I2Plabel.text")); // NOI18N + I2Plabel.setName("I2Plabel"); // NOI18N + + GUILabel.setText(resourceMap.getString("GUILabel.text")); // NOI18N + GUILabel.setName("GUILabel"); // NOI18N + + I2PVersion.setText(resourceMap.getString("I2PVersion.text")); // NOI18N + I2PVersion.setName("I2PVersion"); // NOI18N + + GUIVersion.setText(resourceMap.getString("GUIVersion.text")); // NOI18N + GUIVersion.setName("GUIVersion"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(I2Plabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(GUILabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(I2PVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE) + .addComponent(GUIVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE))) + .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(I2Plabel) + .addComponent(I2PVersion)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(GUILabel) + .addComponent(GUIVersion)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(okButton) + .addContainerGap()) + ); + + pack(); + }// </editor-fold>//GEN-END:initComponents + +private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + this.dispose(); +}//GEN-LAST:event_okButtonActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel GUILabel; + private javax.swing.JLabel GUIVersion; + private javax.swing.JLabel I2PVersion; + private javax.swing.JLabel I2Plabel; + private javax.swing.JButton okButton; + // End of variables declaration//GEN-END:variables + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties new file mode 100644 index 000000000..ca036e197 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties @@ -0,0 +1,26 @@ +# To change this template, choose Tools | Templates +# and open the template in the editor. + +Form.title=Client Tunnel Configuration +tunnelNameLabel.text=Name: +tunnelTypeLabel.text=Type: +tunnelType.text=jLabel10 +tunnelName.text=jTextField1 +tunnelPortLabel.text=Port: +tunnelPort.text=jTextField2 +tunnelDestination.text=jTextField3 +tunnelDestinationLabel.text=Destination: +tunnelProfileLabel.text=Profile: +delayConnect.text=Delay connect +sharedClient.text=Shared client +autoStart.text=Auto start +tunnelDepthLabel.text=Tunnel depth: +depthVarianceLabel.text=Depth variance: +tunnelCountLabel.text=Tunnel count: +backupTunnelCountLabel.text=Backup tunnel count: +reduceIdle.text=Reduce tunnel count when idle +closeIdle.text=Close tunnels when idle +delayIdle.text=Delay opening of tunnels when idle +save.text=Save +cancel.text=Cancel +changeTunnelState.text=Start Tunnel diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties new file mode 100644 index 000000000..d53ac80d0 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties @@ -0,0 +1,37 @@ +cancel.text=Cancel +ok.text=OK +Form.title=General Configuration +speedPanel.TabConstraints.tabTitle=Speed +updatesPanel.TabConstraints.tabTitle=Updates +tunnelPanel.TabConstraints.tabTitle=Tunnels/Services +networkPanel.TabConstraints.tabTitle=Network +advancedPanel.TabConstraints.tabTitle=Advanced +uploadSpeedLabel.text=Upload speed: +downloadSpeedLabel.text=Download speed: +uploadspeed.text=jTextField1 +downloadspeed.text=jTextField2 +uploadgb.text=jTextField3 +downloadgb.text=jTextField4 +updateMethod.text=What is your preferred automatic update setting? +updateInform.text=Only inform about updates (not advised) +updateDownload.text=Download and verify update file, do not restart +updateDownloadRestart.text=Download, verify and restart +checkUpdates.text=Check for updates now +updateNow.text=Update available: update now +advancedUpdateConfig.text=Advanced update configuration +clientTunnelLabel.text=Client tunnels: +serverTunnelLabel.text=Server tunnels: +tunnelsExplanation.text=Click on a tunnel to view and change its configuration. + Tunnel explanation +uploadUsageLabel.text=Monthly usage: +downloadUsageLabel.text=Monthly usage: +gbUploadLabel.text=GB +gbDownloadLabel.text=GB +uploadDownloadExplanation.text=Explanation ... +clientTable.columnModel.title3=Status +clientTable.columnModel.title2=Address +clientTable.columnModel.title1=Type +clientTable.columnModel.title0=Name +serverTable.columnModel.title0=Name +serverTable.columnModel.title3=Title 4 +serverTable.columnModel.title2=Status +serverTable.columnModel.title1=Address diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties new file mode 100644 index 000000000..d4ef5bf0e --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties @@ -0,0 +1,4 @@ +refreshButton.text=Refresh +clearButton.text=Clear +explanationText.text=Explanation ... +Form.title=View Logs diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties new file mode 100644 index 000000000..683f3caa7 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties @@ -0,0 +1 @@ +jLabel1.text=Name: diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties new file mode 100644 index 000000000..00eb6c973 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties @@ -0,0 +1,6 @@ + +Form.title=I2P Speed Configuration +nextButton.text=Next +uploadLabel.text=What is your maximum upload speed? +downloadLabel.text=What is your maximum download speed? +speedExplanation.text=<html>The maximum speed is set by your provider. It can be given in <b>kilobit (kbps)</b> or <b>kilobyte (kBps)</b>.<br />One kilobyte equals eight kilobit.</html> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties new file mode 100644 index 000000000..909518ada --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties @@ -0,0 +1,9 @@ +returnButton.text=Previous +Form.title=I2P Speed Configuration +questionLabel.text=Which of these descriptions fits you best? +browseButton.text=Browsing: I want to use I2P to browse websites anonymously, no heavy usage. +downloadButton.text=Downloading: I want to use I2P for downloads and filesharing, heavy usage. +nextButton.text=Next +browseButton.actionCommand=Browsing +downloadButton.actionCommand=Downloading +jLabel1.text=<html>I2P can be used for many different purposes. Here, we present two possible descriptions. If you use a lot of bandwidth in I2P (for example using downloading), please check the <b>downloading</b> option. If your bandwidth usage is limited, please check the <b>browsing</b> option.</html> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties new file mode 100644 index 000000000..6dca3ca51 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties @@ -0,0 +1,17 @@ +Form.title=I2P Configuration +previousButton.text=Previous +finishButton.text=Finish +uploadLabel.text=Upload Speed: +uploadBurstLabel.text=Burst Upload Speed: +downloadLabel.text=Download Speed: +downloadBurstLabel.text=Burst Download Speed: +uploadUsageLabel.text=GB +downloadUsageLabel.text=GB +uploadField.text=jTextField1 +uploadBurstField.text=jTextField2 +downloadField.text=jTextField4 +downloadBurstField.text=jTextField5 +uploadMonth.text=jTextField1 +downloadMonth.text=jTextField2 +settingsInfo.text=The profile information your entered, indicates that these are your optimal settings: +explanation.text=<html>We give a suggested upload and download speed. If your provider imposes a monthly bandwidth limit (usually given in <b>gigabyte (GB)</b>), please enter a value lower than that limit. If you run I2P only 50% of the time, you can double the bandwidth limit to use the same amount as when you are online 100% of the time.</html> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties new file mode 100644 index 000000000..c2030bb2d --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties @@ -0,0 +1,6 @@ +okButton.text=OK +I2Plabel.text=<html><h1>I2P Version:</h1></html> +GUILabel.text=<html><h1>GUI Version:</h1></html> +I2PVersion.text=jLabel3 +GUIVersion.text=jLabel4 +Form.title=Version diff --git a/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java b/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java new file mode 100644 index 000000000..770bd0957 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java @@ -0,0 +1,72 @@ +package net.i2p.desktopgui.persistence; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author mathias + */ +public class PropertyManager { + + public static void setProps(Properties props) { + PropertyManager.props = props; + } + + public static Properties getProps() { + return props; + } + + public static Properties loadProps() { + Properties defaultProps = new Properties(); + defaultProps.setProperty("firstLoad", "true"); + + // create application properties with default + Properties applicationProps = new Properties(defaultProps); + + // now load properties from last invocation + FileInputStream in; + try { + in = new FileInputStream(PROPSLOCATION); + applicationProps.load(in); + in.close(); + } catch (FileNotFoundException ex) { + //Nothing serious, just means it's being loaded for the first time. + } catch(IOException ex) { + Logger.getLogger(PropertyManager.class.getName()).log(Level.INFO, null, ex); + } + props = applicationProps; + return applicationProps; + } + + public static void saveProps(Properties props) { + FileOutputStream out; + try { + File d = new File(PROPSDIRECTORY); + if(!d.exists()) + d.mkdir(); + File f = new File(PROPSLOCATION); + if(!f.exists()) + f.createNewFile(); + out = new FileOutputStream(f); + props.store(out, PROPSLOCATION); + } catch (FileNotFoundException ex) { + Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex); + } catch(IOException ex) { + Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private static Properties props; + + ///Location where we store the Application Properties + public static final String PROPSDIRECTORY = "desktopgui"; + public static final String PROPSFILENAME = "appProperties"; + public static final String PROPSLOCATION = PROPSDIRECTORY + File.separator + PROPSFILENAME; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java new file mode 100644 index 000000000..022c5c814 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java @@ -0,0 +1,38 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.desktopgui.router; + +import java.util.logging.Level; +import java.util.logging.Logger; +import net.i2p.router.RouterContext; + +/** + * + * @author mathias + */ +public class RouterHandler { + public static final int SHUTDOWN_GRACEFULLY = 0; + public static void setStatus(int status) { + if(status == SHUTDOWN_GRACEFULLY) { + Thread t = new Thread(new Runnable() { + + public void run() { + RouterContext context = RouterHelper.getContext(); + context.router().shutdownGracefully(); + while(context.router().getShutdownTimeRemaining()>0) + try { + Thread.sleep(context.router().getShutdownTimeRemaining()); + } catch (InterruptedException ex) { + Logger.getLogger(RouterHandler.class.getName()).log(Level.SEVERE, null, ex); + } + System.exit(0); + } + + }); + t.start(); + } + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java new file mode 100644 index 000000000..2da95f0c6 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java @@ -0,0 +1,22 @@ +package net.i2p.desktopgui.router; + +import net.i2p.router.RouterContext; +import net.i2p.router.RouterVersion; + +/** + * + * @author mathias + */ +public class RouterHelper { + public static RouterContext getContext() { + return (RouterContext) RouterContext.listContexts().get(0); + } + + public static long getGracefulShutdownTimeRemaining() { + return RouterHelper.getContext().router().getShutdownTimeRemaining(); + } + + public static String getVersion() { + return (RouterVersion.VERSION + "-" + RouterVersion.BUILD); + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java new file mode 100644 index 000000000..74df2b3d9 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java @@ -0,0 +1,165 @@ +package net.i2p.desktopgui.router.configuration; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import net.i2p.data.RouterAddress; +import net.i2p.router.CommSystemFacade; +import net.i2p.router.RouterContext; +import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; +import net.i2p.router.transport.ntcp.NTCPAddress; +import net.i2p.desktopgui.router.RouterHelper; + +/** + * Part of the code imported and adapted from the I2P Router Console (which is licensed as public domain) + */ +public class PeerHelper { + public static String getReachability() { + RouterContext context = RouterHelper.getContext(); + if (context.router().getUptime() > 60*1000 + && (!context.router().gracefulShutdownInProgress()) + && !context.clientManager().isAlive()) + return "ERROR: Client Manager I2CP Error - check logs"; // not a router problem but the user should know + if (!context.clock().getUpdatedSuccessfully()) + return "ERROR: ClockSkew"; + if (context.router().isHidden()) + return "Hidden"; + + int status = context.commSystem().getReachabilityStatus(); + switch (status) { + case CommSystemFacade.STATUS_OK: + RouterAddress ra = context.router().getRouterInfo().getTargetAddress("NTCP"); + if (ra == null || (new NTCPAddress(ra)).isPubliclyRoutable()) + return "OK"; + return "ERROR: Private TCP Address"; + case CommSystemFacade.STATUS_DIFFERENT: + return "ERROR: You are behind a symmetric NAT."; + case CommSystemFacade.STATUS_REJECT_UNSOLICITED: + if (context.router().getRouterInfo().getTargetAddress("NTCP") != null) + return "WARNING: You are behind a firewall and have Inbound TCP Enabled"; + if (((FloodfillNetworkDatabaseFacade)context.netDb()).floodfillEnabled()) + return "WARNING: You are behind a firewall and are a floodfill router"; + if (context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0) + return "WARNING: You are behind a firewall and are a fast router"; + return "Firewalled"; + case CommSystemFacade.STATUS_HOSED: + return "ERROR: The UDP port is already in use. Set i2np.udp.internalPort=xxxx to a different value in the advanced config and restart"; + case CommSystemFacade.STATUS_UNKNOWN: // fallthrough + default: + ra = context.router().getRouterInfo().getTargetAddress("SSU"); + if (ra == null && context.router().getUptime() > 5*60*1000) { + if (context.getProperty(PROP_I2NP_NTCP_HOSTNAME) == null || + context.getProperty(PROP_I2NP_NTCP_PORT) == null) + return "ERROR: UDP is disabled and the inbound TCP host/port combination is not set"; + else + return "WARNING: You are behind a firewall and have UDP Disabled"; + } + return "Testing"; + } + } + + /** + * How many peers we are talking to now + * + */ + public static int getActivePeers() { + RouterContext context = RouterHelper.getContext(); + if (context == null) + return 0; + else + return context.commSystem().countActivePeers(); + } + + public static void addActivePeerListener(ActionListener listener) { + synchronized(activePeerListeners) { + activePeerListeners.add(listener); + if(activePeerTimer == null) { + activePeerTimer = new Timer(); + TimerTask t = new TimerTask() { + private int activePeers = 0; + + @Override + public void run() { + int newActivePeers = getActivePeers(); + if(!(activePeers == newActivePeers)) { + synchronized(activePeerListeners) { + for(int i=0; i<activePeerListeners.size(); i++) { + activePeerListeners.get(i).actionPerformed(new ActionEvent(this, 0, "")); + } + } + activePeers = newActivePeers; + } + } + }; + activePeerTimer.schedule(t, 0, 60*1000); + } + } + } + + public static void removeActivePeerListener(ActionListener listener) { + synchronized(activePeerListeners) { + activePeerListeners.remove(listener); + if(activePeerListeners.size() == 0) { + activePeerTimer.cancel(); + activePeerTimer = null; + } + } + } + + + + public static void addReachabilityListener(ActionListener listener) { + synchronized(reachabilityListeners) { + reachabilityListeners.add(listener); + if(reachabilityTimer == null) { + reachabilityTimer = new Timer(); + TimerTask t = new TimerTask() { + + private String reachability = ""; + + @Override + public void run() { + String newReachability = getReachability(); + if(!reachability.equals(newReachability)) { + synchronized(reachabilityListeners) { + for(int i=0; i<reachabilityListeners.size(); i++) { + reachabilityListeners.get(i).actionPerformed(new ActionEvent(this, 0, "")); + } + } + reachability = newReachability; + } + } + + }; + reachabilityTimer.schedule(t, 0, 60*1000); + } + } + } + + public static void removeReachabilityListener(ActionListener listener) { + synchronized(reachabilityListeners) { + reachabilityListeners.remove(listener); + if(reachabilityListeners.size() == 0) { + reachabilityTimer.cancel(); + reachabilityTimer = null; + } + } + } + + private static List<ActionListener> reachabilityListeners = new ArrayList<ActionListener>(); + private static Timer reachabilityTimer = null; + + private static List<ActionListener> activePeerListeners = new ArrayList<ActionListener>(); + private static Timer activePeerTimer = null; + + /** copied from various private components */ + public final static String PROP_I2NP_UDP_PORT = "i2np.udp.port"; + public final static String PROP_I2NP_INTERNAL_UDP_PORT = "i2np.udp.internalPort"; + public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname"; + public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port"; + public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport"; + public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip"; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java new file mode 100644 index 000000000..8fd675657 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java @@ -0,0 +1,34 @@ +package net.i2p.desktopgui.router.configuration; + +import net.i2p.router.RouterContext; +import net.i2p.router.transport.FIFOBandwidthRefiller; +import net.i2p.desktopgui.router.RouterHelper; + +/** + * + * @author mathias + */ +public class SpeedHandler { + + public static void setInboundBandwidth(int kbytes) { + context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, "" + kbytes); + context.router().saveConfig(); + } + + public static void setOutboundBandwidth(int kbytes) { + context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, "" + kbytes); + context.router().saveConfig(); + } + + public static void setInboundBurstBandwidth(int kbytes) { + context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, "" + kbytes); + context.router().saveConfig(); + } + + public static void setOutboundBurstBandwidth(int kbytes) { + context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, "" + kbytes); + context.router().saveConfig(); + } + + private static final RouterContext context = RouterHelper.getContext(); +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java new file mode 100644 index 000000000..51b8b5a6f --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java @@ -0,0 +1,43 @@ +package net.i2p.desktopgui.router.configuration; + +import net.i2p.router.transport.FIFOBandwidthRefiller; +import net.i2p.desktopgui.router.RouterHelper; + +/** + * + * @author mathias + */ +public class SpeedHelper { + public static final String USERTYPE_BROWSING = "Browsing"; + public static final String USERTYPE_DOWNLOADING = "Downloading"; + + public static int calculateSpeed(String capable, String profile) { + int capableSpeed = Integer.parseInt(capable); + int advisedSpeed = capableSpeed; + if(capableSpeed > 1000) { + if(profile.equals(USERTYPE_BROWSING)) //Don't overdo usage for people just wanting to browse (we don't want to drive them away due to resource hogging) + advisedSpeed *= 0.6; + else if(profile.equals(USERTYPE_DOWNLOADING)) + advisedSpeed *= 0.8; + } + else + advisedSpeed *= 0.6; //Lower available bandwidth: don't hog all the bandwidth + return advisedSpeed; + } + + public static int calculateMonthlyUsage(int kbytes) { + return (int) ((((long)kbytes)*3600*24*31)/1000000); + } + + public static int calculateSpeed(int gigabytes) { + return (int) (((long)gigabytes)*1000000/31/24/3600); + } + + public static String getInboundBandwidth() { + return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH); + } + + public static String getOutboundBandwidth() { + return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH); + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java new file mode 100644 index 000000000..e913f5e51 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java @@ -0,0 +1,19 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.desktopgui.router.configuration; + +import net.i2p.desktopgui.router.RouterHelper; + +/** + * + * @author mathias + */ +public class UpdateHandler { + public static void setUpdatePolicy(String policy) { + RouterHelper.getContext().router().setConfigSetting(UpdateHelper.PROP_UPDATE_POLICY, policy); + RouterHelper.getContext().router().saveConfig(); + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java new file mode 100644 index 000000000..6e28db108 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java @@ -0,0 +1,65 @@ +package net.i2p.desktopgui.router.configuration; + +import net.i2p.desktopgui.router.RouterHelper; + +/** + * + * @author mathias + */ +public class UpdateHelper { + + public static final String PROP_NEWS_URL = "router.newsURL"; + public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml"; + + public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency"; + public static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + ""; + + public static final String PROP_UPDATE_POLICY = "router.updatePolicy"; + public static final String NOTIFY_UPDATE_POLICY = "notify"; + public static final String DOWNLOAD_UPDATE_POLICY = "download"; + public static final String INSTALL_UPDATE_POLICY = "install"; + public static final String DEFAULT_UPDATE_POLICY = DOWNLOAD_UPDATE_POLICY; + + public static final String PROP_SHOULD_PROXY = "router.updateThroughProxy"; + public static final String DEFAULT_SHOULD_PROXY = Boolean.TRUE.toString(); + public static final String PROP_PROXY_HOST = "router.updateProxyHost"; + public static final String DEFAULT_PROXY_HOST = "127.0.0.1"; + public static final String PROP_PROXY_PORT = "router.updateProxyPort"; + public static final String DEFAULT_PROXY_PORT = "4444"; + + public static final String PROP_UPDATE_URL = "router.updateURL"; + public static final String DEFAULT_UPDATE_URL = + "http://echelon.i2p/i2p/i2pupdate.sud\r\n" + + "http://stats.i2p/i2p/i2pupdate.sud\r\n" + + "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" + + "http://update.postman.i2p/i2pupdate.sud" ; + + public static final String PROP_TRUSTED_KEYS = "router.trustedUpdateKeys"; + + public static String getNewsURL() { + String url = RouterHelper.getContext().getProperty(PROP_NEWS_URL); + if(url == null) { + return DEFAULT_NEWS_URL; + } + else { + return url; + } + } + + public static String getUpdatePolicy() { + String policy = null; + try { + policy = RouterHelper.getContext().getProperty(PROP_UPDATE_POLICY); + } + catch(Exception e) { + e.printStackTrace(); + } + System.out.println("Policy: " + policy); + if(policy == null) { + return DEFAULT_UPDATE_POLICY; + } + else { + return policy; + } + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java b/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java new file mode 100644 index 000000000..7cc0fb46a --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java @@ -0,0 +1,32 @@ +package net.i2p.desktopgui.util; + +import javax.swing.InputVerifier; +import javax.swing.JComponent; +import javax.swing.JTextField; + +/** + * + * @author mathias + */ + +public class IntegerVerifier extends InputVerifier { + + @Override + public boolean verify(JComponent arg0) { + JTextField jtf = (JTextField) arg0; + return verify(jtf.getText()); + } + + @Override + public boolean shouldYieldFocus(JComponent input) { + return verify(input); + } + + public static boolean verify(String s) { + for(int i=0;i<s.length();i++) + if(s.charAt(i) > '9' || s.charAt(i) < '0') + return false; + return true; + } + +} \ No newline at end of file diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml index 02eee0aab..59f0421e7 100644 --- a/apps/i2psnark/java/build.xml +++ b/apps/i2psnark/java/build.xml @@ -18,13 +18,13 @@ <!-- Depend on classes instead of jars where available --> <classpath> <pathelement location="../../../core/java/build/obj" /> - <pathelement location="../../../router/java/build/obj" /> <pathelement location="../../ministreaming/java/build/obj" /> <pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" /> <pathelement location="../../jetty/jettylib/javax.servlet.jar" /> </classpath> </depend> </target> + <property name="javac.compilerargs" value="" /> <target name="compile" depends="depend"> <mkdir dir="./build" /> <mkdir dir="./build/obj" /> @@ -32,19 +32,28 @@ srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" destdir="./build/obj" - classpath="../../../core/java/build/i2p.jar:../../../router/java/build/router.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../ministreaming/java/build/mstreaming.jar" /> + classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../ministreaming/java/build/mstreaming.jar" > + <compilerarg line="${javac.compilerargs}" /> + </javac> </target> <target name="jar" depends="builddep, compile"> - <jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/*Servlet.class"> + <jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/I2PSnarkServlet*.class"> <manifest> <attribute name="Main-Class" value="org.klomp.snark.Snark" /> <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" /> </manifest> </jar> </target> + <!-- Ideally we would include + - only include the servlet, everything else is in the jar. + - However, the wrapper.config classpath in existing installs + - does not include i2psnark.jar. + - So we must continue to duplicate everything in the war. + <classes dir="./build/obj" includes="**/I2PSnarkServlet*.class" /> + --> <target name="war" depends="jar"> <war destfile="../i2psnark.war" webxml="../web.xml"> - <classes dir="./build/obj" includes="**/*" /> + <classes dir="./build/obj" includes="**/*.class" excludes="**/RunStandalone.class" /> </war> </target> @@ -54,30 +63,13 @@ </zip> </target> <target name="standalone_prep" depends="war"> - <javac debug="true" deprecation="on" source="1.5" target="1.5" - destdir="./build" srcdir="src/" includes="org/klomp/snark/web/RunStandalone.java" > - <classpath> - <pathelement location="../../jetty/jettylib/commons-logging.jar" /> - <pathelement location="../../jetty/jettylib/commons-el.jar" /> - <pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" /> - <pathelement location="../../jetty/jettylib/javax.servlet.jar" /> - <pathelement location="../../../core/java/build/i2p.jar" /> - </classpath> - </javac> - - <jar destfile="./build/launch-i2psnark.jar" basedir="./build/" includes="org/klomp/snark/web/RunStandalone.class"> - <manifest> - <attribute name="Main-Class" value="org.klomp.snark.web.RunStandalone" /> - <attribute name="Class-Path" value="lib/i2p.jar lib/mstreaming.jar lib/streaming.jar lib/commons-el.jar lib/commons-logging.jar lib/jasper-compiler.jar lib/jasper-runtime.jar lib/javax.servlet.jar lib/org.mortbay.jetty.jar" /> - </manifest> - </jar> - <delete dir="./dist" /> <mkdir dir="./dist" /> - <copy file="./build/launch-i2psnark.jar" tofile="./dist/launch-i2psnark.jar" /> + <copy file="../launch-i2psnark" todir="./dist/" /> <mkdir dir="./dist/webapps" /> <copy file="../i2psnark.war" tofile="./dist/webapps/i2psnark.war" /> <mkdir dir="./dist/lib" /> + <copy file="./build/i2psnark.jar" tofile="./dist/lib/i2psnark.jar" /> <copy file="../../../core/java/build/i2p.jar" tofile="./dist/lib/i2p.jar" /> <copy file="../../jetty/jettylib/commons-el.jar" tofile="./dist/lib/commons-el.jar" /> <copy file="../../jetty/jettylib/commons-logging.jar" tofile="./dist/lib/commons-logging.jar" /> @@ -89,7 +81,6 @@ <copy file="../../streaming/java/build/streaming.jar" tofile="./dist/lib/streaming.jar" /> <copy file="../jetty-i2psnark.xml" tofile="./dist/jetty-i2psnark.xml" /> <copy file="../readme-standalone.txt" tofile="./dist/readme.txt" /> - <mkdir dir="./dist/work" /> <mkdir dir="./dist/logs" /> <zip destfile="i2psnark-standalone.zip"> @@ -101,6 +92,7 @@ <delete dir="./build" /> <delete file="../i2psnark.war" /> <delete file="./i2psnark-standalone.zip" /> + <delete dir="./dist" /> </target> <target name="cleandep" depends="clean"> <ant dir="../../ministreaming/java/" target="distclean" /> diff --git a/apps/i2psnark/java/src/org/klomp/snark/BWLimits.java b/apps/i2psnark/java/src/org/klomp/snark/BWLimits.java new file mode 100644 index 000000000..eb157cb5e --- /dev/null +++ b/apps/i2psnark/java/src/org/klomp/snark/BWLimits.java @@ -0,0 +1,44 @@ +/* + * Released into the public domain + * with no warranty of any kind, either expressed or implied. + */ +package org.klomp.snark; + +import java.util.Arrays; +import java.util.Properties; + +import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSimpleClient; + +/** + * Connect via I2CP and ask the router the bandwidth limits. + * + * The call is blocking and returns null on failure. + * Timeout is set to 5 seconds in I2PSimpleSession but it should be much faster. + * + * @author zzz + */ +class BWLimits { + + public static int[] getBWLimits(String host, int port) { + int[] rv = null; + try { + I2PClient client = new I2PSimpleClient(); + Properties opts = new Properties(); + opts.put(I2PClient.PROP_TCP_HOST, host); + opts.put(I2PClient.PROP_TCP_PORT, "" + port); + I2PSession session = client.createSession(null, opts); + session.connect(); + rv = session.bandwidthLimits(); + session.destroySession(); + } catch (I2PSessionException ise) {} + return rv; + } + + public static void main(String args[]) { + System.out.println(Arrays.toString(getBWLimits("127.0.0.1", 7654))); + } +} diff --git a/apps/i2psnark/java/src/org/klomp/snark/BitField.java b/apps/i2psnark/java/src/org/klomp/snark/BitField.java index 85117b93d..876a39159 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/BitField.java +++ b/apps/i2psnark/java/src/org/klomp/snark/BitField.java @@ -140,7 +140,7 @@ public class BitField public String toString() { // Not very efficient - StringBuffer sb = new StringBuffer("BitField("); + StringBuilder sb = new StringBuilder("BitField("); sb.append(size).append(")["); for (int i = 0; i < size; i++) if (get(i)) diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java index 6d4aad1a3..2e45749b8 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java @@ -152,6 +152,7 @@ public class ConnectionAcceptor implements Runnable _util.debug("Error while accepting: " + ioe, Snark.ERROR); stop = true; } + // catch oom? } try diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index b7e623060..1a43514de 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -73,7 +73,7 @@ public class I2PSnarkUtil { // This is used for both announce replies and .torrent file downloads, // so it must be available even if not connected to I2CP. // so much for multiple instances - _tmpDir = new File("tmp", "i2psnark"); + _tmpDir = new File(ctx.getTempDir(), "i2psnark"); FileUtil.rmdir(_tmpDir, false); _tmpDir.mkdirs(); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java index 984e50ef3..77f07d299 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java @@ -362,7 +362,7 @@ public class MetaInfo */ private static String hexencode(byte[] bs) { - StringBuffer sb = new StringBuffer(bs.length*2); + StringBuilder sb = new StringBuilder(bs.length*2); for (int i = 0; i < bs.length; i++) { int c = bs[i] & 0xFF; @@ -432,7 +432,7 @@ public class MetaInfo private byte[] calculateInfoHash() { Map info = createInfoMap(); - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("info: "); for (Iterator iter = info.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java index 67ff4c858..0a998af3d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java @@ -190,7 +190,7 @@ public class PeerID implements Comparable { boolean leading_zeros = true; - StringBuffer sb = new StringBuffer(bs.length*2); + StringBuilder sb = new StringBuilder(bs.length*2); for (int i = 0; i < bs.length; i++) { int c = bs[i] & 0xFF; diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerMonitorTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerMonitorTask.java index 229391cd7..3ee8932f6 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerMonitorTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerMonitorTask.java @@ -23,6 +23,8 @@ package org.klomp.snark; import java.util.Iterator; import java.util.TimerTask; +import net.i2p.data.DataHelper; + /** * TimerTask that monitors the peers and total up/download speeds. * Works together with the main Snark class to report periodical statistics. @@ -83,21 +85,12 @@ class PeerMonitorTask extends TimerTask // Print some statistics long downloaded = coordinator.getDownloaded(); - String totalDown; - if (downloaded >= 10 * 1024 * 1024) - totalDown = (downloaded / (1024 * 1024)) + "MB"; - else - totalDown = (downloaded / 1024 )+ "KB"; + String totalDown = DataHelper.formatSize(downloaded) + "B"; long uploaded = coordinator.getUploaded(); - String totalUp; - if (uploaded >= 10 * 1024 * 1024) - totalUp = (uploaded / (1024 * 1024)) + "MB"; - else - totalUp = (uploaded / 1024) + "KB"; + String totalUp = DataHelper.formatSize(uploaded) + "B"; int needP = coordinator.storage.needed(); - long needMB - = needP * coordinator.metainfo.getPieceLength(0) / (1024 * 1024); + long needMB = needP * coordinator.metainfo.getPieceLength(0) / (1024 * 1024); int totalP = coordinator.metainfo.getPieces(); long totalMB = coordinator.metainfo.getTotalLength() / (1024 * 1024); diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 054b58262..378cd8758 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -60,9 +60,9 @@ class PeerState // If we have te resend outstanding requests (true after we got choked). private boolean resend = false; - private final static int MAX_PIPELINE = 3; // this is for outbound requests + private final static int MAX_PIPELINE = 5; // this is for outbound requests private final static int MAX_PIPELINE_BYTES = 128*1024; // this is for inbound requests - public final static int PARTSIZE = 32*1024; // Snark was 16K, i2p-bt uses 64KB + public final static int PARTSIZE = 16*1024; // outbound request private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this PeerState(Peer peer, PeerListener listener, MetaInfo metainfo, diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index f10ef41d3..53c42dfad 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -36,7 +36,6 @@ import java.util.Timer; import java.util.TimerTask; import net.i2p.I2PAppContext; -import net.i2p.router.client.ClientManagerFacadeImpl; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.data.Destination; import net.i2p.util.I2PThread; @@ -232,7 +231,7 @@ public class Snark } // Explicit shutdown. - Runtime.getRuntime().removeShutdownHook(snarkhook); + //Runtime.getRuntime().removeShutdownHook(snarkhook); snarkhook.start(); } } @@ -261,9 +260,9 @@ public class Snark public Snark(I2PAppContext ctx, Properties opts, String torrent, StorageListener slistener, boolean start, String rootDir) { this(new I2PSnarkUtil(ctx), torrent, null, -1, slistener, null, null, null, null, false, rootDir); - String host = opts.getProperty(ClientManagerFacadeImpl.PROP_CLIENT_HOST); + String host = opts.getProperty("i2cp.hostname"); int port = 0; - String s = opts.getProperty(ClientManagerFacadeImpl.PROP_CLIENT_PORT); + String s = opts.getProperty("i2cp.port"); if (s != null) { try { port = Integer.parseInt(s); diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 7b62ace84..ff507dc87 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -18,7 +18,6 @@ import java.util.TreeMap; import net.i2p.I2PAppContext; import net.i2p.data.Base64; import net.i2p.data.DataHelper; -import net.i2p.router.RouterContext; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; @@ -32,7 +31,7 @@ public class SnarkManager implements Snark.CompleteListener { /** map of (canonical) filename to Snark instance (unsynchronized) */ private Map _snarks; private Object _addSnarkLock; - private String _configFile = "i2psnark.config"; + private File _configFile; private Properties _config; private I2PAppContext _context; private Log _log; @@ -52,6 +51,7 @@ public class SnarkManager implements Snark.CompleteListener { public static final String PROP_META_PREFIX = "i2psnark.zmeta."; public static final String PROP_META_BITFIELD_SUFFIX = ".bitfield"; + private static final String CONFIG_FILE = "i2psnark.config"; public static final String PROP_AUTO_START = "i2snark.autoStart"; // oops public static final String DEFAULT_AUTO_START = "false"; public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix"; @@ -67,6 +67,9 @@ public class SnarkManager implements Snark.CompleteListener { _log = _context.logManager().getLog(SnarkManager.class); _messages = new ArrayList(16); _util = new I2PSnarkUtil(_context); + _configFile = new File(CONFIG_FILE); + if (!_configFile.isAbsolute()) + _configFile = new File(_context.getConfigDir(), CONFIG_FILE); loadConfig(null); } @@ -81,8 +84,7 @@ public class SnarkManager implements Snark.CompleteListener { I2PAppThread monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor"); monitor.setDaemon(true); monitor.start(); - if (_context instanceof RouterContext) - ((RouterContext)_context).router().addShutdownTask(new SnarkManagerShutdown()); + _context.addShutdownTask(new SnarkManagerShutdown()); } /** hook to I2PSnarkUtil for the servlet */ @@ -114,10 +116,11 @@ public class SnarkManager implements Snark.CompleteListener { } private int getStartupDelayMinutes() { return 3; } public File getDataDir() { - String dir = _config.getProperty(PROP_DIR); - if ( (dir == null) || (dir.trim().length() <= 0) ) - dir = "i2psnark"; - return new File(dir); + String dir = _config.getProperty(PROP_DIR, "i2psnark"); + File f = new File(dir); + if (!f.isAbsolute()) + f = new File(_context.getAppDir(), dir); + return f; } /** null to set initial defaults */ @@ -125,8 +128,10 @@ public class SnarkManager implements Snark.CompleteListener { if (_config == null) _config = new Properties(); if (filename != null) { - _configFile = filename; File cfg = new File(filename); + if (!cfg.isAbsolute()) + cfg = new File(_context.getConfigDir(), filename); + _configFile = cfg; if (cfg.exists()) { try { DataHelper.loadProps(_config, cfg); @@ -137,33 +142,32 @@ public class SnarkManager implements Snark.CompleteListener { } // now add sane defaults if (!_config.containsKey(PROP_I2CP_HOST)) - _config.setProperty(PROP_I2CP_HOST, "localhost"); + _config.setProperty(PROP_I2CP_HOST, "127.0.0.1"); if (!_config.containsKey(PROP_I2CP_PORT)) _config.setProperty(PROP_I2CP_PORT, "7654"); if (!_config.containsKey(PROP_I2CP_OPTS)) _config.setProperty(PROP_I2CP_OPTS, "inbound.length=2 inbound.lengthVariance=0 outbound.length=2 outbound.lengthVariance=0 inbound.quantity=3 outbound.quantity=3"); if (!_config.containsKey(PROP_EEP_HOST)) - _config.setProperty(PROP_EEP_HOST, "localhost"); + _config.setProperty(PROP_EEP_HOST, "127.0.0.1"); if (!_config.containsKey(PROP_EEP_PORT)) _config.setProperty(PROP_EEP_PORT, "4444"); if (!_config.containsKey(PROP_UPLOADERS_TOTAL)) _config.setProperty(PROP_UPLOADERS_TOTAL, "" + Snark.MAX_TOTAL_UPLOADERS); - if (!_config.containsKey(PROP_UPBW_MAX)) { - try { - if (_context instanceof RouterContext) - _config.setProperty(PROP_UPBW_MAX, "" + (((RouterContext)_context).bandwidthLimiter().getOutboundKBytesPerSecond() / 2)); - else - _config.setProperty(PROP_UPBW_MAX, "" + DEFAULT_MAX_UP_BW); - } catch (NoClassDefFoundError ncdfe) { - _config.setProperty(PROP_UPBW_MAX, "" + DEFAULT_MAX_UP_BW); - } - } if (!_config.containsKey(PROP_DIR)) _config.setProperty(PROP_DIR, "i2psnark"); if (!_config.containsKey(PROP_AUTO_START)) _config.setProperty(PROP_AUTO_START, DEFAULT_AUTO_START); updateConfig(); } + + /** call from DirMonitor since loadConfig() is called before router I2CP is up */ + private void getBWLimit() { + if (!_config.containsKey(PROP_UPBW_MAX)) { + int[] limits = BWLimits.getBWLimits(_util.getI2CPHost(), _util.getI2CPPort()); + if (limits != null && limits[1] > 0) + _util.setMaxUpBW(limits[1]); + } + } private void updateConfig() { String i2cpHost = _config.getProperty(PROP_I2CP_HOST); @@ -335,37 +339,37 @@ public class SnarkManager implements Snark.CompleteListener { } if (_util.shouldUseOpenTrackers() != useOpenTrackers) { _config.setProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS, useOpenTrackers + ""); - addMessage((useOpenTrackers ? "En" : "Dis") + "abled open trackers - torrent restart required to take effect"); + addMessage((useOpenTrackers ? "En" : "Dis") + "abled open trackers - torrent restart required to take effect."); changed = true; } if (openTrackers != null) { if (openTrackers.trim().length() > 0 && !openTrackers.trim().equals(_util.getOpenTrackerString())) { _config.setProperty(I2PSnarkUtil.PROP_OPENTRACKERS, openTrackers.trim()); - addMessage("Open Tracker list changed - torrent restart required to take effect"); + addMessage("Open Tracker list changed - torrent restart required to take effect."); changed = true; } } if (changed) { saveConfig(); } else { - addMessage("Configuration unchanged"); + addMessage("Configuration unchanged."); } } public void saveConfig() { try { synchronized (_configFile) { - DataHelper.storeProps(_config, new File(_configFile)); + DataHelper.storeProps(_config, _configFile); } } catch (IOException ioe) { - addMessage("Unable to save the config to '" + _configFile + "'"); + addMessage("Unable to save the config to '" + _configFile.getAbsolutePath() + "'."); } } public Properties getConfig() { return _config; } /** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */ - private static final int MAX_FILES_PER_TORRENT = 256; + private static final int MAX_FILES_PER_TORRENT = 512; /** set of filenames that we are dealing with */ public Set listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } } @@ -379,7 +383,7 @@ public class SnarkManager implements Snark.CompleteListener { addMessage("Connecting to I2P"); boolean ok = _util.connect(); if (!ok) { - addMessage("Error connecting to I2P - check your I2CP settings"); + addMessage("Error connecting to I2P - check your I2CP settings!"); return; } } @@ -442,9 +446,9 @@ public class SnarkManager implements Snark.CompleteListener { File f = new File(filename); if (!dontAutoStart && shouldAutoStart()) { torrent.startTorrent(); - addMessage("Torrent added and started: '" + f.getName() + "'"); + addMessage("Torrent added and started: '" + f.getName() + "'."); } else { - addMessage("Torrent added: '" + f.getName() + "'"); + addMessage("Torrent added: '" + f.getName() + "'."); } } @@ -539,23 +543,25 @@ public class SnarkManager implements Snark.CompleteListener { String announce = info.getAnnounce(); // basic validation of url if ((!announce.startsWith("http://")) || - (announce.indexOf(".i2p/") < 0)) - return "Non-i2p tracker in " + info.getName() + ", deleting it"; + (announce.indexOf(".i2p/") < 0)) // need to do better than this + return "Non-i2p tracker in " + info.getName() + ", deleting it from our list of trackers!"; List files = info.getFiles(); if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) { - return "Too many files in " + info.getName() + " (" + files.size() + "), deleting it"; + return "Too many files in " + info.getName() + " (" + files.size() + "), deleting it!"; } else if (info.getPieces() <= 0) { - return "No pieces in " + info.getName() + "? deleting it"; - } else if (info.getPieceLength(0) > 1*1024*1024) { - return "Pieces are too large in " + info.getName() + " (" + info.getPieceLength(0)/1024 + "KB), deleting it"; - } else if (info.getTotalLength() > 10*1024*1024*1024l) { + return "No pieces in " + info.getName() + "? deleting it!"; + } else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) { + return "Pieces are too large in " + info.getName() + " (" + DataHelper.formatSize(info.getPieceLength(0)) + + "B), deleting it."; + } else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) { System.out.println("torrent info: " + info.toString()); List lengths = info.getLengths(); if (lengths != null) for (int i = 0; i < lengths.size(); i++) - System.out.println("File " + i + " is " + lengths.get(i) + " long"); + System.out.println("File " + i + " is " + lengths.get(i) + " long."); - return "Torrents larger than 10GB are not supported yet (because we're paranoid): " + info.getName() + ", deleting it"; + return "Torrents larger than " + DataHelper.formatSize(Storage.MAX_TOTAL_SIZE) + + "B are not supported yet (because we're paranoid): " + info.getName() + ", deleting it!"; } else { // ok return null; @@ -592,7 +598,7 @@ public class SnarkManager implements Snark.CompleteListener { ////_util. } if (!wasStopped) - addMessage("Torrent stopped: '" + sfile.getName() + "'"); + addMessage("Torrent stopped: '" + sfile.getName() + "'."); } return torrent; } @@ -607,7 +613,7 @@ public class SnarkManager implements Snark.CompleteListener { torrentFile.delete(); if (torrent.storage != null) removeTorrentStatus(torrent.storage.getMetaInfo()); - addMessage("Torrent removed: '" + torrentFile.getName() + "'"); + addMessage("Torrent removed: '" + torrentFile.getName() + "'."); } } @@ -620,6 +626,9 @@ public class SnarkManager implements Snark.CompleteListener { _messages.remove(0); } + // here because we need to delay until I2CP is up + // although the user will see the default until then + getBWLimit(); while (true) { File dir = getDataDir(); _log.debug("Directory Monitor loop over " + dir.getAbsolutePath()); @@ -637,8 +646,7 @@ public class SnarkManager implements Snark.CompleteListener { public void torrentComplete(Snark snark) { File f = new File(snark.torrent); long len = snark.meta.getTotalLength(); - addMessage("Download complete of " + f.getName() - + (len < 5*1024*1024 ? " (size: " + (len/1024) + "KB)" : " (size: " + (len/(1024*1024l)) + "MB)")); + addMessage("Download finished: " + f.getName() + " (size: " + DataHelper.formatSize(len) + "B)"); updateStatus(snark); } @@ -666,7 +674,7 @@ public class SnarkManager implements Snark.CompleteListener { // already known. noop } else { if (shouldAutoStart() && !_util.connect()) - addMessage("Unable to connect to I2P"); + addMessage("Unable to connect to I2P!"); addTorrent((String)foundNames.get(i), !shouldAutoStart()); } } @@ -683,17 +691,19 @@ public class SnarkManager implements Snark.CompleteListener { } private static final String DEFAULT_TRACKERS[] = { - "Postman", "http://YRgrgTLGnbTq2aZOZDJQ~o6Uk5k6TK-OZtx0St9pb0G-5EGYURZioxqYG8AQt~LgyyI~NCj6aYWpPO-150RcEvsfgXLR~CxkkZcVpgt6pns8SRc3Bi-QSAkXpJtloapRGcQfzTtwllokbdC-aMGpeDOjYLd8b5V9Im8wdCHYy7LRFxhEtGb~RL55DA8aYOgEXcTpr6RPPywbV~Qf3q5UK55el6Kex-6VCxreUnPEe4hmTAbqZNR7Fm0hpCiHKGoToRcygafpFqDw5frLXToYiqs9d4liyVB-BcOb0ihORbo0nS3CLmAwZGvdAP8BZ7cIYE3Z9IU9D1G8JCMxWarfKX1pix~6pIA-sp1gKlL1HhYhPMxwyxvuSqx34o3BqU7vdTYwWiLpGM~zU1~j9rHL7x60pVuYaXcFQDR4-QVy26b6Pt6BlAZoFmHhPcAuWfu-SFhjyZYsqzmEmHeYdAwa~HojSbofg0TMUgESRXMw6YThK1KXWeeJVeztGTz25sL8AAAA.i2p/announce.php=http://tracker.postman.i2p/" +// "Postman", "http://YRgrgTLGnbTq2aZOZDJQ~o6Uk5k6TK-OZtx0St9pb0G-5EGYURZioxqYG8AQt~LgyyI~NCj6aYWpPO-150RcEvsfgXLR~CxkkZcVpgt6pns8SRc3Bi-QSAkXpJtloapRGcQfzTtwllokbdC-aMGpeDOjYLd8b5V9Im8wdCHYy7LRFxhEtGb~RL55DA8aYOgEXcTpr6RPPywbV~Qf3q5UK55el6Kex-6VCxreUnPEe4hmTAbqZNR7Fm0hpCiHKGoToRcygafpFqDw5frLXToYiqs9d4liyVB-BcOb0ihORbo0nS3CLmAwZGvdAP8BZ7cIYE3Z9IU9D1G8JCMxWarfKX1pix~6pIA-sp1gKlL1HhYhPMxwyxvuSqx34o3BqU7vdTYwWiLpGM~zU1~j9rHL7x60pVuYaXcFQDR4-QVy26b6Pt6BlAZoFmHhPcAuWfu-SFhjyZYsqzmEmHeYdAwa~HojSbofg0TMUgESRXMw6YThK1KXWeeJVeztGTz25sL8AAAA.i2p/announce.php=http://tracker.postman.i2p/" // , "eBook", "http://E71FRom6PZNEqTN2Lr8P-sr23b7HJVC32KoGnVQjaX6zJiXwhJy2HsXob36Qmj81TYFZdewFZa9mSJ533UZgGyQkXo2ahctg82JKYZfDe5uDxAn1E9YPjxZCWJaFJh0S~UwSs~9AZ7UcauSJIoNtpxrtbmRNVFLqnkEDdLZi26TeucfOmiFmIWnVblLniWv3tG1boE9Abd-6j3FmYVrRucYuepAILYt6katmVNOk6sXmno1Eynrp~~MBuFq0Ko6~jsc2E2CRVYXDhGHEMdt-j6JUz5D7S2RIVzDRqQyAZLKJ7OdQDmI31przzmne1vOqqqLC~1xUumZVIvF~yOeJUGNjJ1Vx0J8i2BQIusn1pQJ6UCB~ZtZZLQtEb8EPVCfpeRi2ri1M5CyOuxN0V5ekmPHrYIBNevuTCRC26NP7ZS5VDgx1~NaC3A-CzJAE6f1QXi0wMI9aywNG5KGzOPifcsih8eyGyytvgLtrZtV7ykzYpPCS-rDfITncpn5hliPUAAAA.i2p/pub/bt/announce.php=http://de-ebook-archiv.i2p/pub/bt/" // , "Gaytorrents", "http://uxPWHbK1OIj9HxquaXuhMiIvi21iK0~ZiG9d8G0840ZXIg0r6CbiV71xlsqmdnU6wm0T2LySriM0doW2gUigo-5BNkUquHwOjLROiETnB3ZR0Ml4IGa6QBPn1aAq2d9~g1r1nVjLE~pcFnXB~cNNS7kIhX1d6nLgYVZf0C2cZopEow2iWVUggGGnAA9mHjE86zLEnTvAyhbAMTqDQJhEuLa0ZYSORqzJDMkQt90MV4YMjX1ICY6RfUSFmxEqu0yWTrkHsTtRw48l~dz9wpIgc0a0T9C~eeWvmBFTqlJPtQZwntpNeH~jF7nlYzB58olgV2HHFYpVYD87DYNzTnmNWxCJ5AfDorm6AIUCV2qaE7tZtI1h6fbmGpGlPyW~Kw5GXrRfJwNvr6ajwAVi~bPVnrBwDZezHkfW4slOO8FACPR28EQvaTu9nwhAbqESxV2hCTq6vQSGjuxHeOuzBOEvRWkLKOHWTC09t2DbJ94FSqETmZopTB1ukEmaxRWbKSIaAAAA.i2p/announce.php=http://gaytorrents.i2p/" // , "NickyB", "http://9On6d3cZ27JjwYCtyJJbowe054d5tFnfMjv4PHsYs-EQn4Y4mk2zRixatvuAyXz2MmRfXG-NAUfhKr0KCxRNZbvHmlckYfT-WBzwwpiMAl0wDFY~Pl8cqXuhfikSG5WrqdPfDNNIBuuznS0dqaczf~OyVaoEOpvuP3qV6wKqbSSLpjOwwAaQPHjlRtNIW8-EtUZp-I0LT45HSoowp~6b7zYmpIyoATvIP~sT0g0MTrczWhbVTUZnEkZeLhOR0Duw1-IRXI2KHPbA24wLO9LdpKKUXed05RTz0QklW5ROgR6TYv7aXFufX8kC0-DaKvQ5JKG~h8lcoHvm1RCzNqVE-2aiZnO2xH08H-iCWoLNJE-Td2kT-Tsc~3QdQcnEUcL5BF-VT~QYRld2--9r0gfGl-yDrJZrlrihHGr5J7ImahelNn9PpkVp6eIyABRmJHf2iicrk3CtjeG1j9OgTSwaNmEpUpn4aN7Kx0zNLdH7z6uTgCGD9Kmh1MFYrsoNlTp4AAAA.i2p/bittorrent/announce.php=http://nickyb.i2p/bittorrent/" // , "Orion", "http://gKik1lMlRmuroXVGTZ~7v4Vez3L3ZSpddrGZBrxVriosCQf7iHu6CIk8t15BKsj~P0JJpxrofeuxtm7SCUAJEr0AIYSYw8XOmp35UfcRPQWyb1LsxUkMT4WqxAT3s1ClIICWlBu5An~q-Mm0VFlrYLIPBWlUFnfPR7jZ9uP5ZMSzTKSMYUWao3ejiykr~mtEmyls6g-ZbgKZawa9II4zjOy-hdxHgP-eXMDseFsrym4Gpxvy~3Fv9TuiSqhpgm~UeTo5YBfxn6~TahKtE~~sdCiSydqmKBhxAQ7uT9lda7xt96SS09OYMsIWxLeQUWhns-C~FjJPp1D~IuTrUpAFcVEGVL-BRMmdWbfOJEcWPZ~CBCQSO~VkuN1ebvIOr9JBerFMZSxZtFl8JwcrjCIBxeKPBmfh~xYh16BJm1BBBmN1fp2DKmZ2jBNkAmnUbjQOqWvUcehrykWk5lZbE7bjJMDFH48v3SXwRuDBiHZmSbsTY6zhGY~GkMQHNGxPMMSIAAAA.i2p/bt/announce.php=http://orion.i2p/bt/" // , "anonymity", "http://8EoJZIKrWgGuDrxA3nRJs1jsPfiGwmFWL91hBrf0HA7oKhEvAna4Ocx47VLUR9retVEYBAyWFK-eZTPcvhnz9XffBEiJQQ~kFSCqb1fV6IfPiV3HySqi9U5Caf6~hC46fRd~vYnxmaBLICT3N160cxBETqH3v2rdxdJpvYt8q4nMk9LUeVXq7zqCTFLLG5ig1uKgNzBGe58iNcsvTEYlnbYcE930ABmrzj8G1qQSgSwJ6wx3tUQNl1z~4wSOUMan~raZQD60lRK70GISjoX0-D0Po9WmPveN3ES3g72TIET3zc3WPdK2~lgmKGIs8GgNLES1cXTolvbPhdZK1gxddRMbJl6Y6IPFyQ9o4-6Rt3Lp-RMRWZ2TG7j2OMcNSiOmATUhKEFBDfv-~SODDyopGBmfeLw16F4NnYednvn4qP10dyMHcUASU6Zag4mfc2-WivrOqeWhD16fVAh8MoDpIIT~0r9XmwdaVFyLcjbXObabJczxCAW3fodQUnvuSkwzAAAA.i2p/anonymityTracker/announce.php=http://anonymityweb.i2p/anonymityTracker/" // , "The freak's tracker", "http://mHKva9x24E5Ygfey2llR1KyQHv5f8hhMpDMwJDg1U-hABpJ2NrQJd6azirdfaR0OKt4jDlmP2o4Qx0H598~AteyD~RJU~xcWYdcOE0dmJ2e9Y8-HY51ie0B1yD9FtIV72ZI-V3TzFDcs6nkdX9b81DwrAwwFzx0EfNvK1GLVWl59Ow85muoRTBA1q8SsZImxdyZ-TApTVlMYIQbdI4iQRwU9OmmtefrCe~ZOf4UBS9-KvNIqUL0XeBSqm0OU1jq-D10Ykg6KfqvuPnBYT1BYHFDQJXW5DdPKwcaQE4MtAdSGmj1epDoaEBUa9btQlFsM2l9Cyn1hzxqNWXELmx8dRlomQLlV4b586dRzW~fLlOPIGC13ntPXogvYvHVyEyptXkv890jC7DZNHyxZd5cyrKC36r9huKvhQAmNABT2Y~pOGwVrb~RpPwT0tBuPZ3lHYhBFYmD8y~AOhhNHKMLzea1rfwTvovBMByDdFps54gMN1mX4MbCGT4w70vIopS9yAAAA.i2p/bytemonsoon/announce.php" - , "welterde", "http://BGKmlDOoH3RzFbPRfRpZV2FjpVj8~3moFftw5-dZfDf2070TOe8Tf2~DAVeaM6ZRLdmFEt~9wyFL8YMLMoLoiwGEH6IGW6rc45tstN68KsBDWZqkTohV1q9XFgK9JnCwE~Oi89xLBHsLMTHOabowWM6dkC8nI6QqJC2JODqLPIRfOVrDdkjLwtCrsckzLybNdFmgfoqF05UITDyczPsFVaHtpF1sRggOVmdvCM66otyonlzNcJbn59PA-R808vUrCPMGU~O9Wys0i-NoqtIbtWfOKnjCRFMNw5ex4n9m5Sxm9e20UkpKG6qzEuvKZWi8vTLe1NW~CBrj~vG7I3Ok4wybUFflBFOaBabxYJLlx4xTE1zJIVxlsekmAjckB4v-cQwulFeikR4LxPQ6mCQknW2HZ4JQIq6hL9AMabxjOlYnzh7kjOfRGkck8YgeozcyTvcDUcUsOuSTk06L4kdrv8h2Cozjbloi5zl6KTbj5ZTciKCxi73Pn9grICn-HQqEAAAA.i2p/a=http://tracker.welterde.i2p/stats?mode=top5" // , "mastertracker", "http://VzXD~stRKbL3MOmeTn1iaCQ0CFyTmuFHiKYyo0Rd~dFPZFCYH-22rT8JD7i-C2xzYFa4jT5U2aqHzHI-Jre4HL3Ri5hFtZrLk2ax3ji7Qfb6qPnuYkuiF2E2UDmKUOppI8d9Ye7tjdhQVCy0izn55tBaB-U7UWdcvSK2i85sauyw3G0Gfads1Rvy5-CAe2paqyYATcDmGjpUNLoxbfv9KH1KmwRTNH6k1v4PyWYYnhbT39WfKMbBjSxVQRdi19cyJrULSWhjxaQfJHeWx5Z8Ev4bSPByBeQBFl2~4vqy0S5RypINsRSa3MZdbiAAyn5tr5slWR6QdoqY3qBQgBJFZppy-3iWkFqqKgSxCPundF8gdDLC5ddizl~KYcYKl42y9SGFHIukH-TZs8~em0~iahzsqWVRks3zRG~tlBcX2U3M2~OJs~C33-NKhyfZT7-XFBREvb8Szmd~p66jDxrwOnKaku-G6DyoQipJqIz4VHmY9-y5T8RrUcJcM-5lVoMpAAAA.i2p/announce.php=http://tracker.mastertracker.i2p/" // , "Galen", "http://5jpwQMI5FT303YwKa5Rd38PYSX04pbIKgTaKQsWbqoWjIfoancFdWCShXHLI5G5ofOb0Xu11vl2VEMyPsg1jUFYSVnu4-VfMe3y4TKTR6DTpetWrnmEK6m2UXh91J5DZJAKlgmO7UdsFlBkQfR2rY853-DfbJtQIFl91tbsmjcA5CGQi4VxMFyIkBzv-pCsuLQiZqOwWasTlnzey8GcDAPG1LDcvfflGV~6F5no9mnuisZPteZKlrv~~TDoXTj74QjByWc4EOYlwqK8sbU9aOvz~s31XzErbPTfwiawiaZ0RUI-IDrKgyvmj0neuFTWgjRGVTH8bz7cBZIc3viy6ioD-eMQOrXaQL0TCWZUelRwHRvgdPiQrxdYQs7ixkajeHzxi-Pq0EMm5Vbh3j3Q9kfUFW3JjFDA-MLB4g6XnjCbM5J1rC0oOBDCIEfhQkszru5cyLjHiZ5yeA0VThgu~c7xKHybv~OMXION7V8pBKOgET7ZgAkw1xgYe3Kkyq5syAAAA.i2p/tr/announce.php=http://galen.i2p/tr/" - , "crstrack", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/" + "POSTMAN", "http://tracker2.postman.i2p/announce.php=http://tracker2.postman.i2p/" + ,"WELTERDE", "http://BGKmlDOoH3RzFbPRfRpZV2FjpVj8~3moFftw5-dZfDf2070TOe8Tf2~DAVeaM6ZRLdmFEt~9wyFL8YMLMoLoiwGEH6IGW6rc45tstN68KsBDWZqkTohV1q9XFgK9JnCwE~Oi89xLBHsLMTHOabowWM6dkC8nI6QqJC2JODqLPIRfOVrDdkjLwtCrsckzLybNdFmgfoqF05UITDyczPsFVaHtpF1sRggOVmdvCM66otyonlzNcJbn59PA-R808vUrCPMGU~O9Wys0i-NoqtIbtWfOKnjCRFMNw5ex4n9m5Sxm9e20UkpKG6qzEuvKZWi8vTLe1NW~CBrj~vG7I3Ok4wybUFflBFOaBabxYJLlx4xTE1zJIVxlsekmAjckB4v-cQwulFeikR4LxPQ6mCQknW2HZ4JQIq6hL9AMabxjOlYnzh7kjOfRGkck8YgeozcyTvcDUcUsOuSTk06L4kdrv8h2Cozjbloi5zl6KTbj5ZTciKCxi73Pn9grICn-HQqEAAAA.i2p/a=http://tracker.welterde.i2p/stats?mode=top5" + , "CRSTRACK", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/" + }; /** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 69e5a198f..a6ca56583 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -56,10 +56,11 @@ public class Storage boolean changed; /** The default piece size. */ - private static int MIN_PIECE_SIZE = 256*1024; - private static int MAX_PIECE_SIZE = 1024*1024; + private static final int MIN_PIECE_SIZE = 256*1024; + public static final int MAX_PIECE_SIZE = 1024*1024; /** The maximum number of pieces in a torrent. */ - private static long MAX_PIECES = 100*1024/20; + public static final int MAX_PIECES = 10*1024; + public static final long MAX_TOTAL_SIZE = MAX_PIECE_SIZE * (long) MAX_PIECES; /** * Creates a new storage based on the supplied MetaInfo. This will @@ -189,6 +190,9 @@ public class Storage } */ + /** FIXME we can run out of fd's doing this, + * maybe some sort of global close-RAF-right-away flag + * would do the trick */ private void fast_digestCreate() throws IOException { // Calculate piece_hashes SHA1 digest = new SHA1(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java index 3ba2f6be6..da317998a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java +++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java @@ -373,7 +373,7 @@ public class TrackerClient extends I2PAppThread */ public static String urlencode(byte[] bs) { - StringBuffer sb = new StringBuffer(bs.length*3); + StringBuilder sb = new StringBuilder(bs.length*3); for (int i = 0; i < bs.length; i++) { int c = bs[i] & 0xFF; diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index d42d3b520..99b4c22ca 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -82,14 +82,9 @@ public class I2PSnarkServlet extends HttpServlet { // we want it to go to the base URI so we don't refresh with some funky action= value out.write("<meta http-equiv=\"refresh\" content=\"60;" + req.getRequestURI() + peerString + "\">\n"); out.write(HEADER); - - out.write("<table border=\"0\" width=\"100%\">\n"); - out.write("<tr><td width=\"20%\" class=\"snarkTitle\" valign=\"top\" align=\"left\">"); - out.write("I2PSnark<br />\n"); - out.write("<table border=\"0\" width=\"100%\">\n"); - out.write("<tr><td><a href=\"" + req.getRequestURI() + peerString + "\" class=\"snarkRefresh\">Refresh</a>\n"); - out.write("<td><a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\">Forum</a>\n"); - int count = 0; + out.write("</head><body>"); + out.write("<center><div class=\"page\"><table border=\"0\" width=\"100%\"><tr><td align=\"center\" class=\"snarkTitle\"><a href=\"" + req.getRequestURI() + peerString + "\" title=\"I2PSnark (Manual Page Refresh)\"><img src=\"/themes/console/images/i2psnark.png\" alt=\"I2PSnark Anonymous BitTorrent Client\" border=\"0\" class=\"snarklogo\"></a></table>"); + out.write("<div class=\"snarknavbar\"><a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\" target=\"_blank\">Forum</a>\n"); Map trackers = _manager.getTrackers(); for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); @@ -99,20 +94,16 @@ public class I2PSnarkServlet extends HttpServlet { if (e < 0) continue; baseURL = baseURL.substring(e + 1); - if (count++ % 2 == 0) - out.write("<tr>"); - out.write("<td><a href=\"" + baseURL + "\" class=\"snarkRefresh\">" + name + "</a>\n"); + out.write("<a href=\"" + baseURL + "\" class=\"snarkRefresh\" target=\"_blank\">" + name + "</a>"); } - if (count % 2 == 1) - out.write("<td> \n"); - out.write("</table>\n"); - out.write("</td><td width=\"80%\" class=\"snarkMessages\" valign=\"top\" align=\"left\"><pre>"); + out.write("</div>\n"); + out.write("<div class=\"mainsection\"><div class=\"snarkMessages\"><table><tr><td align=\"left\"><pre>"); List msgs = _manager.getMessages(); for (int i = msgs.size()-1; i >= 0; i--) { String msg = (String)msgs.get(i); out.write(msg + "\n"); } - out.write("</pre></td></tr></table>\n"); + out.write("</pre></td></tr></table></div>"); List snarks = getSortedSnarks(req); String uri = req.getRequestURI(); @@ -124,7 +115,7 @@ public class I2PSnarkServlet extends HttpServlet { out.write("(<a href=\"" + req.getRequestURI() + "?p=1" + "\">Show Peers</a>)<br />\n"); } out.write(TABLE_HEADER2); - out.write("<th align=\"left\" valign=\"top\">"); + out.write("<th align=\"left\">"); if (_manager.util().connected()) out.write("<a href=\"" + uri + "?action=StopAll&nonce=" + _nonce + "\" title=\"Stop all torrents and the i2p tunnel\">Stop All</a>"); @@ -144,12 +135,12 @@ public class I2PSnarkServlet extends HttpServlet { out.write(TABLE_EMPTY); } else if (snarks.size() > 1) { out.write("<tfoot><tr>\n" + - " <th align=\"left\" valign=\"top\" colspan=\"2\">Totals (" + snarks.size() + " torrents, " + stats[4] + " connected peers)</th>\n" + + " <th align=\"left\" colspan=\"2\">Totals (" + snarks.size() + " torrents, " + stats[4] + " connected peers)</th>\n" + " <th> </th>\n" + - " <th align=\"right\" valign=\"top\">" + formatSize(stats[0]) + "</th>\n" + - " <th align=\"right\" valign=\"top\">" + formatSize(stats[1]) + "</th>\n" + - " <th align=\"right\" valign=\"top\">" + formatSize(stats[2]) + "ps</th>\n" + - " <th align=\"right\" valign=\"top\">" + formatSize(stats[3]) + "ps</th>\n" + + " <th align=\"right\">" + formatSize(stats[0]) + "</th>\n" + + " <th align=\"right\">" + formatSize(stats[1]) + "</th>\n" + + " <th align=\"right\">" + formatSize(stats[2]) + "ps</th>\n" + + " <th align=\"right\">" + formatSize(stats[3]) + "ps</th>\n" + " <th> </th></tr>\n" + "</tfoot>\n"); } @@ -173,6 +164,7 @@ public class I2PSnarkServlet extends HttpServlet { } else if ("Add torrent".equals(action)) { String newFile = req.getParameter("newFile"); String newURL = req.getParameter("newURL"); + // NOTE - newFile currently disabled in HTML form - see below File f = null; if ( (newFile != null) && (newFile.trim().length() > 0) ) f = new File(newFile.trim()); @@ -202,10 +194,14 @@ public class I2PSnarkServlet extends HttpServlet { } catch (IOException ioe) { _log.warn("hrm: " + local, ioe); } - } else if ( (newURL != null) && (newURL.trim().length() > "http://.i2p/".length()) ) { - _manager.addMessage("Fetching " + newURL); - I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add"); - fetch.start(); + } else if (newURL != null) { + if (newURL.startsWith("http://")) { + _manager.addMessage("Fetching " + newURL); + I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add"); + fetch.start(); + } else { + _manager.addMessage("Invalid URL - must start with http://"); + } } else { // no file or URL specified } @@ -322,7 +318,7 @@ public class I2PSnarkServlet extends HttpServlet { _manager.updateConfig(dataDir, autoStart, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, openTrackers); } else if ("Create torrent".equals(action)) { String baseData = req.getParameter("baseFile"); - if (baseData != null) { + if (baseData != null && baseData.trim().length() > 0) { File baseFile = new File(_manager.getDataDir(), baseData); String announceURL = req.getParameter("announceURL"); String announceURLOther = req.getParameter("announceURLOther"); @@ -355,9 +351,11 @@ public class I2PSnarkServlet extends HttpServlet { } else { _manager.addMessage("Cannot create a torrent for the nonexistent data: " + baseFile.getAbsolutePath()); } + } else { + _manager.addMessage("Error creating torrent - you must enter a file or directory"); } } else if ("StopAll".equals(action)) { - _manager.addMessage("Stopping all torrents and closing the I2P tunnel"); + _manager.addMessage("Stopping all torrents and closing the I2P tunnel."); List snarks = getSortedSnarks(req); for (int i = 0; i < snarks.size(); i++) { Snark snark = (Snark)snarks.get(i); @@ -366,10 +364,10 @@ public class I2PSnarkServlet extends HttpServlet { } if (_manager.util().connected()) { _manager.util().disconnect(); - _manager.addMessage("I2P tunnel closed"); + _manager.addMessage("I2P tunnel closed."); } } else if ("StartAll".equals(action)) { - _manager.addMessage("Opening the I2P tunnel and starting all torrents"); + _manager.addMessage("Opening the I2P tunnel and starting all torrents."); List snarks = getSortedSnarks(req); for (int i = 0; i < snarks.size(); i++) { Snark snark = (Snark)snarks.get(i); @@ -393,7 +391,7 @@ public class I2PSnarkServlet extends HttpServlet { return rv; } - private static final int MAX_DISPLAYED_FILENAME_LENGTH = 60; + private static final int MAX_DISPLAYED_FILENAME_LENGTH = 44; private static final int MAX_DISPLAYED_ERROR_LENGTH = 40; private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers, boolean showDebug) throws IOException { String filename = snark.torrent; @@ -403,7 +401,7 @@ public class I2PSnarkServlet extends HttpServlet { if (i > 0) filename = filename.substring(0, i); if (filename.length() > MAX_DISPLAYED_FILENAME_LENGTH) - filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "..."; + filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "…"; long total = snark.meta.getTotalLength(); // Early typecast, avoid possibly overflowing a temp integer long remaining = (long) snark.storage.needed() * (long) snark.meta.getPieceLength(0); @@ -455,7 +453,7 @@ public class I2PSnarkServlet extends HttpServlet { statusString = "<a title=\"" + err + "\">TrackerErr (" + curPeers + "/" + knownPeers + " peers)"; else { if (err.length() > MAX_DISPLAYED_ERROR_LENGTH) - err = err.substring(0, MAX_DISPLAYED_ERROR_LENGTH) + "..."; + err = err.substring(0, MAX_DISPLAYED_ERROR_LENGTH) + "…"; statusString = "TrackerErr<br />(" + err + ")"; } } else if (remaining <= 0) { @@ -488,59 +486,61 @@ public class I2PSnarkServlet extends HttpServlet { String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd"); out.write("<tr class=\"" + rowClass + "\">"); - out.write("<td valign=\"top\" align=\"left\" class=\"snarkTorrentStatus " + rowClass + "\">"); + out.write("<td align=\"left\" class=\"snarkTorrentStatus " + rowClass + "\">"); out.write(statusString + "</td>\n\t"); - out.write("<td valign=\"top\" align=\"left\" class=\"snarkTorrentName " + rowClass + "\">"); + out.write("<td align=\"left\" class=\"snarkTorrentName " + rowClass + "\">"); if (remaining == 0) out.write("<a href=\"" + _manager.linkPrefix() + snark.meta.getName() - + "\" title=\"Download the completed file\">"); + + "\" title=\"Click to access completed downloaded..\">"); out.write(filename); if (remaining == 0) out.write("</a>"); - // temporarily hardcoded for postman and anonymity, requires bytemonsoon patch for lookup by info_hash + // temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash String announce = snark.meta.getAnnounce(); - if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr")) { + if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") || + announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/")) { Map trackers = _manager.getTrackers(); for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); String name = (String)entry.getKey(); String baseURL = (String)entry.getValue(); - if (!baseURL.startsWith(announce)) + if (!(baseURL.startsWith(announce) || // vvv hack for non-b64 announce in list vvv + (announce.startsWith("http://lnQ6yoBT") && baseURL.startsWith("http://tracker2.postman.i2p/")))) continue; int e = baseURL.indexOf('='); if (e < 0) continue; baseURL = baseURL.substring(e + 1); - out.write("   (<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash="); + out.write("   [<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash="); out.write(TrackerClient.urlencode(snark.meta.getInfoHash())); - out.write("\" title=\"" + name + " Tracker\">Details</a>)"); + out.write("\" title=\"" + name + " Tracker\">Details</a>]"); break; } } out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">"); + out.write("<td align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">"); if(isRunning && remainingSeconds > 0) out.write(DataHelper.formatDuration(remainingSeconds*1000)); // (eta 6h) out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">"); + out.write("<td align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">"); if (remaining > 0) out.write(formatSize(total-remaining) + "/" + formatSize(total)); // 18MB/3GB else out.write(formatSize(total)); // 3GB out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentUploaded " + rowClass + out.write("<td align=\"right\" class=\"snarkTorrentUploaded " + rowClass + "\">" + formatSize(uploaded) + "</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentRate\">"); + out.write("<td align=\"right\" class=\"snarkTorrentRate\">"); if(isRunning && remaining > 0) out.write(formatSize(downBps) + "ps"); out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentRate\">"); + out.write("<td align=\"right\" class=\"snarkTorrentRate\">"); if(isRunning) out.write(formatSize(upBps) + "ps"); out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"left\" class=\"snarkTorrentAction " + rowClass + "\">"); + out.write("<td align=\"left\" class=\"snarkTorrentAction " + rowClass + "\">"); String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.meta.getInfoHash()); if (showPeers) parameters = parameters + "&p=1"; @@ -567,7 +567,7 @@ public class I2PSnarkServlet extends HttpServlet { out.write("<tr class=\"" + rowClass + "\">"); out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">"); out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); + out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); String ch = peer.toString().substring(0, 4); String client; if ("AwMD".equals(ch)) @@ -582,6 +582,8 @@ public class I2PSnarkServlet extends HttpServlet { client = "I2PSnarkXL"; else if ("ZV".equals(ch.substring(2,4))) client = "Robert"; + else if ("VUZP".equals(ch)) + client = "Robert"; else client = "Unknown (" + ch + ')'; out.write("<font size=-1>" + client + "</font>  <tt>" + peer.toString().substring(5, 9) + "</tt>"); @@ -590,7 +592,7 @@ public class I2PSnarkServlet extends HttpServlet { out.write("</td>\n\t"); out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">"); out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); + out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); float pct = (float) (100.0 * (float) peer.completed() / snark.meta.getPieces()); if (pct == 100.0) out.write("<font size=-1>Seed</font>"); @@ -603,7 +605,7 @@ public class I2PSnarkServlet extends HttpServlet { out.write("</td>\n\t"); out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">"); out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); + out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); if (remaining > 0) { if (peer.isInteresting() && !peer.isChoked()) { out.write("<font color=#008000>"); @@ -618,7 +620,7 @@ public class I2PSnarkServlet extends HttpServlet { } } out.write("</td>\n\t"); - out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); + out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); if (pct != 100.0) { if (peer.isInterested() && !peer.isChoking()) { out.write("<font color=#008000>"); @@ -644,7 +646,7 @@ public class I2PSnarkServlet extends HttpServlet { private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException { String uri = req.getRequestURI(); String newURL = req.getParameter("newURL"); - if ( (newURL == null) || (newURL.trim().length() <= 0) ) newURL = "http://"; + if ( (newURL == null) || (newURL.trim().length() <= 0) ) newURL = ""; String newFile = req.getParameter("newFile"); if ( (newFile == null) || (newFile.trim().length() <= 0) ) newFile = ""; @@ -652,14 +654,14 @@ public class I2PSnarkServlet extends HttpServlet { // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file out.write("<form action=\"" + uri + "\" method=\"POST\">\n"); out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n"); - out.write("<span class=\"snarkConfigTitle\">Add Torrent:</span><br />\n"); + out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">Add Torrent:</span><br />\n"); out.write("From URL : <input type=\"text\" name=\"newURL\" size=\"80\" value=\"" + newURL + "\" /> \n"); // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve) //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br />\n"); out.write("<input type=\"submit\" value=\"Add torrent\" name=\"action\" /><br />\n"); out.write("<span class=\"snarkAddInfo\">Alternately, you can copy .torrent files to " + _manager.getDataDir().getAbsolutePath() + "<br />\n"); out.write("Removing that .torrent file will cause the torrent to stop.<br /></span>\n"); - out.write("</form>\n</span>\n"); + out.write("</form>\n</span></div>"); } private void writeSeedForm(PrintWriter out, HttpServletRequest req) throws IOException { @@ -668,7 +670,7 @@ public class I2PSnarkServlet extends HttpServlet { if (baseFile == null) baseFile = ""; - out.write("<span class=\"snarkNewTorrent\"><hr />\n"); + out.write("<div class=\"newtorrentsection\"><span class=\"snarkNewTorrent\">\n"); // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file out.write("<form action=\"" + uri + "\" method=\"POST\">\n"); out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n"); @@ -692,7 +694,7 @@ public class I2PSnarkServlet extends HttpServlet { out.write("or <input type=\"text\" name=\"announceURLOther\" size=\"50\" value=\"http://\" " + "title=\"Custom tracker URL\" /> "); out.write("<input type=\"submit\" value=\"Create torrent\" name=\"action\" />\n"); - out.write("</form>\n</span>\n"); + out.write("</form>\n</span></div>"); } private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException { @@ -704,12 +706,12 @@ public class I2PSnarkServlet extends HttpServlet { //int seedPct = 0; out.write("<form action=\"" + uri + "\" method=\"POST\">\n"); - out.write("<span class=\"snarkConfig\"><hr />\n"); + out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n"); out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n"); out.write("<span class=\"snarkConfigTitle\">Configuration:</span><br />\n"); out.write("Data directory: <input type=\"text\" size=\"40\" name=\"dataDir\" value=\"" + dataDir + "\" "); out.write("title=\"Directory to store torrents and data\" disabled=\"true\" /> <i>(Edit i2psnark.config and restart to change)</i><br />\n"); - out.write("Auto start: <input type=\"checkbox\" name=\"autoStart\" value=\"true\" " + out.write("Auto start: <input type=\"checkbox\" class=\"optbox\" name=\"autoStart\" value=\"true\" " + (autoStart ? "checked " : "") + "title=\"If true, automatically start torrents that are added\" />"); //Auto add: <input type="checkbox" name="autoAdd" value="true" title="If true, automatically add torrents that are found in the data directory" /> @@ -734,15 +736,15 @@ public class I2PSnarkServlet extends HttpServlet { out.write("Total uploader limit: <input type=\"text\" name=\"upLimit\" value=\"" + _manager.util().getMaxUploaders() + "\" size=\"3\" maxlength=\"3\" /> peers<br />\n"); out.write("Up bandwidth limit: <input type=\"text\" name=\"upBW\" value=\"" - + _manager.util().getMaxUpBW() + "\" size=\"3\" maxlength=\"3\" /> KBps <i>(Router Up BW / 2 recommended)</i><br />\n"); + + _manager.util().getMaxUpBW() + "\" size=\"3\" maxlength=\"3\" /> KBps <i>(Half <a href=\"/config.jsp\" target=\"blank\">available bandwidth</a> recommended.)</i><br />\n"); - out.write("Use open trackers also: <input type=\"checkbox\" name=\"useOpenTrackers\" value=\"true\" " + out.write("Use open trackers also: <input type=\"checkbox\" class=\"optbox\" name=\"useOpenTrackers\" value=\"true\" " + (useOpenTrackers ? "checked " : "") + "title=\"If true, uses open trackers in addition\" /> "); out.write("Announce URLs: <input type=\"text\" name=\"openTrackers\" value=\"" + openTrackers + "\" size=\"50\" /><br />\n"); - //out.write("<hr />\n"); + //out.write("\n"); out.write("EepProxy host: <input type=\"text\" name=\"eepHost\" value=\"" + _manager.util().getEepProxyHost() + "\" size=\"15\" /> "); out.write("port: <input type=\"text\" name=\"eepPort\" value=\"" @@ -751,7 +753,7 @@ public class I2PSnarkServlet extends HttpServlet { + _manager.util().getI2CPHost() + "\" size=\"15\" /> "); out.write("port: <input type=\"text\" name=\"i2cpPort\" value=\"" + + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" /> <br />\n"); - StringBuffer opts = new StringBuffer(64); + StringBuilder opts = new StringBuilder(64); Map options = new TreeMap(_manager.util().getI2CPOptions()); for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); @@ -763,7 +765,7 @@ public class I2PSnarkServlet extends HttpServlet { + opts.toString() + "\" /><br />\n"); out.write("<input type=\"submit\" value=\"Save configuration\" name=\"action\" />\n"); out.write("</span>\n"); - out.write("</form>\n"); + out.write("</form></div>"); } // rounding makes us look faster :) @@ -772,7 +774,7 @@ public class I2PSnarkServlet extends HttpServlet { return bytes + "B"; else if (bytes < 5*1024*1024) return ((bytes + 512)/1024) + "KB"; - else if (bytes < 5*1024*1024*1024l) + else if (bytes < 10*1024*1024*1024l) return ((bytes + 512*1024)/(1024*1024)) + "MB"; else return ((bytes + 512*1024*1024)/(1024*1024*1024)) + "GB"; @@ -780,98 +782,33 @@ public class I2PSnarkServlet extends HttpServlet { private static final String HEADER_BEGIN = "<html>\n" + "<head>\n" + - "<title>I2PSnark - anonymous bittorrent\n"; + "I2PSnark - Anonymous BitTorrent Client\n"; - private static final String HEADER = "\n" + - "\n" + - "\n"; - + private static final String HEADER = ""; + private static final String TABLE_HEADER = "\n" + "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n"; + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n"; private static final String TABLE_EMPTY = "" + - "\n"; + "\n"; - private static final String TABLE_FOOTER = "
Status \n"; + "
Status \n"; private static final String TABLE_HEADER2 = "TorrentETADownloadedUploadedDown RateUp RateTorrentETADownloadedUploadedDown RateUp Rate
No torrents
No torrents loaded.
\n"; + private static final String TABLE_FOOTER = "\n"; - private static final String FOOTER = ""; -} + private static final String FOOTER = ""; - -class FetchAndAdd implements Runnable { +/** inner class, don't bother reindenting */ +private static class FetchAndAdd implements Runnable { private SnarkManager _manager; private String _url; public FetchAndAdd(SnarkManager mgr, String url) { @@ -923,3 +860,5 @@ class FetchAndAdd implements Runnable { } } } + +} diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/RunStandalone.java b/apps/i2psnark/java/src/org/klomp/snark/web/RunStandalone.java index 05795b861..2880676a2 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/RunStandalone.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/RunStandalone.java @@ -2,6 +2,7 @@ package org.klomp.snark.web; import java.io.File; +import net.i2p.I2PAppContext; import net.i2p.util.FileUtil; import org.mortbay.jetty.Server; @@ -22,7 +23,7 @@ public class RunStandalone { } public void start() { - File workDir = new File("work"); + File workDir = new File(I2PAppContext.getGlobalContext().getTempDir(), "jetty-work"); boolean workDirRemoved = FileUtil.rmdir(workDir, false); if (!workDirRemoved) System.err.println("ERROR: Unable to remove Jetty temporary work directory"); @@ -32,6 +33,8 @@ public class RunStandalone { try { _server = new Server("jetty-i2psnark.xml"); + // just blow up NPE if we don't have a context + (_server.getContexts()[0]).setTempDirectory(workDir); _server.start(); } catch (Exception e) { e.printStackTrace(); diff --git a/apps/i2psnark/jetty-i2psnark.xml b/apps/i2psnark/jetty-i2psnark.xml index 125db8b6d..0d4c56112 100644 --- a/apps/i2psnark/jetty-i2psnark.xml +++ b/apps/i2psnark/jetty-i2psnark.xml @@ -1,6 +1,12 @@ + + + + + + @@ -12,7 +18,7 @@ - + @@ -23,7 +29,7 @@ 8002 - 3 + 1 10 30000 1000 @@ -34,45 +40,6 @@ - - - - - - - - - - - - - @@ -91,20 +58,6 @@ webapps/i2psnark.war - - - - - - ./logs/yyyy_mm_dd.i2psnark-request.log - 90 - true - false - false - GMT - - - diff --git a/apps/i2psnark/launch-i2psnark b/apps/i2psnark/launch-i2psnark new file mode 100755 index 000000000..023b5a21a --- /dev/null +++ b/apps/i2psnark/launch-i2psnark @@ -0,0 +1,8 @@ +#!/bin/sh +# +# This launches i2psnark and jetty in a separate jvm. +# The file jetty-i2psnark.xml must be present in the current directory. +# i2psnark will be accessed at http://127.0.0.1:8002/ +# +I2P="." +java -cp "$I2P/lib/i2psnark.jar:$I2P/lib/i2p.jar:$I2P/lib/mstreaming.jar:$I2P/lib/streaming.jar:$I2P/lib/commons-el.jar:$I2P/lib/commons-logging.jar:$I2P/lib/jasper-compiler.jar:$I2P/lib/jasper-runtime.jar:$I2P/lib/javax.servlet.jar:$I2P/lib/org.mortbay.jetty.jar" org.klomp.snark.web.RunStandalone "$@" diff --git a/apps/i2psnark/readme-standalone.txt b/apps/i2psnark/readme-standalone.txt index 2f641db89..9bc1ddf66 100644 --- a/apps/i2psnark/readme-standalone.txt +++ b/apps/i2psnark/readme-standalone.txt @@ -1,6 +1,6 @@ To run I2PSnark from the command line, run "java -jar lib/i2psnark.jar", but -to run it with the web UI, run "java -jar launch-i2psnark.jar". I2PSnark is +to run it with the web UI, run "launch-i2psnark". I2PSnark is GPL'ed software, based on Snark (http://www.klomp.org/) to run on top of I2P -(http://www.i2p.net/) within a webserver (such as the bundled Jetty from +(http://www.i2p2.de/) within a webserver (such as the bundled Jetty from http://jetty.mortbay.org/). For more information about I2PSnark, get in touch -with the folks at http://forum.i2p.net/ \ No newline at end of file +with the folks at http://forum.i2p2.de/ diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml index 564f6fc4b..a74e328cc 100644 --- a/apps/i2ptunnel/java/build.xml +++ b/apps/i2ptunnel/java/build.xml @@ -22,6 +22,7 @@ + @@ -29,7 +30,9 @@ srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" destdir="./build/obj" - classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" /> + classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" > + + @@ -52,7 +55,7 @@ - + @@ -73,6 +76,7 @@ + diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/BufferLogger.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/BufferLogger.java index 29f954fc4..4c3da0898 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/BufferLogger.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/BufferLogger.java @@ -14,7 +14,7 @@ import net.i2p.util.Log; */ class BufferLogger implements Logging { private final static Log _log = new Log(BufferLogger.class); - private ByteArrayOutputStream _baos; + private ByteArrayOutputStream _baos; // should be final and use a factory. LINT private boolean _ignore; /** diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java index 411b2c442..12940a81b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java @@ -59,13 +59,16 @@ class HTTPResponseOutputStream extends FilterOutputStream { _buf1 = new byte[1]; } + @Override public void write(int c) throws IOException { _buf1[0] = (byte)c; write(_buf1, 0, 1); } + @Override public void write(byte buf[]) throws IOException { write(buf, 0, buf.length); } + @Override public void write(byte buf[], int off, int len) throws IOException { if (_headerWritten) { out.write(buf, off, len); @@ -207,6 +210,7 @@ class HTTPResponseOutputStream extends FilterOutputStream { out.write("\r\n".getBytes()); // end of the headers } + @Override public void close() throws IOException { out.close(); } @@ -303,11 +307,13 @@ class HTTPResponseOutputStream extends FilterOutputStream { return true; } } + @Override public String toString() { return "Read: " + getTotalRead() + " expanded: " + getTotalExpanded() + " remaining: " + getRemaining() + " finished: " + getFinished(); } } + @Override public String toString() { return super.toString() + ": " + _in; } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java index b72ae18b3..0b2d2d7c0 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java @@ -62,6 +62,8 @@ import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.i2ptunnel.socks.I2PSOCKSTunnel; +import net.i2p.i2ptunnel.streamr.StreamrConsumer; +import net.i2p.i2ptunnel.streamr.StreamrProducer; import net.i2p.util.EventDispatcher; import net.i2p.util.EventDispatcherImpl; import net.i2p.util.Log; @@ -73,7 +75,7 @@ public class I2PTunnel implements Logging, EventDispatcher { private static long __tunnelId = 0; private long _tunnelId; private Properties _clientOptions; - private List _sessions; + private final List _sessions; public static final int PACKET_DELAY = 100; @@ -87,10 +89,10 @@ public class I2PTunnel implements Logging, EventDispatcher { private static final String nocli_args[] = { "-nocli", "-die"}; - private List tasks = new ArrayList(); + private final List tasks = new ArrayList(); private int next_task_id = 1; - private Set listeners = new HashSet(); + private final Set listeners = new HashSet(); public static void main(String[] args) throws IOException { new I2PTunnel(args); @@ -177,7 +179,7 @@ public class I2PTunnel implements Logging, EventDispatcher { } } - List getSessions() { + List getSessions() { synchronized (_sessions) { return new ArrayList(_sessions); } @@ -234,6 +236,8 @@ public class I2PTunnel implements Logging, EventDispatcher { runServer(args, l); } else if ("httpserver".equals(cmdname)) { runHttpServer(args, l); + } else if ("ircserver".equals(cmdname)) { + runIrcServer(args, l); } else if ("textserver".equals(cmdname)) { runTextServer(args, l); } else if ("client".equals(cmdname)) { @@ -246,6 +250,10 @@ public class I2PTunnel implements Logging, EventDispatcher { runSOCKSTunnel(args, l); } else if ("connectclient".equals(cmdname)) { runConnectClient(args, l); + } else if ("streamrclient".equals(cmdname)) { + runStreamrClient(args, l); + } else if ("streamrserver".equals(cmdname)) { + runStreamrServer(args, l); } else if ("config".equals(cmdname)) { runConfig(args, l); } else if ("listen_on".equals(cmdname)) { @@ -364,6 +372,8 @@ public class I2PTunnel implements Logging, EventDispatcher { } privKeyFile = new File(args[2]); + if (!privKeyFile.isAbsolute()) + privKeyFile = new File(_context.getConfigDir(), args[2]); if (!privKeyFile.canRead()) { l.log("private key file does not exist"); _log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]); @@ -383,6 +393,55 @@ public class I2PTunnel implements Logging, EventDispatcher { } } + /** + * Same args as runServer + * (we should stop duplicating all this code...) + */ + public void runIrcServer(String args[], Logging l) { + if (args.length == 3) { + InetAddress serverHost = null; + int portNum = -1; + File privKeyFile = null; + try { + serverHost = InetAddress.getByName(args[0]); + } catch (UnknownHostException uhe) { + l.log("unknown host"); + _log.error(getPrefix() + "Error resolving " + args[0], uhe); + notifyEvent("serverTaskId", Integer.valueOf(-1)); + return; + } + + try { + portNum = Integer.parseInt(args[1]); + } catch (NumberFormatException nfe) { + l.log("invalid port"); + _log.error(getPrefix() + "Port specified is not valid: " + args[1], nfe); + notifyEvent("serverTaskId", Integer.valueOf(-1)); + return; + } + + privKeyFile = new File(args[2]); + if (!privKeyFile.isAbsolute()) + privKeyFile = new File(_context.getConfigDir(), args[2]); + if (!privKeyFile.canRead()) { + l.log("private key file does not exist"); + _log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]); + notifyEvent("serverTaskId", Integer.valueOf(-1)); + return; + } + I2PTunnelServer serv = new I2PTunnelIRCServer(serverHost, portNum, privKeyFile, args[2], l, (EventDispatcher) this, this); + serv.setReadTimeout(readTimeout); + serv.startRunning(); + addtask(serv); + notifyEvent("serverTaskId", Integer.valueOf(serv.getId())); + return; + } else { + l.log("server "); + l.log(" creates a server that sends all incoming data\n" + " of its destination to host:port."); + notifyEvent("serverTaskId", Integer.valueOf(-1)); + } + } + /** * Run the HTTP server pointing at the host and port specified using the private i2p * destination loaded from the specified file, replacing the HTTP headers @@ -421,6 +480,8 @@ public class I2PTunnel implements Logging, EventDispatcher { String spoofedHost = args[2]; privKeyFile = new File(args[3]); + if (!privKeyFile.isAbsolute()) + privKeyFile = new File(_context.getConfigDir(), args[3]); if (!privKeyFile.canRead()) { l.log("private key file does not exist"); _log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]); @@ -497,14 +558,14 @@ public class I2PTunnel implements Logging, EventDispatcher { * Integer port number if the client is listening * sharedClient parameter is a String "true" or "false" * - * @param args {portNumber, destinationBase64 or "file:filename"[, sharedClient]} + * @param args {portNumber, destinationBase64 or "file:filename"[, sharedClient [, privKeyFile]]} * @param l logger to receive events and output */ public void runClient(String args[], Logging l) { boolean isShared = true; - if (args.length == 3) + if (args.length >= 3) isShared = Boolean.valueOf(args[2].trim()).booleanValue(); - if ( (args.length == 2) || (args.length == 3) ) { + if (args.length >= 2) { int portNum = -1; try { portNum = Integer.parseInt(args[0]); @@ -517,7 +578,10 @@ public class I2PTunnel implements Logging, EventDispatcher { I2PTunnelTask task; ownDest = !isShared; try { - task = new I2PTunnelClient(portNum, args[1], l, ownDest, (EventDispatcher) this, this); + String privateKeyFile = null; + if (args.length >= 4) + privateKeyFile = args[3]; + task = new I2PTunnelClient(portNum, args[1], l, ownDest, (EventDispatcher) this, this, privateKeyFile); addtask(task); notifyEvent("clientTaskId", Integer.valueOf(task.getId())); } catch (IllegalArgumentException iae) { @@ -526,7 +590,7 @@ public class I2PTunnel implements Logging, EventDispatcher { notifyEvent("clientTaskId", Integer.valueOf(-1)); } } else { - l.log("client [,]|file:[ ]"); + l.log("client [,]|file:[ ] []"); l.log(" creates a client that forwards port to the pubkey.\n" + " use 0 as port to get a free port assigned. If you specify\n" + " a comma delimited list of pubkeys, it will rotate among them\n" @@ -548,9 +612,9 @@ public class I2PTunnel implements Logging, EventDispatcher { */ public void runHttpClient(String args[], Logging l) { if (args.length >= 1 && args.length <= 3) { - int port = -1; + int clientPort = -1; try { - port = Integer.parseInt(args[0]); + clientPort = Integer.parseInt(args[0]); } catch (NumberFormatException nfe) { l.log("invalid port"); _log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe); @@ -584,12 +648,12 @@ public class I2PTunnel implements Logging, EventDispatcher { I2PTunnelTask task; ownDest = !isShared; try { - task = new I2PTunnelHTTPClient(port, l, ownDest, proxy, (EventDispatcher) this, this); + task = new I2PTunnelHTTPClient(clientPort, l, ownDest, proxy, (EventDispatcher) this, this); addtask(task); notifyEvent("httpclientTaskId", Integer.valueOf(task.getId())); } catch (IllegalArgumentException iae) { - _log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ port + "]", iae); - l.log("Invalid I2PTunnel configuration [" + host + ":" + port + "]"); + _log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ clientPort + "]", iae); + l.log("Invalid I2PTunnel configuration [" + host + ":" + clientPort + "]"); notifyEvent("httpclientTaskId", Integer.valueOf(-1)); } } else { @@ -610,9 +674,9 @@ public class I2PTunnel implements Logging, EventDispatcher { */ public void runConnectClient(String args[], Logging l) { if (args.length >= 1 && args.length <= 3) { - int port = -1; + int _port = -1; try { - port = Integer.parseInt(args[0]); + _port = Integer.parseInt(args[0]); } catch (NumberFormatException nfe) { _log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe); return; @@ -644,10 +708,10 @@ public class I2PTunnel implements Logging, EventDispatcher { I2PTunnelTask task; ownDest = !isShared; try { - task = new I2PTunnelConnectClient(port, l, ownDest, proxy, (EventDispatcher) this, this); + task = new I2PTunnelConnectClient(_port, l, ownDest, proxy, (EventDispatcher) this, this); addtask(task); } catch (IllegalArgumentException iae) { - _log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ port + "]", iae); + _log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ _port + "]", iae); } } else { l.log("connectclient [] []"); @@ -665,14 +729,14 @@ public class I2PTunnel implements Logging, EventDispatcher { * Also sets "ircclientStatus" = "ok" or "error" after the client tunnel has started. * parameter sharedClient is a String, either "true" or "false" * - * @param args {portNumber,destinationBase64 or "file:filename" [, sharedClient]} + * @param args {portNumber,destinationBase64 or "file:filename" [, sharedClient [, privKeyFile]]} * @param l logger to receive events and output */ public void runIrcClient(String args[], Logging l) { - if (args.length >= 2 && args.length <= 3) { - int port = -1; + if (args.length >= 2) { + int _port = -1; try { - port = Integer.parseInt(args[0]); + _port = Integer.parseInt(args[0]); } catch (NumberFormatException nfe) { l.log("invalid port"); _log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe); @@ -696,16 +760,19 @@ public class I2PTunnel implements Logging, EventDispatcher { I2PTunnelTask task; ownDest = !isShared; try { - task = new I2PTunnelIRCClient(port, args[1],l, ownDest, (EventDispatcher) this, this); + String privateKeyFile = null; + if (args.length >= 4) + privateKeyFile = args[3]; + task = new I2PTunnelIRCClient(_port, args[1], l, ownDest, (EventDispatcher) this, this, privateKeyFile); addtask(task); notifyEvent("ircclientTaskId", Integer.valueOf(task.getId())); } catch (IllegalArgumentException iae) { - _log.error(getPrefix() + "Invalid I2PTunnel config to create an ircclient [" + host + ":"+ port + "]", iae); - l.log("Invalid I2PTunnel configuration [" + host + ":" + port + "]"); + _log.error(getPrefix() + "Invalid I2PTunnel config to create an ircclient [" + host + ":"+ _port + "]", iae); + l.log("Invalid I2PTunnel configuration [" + host + ":" + _port + "]"); notifyEvent("ircclientTaskId", Integer.valueOf(-1)); } } else { - l.log("ircclient []"); + l.log("ircclient [ []]"); l.log(" creates a client that filter IRC protocol."); l.log(" (optional) indicates if this client shares tunnels with other clients (true of false)"); notifyEvent("ircclientTaskId", Integer.valueOf(-1)); @@ -725,9 +792,9 @@ public class I2PTunnel implements Logging, EventDispatcher { */ public void runSOCKSTunnel(String args[], Logging l) { if (args.length >= 1 && args.length <= 2) { - int port = -1; + int _port = -1; try { - port = Integer.parseInt(args[0]); + _port = Integer.parseInt(args[0]); } catch (NumberFormatException nfe) { l.log("invalid port"); _log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe); @@ -741,7 +808,7 @@ public class I2PTunnel implements Logging, EventDispatcher { ownDest = !isShared; I2PTunnelTask task; - task = new I2PSOCKSTunnel(port, l, ownDest, (EventDispatcher) this, this); + task = new I2PSOCKSTunnel(_port, l, ownDest, (EventDispatcher) this, this); addtask(task); notifyEvent("sockstunnelTaskId", Integer.valueOf(task.getId())); } else { @@ -751,6 +818,84 @@ public class I2PTunnel implements Logging, EventDispatcher { } } + /** + * Streamr client + * + * @param args {targethost, targetport, destinationString} + * @param l logger to receive events and output + */ + public void runStreamrClient(String args[], Logging l) { + if (args.length == 3) { + InetAddress _host; + try { + _host = InetAddress.getByName(args[0]); + } catch (UnknownHostException uhe) { + l.log("unknown host"); + _log.error(getPrefix() + "Error resolving " + args[0], uhe); + notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1)); + return; + } + + int _port = -1; + try { + _port = Integer.parseInt(args[1]); + } catch (NumberFormatException nfe) { + l.log("invalid port"); + _log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe); + notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1)); + return; + } + + StreamrConsumer task = new StreamrConsumer(_host, _port, args[2], l, (EventDispatcher) this, this); + task.startRunning(); + addtask(task); + notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId())); + } else { + l.log("streamrclient "); + l.log(" creates a tunnel that receives streaming data."); + notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1)); + } + } + + /** + * Streamr server + * + * @param args {port, privkeyfile} + * @param l logger to receive events and output + */ + public void runStreamrServer(String args[], Logging l) { + if (args.length == 2) { + int _port = -1; + try { + _port = Integer.parseInt(args[0]); + } catch (NumberFormatException nfe) { + l.log("invalid port"); + _log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe); + notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1)); + return; + } + + File privKeyFile = new File(args[1]); + if (!privKeyFile.isAbsolute()) + privKeyFile = new File(_context.getConfigDir(), args[1]); + if (!privKeyFile.canRead()) { + l.log("private key file does not exist"); + _log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]); + notifyEvent("serverTaskId", Integer.valueOf(-1)); + return; + } + + StreamrProducer task = new StreamrProducer(_port, privKeyFile, args[1], l, (EventDispatcher) this, this); + task.startRunning(); + addtask(task); + notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId())); + } else { + l.log("streamrserver "); + l.log(" creates a tunnel that sends streaming data."); + notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1)); + } + } + /** * Specify the i2cp host and port * diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java index 4739a07f4..36edc0766 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java @@ -31,24 +31,24 @@ public class I2PTunnelClient extends I2PTunnelClientBase { */ public I2PTunnelClient(int localPort, String destinations, Logging l, boolean ownDest, EventDispatcher notifyThis, - I2PTunnel tunnel) throws IllegalArgumentException { - super(localPort, ownDest, l, notifyThis, "SynSender", tunnel); + I2PTunnel tunnel, String pkf) throws IllegalArgumentException { + super(localPort, ownDest, l, notifyThis, "SynSender", tunnel, pkf); if (waitEventValue("openBaseClientResult").equals("error")) { notifyEvent("openClientResult", "error"); return; } - StringTokenizer tok = new StringTokenizer(destinations, ","); + StringTokenizer tok = new StringTokenizer(destinations, ", "); dests = new ArrayList(1); while (tok.hasMoreTokens()) { String destination = tok.nextToken(); try { - Destination dest = I2PTunnel.destFromName(destination); - if (dest == null) + Destination destN = I2PTunnel.destFromName(destination); + if (destN == null) l.log("Could not resolve " + destination); else - dests.add(dest); + dests.add(destN); } catch (DataFormatException dfe) { l.log("Bad format parsing \"" + destination + "\""); } @@ -71,10 +71,10 @@ public class I2PTunnelClient extends I2PTunnelClientBase { public long getReadTimeout() { return readTimeout; } protected void clientConnectionRun(Socket s) { - Destination dest = pickDestination(); + Destination destN = pickDestination(); I2PSocket i2ps = null; try { - i2ps = createI2PSocket(dest); + i2ps = createI2PSocket(destN); i2ps.setReadTimeout(readTimeout); new I2PTunnelRunner(s, i2ps, sockLock, null, mySockets); } catch (Exception ex) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java index 38311eaf1..190a4a96d 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java @@ -3,6 +3,7 @@ */ package net.i2p.i2ptunnel; +import java.io.FileInputStream; import java.io.IOException; import java.io.InterruptedIOException; import java.net.ConnectException; @@ -40,9 +41,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna private static volatile long __clientId = 0; protected long _clientId; - protected Object sockLock = new Object(); // Guards sockMgr and mySockets - protected I2PSocketManager sockMgr; + protected final Object sockLock = new Object(); // Guards sockMgr and mySockets + protected I2PSocketManager sockMgr; // should be final and use a factory. LINT protected List mySockets = new ArrayList(); + protected boolean _ownDest; protected Destination dest = null; private int localPort; @@ -51,19 +53,20 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna private ServerSocket ss; - private Object startLock = new Object(); + private final Object startLock = new Object(); private boolean startRunning = false; - private Object closeLock = new Object(); + // private Object closeLock = new Object(); - private byte[] pubkey; + // private byte[] pubkey; private String handlerName; + private String privKeyFile; - private Object conLock = new Object(); + // private Object conLock = new Object(); /** List of Socket for those accept()ed but not yet started up */ - private List _waitingSockets = new ArrayList(); + private List _waitingSockets = new ArrayList(); // should be final and use a factory. LINT /** How many connections will we allow to be in the process of being built at once? */ private int _numConnectionBuilders; /** How long will we allow sockets to sit in the _waitingSockets map before killing them? */ @@ -91,18 +94,29 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna // I2PTunnelClientBase(localPort, ownDest, l, (EventDispatcher)null); //} + public I2PTunnelClientBase(int localPort, boolean ownDest, Logging l, + EventDispatcher notifyThis, String handlerName, + I2PTunnel tunnel) throws IllegalArgumentException { + this(localPort, ownDest, l, notifyThis, handlerName, tunnel, null); + } + /** + * @param pkf null to generate a transient key + * * @throws IllegalArgumentException if the I2CP configuration is b0rked so * badly that we cant create a socketManager */ public I2PTunnelClientBase(int localPort, boolean ownDest, Logging l, EventDispatcher notifyThis, String handlerName, - I2PTunnel tunnel) throws IllegalArgumentException{ + I2PTunnel tunnel, String pkf) throws IllegalArgumentException{ super(localPort + " (uninitialized)", notifyThis, tunnel); _clientId = ++__clientId; this.localPort = localPort; this.l = l; this.handlerName = handlerName + _clientId; + this.privKeyFile = pkf; + _ownDest = ownDest; // == ! shared client + _context = tunnel.getContext(); _context.statManager().createRateStat("i2ptunnel.client.closeBacklog", "How many pending sockets remain when we close one due to backlog?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); @@ -114,26 +128,22 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna // be looked up tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true"); - while (sockMgr == null) { - synchronized (sockLock) { - if (ownDest) { - sockMgr = buildSocketManager(); - } else { - sockMgr = getSocketManager(); + boolean openNow = !Boolean.valueOf(tunnel.getClientOptions().getProperty("i2cp.delayOpen")).booleanValue(); + if (openNow) { + while (sockMgr == null) { + verifySocketManager(); + if (sockMgr == null) { + _log.log(Log.CRIT, "Unable to create socket manager (our own? " + ownDest + ")"); + try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} } } if (sockMgr == null) { - _log.log(Log.CRIT, "Unable to create socket manager (our own? " + ownDest + ")"); - try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} + l.log("Invalid I2CP configuration"); + throw new IllegalArgumentException("Socket manager could not be created"); } - } - if (sockMgr == null) { - l.log("Invalid I2CP configuration"); - throw new IllegalArgumentException("Socket manager could not be created"); - } - l.log("I2P session created"); + l.log("I2P session created"); - getTunnel().addSession(sockMgr.getSession()); + } // else delay creating session until createI2PSocket() is called Thread t = new I2PThread(this); t.setName("Client " + _clientId); @@ -153,7 +163,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna configurePool(tunnel); if (open && listenerReady) { - l.log("Ready! Port " + getLocalPort()); + if (openNow) + l.log("Ready! Port " + getLocalPort()); + else + l.log("Listening on port " + getLocalPort() + ", delaying tunnel open until required"); notifyEvent("openBaseClientResult", "ok"); } else { l.log("Error listening - please see the logs!"); @@ -192,31 +205,79 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna } } + /** + * Sets the this.sockMgr field if it is null, or if we want a new one + * + * We need a socket manager before getDefaultOptions() and most other things + */ + protected void verifySocketManager() { + synchronized(sockLock) { + boolean newManager = false; + if (this.sockMgr == null) { + newManager = true; + } else { + I2PSession sess = sockMgr.getSession(); + if (sess == null) { + newManager = true; + } else if (sess.isClosed() && + Boolean.valueOf(getTunnel().getClientOptions().getProperty("i2cp.closeOnIdle")).booleanValue() && + Boolean.valueOf(getTunnel().getClientOptions().getProperty("i2cp.newDestOnResume")).booleanValue()) { + // build a new socket manager and a new dest if the session is closed. + getTunnel().removeSession(sess); + if (_log.shouldLog(Log.WARN)) + _log.warn(getTunnel().getClientOptions().getProperty("inbound.nickname") + ": Built a new destination on resume"); + newManager = true; + } // else the old socket manager will reconnect the old session if necessary + } + if (newManager) { + if (_ownDest) + this.sockMgr = buildSocketManager(); + else + this.sockMgr = getSocketManager(); + } + } + } + + /** this is ONLY for shared clients */ private static I2PSocketManager socketManager; + /** this is ONLY for shared clients */ protected synchronized I2PSocketManager getSocketManager() { - return getSocketManager(getTunnel()); + return getSocketManager(getTunnel(), this.privKeyFile); } + /** this is ONLY for shared clients */ protected static synchronized I2PSocketManager getSocketManager(I2PTunnel tunnel) { + return getSocketManager(tunnel, null); + } + /** this is ONLY for shared clients */ + protected static synchronized I2PSocketManager getSocketManager(I2PTunnel tunnel, String pkf) { if (socketManager != null) { I2PSession s = socketManager.getSession(); if ( (s == null) || (s.isClosed()) ) { - _log.info("Building a new socket manager since the old one closed [s=" + s + "]"); - socketManager = buildSocketManager(tunnel); + if (_log.shouldLog(Log.INFO)) + _log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Building a new socket manager since the old one closed [s=" + s + "]"); + if (s != null) + tunnel.removeSession(s); + socketManager = buildSocketManager(tunnel, pkf); } else { - _log.info("Not building a new socket manager since the old one is open [s=" + s + "]"); + if (_log.shouldLog(Log.INFO)) + _log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Not building a new socket manager since the old one is open [s=" + s + "]"); } } else { - _log.info("Building a new socket manager since there is no other one"); - socketManager = buildSocketManager(tunnel); + if (_log.shouldLog(Log.INFO)) + _log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Building a new socket manager since there is no other one"); + socketManager = buildSocketManager(tunnel, pkf); } return socketManager; } protected I2PSocketManager buildSocketManager() { - return buildSocketManager(getTunnel()); + return buildSocketManager(getTunnel(), this.privKeyFile); } protected static I2PSocketManager buildSocketManager(I2PTunnel tunnel) { + return buildSocketManager(tunnel, null); + } + protected static I2PSocketManager buildSocketManager(I2PTunnel tunnel, String pkf) { Properties props = new Properties(); props.putAll(tunnel.getClientOptions()); int portNum = 7654; @@ -230,7 +291,22 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna I2PSocketManager sockManager = null; while (sockManager == null) { - sockManager = I2PSocketManagerFactory.createManager(tunnel.host, portNum, props); + if (pkf != null) { + // Persistent client dest + FileInputStream fis = null; + try { + fis = new FileInputStream(pkf); + sockManager = I2PSocketManagerFactory.createManager(fis, tunnel.host, portNum, props); + } catch (IOException ioe) { + _log.error("Error opening key file", ioe); + // this is going to loop but if we break we'll get a NPE + } finally { + if (fis != null) + try { fis.close(); } catch (IOException ioe) {} + } + } else { + sockManager = I2PSocketManagerFactory.createManager(tunnel.host, portNum, props); + } if (sockManager == null) { _log.log(Log.CRIT, "Unable to create socket manager"); @@ -238,6 +314,9 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna } } sockManager.setName("Client"); + if (_log.shouldLog(Log.INFO)) + _log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Built a new socket manager [s=" + sockManager.getSession() + "]"); + tunnel.addSession(sockManager.getSession()); return sockManager; } @@ -302,6 +381,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna * @return a new I2PSocket */ public I2PSocket createI2PSocket(Destination dest) throws I2PException, ConnectException, NoRouteToHostException, InterruptedIOException { + verifySocketManager(); return createI2PSocket(dest, getDefaultOptions()); } @@ -322,6 +402,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna public I2PSocket createI2PSocket(Destination dest, I2PSocketOptions opt) throws I2PException, ConnectException, NoRouteToHostException, InterruptedIOException { I2PSocket i2ps; + verifySocketManager(); i2ps = sockMgr.connect(dest, opt); synchronized (sockLock) { mySockets.add(i2ps); @@ -374,8 +455,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna _context.statManager().addRateData("i2ptunnel.client.manageTime", total, total); } } catch (IOException ex) { - _log.error("Error listening for connections on " + localPort, ex); - notifyEvent("openBaseClientResult", "error"); + if (open) { + _log.error("Error listening for connections on " + localPort, ex); + notifyEvent("openBaseClientResult", "error"); + } synchronized (sockLock) { mySockets.clear(); } @@ -456,20 +539,23 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna // might risk to create an orphan socket. Would be better // to return with an error in that situation quickly. synchronized (sockLock) { - mySockets.retainAll(sockMgr.listSockets()); - if (!forced && mySockets.size() != 0) { - l.log("There are still active connections!"); - _log.debug("can't close: there are still active connections!"); - for (Iterator it = mySockets.iterator(); it.hasNext();) { - l.log("->" + it.next()); + if (sockMgr != null) { + mySockets.retainAll(sockMgr.listSockets()); + if (!forced && mySockets.size() != 0) { + l.log("There are still active connections!"); + _log.debug("can't close: there are still active connections!"); + for (Iterator it = mySockets.iterator(); it.hasNext();) { + l.log("->" + it.next()); + } + return false; + } + I2PSession session = sockMgr.getSession(); + if (session != null) { + getTunnel().removeSession(session); } - return false; - } - I2PSession session = sockMgr.getSession(); - if (session != null) { - getTunnel().removeSession(session); } l.log("Closing client " + toString()); + open = false; try { if (ss != null) ss.close(); } catch (IOException ex) { @@ -477,7 +563,6 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna return false; } l.log("Client closed."); - open = false; } synchronized (_waitingSockets) { _waitingSockets.notifyAll(); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java index bf7ebf0a7..65941f3ba 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java @@ -3,6 +3,7 @@ */ package net.i2p.i2ptunnel; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -17,7 +18,6 @@ import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketOptions; -import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.util.EventDispatcher; @@ -55,7 +55,7 @@ import net.i2p.util.Log; public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runnable { private static final Log _log = new Log(I2PTunnelConnectClient.class); - private List _proxyList; + private final List _proxyList; private final static byte[] ERR_DESTINATION_UNKNOWN = ("HTTP/1.1 503 Service Unavailable\r\n"+ @@ -107,6 +107,8 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna /** used to assign unique IDs to the threads / clients. no logic or functionality */ private static volatile long __clientId = 0; + private static final File _errorDir = new File(I2PAppContext.getGlobalContext().getBaseDir(), "docs"); + /** * @throws IllegalArgumentException if the I2PTunnel does not contain * valid config to contact the router @@ -116,14 +118,14 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna I2PTunnel tunnel) throws IllegalArgumentException { super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel); + _proxyList = new ArrayList(); if (waitEventValue("openBaseClientResult").equals("error")) { notifyEvent("openConnectClientResult", "error"); return; } - _proxyList = new ArrayList(); if (wwwProxy != null) { - StringTokenizer tok = new StringTokenizer(wwwProxy, ","); + StringTokenizer tok = new StringTokenizer(wwwProxy, ", "); while (tok.hasMoreTokens()) _proxyList.add(tok.nextToken().trim()); } @@ -157,6 +159,8 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna defaultOpts.setProperty(I2PSocketOptions.PROP_READ_TIMEOUT, ""+DEFAULT_READ_TIMEOUT); if (!defaultOpts.contains("i2p.streaming.inactivityTimeout")) defaultOpts.setProperty("i2p.streaming.inactivityTimeout", ""+DEFAULT_READ_TIMEOUT); + // delayed start + verifySocketManager(); I2PSocketOptions opts = sockMgr.buildOptions(defaultOpts); if (!defaultOpts.containsKey(I2PSocketOptions.PROP_CONNECT_TIMEOUT)) opts.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT); @@ -175,7 +179,7 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna out = s.getOutputStream(); in = s.getInputStream(); String line, method = null, host = null, destination = null, restofline = null; - StringBuffer newRequest = new StringBuffer(); + StringBuilder newRequest = new StringBuilder(); int ahelper = 0; while (true) { // Use this rather than BufferedReader because we can't have readahead, @@ -260,9 +264,9 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna String str; byte[] header; if (usingWWWProxy) - str = FileUtil.readTextFile("docs/dnfp-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnfp-header.ht")).getAbsolutePath(), 100, true); else - str = FileUtil.readTextFile("docs/dnfh-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnfh-header.ht")).getAbsolutePath(), 100, true); if (str != null) header = str.getBytes(); else @@ -356,9 +360,9 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna String str; byte[] header; if (usingWWWProxy) - str = FileUtil.readTextFile("docs/dnfp-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnfp-header.ht")).getAbsolutePath(), 100, true); else - str = FileUtil.readTextFile("docs/dnf-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnf-header.ht")).getAbsolutePath(), 100, true); if (str != null) header = str.getBytes(); else diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index b42376dbf..fc8d5b76a 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -4,6 +4,7 @@ package net.i2p.i2ptunnel; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -50,7 +51,7 @@ import net.i2p.util.Log; public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable { private static final Log _log = new Log(I2PTunnelHTTPClient.class); - private List proxyList; + private final List proxyList; private HashMap addressHelpers = new HashMap(); @@ -136,6 +137,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable /** used to assign unique IDs to the threads / clients. no logic or functionality */ private static volatile long __clientId = 0; + private static final File _errorDir = new File(I2PAppContext.getGlobalContext().getBaseDir(), "docs"); + + /** * @throws IllegalArgumentException if the I2PTunnel does not contain * valid config to contact the router @@ -145,14 +149,14 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable I2PTunnel tunnel) throws IllegalArgumentException { super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel); + proxyList = new ArrayList(); if (waitEventValue("openBaseClientResult").equals("error")) { notifyEvent("openHTTPClientResult", "error"); return; } - proxyList = new ArrayList(); if (wwwProxy != null) { - StringTokenizer tok = new StringTokenizer(wwwProxy, ","); + StringTokenizer tok = new StringTokenizer(wwwProxy, ", "); while (tok.hasMoreTokens()) proxyList.add(tok.nextToken().trim()); } @@ -185,7 +189,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable /** * create the default options (using the default timeout, etc) - * + * unused? */ protected I2PSocketOptions getDefaultOptions() { Properties defaultOpts = getTunnel().getClientOptions(); @@ -210,6 +214,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable defaultOpts.setProperty(I2PSocketOptions.PROP_READ_TIMEOUT, ""+DEFAULT_READ_TIMEOUT); if (!defaultOpts.contains("i2p.streaming.inactivityTimeout")) defaultOpts.setProperty("i2p.streaming.inactivityTimeout", ""+DEFAULT_READ_TIMEOUT); + // delayed start + verifySocketManager(); I2PSocketOptions opts = sockMgr.buildOptions(defaultOpts); if (!defaultOpts.containsKey(I2PSocketOptions.PROP_CONNECT_TIMEOUT)) opts.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT); @@ -234,7 +240,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable out = s.getOutputStream(); InputReader reader = new InputReader(s.getInputStream()); String line, method = null, protocol = null, host = null, destination = null; - StringBuffer newRequest = new StringBuffer(); + StringBuilder newRequest = new StringBuilder(); int ahelper = 0; while ((line = reader.readLine(method)) != null) { line = line.trim(); @@ -285,7 +291,20 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable break; } host = request.substring(0, pos); - + + // parse port + int posPort = host.indexOf(":"); + int port = 80; + if(posPort != -1) { + String[] parts = host.split(":"); + host = parts[0]; + try { + port = Integer.parseInt(parts[1]); + } catch(Exception exc) { + // TODO: log this + } + } + // Quick hack for foo.bar.i2p if (host.toLowerCase().endsWith(".i2p")) { // Destination gets the host name @@ -357,7 +376,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable { String str; byte[] header; - str = FileUtil.readTextFile("docs/ahelper-conflict-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "ahelper-conflict-header.ht")).getAbsolutePath(), 100, true); if (str != null) header = str.getBytes(); else header = ERR_AHELPER_CONFLICT; @@ -367,9 +386,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable String conflictURL = protocol + alias + ".i2p/?" + initialFragments; out.write(header); out.write(("To visit the destination in your host database, click here. To visit the conflicting addresshelper link by temporarily giving it a random alias, click here.

").getBytes()); - out.write("

I2P HTTP Proxy Server
Generated on: ".getBytes()); + out.write("

I2P HTTP Proxy Server
Generated on: ".getBytes()); out.write(new Date().toString().getBytes()); - out.write("
\n".getBytes()); + out.write("

\n".getBytes()); out.flush(); } s.close(); @@ -385,7 +404,19 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable } line = method + " " + request.substring(pos); + } else if (host.toLowerCase().equals("localhost") || host.equals("127.0.0.1")) { + if (out != null) { + out.write(ERR_LOCALHOST); + out.write("

Generated on: ".getBytes()); + out.write(new Date().toString().getBytes()); + out.write("\n".getBytes()); + out.flush(); + } + s.close(); + return; } else if (host.indexOf(".") != -1) { + // rebuild host + host = host + ":" + port; // The request must be forwarded to a WWW proxy if (_log.shouldLog(Log.DEBUG)) _log.debug("Before selecting outproxy for " + host); @@ -410,16 +441,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable usingWWWProxy = true; if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix(requestId) + "Host doesnt end with .i2p and it contains a period [" + host + "]: wwwProxy!"); - } else if (host.toLowerCase().startsWith("localhost:")) { - if (out != null) { - out.write(ERR_LOCALHOST); - out.write("

Generated on: ".getBytes()); - out.write(new Date().toString().getBytes()); - out.write("\n".getBytes()); - out.flush(); - } - s.close(); - return; } else { request = request.substring(pos + 1); pos = request.indexOf("/"); @@ -532,6 +553,14 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix(requestId) + "Destination: " + destination); + // Serve local proxy files (images, css linked from error pages) + // Ignore all the headers + if (destination.equals("proxy.i2p")) { + serveLocalFile(out, method, targetRequest); + s.close(); + return; + } + Destination dest = I2PTunnel.destFromName(destination); if (dest == null) { //l.log("Could not resolve " + destination + "."); @@ -541,13 +570,13 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable byte[] header; boolean showAddrHelper = false; if (usingWWWProxy) - str = FileUtil.readTextFile("docs/dnfp-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnfp-header.ht")).getAbsolutePath(), 100, true); else if(ahelper != 0) - str = FileUtil.readTextFile("docs/dnfb-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnfb-header.ht")).getAbsolutePath(), 100, true); else if (destination.length() == 60 && destination.endsWith(".b32.i2p")) - str = FileUtil.readTextFile("docs/dnf-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnf-header.ht")).getAbsolutePath(), 100, true); else { - str = FileUtil.readTextFile("docs/dnfh-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnfh-header.ht")).getAbsolutePath(), 100, true); showAddrHelper = true; } if (str != null) @@ -698,9 +727,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable } } } - out.write("

I2P HTTP Proxy Server
Generated on: ".getBytes()); + out.write("

I2P HTTP Proxy Server
Generated on: ".getBytes()); out.write(new Date().toString().getBytes()); - out.write("
\n".getBytes()); + out.write("

\n".getBytes()); out.flush(); } } @@ -716,9 +745,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable String str; byte[] header; if (usingWWWProxy) - str = FileUtil.readTextFile("docs/dnfp-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnfp-header.ht")).getAbsolutePath(), 100, true); else - str = FileUtil.readTextFile("docs/dnf-header.ht", 100, true); + str = FileUtil.readTextFile((new File(_errorDir, "dnf-header.ht")).getAbsolutePath(), 100, true); if (str != null) header = str.getBytes(); else @@ -757,4 +786,78 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable return protocol.equalsIgnoreCase("http://"); } + + private final static byte[] ERR_404 = + ("HTTP/1.1 404 Not Found\r\n"+ + "Content-Type: text/plain\r\n"+ + "\r\n"+ + "HTTP Proxy local file not found") + .getBytes(); + + /** + * Very simple web server. + * + * Serve local files in the docs/ directory, for CSS and images in + * error pages, using the reserved address proxy.i2p + * (similar to p.p in privoxy). + * This solves the problems with including links to the router console, + * as assuming the router console is at 127.0.0.1 leads to broken + * links if it isn't. + * + * Ignore all request headers (If-Modified-Since, etc.) + * + * There is basic protection here - + * FileUtil.readFile() prevents traversal above the base directory - + * but inproxy/gateway ops would be wise to block proxy.i2p to prevent + * exposing the docs/ directory or perhaps other issues through + * uncaught vulnerabilities. + * Restrict to the /themes/ directory for now. + * + * @param targetRequest "proxy.i2p/themes/foo.png HTTP/1.1" + */ + private static void serveLocalFile(OutputStream out, String method, String targetRequest) { + // a home page message for the curious... + if (targetRequest.startsWith("proxy.i2p/ ")) { + try { + out.write(("HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nCache-Control: max-age=86400\r\n\r\nI2P HTTP proxy OK").getBytes()); + out.flush(); + } catch (IOException ioe) {} + return; + } + if ((method.equals("GET") || method.equals("HEAD")) && + targetRequest.startsWith("proxy.i2p/themes/") && + !targetRequest.contains("..")) { + int space = targetRequest.indexOf(' '); + String filename = null; + try { + filename = targetRequest.substring(17, space); // "proxy.i2p/themes/".length + } catch (IndexOutOfBoundsException ioobe) {} + // theme hack + if (filename.startsWith("console/default/")) + filename = filename.replaceFirst("default", I2PAppContext.getGlobalContext().getProperty("routerconsole.theme", "light")); + File themesDir = new File(_errorDir, "themes"); + File file = new File(themesDir, filename); + if (file.exists() && !file.isDirectory()) { + String type; + if (filename.endsWith(".css")) + type = "text/css"; + else if (filename.endsWith(".png")) + type = "image/png"; + else if (filename.endsWith(".jpg")) + type = "image/jpeg"; + else type = "text/html"; + try { + out.write("HTTP/1.1 200 OK\r\nContent-Type: ".getBytes()); + out.write(type.getBytes()); + out.write("\r\nCache-Control: max-age=86400\r\n\r\n".getBytes()); + FileUtil.readFile(filename, themesDir.getAbsolutePath(), out); + return; + } catch (IOException ioe) {} + } + } + try { + out.write(ERR_404); + out.flush(); + } catch (IOException ioe) {} + } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java index 9ade9021f..6afc940f7 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java @@ -30,11 +30,13 @@ public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner { _log = I2PAppContext.getGlobalContext().logManager().getLog(I2PTunnelHTTPClientRunner.class); } + @Override protected OutputStream getSocketOut() throws IOException { OutputStream raw = super.getSocketOut(); return new HTTPResponseOutputStream(raw); } + @Override protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin, Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException, IOException { try { i2pin.close(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java index 658dd5e32..e1ce9084e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java @@ -19,6 +19,7 @@ import net.i2p.data.DataHelper; import net.i2p.util.EventDispatcher; import net.i2p.util.I2PThread; import net.i2p.util.Log; +import net.i2p.data.Base32; /** * Simple extension to the I2PTunnelServer that filters the HTTP @@ -33,6 +34,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { /** what Host: should we seem to be to the webserver? */ private String _spoofHost; private static final String HASH_HEADER = "X-I2P-DestHash"; + private static final String DEST64_HEADER = "X-I2P-DestB64"; + private static final String DEST32_HEADER = "X-I2P-DestB32"; public I2PTunnelHTTPServer(InetAddress host, int port, String privData, String spoofHost, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) { super(host, port, privData, l, notifyThis, tunnel); @@ -59,6 +62,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { * Called by the thread pool of I2PSocket handlers * */ + @Override protected void blockingHandle(I2PSocket socket) { long afterAccept = getTunnel().getContext().clock().now(); long afterSocket = -1; @@ -70,9 +74,12 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { InputStream in = socket.getInputStream(); - StringBuffer command = new StringBuffer(128); + StringBuilder command = new StringBuilder(128); Properties headers = readHeaders(in, command); headers.setProperty(HASH_HEADER, socket.getPeerDestination().calculateHash().toBase64()); + headers.setProperty(DEST32_HEADER, Base32.encode(socket.getPeerDestination().calculateHash().getData()) + ".b32.i2p" ); + headers.setProperty(DEST64_HEADER, socket.getPeerDestination().toBase64()); + if ( (_spoofHost != null) && (_spoofHost.trim().length() > 0) ) headers.setProperty("Host", _spoofHost); headers.setProperty("Connection", "close"); @@ -124,8 +131,17 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { _log.error("Error while closing the received i2p con", ex); } } catch (IOException ex) { + try { + socket.close(); + } catch (IOException ioe) {} if (_log.shouldLog(Log.WARN)) _log.warn("Error while receiving the new HTTP request", ex); + } catch (OutOfMemoryError oom) { + try { + socket.close(); + } catch (IOException ioe) {} + if (_log.shouldLog(Log.ERROR)) + _log.error("OOM in HTTP server", oom); } long afterHandle = getTunnel().getContext().clock().now(); @@ -162,7 +178,24 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { sender.start(); browserout = _browser.getOutputStream(); - serverin = _webserver.getInputStream(); + // NPE seen here in 0.7-7, caused by addition of socket.close() in the + // catch (IOException ioe) block above in blockingHandle() ??? + // CRIT [ad-130280.hc] net.i2p.util.I2PThread : Killing thread Thread-130280.hc + // java.lang.NullPointerException + // at java.io.FileInputStream.(FileInputStream.java:131) + // at java.net.SocketInputStream.(SocketInputStream.java:44) + // at java.net.PlainSocketImpl.getInputStream(PlainSocketImpl.java:401) + // at java.net.Socket$2.run(Socket.java:779) + // at java.security.AccessController.doPrivileged(Native Method) + // at java.net.Socket.getInputStream(Socket.java:776) + // at net.i2p.i2ptunnel.I2PTunnelHTTPServer$CompressedRequestor.run(I2PTunnelHTTPServer.java:174) + // at java.lang.Thread.run(Thread.java:619) + // at net.i2p.util.I2PThread.run(I2PThread.java:71) + try { + serverin = _webserver.getInputStream(); + } catch (NullPointerException npe) { + throw new IOException("getInputStream NPE"); + } CompressedResponseOutputStream compressedOut = new CompressedResponseOutputStream(browserout); Sender s = new Sender(compressedOut, serverin, "server: server to browser"); if (_log.shouldLog(Log.INFO)) @@ -221,7 +254,9 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { super(o); } + @Override protected boolean shouldCompress() { return true; } + @Override protected void finishHeaders() throws IOException { if (_log.shouldLog(Log.INFO)) _log.info("Including x-i2p-gzip as the content encoding in the response"); @@ -229,6 +264,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { super.finishHeaders(); } + @Override protected void beginProcessing() throws IOException { if (_log.shouldLog(Log.INFO)) _log.info("Beginning compression processing"); @@ -273,8 +309,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { } } - private String formatHeaders(Properties headers, StringBuffer command) { - StringBuffer buf = new StringBuffer(command.length() + headers.size() * 64); + private String formatHeaders(Properties headers, StringBuilder command) { + StringBuilder buf = new StringBuilder(command.length() + headers.size() * 64); buf.append(command.toString().trim()).append("\r\n"); for (Iterator iter = headers.keySet().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); @@ -285,9 +321,9 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { return buf.toString(); } - private Properties readHeaders(InputStream in, StringBuffer command) throws IOException { + private Properties readHeaders(InputStream in, StringBuilder command) throws IOException { Properties headers = new Properties(); - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); boolean ok = DataHelper.readLine(in, command); if (!ok) throw new IOException("EOF reached while reading the HTTP command [" + command.toString() + "]"); @@ -331,6 +367,10 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { name = "X-Accept-encoding"; else if (HASH_HEADER.equalsIgnoreCase(name)) continue; // Prevent spoofing + else if (DEST64_HEADER.equalsIgnoreCase(name)) + continue; // Prevent spoofing + else if (DEST32_HEADER.equalsIgnoreCase(name)) + continue; // Prevent spoofing headers.setProperty(name, value); if (_log.shouldLog(Log.DEBUG)) _log.debug("Read the header [" + name + "] = [" + value + "]"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java index e6708aa21..dd8c289d9 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java @@ -39,23 +39,23 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable Logging l, boolean ownDest, EventDispatcher notifyThis, - I2PTunnel tunnel) throws IllegalArgumentException { + I2PTunnel tunnel, String pkf) throws IllegalArgumentException { super(localPort, ownDest, l, notifyThis, - "IRCHandler " + (++__clientId), tunnel); + "IRCHandler " + (++__clientId), tunnel, pkf); - StringTokenizer tok = new StringTokenizer(destinations, ","); + StringTokenizer tok = new StringTokenizer(destinations, ", "); dests = new ArrayList(1); while (tok.hasMoreTokens()) { String destination = tok.nextToken(); try { - Destination dest = I2PTunnel.destFromName(destination); - if (dest == null) + Destination destN = I2PTunnel.destFromName(destination); + if (destN == null) l.log("Could not resolve " + destination); else - dests.add(dest); + dests.add(destN); } catch (DataFormatException dfe) { l.log("Bad format parsing \"" + destination + "\""); } @@ -82,10 +82,10 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable try { i2ps = createI2PSocket(dest); i2ps.setReadTimeout(readTimeout); - StringBuffer expectedPong = new StringBuffer(); - Thread in = new I2PThread(new IrcInboundFilter(s,i2ps, expectedPong)); + StringBuilder expectedPong = new StringBuilder(); + Thread in = new I2PThread(new IrcInboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " in"); in.start(); - Thread out = new I2PThread(new IrcOutboundFilter(s,i2ps, expectedPong)); + Thread out = new I2PThread(new IrcOutboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " out"); out.start(); } catch (Exception ex) { if (_log.shouldLog(Log.ERROR)) @@ -121,9 +121,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable private Socket local; private I2PSocket remote; - private StringBuffer expectedPong; + private StringBuilder expectedPong; - IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) { + IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuilder pong) { local=_local; remote=_remote; expectedPong=pong; @@ -195,9 +195,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable private Socket local; private I2PSocket remote; - private StringBuffer expectedPong; + private StringBuilder expectedPong; - IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) { + IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuilder pong) { local=_local; remote=_remote; expectedPong=pong; @@ -266,7 +266,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable * */ - public String inboundFilter(String s, StringBuffer expectedPong) { + public String inboundFilter(String s, StringBuilder expectedPong) { String field[]=s.split(" ",4); String command; @@ -353,7 +353,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable return null; } - public String outboundFilter(String s, StringBuffer expectedPong) { + public String outboundFilter(String s, StringBuilder expectedPong) { String field[]=s.split(" ",3); String command; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java new file mode 100644 index 000000000..6e0427095 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java @@ -0,0 +1,188 @@ +package net.i2p.i2ptunnel; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.Socket; +import java.net.SocketException; +import java.util.Properties; + +import net.i2p.client.streaming.I2PSocket; +import net.i2p.crypto.SHA256Generator; +import net.i2p.data.DataHelper; +import net.i2p.data.Destination; +import net.i2p.data.Hash; +import net.i2p.data.Base32; +import net.i2p.util.EventDispatcher; +import net.i2p.util.Log; + +/** + * Simple extension to the I2PTunnelServer that filters the registration + * sequence to pass the destination hash of the client through as the hostname, + * so an IRC Server may track users across nick changes. + * + * Of course, this requires the ircd actually use the hostname sent by + * the client rather than the IP. It is common for ircds to ignore the + * hostname in the USER message (unless it's coming from another server) + * since it is easily spoofed. So you have to fix or, if you are lucky, + * configure your ircd first. At least in unrealircd and ngircd this is + * not configurable. + * + * There are three options for mangling the desthash. Put the option in the + * "custom options" section of i2ptunnel. + * - ircserver.cloakKey unset: Cloak with a random value that is persistent for + * the life of this tunnel. This is the default. + * - ircserver.cloakKey=somepassphrase: Cloak with the hash of the passphrase. Use this to + * have consistent mangling across restarts, or to + * have multiple IRC servers cloak consistently to + * be able to track users even when they switch servers. + * Note: don't quote or put spaces in the passphrase, + * the i2ptunnel gui can't handle it. + * - ircserver.fakeHostname=%f.b32.i2p: Set the fake hostname sent by I2PTunnel, + * %f is the full B32 destination hash + * %c is the cloaked hash. + * + * There is no outbound filtering. + * + * @author zzz + */ +public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable { + public static final String PROP_CLOAK="ircserver.cloakKey"; + public static final String PROP_HOSTNAME="ircserver.fakeHostname"; + public static final String PROP_HOSTNAME_DEFAULT="%f.b32.i2p"; + + private static final Log _log = new Log(I2PTunnelIRCServer.class); + + + /** + * @throws IllegalArgumentException if the I2PTunnel does not contain + * valid config to contact the router + */ + + public I2PTunnelIRCServer(InetAddress host, int port, File privkey, String privkeyname, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) { + super(host, port, privkey, privkeyname, l, notifyThis, tunnel); + initCloak(tunnel); + } + + /** generate a random 32 bytes, or the hash of the passphrase */ + private void initCloak(I2PTunnel tunnel) { + Properties opts = tunnel.getClientOptions(); + String passphrase = opts.getProperty(PROP_CLOAK); + if (passphrase == null) { + this.cloakKey = new byte[Hash.HASH_LENGTH]; + tunnel.getContext().random().nextBytes(this.cloakKey); + } else { + this.cloakKey = SHA256Generator.getInstance().calculateHash(passphrase.trim().getBytes()).getData(); + } + + this.hostname = opts.getProperty(PROP_HOSTNAME, PROP_HOSTNAME_DEFAULT); + } + + @Override + protected void blockingHandle(I2PSocket socket) { + try { + // give them 15 seconds to send in the request + socket.setReadTimeout(15*1000); + InputStream in = socket.getInputStream(); + String modifiedRegistration = filterRegistration(in, cloakDest(socket.getPeerDestination())); + socket.setReadTimeout(readTimeout); + Socket s = new Socket(remoteHost, remotePort); + new I2PTunnelRunner(s, socket, slock, null, modifiedRegistration.getBytes(), null); + } catch (SocketException ex) { + try { + socket.close(); + } catch (IOException ioe) { + if (_log.shouldLog(Log.ERROR)) + _log.error("Error while closing the received i2p con", ex); + } + } catch (IOException ex) { + try { + socket.close(); + } catch (IOException ioe) {} + if (_log.shouldLog(Log.WARN)) + _log.warn("Error while receiving the new IRC Connection", ex); + } catch (OutOfMemoryError oom) { + try { + socket.close(); + } catch (IOException ioe) {} + if (_log.shouldLog(Log.ERROR)) + _log.error("OOM in IRC server", oom); + } + } + + /** + * (Optionally) append 32 bytes of crap to the destination then return + * the first few characters of the hash of the whole thing, + ".i2p". + * Or do we want the full hash if the ircd is going to use this for + * nickserv auto-login? Or even Base32 if it will be used in a + * case-insensitive manner? + * + */ + String cloakDest(Destination d) { + String hf; + String hc; + + byte[] b = new byte[d.size() + this.cloakKey.length]; + System.arraycopy(b, 0, d.toByteArray(), 0, d.size()); + System.arraycopy(b, d.size(), this.cloakKey, 0, this.cloakKey.length); + hc = Base32.encode(SHA256Generator.getInstance().calculateHash(b).getData()); + + hf = Base32.encode(d.calculateHash().getData()); + + return this.hostname.replace("%f", hf).replace("%c", hc); + } + + /** keep reading until we see USER or SERVER */ + private String filterRegistration(InputStream in, String newHostname) throws IOException { + StringBuilder buf = new StringBuilder(128); + int lineCount = 0; + + while (true) { + String s = DataHelper.readLine(in); + if (s == null) + throw new IOException("EOF reached before the end of the headers [" + buf.toString() + "]"); + if (++lineCount > 10) + throw new IOException("Too many lines before USER or SERVER, giving up"); + s = s.trim(); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Got line: " + s); + + String field[]=s.split(" ",5); + String command; + int idx=0; + + if(field[0].charAt(0)==':') + idx++; + + try { + command = field[idx++]; + } catch (IndexOutOfBoundsException ioobe) { + // wtf, server sent borked command? + throw new IOException("Dropping defective message: index out of bounds while extracting command."); + } + + if ("USER".equalsIgnoreCase(command)) { + if (field.length < idx + 4) + throw new IOException("Too few parameters in USER message: " + s); + // USER zzz1 hostname localhost :zzz + // => + // USER zzz1 abcd1234.i2p localhost :zzz + // this whole class is for these two lines... + buf.append("USER ").append(field[idx]).append(' ').append(newHostname); + buf.append(' '); + buf.append(field[idx+2]).append(' ').append(field[idx+3]).append("\r\n"); + break; + } + buf.append(s).append("\r\n"); + if ("SERVER".equalsIgnoreCase(command)) + break; + } + if (_log.shouldLog(Log.DEBUG)) + _log.debug("All done, sending: " + buf.toString()); + return buf.toString(); + } + + private byte[] cloakKey; // 32 bytes of stuff to scramble the dest with + private String hostname; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java index f237b97ef..76480a940 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java @@ -36,7 +36,7 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL private Socket s; private I2PSocket i2ps; - Object slock, finishLock = new Object(); + final Object slock, finishLock = new Object(); boolean finished = false; HashMap ostreams, sockets; byte[] initialI2PData; @@ -114,6 +114,7 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL protected InputStream getSocketIn() throws IOException { return s.getInputStream(); } protected OutputStream getSocketOut() throws IOException { return s.getOutputStream(); } + @Override public void run() { try { InputStream in = getSocketIn(); @@ -239,6 +240,7 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL start(); } + @Override public void run() { String from = i2ps.getThisDestination().calculateHash().toBase64().substring(0,6); String to = i2ps.getPeerDestination().calculateHash().toBase64().substring(0,6); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java index fa3478c71..76246d7b6 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java @@ -18,8 +18,6 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.I2PException; -import net.i2p.client.I2PClient; -import net.i2p.client.I2PClientFactory; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; @@ -36,8 +34,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { protected I2PSocketManager sockMgr; protected I2PServerSocket i2pss; - private Object lock = new Object(); - protected Object slock = new Object(); + private final Object lock = new Object(); + protected final Object slock = new Object(); protected InetAddress remoteHost; protected int remotePort; @@ -203,17 +201,17 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { public void run() { if (shouldUsePool()) { - I2PServerSocket i2pss = sockMgr.getServerSocket(); + I2PServerSocket i2pS_S = sockMgr.getServerSocket(); int handlers = getHandlerCount(); for (int i = 0; i < handlers; i++) { - I2PThread handler = new I2PThread(new Handler(i2pss), "Handle Server " + i); + I2PThread handler = new I2PThread(new Handler(i2pS_S), "Handle Server " + i); handler.start(); } } else { - I2PServerSocket i2pss = sockMgr.getServerSocket(); + I2PServerSocket i2pS_S = sockMgr.getServerSocket(); while (true) { try { - final I2PSocket i2ps = i2pss.accept(); + final I2PSocket i2ps = i2pS_S.accept(); if (i2ps == null) throw new I2PException("I2PServerSocket closed"); new I2PThread(new Runnable() { public void run() { blockingHandle(i2ps); } }).start(); } catch (I2PException ipe) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelTask.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelTask.java index 6aa8ca18f..4a6a0bb66 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelTask.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelTask.java @@ -73,6 +73,7 @@ public abstract class I2PTunnelTask implements EventDispatcher { public void reportAbuse(I2PSession session, int severity) { } + @Override public String toString() { return name; } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java index 019bc7826..1f358abf0 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java @@ -37,11 +37,11 @@ public class I2Ping extends I2PTunnelTask implements Runnable { private String command; private long timeout = PING_TIMEOUT; - private Object simulLock = new Object(); + private final Object simulLock = new Object(); private int simulPings = 0; private long lastPingTime = 0; - private Object lock = new Object(), slock = new Object(); + private final Object lock = new Object(), slock = new Object(); //public I2Ping(String cmd, Logging l, // boolean ownDest) { @@ -197,6 +197,7 @@ public class I2Ping extends I2PTunnelTask implements Runnable { start(); } + @Override public void run() { try { Destination dest = I2PTunnel.destFromName(destination); @@ -210,7 +211,7 @@ public class I2Ping extends I2PTunnelTask implements Runnable { int fail = 0; long totalTime = 0; int cnt = countPing ? CPING_COUNT : PING_COUNT; - StringBuffer pingResults = new StringBuffer(2 * cnt + destination.length() + 3); + StringBuilder pingResults = new StringBuilder(2 * cnt + destination.length() + 3); for (int i = 0; i < cnt; i++) { boolean sent; sent = ping(dest); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java index 3c9640ce5..b5ca6c3a1 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java @@ -58,7 +58,7 @@ public class TunnelController implements Logging { setConfig(config, prefix); _messages = new ArrayList(4); _running = false; - if (createKey && ("server".equals(getType()) || "httpserver".equals(getType())) ) + if (createKey && (getType().endsWith("server") || getPersistentClientKey())) createPrivateKey(); _starting = getStartOnLoad(); } @@ -72,6 +72,8 @@ public class TunnelController implements Logging { } File keyFile = new File(getPrivKeyFile()); + if (!keyFile.isAbsolute()) + keyFile = new File(I2PAppContext.getGlobalContext().getConfigDir(), getPrivKeyFile()); if (keyFile.exists()) { //log("Not overwriting existing private keys in " + keyFile.getAbsolutePath()); return; @@ -134,6 +136,8 @@ public class TunnelController implements Logging { _log.warn("Cannot start the tunnel - no type specified"); return; } + setI2CPOptions(); + setSessionOptions(); if ("httpclient".equals(type)) { startHttpClient(); } else if("ircclient".equals(type)) { @@ -144,19 +148,26 @@ public class TunnelController implements Logging { startConnectClient(); } else if ("client".equals(type)) { startClient(); + } else if ("streamrclient".equals(type)) { + startStreamrClient(); } else if ("server".equals(type)) { startServer(); } else if ("httpserver".equals(type)) { startHttpServer(); + } else if ("ircserver".equals(type)) { + startIrcServer(); + } else if ("streamrserver".equals(type)) { + startStreamrServer(); } else { if (_log.shouldLog(Log.ERROR)) _log.error("Cannot start tunnel - unknown type [" + type + "]"); + return; } + acquire(); + _running = true; } private void startHttpClient() { - setI2CPOptions(); - setSessionOptions(); setListenOn(); String listenPort = getListenPort(); String proxyList = getProxyList(); @@ -165,13 +176,9 @@ public class TunnelController implements Logging { _tunnel.runHttpClient(new String[] { listenPort, sharedClient }, this); else _tunnel.runHttpClient(new String[] { listenPort, sharedClient, proxyList }, this); - acquire(); - _running = true; } private void startConnectClient() { - setI2CPOptions(); - setSessionOptions(); setListenOn(); String listenPort = getListenPort(); String proxyList = getProxyList(); @@ -180,31 +187,51 @@ public class TunnelController implements Logging { _tunnel.runConnectClient(new String[] { listenPort, sharedClient }, this); else _tunnel.runConnectClient(new String[] { listenPort, sharedClient, proxyList }, this); - acquire(); - _running = true; } private void startIrcClient() { - setI2CPOptions(); - setSessionOptions(); setListenOn(); String listenPort = getListenPort(); String dest = getTargetDestination(); String sharedClient = getSharedClient(); - _tunnel.runIrcClient(new String[] { listenPort, dest, sharedClient }, this); - acquire(); - _running = true; + if (getPersistentClientKey()) { + String privKeyFile = getPrivKeyFile(); + _tunnel.runIrcClient(new String[] { listenPort, dest, sharedClient, privKeyFile }, this); + } else { + _tunnel.runIrcClient(new String[] { listenPort, dest, sharedClient }, this); + } } private void startSocksClient() { - setI2CPOptions(); - setSessionOptions(); setListenOn(); String listenPort = getListenPort(); String sharedClient = getSharedClient(); _tunnel.runSOCKSTunnel(new String[] { listenPort, sharedClient }, this); - acquire(); - _running = true; + } + + /* + * Streamr client is a UDP server, use the listenPort field for targetPort + * and the listenOnInterface field for the targetHost + */ + private void startStreamrClient() { + String targetHost = getListenOnInterface(); + String targetPort = getListenPort(); + String dest = getTargetDestination(); + _tunnel.runStreamrClient(new String[] { targetHost, targetPort, dest }, this); + } + + /** + * Streamr server is a UDP client, use the targetPort field for listenPort + * and the targetHost field for the listenOnInterface + */ + private void startStreamrServer() { + String listenOn = getTargetHost(); + if ( (listenOn != null) && (listenOn.length() > 0) ) { + _tunnel.runListenOn(new String[] { listenOn }, this); + } + String listenPort = getTargetPort(); + String privKeyFile = getPrivKeyFile(); + _tunnel.runStreamrServer(new String[] { listenPort, privKeyFile }, this); } /** @@ -240,38 +267,38 @@ public class TunnelController implements Logging { } private void startClient() { - setI2CPOptions(); - setSessionOptions(); setListenOn(); String listenPort = getListenPort(); String dest = getTargetDestination(); String sharedClient = getSharedClient(); - _tunnel.runClient(new String[] { listenPort, dest, sharedClient }, this); - acquire(); - _running = true; + if (getPersistentClientKey()) { + String privKeyFile = getPrivKeyFile(); + _tunnel.runClient(new String[] { listenPort, dest, sharedClient, privKeyFile }, this); + } else { + _tunnel.runClient(new String[] { listenPort, dest, sharedClient }, this); + } } private void startServer() { - setI2CPOptions(); - setSessionOptions(); String targetHost = getTargetHost(); String targetPort = getTargetPort(); String privKeyFile = getPrivKeyFile(); _tunnel.runServer(new String[] { targetHost, targetPort, privKeyFile }, this); - acquire(); - _running = true; } private void startHttpServer() { - setI2CPOptions(); - setSessionOptions(); String targetHost = getTargetHost(); String targetPort = getTargetPort(); String spoofedHost = getSpoofedHost(); String privKeyFile = getPrivKeyFile(); _tunnel.runHttpServer(new String[] { targetHost, targetPort, spoofedHost, privKeyFile }, this); - acquire(); - _running = true; + } + + private void startIrcServer() { + String targetHost = getTargetHost(); + String targetPort = getTargetPort(); + String privKeyFile = getPrivKeyFile(); + _tunnel.runIrcServer(new String[] { targetHost, targetPort, privKeyFile }, this); } private void setListenOn() { @@ -358,7 +385,7 @@ public class TunnelController implements Logging { public String getI2CPHost() { return _config.getProperty("i2cpHost"); } public String getI2CPPort() { return _config.getProperty("i2cpPort"); } public String getClientOptions() { - StringBuffer opts = new StringBuffer(64); + StringBuilder opts = new StringBuilder(64); for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) { String key = (String)iter.next(); String val = _config.getProperty(key); @@ -380,6 +407,7 @@ public class TunnelController implements Logging { public String getProxyList() { return _config.getProperty("proxyList"); } public String getSharedClient() { return _config.getProperty("sharedClient", "true"); } public boolean getStartOnLoad() { return "true".equalsIgnoreCase(_config.getProperty("startOnLoad", "true")); } + public boolean getPersistentClientKey() { return Boolean.valueOf(_config.getProperty("option.persistentClientKey")).booleanValue(); } public String getMyDestination() { if (_tunnel != null) { List sessions = _tunnel.getSessions(); @@ -408,8 +436,18 @@ public class TunnelController implements Logging { public boolean getIsRunning() { return _running; } public boolean getIsStarting() { return _starting; } + /** if running but no open sessions, we are in standby */ + public boolean getIsStandby() { + if (!_running) + return false; + for (I2PSession sess : _tunnel.getSessions()) { + if (!sess.isClosed()) + return false; + } + return true; + } - public void getSummary(StringBuffer buf) { + public void getSummary(StringBuilder buf) { String type = getType(); if ("httpclient".equals(type)) getHttpClientSummary(buf); @@ -423,7 +461,7 @@ public class TunnelController implements Logging { buf.append("Unknown type ").append(type); } - private void getHttpClientSummary(StringBuffer buf) { + private void getHttpClientSummary(StringBuilder buf) { String description = getDescription(); if ( (description != null) && (description.trim().length() > 0) ) buf.append("").append(description).append("
\n"); @@ -444,7 +482,7 @@ public class TunnelController implements Logging { getOptionSummary(buf); } - private void getClientSummary(StringBuffer buf) { + private void getClientSummary(StringBuilder buf) { String description = getDescription(); if ( (description != null) && (description.trim().length() > 0) ) buf.append("").append(description).append("
\n"); @@ -461,7 +499,7 @@ public class TunnelController implements Logging { getOptionSummary(buf); } - private void getServerSummary(StringBuffer buf) { + private void getServerSummary(StringBuilder buf) { String description = getDescription(); if ( (description != null) && (description.trim().length() > 0) ) buf.append("").append(description).append("
\n"); @@ -472,7 +510,7 @@ public class TunnelController implements Logging { getOptionSummary(buf); } - private void getHttpServerSummary(StringBuffer buf) { + private void getHttpServerSummary(StringBuilder buf) { String description = getDescription(); if ( (description != null) && (description.trim().length() > 0) ) buf.append("").append(description).append("
\n"); @@ -484,7 +522,7 @@ public class TunnelController implements Logging { getOptionSummary(buf); } - private void getOptionSummary(StringBuffer buf) { + private void getOptionSummary(StringBuilder buf) { String opts = getClientOptions(); if ( (opts != null) && (opts.length() > 0) ) buf.append("Network options: ").append(opts).append("
\n"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java index 3b6e76539..b077179e0 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java @@ -40,7 +40,7 @@ public class TunnelControllerGroup { * no more tunnels are using it) * */ - private Map _sessions; + private final Map _sessions; public static TunnelControllerGroup getInstance() { synchronized (TunnelControllerGroup.class) { @@ -231,6 +231,8 @@ public class TunnelControllerGroup { public void saveConfig(String configFile) { _configFile = configFile; File cfgFile = new File(configFile); + if (!cfgFile.isAbsolute()) + cfgFile = new File(I2PAppContext.getGlobalContext().getConfigDir(), configFile); File parent = cfgFile.getParentFile(); if ( (parent != null) && (!parent.exists()) ) parent.mkdirs(); @@ -243,7 +245,7 @@ public class TunnelControllerGroup { map.putAll(cur); } - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); for (Iterator iter = map.keySet().iterator(); iter.hasNext(); ) { String key = (String)iter.next(); String val = (String)map.get(key); @@ -270,9 +272,11 @@ public class TunnelControllerGroup { */ private Properties loadConfig(String configFile) { File cfgFile = new File(configFile); + if (!cfgFile.isAbsolute()) + cfgFile = new File(I2PAppContext.getGlobalContext().getConfigDir(), configFile); if (!cfgFile.exists()) { if (_log.shouldLog(Log.ERROR)) - _log.error("Unable to load the controllers from " + configFile); + _log.error("Unable to load the controllers from " + cfgFile.getAbsolutePath()); return null; } @@ -282,7 +286,7 @@ public class TunnelControllerGroup { return props; } catch (IOException ioe) { if (_log.shouldLog(Log.ERROR)) - _log.error("Error reading the controllers from " + configFile, ioe); + _log.error("Error reading the controllers from " + cfgFile.getAbsolutePath(), ioe); return null; } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/MultiSink.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/MultiSink.java new file mode 100644 index 000000000..3c63758c1 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/MultiSink.java @@ -0,0 +1,35 @@ +package net.i2p.i2ptunnel.socks; + +import java.util.Map; + +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.util.Log; + +/** + * Sends to one of many Sinks + * @author zzz modded from streamr/MultiSource + */ +public class MultiSink implements Source, Sink { + private static final Log _log = new Log(MultiSink.class); + + public MultiSink(Map cache) { + this.cache = cache; + } + + /** Don't use this - put sinks in the cache */ + public void setSink(Sink sink) {} + + public void start() {} + + public void send(Destination from, byte[] data) { + Sink s = this.cache.get(from); + if (s == null) { + _log.error("No where to go for " + from.calculateHash().toBase64().substring(0, 6)); + return; + } + s.send(from, data); + } + + private Map cache; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/ReplyTracker.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/ReplyTracker.java new file mode 100644 index 000000000..fbdf2939d --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/ReplyTracker.java @@ -0,0 +1,35 @@ +package net.i2p.i2ptunnel.socks; + +import java.util.Map; + +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.util.Log; + +/** + * Track who the reply goes to + * @author zzz + */ +public class ReplyTracker implements Source, Sink { + private static final Log _log = new Log(MultiSink.class); + + public ReplyTracker(Sink reply, Map cache) { + this.reply = reply; + this.cache = cache; + } + + public void setSink(Sink sink) { + this.sink = sink; + } + + public void start() {} + + public void send(Destination to, byte[] data) { + this.cache.put(to, this.reply); + this.sink.send(to, data); + } + + private Sink reply; + private Map cache; + private Sink sink; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java new file mode 100644 index 000000000..ef88102cf --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java @@ -0,0 +1,284 @@ +/* I2PSOCKSTunnel is released under the terms of the GNU GPL, + * with an additional exception. For further details, see the + * licensing terms in I2PTunnel.java. + * + * Copyright (c) 2004 by human + */ +package net.i2p.i2ptunnel.socks; + +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.SocketException; +import java.util.List; + +import net.i2p.I2PAppContext; +import net.i2p.I2PException; +import net.i2p.client.streaming.I2PSocket; +import net.i2p.data.DataFormatException; +import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.util.HexDump; +import net.i2p.util.Log; + +/* + * Class that manages SOCKS 4/4a connections, and forwards them to + * destination hosts or (eventually) some outproxy. + * + * @author zzz modded from SOCKS5Server + */ +public class SOCKS4aServer extends SOCKSServer { + private static final Log _log = new Log(SOCKS4aServer.class); + + private Socket clientSock = null; + private boolean setupCompleted = false; + + /** + * Create a SOCKS4a server that communicates with the client using + * the specified socket. This method should not be invoked + * directly: new SOCKS4aServer objects should be created by using + * SOCKSServerFactory.createSOCSKServer(). It is assumed that the + * SOCKS VER field has been stripped from the input stream of the + * client socket. + * + * @param clientSock client socket + */ + public SOCKS4aServer(Socket clientSock) { + this.clientSock = clientSock; + } + + public Socket getClientSocket() throws SOCKSException { + setupServer(); + + return clientSock; + } + + protected void setupServer() throws SOCKSException { + if (setupCompleted) { return; } + + DataInputStream in; + DataOutputStream out; + try { + in = new DataInputStream(clientSock.getInputStream()); + out = new DataOutputStream(clientSock.getOutputStream()); + + manageRequest(in, out); + } catch (IOException e) { + throw new SOCKSException("Connection error (" + e.getMessage() + ")"); + } + + setupCompleted = true; + } + + /** + * SOCKS4a request management. This method assumes that all the + * stuff preceding or enveloping the actual request + * has been stripped out of the input/output streams. + */ + private void manageRequest(DataInputStream in, DataOutputStream out) throws IOException, SOCKSException { + + int command = in.readByte() & 0xff; + switch (command) { + case Command.CONNECT: + break; + case Command.BIND: + _log.debug("BIND command is not supported!"); + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + throw new SOCKSException("BIND command not supported"); + default: + _log.debug("unknown command in request (" + Integer.toHexString(command) + ")"); + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + throw new SOCKSException("Invalid command in request"); + } + + connPort = in.readUnsignedShort(); + if (connPort == 0) { + _log.debug("trying to connect to TCP port 0? Dropping!"); + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + throw new SOCKSException("Invalid port number in request"); + } + + connHostName = new String(""); + boolean alreadyWarned = false; + for (int i = 0; i < 4; ++i) { + int octet = in.readByte() & 0xff; + connHostName += Integer.toString(octet); + if (i != 3) { + connHostName += "."; + if (octet != 0 && !alreadyWarned) { + _log.warn("IPV4 address type in request: " + connHostName + ". Is your client secure?"); + alreadyWarned = true; + } + } + } + + // discard user name + readString(in); + + // SOCKS 4a + if (connHostName.startsWith("0.0.0.") && !connHostName.equals("0.0.0.0")) + connHostName = readString(in); + } + + private String readString(DataInputStream in) throws IOException { + StringBuilder sb = new StringBuilder(16); + char c; + while ((c = (char) (in.readByte() & 0xff)) != 0) + sb.append(c); + return sb.toString(); + } + + protected void confirmConnection() throws SOCKSException { + DataInputStream in; + DataOutputStream out; + try { + out = new DataOutputStream(clientSock.getOutputStream()); + + sendRequestReply(Reply.SUCCEEDED, InetAddress.getByName("127.0.0.1"), 1, out); + } catch (IOException e) { + throw new SOCKSException("Connection error (" + e.getMessage() + ")"); + } + } + + /** + * Send the specified reply to a request of the client. Either + * one of inetAddr or domainName can be null, depending on + * addressType. + */ + private void sendRequestReply(int replyCode, InetAddress inetAddr, + int bindPort, DataOutputStream out) throws IOException { + ByteArrayOutputStream reps = new ByteArrayOutputStream(); + DataOutputStream dreps = new DataOutputStream(reps); + + // Reserved byte, should be 0x00 + dreps.write(0x00); + dreps.write(replyCode); + dreps.writeShort(bindPort); + dreps.write(inetAddr.getAddress()); + + byte[] reply = reps.toByteArray(); + + if (_log.shouldLog(Log.DEBUG)) { + _log.debug("Sending request reply:\n" + HexDump.dump(reply)); + } + + out.write(reply); + } + + /** + * Get an I2PSocket that can be used to send/receive 8-bit clean data + * to/from the destination of the SOCKS connection. + * + * @return an I2PSocket connected with the destination + */ + public I2PSocket getDestinationI2PSocket(I2PSOCKSTunnel t) throws SOCKSException { + setupServer(); + + if (connHostName == null) { + _log.error("BUG: destination host name has not been initialized!"); + throw new SOCKSException("BUG! See the logs!"); + } + if (connPort == 0) { + _log.error("BUG: destination port has not been initialized!"); + throw new SOCKSException("BUG! See the logs!"); + } + + DataOutputStream out; // for errors + try { + out = new DataOutputStream(clientSock.getOutputStream()); + } catch (IOException e) { + throw new SOCKSException("Connection error (" + e.getMessage() + ")"); + } + + // FIXME: here we should read our config file, select an + // outproxy, and instantiate the proper socket class that + // handles the outproxy itself (SOCKS4a, SOCKS4a, HTTP CONNECT...). + I2PSocket destSock; + + try { + if (connHostName.toLowerCase().endsWith(".i2p") || + connHostName.toLowerCase().endsWith(".onion")) { + _log.debug("connecting to " + connHostName + "..."); + // Let's not due a new Dest for every request, huh? + //I2PSocketManager sm = I2PSocketManagerFactory.createManager(); + //destSock = sm.connect(I2PTunnel.destFromName(connHostName), null); + destSock = t.createI2PSocket(I2PTunnel.destFromName(connHostName)); + } else if ("localhost".equals(connHostName) || "127.0.0.1".equals(connHostName)) { + String err = "No localhost accesses allowed through the Socks Proxy"; + _log.error(err); + try { + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + } catch (IOException ioe) {} + throw new SOCKSException(err); + } else if (connPort == 80) { + // rewrite GET line to include hostname??? or add Host: line??? + // or forward to local eepProxy (but that's a Socket not an I2PSocket) + // use eepProxy configured outproxies? + String err = "No handler for HTTP outproxy implemented - to: " + connHostName; + _log.error(err); + try { + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + } catch (IOException ioe) {} + throw new SOCKSException(err); + } else { + List proxies = t.getProxies(connPort); + if (proxies == null || proxies.size() <= 0) { + String err = "No outproxy configured for port " + connPort + " and no default configured either - host: " + connHostName; + _log.error(err); + try { + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + } catch (IOException ioe) {} + throw new SOCKSException(err); + } + int p = I2PAppContext.getGlobalContext().random().nextInt(proxies.size()); + String proxy = proxies.get(p); + _log.debug("connecting to port " + connPort + " proxy " + proxy + " for " + connHostName + "..."); + // this isn't going to work, these need to be socks outproxies so we need + // to do a socks session to them? + destSock = t.createI2PSocket(I2PTunnel.destFromName(proxy)); + } + confirmConnection(); + _log.debug("connection confirmed - exchanging data..."); + } catch (DataFormatException e) { + try { + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + } catch (IOException ioe) {} + throw new SOCKSException("Error in destination format"); + } catch (SocketException e) { + try { + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + } catch (IOException ioe) {} + throw new SOCKSException("Error connecting (" + + e.getMessage() + ")"); + } catch (IOException e) { + try { + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + } catch (IOException ioe) {} + throw new SOCKSException("Error connecting (" + + e.getMessage() + ")"); + } catch (I2PException e) { + try { + sendRequestReply(Reply.CONNECTION_REFUSED, InetAddress.getByName("127.0.0.1"), 0, out); + } catch (IOException ioe) {} + throw new SOCKSException("Error connecting (" + + e.getMessage() + ")"); + } + + return destSock; + } + + /* + * Some namespaces to enclose SOCKS protocol codes + */ + private static class Command { + private static final int CONNECT = 0x01; + private static final int BIND = 0x02; + } + + private static class Reply { + private static final int SUCCEEDED = 0x5a; + private static final int CONNECTION_REFUSED = 0x5b; + } +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java index 38c50f266..cc397c414 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java @@ -13,12 +13,15 @@ import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.List; import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.data.DataFormatException; +import net.i2p.data.Destination; import net.i2p.i2ptunnel.I2PTunnel; import net.i2p.util.HexDump; import net.i2p.util.Log; @@ -67,7 +70,8 @@ public class SOCKS5Server extends SOCKSServer { out = new DataOutputStream(clientSock.getOutputStream()); init(in, out); - manageRequest(in, out); + if (manageRequest(in, out) == Command.UDP_ASSOCIATE) + handleUDP(in, out); } catch (IOException e) { throw new SOCKSException("Connection error (" + e.getMessage() + ")"); } @@ -111,7 +115,7 @@ public class SOCKS5Server extends SOCKSServer { * initialization, integrity/confidentiality encapsulations, etc) * has been stripped out of the input/output streams. */ - private void manageRequest(DataInputStream in, DataOutputStream out) throws IOException, SOCKSException { + private int manageRequest(DataInputStream in, DataOutputStream out) throws IOException, SOCKSException { int socksVer = in.readByte() & 0xff; if (socksVer != SOCKS_VERSION_5) { _log.debug("error in SOCKS5 request (protocol != 5? wtf?)"); @@ -127,9 +131,12 @@ public class SOCKS5Server extends SOCKSServer { sendRequestReply(Reply.COMMAND_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); throw new SOCKSException("BIND command not supported"); case Command.UDP_ASSOCIATE: + /*** if(!Boolean.valueOf(tunnel.getOptions().getProperty("i2ptunnel.socks.allowUDP")).booleanValue()) { _log.debug("UDP ASSOCIATE command is not supported!"); sendRequestReply(Reply.COMMAND_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); throw new SOCKSException("UDP ASSOCIATE command not supported"); + ***/ + break; default: _log.debug("unknown command in request (" + Integer.toHexString(command) + ")"); sendRequestReply(Reply.COMMAND_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); @@ -152,7 +159,8 @@ public class SOCKS5Server extends SOCKSServer { connHostName += "."; } } - _log.warn("IPV4 address type in request: " + connHostName + ". Is your client secure?"); + if (command != Command.UDP_ASSOCIATE) + _log.warn("IPV4 address type in request: " + connHostName + ". Is your client secure?"); break; case AddressType.DOMAINNAME: { @@ -168,9 +176,12 @@ public class SOCKS5Server extends SOCKSServer { _log.debug("DOMAINNAME address type in request: " + connHostName); break; case AddressType.IPV6: - _log.warn("IP V6 address type in request! Is your client secure?" + " (IPv6 is not supported, anyway :-)"); - sendRequestReply(Reply.ADDRESS_TYPE_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); - throw new SOCKSException("IPV6 addresses not supported"); + if (command != Command.UDP_ASSOCIATE) { + _log.warn("IP V6 address type in request! Is your client secure?" + " (IPv6 is not supported, anyway :-)"); + sendRequestReply(Reply.ADDRESS_TYPE_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); + throw new SOCKSException("IPV6 addresses not supported"); + } + break; default: _log.debug("unknown address type in request (" + Integer.toHexString(command) + ")"); sendRequestReply(Reply.ADDRESS_TYPE_NOT_SUPPORTED, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); @@ -183,6 +194,7 @@ public class SOCKS5Server extends SOCKSServer { sendRequestReply(Reply.CONNECTION_NOT_ALLOWED_BY_RULESET, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); throw new SOCKSException("Invalid port number in request"); } + return command; } protected void confirmConnection() throws SOCKSException { @@ -293,6 +305,13 @@ public class SOCKS5Server extends SOCKSServer { // Let's not due a new Dest for every request, huh? //I2PSocketManager sm = I2PSocketManagerFactory.createManager(); //destSock = sm.connect(I2PTunnel.destFromName(connHostName), null); + Destination dest = I2PTunnel.destFromName(connHostName); + if (dest == null) { + try { + sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); + } catch (IOException ioe) {} + throw new SOCKSException("Host not found"); + } destSock = t.createI2PSocket(I2PTunnel.destFromName(connHostName)); } else if ("localhost".equals(connHostName) || "127.0.0.1".equals(connHostName)) { String err = "No localhost accesses allowed through the Socks Proxy"; @@ -358,6 +377,59 @@ public class SOCKS5Server extends SOCKSServer { return destSock; } + // This isn't really the right place for this, we can't stop the tunnel once it starts. + static SOCKSUDPTunnel _tunnel; + static final Object _startLock = new Object(); + static byte[] dummyIP = new byte[4]; + /** + * We got a UDP associate command. + * Loop here looking for more, never return normally, + * or else I2PSocksTunnel will create a streaming lib connection. + * + * Do UDP Socks clients actually send more than one Associate request? + * RFC 1928 isn't clear... maybe not. + */ + private void handleUDP(DataInputStream in, DataOutputStream out) throws SOCKSException { + List ports = new ArrayList(1); + synchronized (_startLock) { + if (_tunnel == null) { + // tunnel options? + _tunnel = new SOCKSUDPTunnel(new I2PTunnel()); + _tunnel.startRunning(); + } + } + while (true) { + // Set it up. connHostName and connPort are the client's info. + InetAddress ia = null; + try { + ia = InetAddress.getByAddress(connHostName, dummyIP); + } catch (UnknownHostException uhe) {} // won't happen, no resolving done here + int myPort = _tunnel.add(ia, connPort); + ports.add(Integer.valueOf(myPort)); + try { + sendRequestReply(Reply.SUCCEEDED, AddressType.IPV4, InetAddress.getByName("127.0.0.1"), null, myPort, out); + } catch (IOException ioe) { break; } + + // wait for more ??? + try { + int command = manageRequest(in, out); + // don't do this... + if (command != Command.UDP_ASSOCIATE) + break; + } catch (IOException ioe) { break; } + catch (SOCKSException ioe) { break; } + } + + for (Integer i : ports) + _tunnel.remove(i); + + // Prevent I2PSocksTunnel from calling getDestinationI2PSocket() above + // to create a streaming lib connection... + // This isn't very elegant... + // + throw new SOCKSException("End of UDP Processing"); + } + /* * Some namespaces to enclose SOCKS protocol codes */ diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java new file mode 100644 index 000000000..763b9aa10 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java @@ -0,0 +1,89 @@ +package net.i2p.i2ptunnel.socks; + +import net.i2p.data.Base32; +import net.i2p.data.DataFormatException; +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.I2PTunnel; + +/** + * Save the SOCKS header from a datagram + * Ref: RFC 1928 + * + * @author zzz + */ +public class SOCKSHeader { + + /** + * @param data the whole packet + */ + public SOCKSHeader(byte[] data) { + if (data.length <= 8) + throw new IllegalArgumentException("Header too short: " + data.length); + if (data[0] != 0 || data[1] != 0) + throw new IllegalArgumentException("Not a SOCKS datagram?"); + if (data[2] != 0) + throw new IllegalArgumentException("We can't handle fragments!"); + int headerlen = 0; + int addressType = data[3]; + if (addressType == 1) { + // this will fail in getDestination() + headerlen = 6 + 4; + } else if (addressType == 3) { + headerlen = 6 + 1 + (data[4] & 0xff); + } else if (addressType == 4) { + // this will fail in getDestination() + // but future garlicat partial hash lookup possible? + headerlen = 6 + 16; + } else { + throw new IllegalArgumentException("Unknown address type: " + addressType); + } + if (data.length < headerlen) + throw new IllegalArgumentException("Header too short: " + data.length); + + this.header = new byte[headerlen]; + System.arraycopy(this.header, 0, data, 0, headerlen); + } + + private static final byte[] beg = {0,0,0,3,60}; + private static final byte[] end = {'.','b','3','2','.','i','2','p',0,0}; + + /** + * Make a dummy header from a dest, + * for those cases where we want to receive unsolicited datagrams. + * Unused for now. + */ + public SOCKSHeader(Destination dest) { + this.header = new byte[beg.length + 52 + end.length]; + System.arraycopy(this.header, 0, beg, 0, beg.length); + String b32 = Base32.encode(dest.calculateHash().getData()); + System.arraycopy(this.header, beg.length, b32.getBytes(), 0, 52); + System.arraycopy(this.header, beg.length + 52, end, 0, end.length); + } + + public String getHost() { + int addressType = this.header[3]; + if (addressType != 3) + return null; + int namelen = (this.header[4] & 0xff); + byte[] nameBytes = new byte[namelen]; + System.arraycopy(nameBytes, 0, this.header, 5, namelen); + return new String(nameBytes); + } + + public Destination getDestination() { + String name = getHost(); + if (name == null) + return null; + try { + // the naming service does caching (thankfully) + return I2PTunnel.destFromName(name); + } catch (DataFormatException dfe) {} + return null; + } + + public byte[] getBytes() { + return header; + } + + private byte[] header; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServer.java index 06c3fab55..09e9284de 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServer.java @@ -9,7 +9,6 @@ package net.i2p.i2ptunnel.socks; import java.net.Socket; import net.i2p.client.streaming.I2PSocket; -import net.i2p.i2ptunnel.I2PTunnel; import net.i2p.util.Log; /** diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java index 67a52d688..80dfacb6a 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java @@ -44,6 +44,10 @@ public class SOCKSServerFactory { int socksVer = in.readByte(); switch (socksVer) { + case 0x04: + // SOCKS version 4/4a + serv = new SOCKS4aServer(s); + break; case 0x05: // SOCKS version 5 serv = new SOCKS5Server(s); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPPort.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPPort.java new file mode 100644 index 000000000..b56c9082f --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPPort.java @@ -0,0 +1,77 @@ +package net.i2p.i2ptunnel.socks; + +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; + +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.udp.*; + +/** + * Implements a UDP port and Socks encapsulation / decapsulation. + * This is for a single port. If there is demuxing for multiple + * ports, it happens outside of here. + * + * TX: + * UDPSource -> SOCKSUDPUnwrapper -> ReplyTracker ( -> I2PSink in SOCKSUDPTunnel) + * + * RX: + * UDPSink <- SOCKSUDPWrapper ( <- MultiSink <- I2PSource in SOCKSUDPTunnel) + * + * The Unwrapper passes headers to the Wrapper through a cache. + * The ReplyTracker passes sinks to MultiSink through a cache. + * + * @author zzz + */ +public class SOCKSUDPPort implements Source, Sink { + + public SOCKSUDPPort(InetAddress host, int port, Map replyMap) { + + // this passes the host and port from UDPUnwrapper to UDPWrapper + Map cache = new ConcurrentHashMap(4); + + // rcv from I2P and send to a port + this.wrapper = new SOCKSUDPWrapper(cache); + this.udpsink = new UDPSink(host, port); + this.wrapper.setSink(this.udpsink); + + // rcv from the same port and send to I2P + DatagramSocket sock = this.udpsink.getSocket(); + this.udpsource = new UDPSource(sock); + this.unwrapper = new SOCKSUDPUnwrapper(cache); + this.udpsource.setSink(this.unwrapper); + this.udptracker = new ReplyTracker(this, replyMap); + this.unwrapper.setSink(this.udptracker); + } + + /** Socks passes this back to the client on the TCP connection */ + public int getPort() { + return this.udpsink.getPort(); + } + + public void setSink(Sink sink) { + this.udptracker.setSink(sink); + } + + public void start() { + // the other Sources don't use start + this.udpsource.start(); + } + + public void stop() { + this.udpsink.stop(); + this.udpsource.stop(); + } + + public void send(Destination from, byte[] data) { + this.wrapper.send(from, data); + } + + + private UDPSink udpsink; + private UDPSource udpsource; + private SOCKSUDPWrapper wrapper; + private SOCKSUDPUnwrapper unwrapper; + private ReplyTracker udptracker; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPTunnel.java new file mode 100644 index 000000000..0490a6f0a --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPTunnel.java @@ -0,0 +1,93 @@ +package net.i2p.i2ptunnel.socks; + +import java.net.InetAddress; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Iterator; +import java.util.Map; + +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.i2ptunnel.udpTunnel.I2PTunnelUDPClientBase; + +/** + * A Datagram Tunnel that can have multiple bidirectional ports on the UDP side. + * + * TX: + * (ReplyTracker in multiple SOCKSUDPPorts -> ) I2PSink + * + * RX: + * (SOCKSUDPWrapper in multiple SOCKSUDPPorts <- ) MultiSink <- I2PSource + * + * The reply from a dest goes to the last SOCKSUDPPort that sent to that dest. + * If multiple ports are talking to a dest at the same time, this isn't + * going to work very well. + * + * @author zzz modded from streamr/StreamrConsumer + */ +public class SOCKSUDPTunnel extends I2PTunnelUDPClientBase { + + /** + * Set up a tunnel with no UDP side yet. + * Use add() for each port. + */ + public SOCKSUDPTunnel(I2PTunnel tunnel) { + super(null, tunnel, tunnel, tunnel); + + this.ports = new ConcurrentHashMap(1); + this.cache = new ConcurrentHashMap(1); + this.demuxer = new MultiSink(this.cache); + setSink(this.demuxer); + } + + + /** @return the UDP port number */ + public int add(InetAddress host, int port) { + SOCKSUDPPort sup = new SOCKSUDPPort(host, port, this.cache); + this.ports.put(Integer.valueOf(sup.getPort()), sup); + sup.setSink(this); + sup.start(); + return sup.getPort(); + } + + public void remove(Integer port) { + SOCKSUDPPort sup = this.ports.remove(port); + if (sup != null) + sup.stop(); + for (Iterator iter = cache.entrySet().iterator(); iter.hasNext();) { + Map.Entry e = (Map.Entry) iter.next(); + if (e.getValue() == sup) + iter.remove(); + } + } + + @Override + public final void startRunning() { + super.startRunning(); + // demuxer start() doesn't do anything + startall(); + } + + @Override + public boolean close(boolean forced) { + stopall(); + return super.close(forced); + } + + /** you should really add() after startRunning() */ + private void startall() { + } + + private void stopall() { + for (SOCKSUDPPort sup : this.ports.values()) { + sup.stop(); + } + this.ports.clear(); + this.cache.clear(); + } + + + + private Map ports; + private Map cache; + private MultiSink demuxer; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPUnwrapper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPUnwrapper.java new file mode 100644 index 000000000..2720b6fd4 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPUnwrapper.java @@ -0,0 +1,59 @@ +package net.i2p.i2ptunnel.socks; + +import java.util.Map; + +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.util.Log; + +/** + * Strip a SOCKS header off a datagram, convert it to a Destination + * Ref: RFC 1928 + * + * @author zzz + */ +public class SOCKSUDPUnwrapper implements Source, Sink { + private static final Log _log = new Log(SOCKSUDPUnwrapper.class); + + /** + * @param cache put headers here to pass to SOCKSUDPWrapper + */ + public SOCKSUDPUnwrapper(Map cache) { + this.cache = cache; + } + + public void setSink(Sink sink) { + this.sink = sink; + } + + public void start() {} + + /** + * + */ + public void send(Destination ignored_from, byte[] data) { + SOCKSHeader h; + try { + h = new SOCKSHeader(data); + } catch (IllegalArgumentException iae) { + _log.error(iae.toString()); + return; + } + Destination dest = h.getDestination(); + if (dest == null) { + // no, we aren't going to send non-i2p traffic to a UDP outproxy :) + _log.error("Destination not found: " + h.getHost()); + return; + } + + cache.put(dest, h); + + int headerlen = h.getBytes().length; + byte unwrapped[] = new byte[data.length - headerlen]; + System.arraycopy(unwrapped, 0, data, headerlen, unwrapped.length); + this.sink.send(dest, unwrapped); + } + + private Sink sink; + private Map cache; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPWrapper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPWrapper.java new file mode 100644 index 000000000..4ec836157 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSUDPWrapper.java @@ -0,0 +1,49 @@ +package net.i2p.i2ptunnel.socks; + +import java.util.Map; + +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.udp.*; + +/** + * Put a SOCKS header on a datagram + * Ref: RFC 1928 + * + * @author zzz + */ +public class SOCKSUDPWrapper implements Source, Sink { + public SOCKSUDPWrapper(Map cache) { + this.cache = cache; + } + + public void setSink(Sink sink) { + this.sink = sink; + } + + public void start() {} + + /** + * Use the cached header, which should have the host string and port + * + */ + public void send(Destination from, byte[] data) { + if (this.sink == null) + return; + + SOCKSHeader h = cache.get(from); + if (h == null) { + // RFC 1928 says drop + // h = new SOCKSHeader(from); + return; + } + + byte[] header = h.getBytes(); + byte wrapped[] = new byte[header.length + data.length]; + System.arraycopy(wrapped, 0, header, 0, header.length); + System.arraycopy(wrapped, header.length, data, 0, data.length); + this.sink.send(from, wrapped); + } + + private Sink sink; + private Map cache; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/MultiSource.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/MultiSource.java new file mode 100644 index 000000000..5c5a08027 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/MultiSource.java @@ -0,0 +1,64 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.streamr; + +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.List; + +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.udp.*; + +/** + * Sends to many Sinks + * @author welterde + * @author zzz modded for I2PTunnel + */ +public class MultiSource implements Source, Sink { + public MultiSource() { + this.sinks = new CopyOnWriteArrayList(); + } + + public void setSink(Sink sink) { + this.sink = sink; + } + + public void start() {} + + public void stop() { + this.sinks.clear(); + } + + public void send(Destination ignored_from, byte[] data) { + for(Destination dest : this.sinks) { + this.sink.send(dest, data); + } + } + + public void add(Destination sink) { + this.sinks.add(sink); + } + + public void remove(Destination sink) { + this.sinks.remove(sink); + } + + + + + + + + + + + + + + + + private Sink sink; + private List sinks; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Pinger.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Pinger.java new file mode 100644 index 000000000..29d1186c4 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Pinger.java @@ -0,0 +1,59 @@ +package net.i2p.i2ptunnel.streamr; + +import net.i2p.i2ptunnel.udp.*; + +/** + * + * @author welterde/zzz + */ +public class Pinger implements Source, Runnable { + public Pinger() { + this.thread = new Thread(this); + } + public void setSink(Sink sink) { + this.sink = sink; + } + + public void start() { + this.running = true; + this.waitlock = new Object(); + this.thread.start(); + } + + public void stop() { + this.running = false; + synchronized(this.waitlock) { + this.waitlock.notifyAll(); + } + // send unsubscribe-message + byte[] data = new byte[1]; + data[0] = 1; + this.sink.send(null, data); + } + + public void run() { + // send subscribe-message + byte[] data = new byte[1]; + data[0] = 0; + int i = 0; + while(this.running) { + //System.out.print("p"); + this.sink.send(null, data); + synchronized(this.waitlock) { + int delay = 10000; + if (i < 5) { + i++; + delay = 2000; + } + try { + this.waitlock.wait(delay); + } catch(InterruptedException ie) {} + } + } + } + + protected Sink sink; + protected Thread thread; + protected Object waitlock; // should be final and use a factory. LINT + protected boolean running; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/StreamrConsumer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/StreamrConsumer.java new file mode 100644 index 000000000..9c1d584ae --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/StreamrConsumer.java @@ -0,0 +1,67 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.streamr; + +import java.net.InetAddress; + +import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.i2ptunnel.Logging; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.i2ptunnel.udpTunnel.I2PTunnelUDPClientBase; +import net.i2p.util.EventDispatcher; + +/** + * Compared to a standard I2PTunnel, + * this acts like a client on the I2P side (no privkey file) + * but a server on the UDP side (sends to a configured host/port) + * + * @author welterde + * @author zzz modded for I2PTunnel + */ +public class StreamrConsumer extends I2PTunnelUDPClientBase { + + public StreamrConsumer(InetAddress host, int port, String destination, + Logging l, EventDispatcher notifyThis, + I2PTunnel tunnel) { + super(destination, l, notifyThis, tunnel); + + // create udp-destination + this.sink = new UDPSink(host, port); + setSink(this.sink); + + // create pinger + this.pinger = new Pinger(); + this.pinger.setSink(this); + } + + @Override + public final void startRunning() { + super.startRunning(); + // send subscribe-message + this.pinger.start(); + l.log("Streamr client ready"); + } + + @Override + public boolean close(boolean forced) { + // send unsubscribe-message + this.pinger.stop(); + this.sink.stop(); + return super.close(forced); + } + + + + + + + + + + + private UDPSink sink; + private Pinger pinger; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/StreamrProducer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/StreamrProducer.java new file mode 100644 index 000000000..7d6b14491 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/StreamrProducer.java @@ -0,0 +1,73 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.streamr; + +// system +import java.io.File; + +// i2p +import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.i2ptunnel.Logging; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.i2ptunnel.udpTunnel.I2PTunnelUDPServerBase; +import net.i2p.util.EventDispatcher; + +/** + * Compared to a standard I2PTunnel, + * this acts like a server on the I2P side (persistent privkey file) + * but a client on the UDP side (receives on a configured port) + * + * @author welterde + * @author zzz modded for I2PTunnel + */ +public class StreamrProducer extends I2PTunnelUDPServerBase { + + public StreamrProducer(int port, + File privkey, String privkeyname, Logging l, + EventDispatcher notifyThis, I2PTunnel tunnel) { + // verify subscription requests + super(true, privkey, privkeyname, l, notifyThis, tunnel); + + // The broadcaster + this.multi = new MultiSource(); + this.multi.setSink(this); + + // The listener + this.subscriber = new Subscriber(this.multi); + setSink(this.subscriber); + + // now start udp-server + this.server = new UDPSource(port); + this.server.setSink(this.multi); + } + + @Override + public final void startRunning() { + super.startRunning(); + this.server.start(); + l.log("Streamr server ready"); + } + + @Override + public boolean close(boolean forced) { + this.server.stop(); + this.multi.stop(); + return super.close(forced); + } + + + + + + + + + + + private MultiSource multi; + private UDPSource server; + private Sink subscriber; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Subscriber.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Subscriber.java new file mode 100644 index 000000000..377292dde --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/streamr/Subscriber.java @@ -0,0 +1,70 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.streamr; + +// system +import java.util.Set; + +// i2p +import net.i2p.client.I2PSession; +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.util.ConcurrentHashSet; + +/** + * server-mode + * @author welterde + * @author zzz modded from Producer for I2PTunnel + */ +public class Subscriber implements Sink { + + public Subscriber(MultiSource multi) { + this.multi = multi; + // subscriptions + this.subscriptions = new ConcurrentHashSet(); + } + + public void send(Destination dest, byte[] data) { + if(dest == null || data.length < 1) { + // invalid packet + // TODO: write to log + } else { + byte ctrl = data[0]; + if(ctrl == 0) { + if (!this.subscriptions.contains(dest)) { + // subscribe + System.out.println("Add subscription: " + dest.toBase64().substring(0,4)); + this.subscriptions.add(dest); + this.multi.add(dest); + } // else already subscribed + } else if(ctrl == 1) { + // unsubscribe + System.out.println("Remove subscription: " + dest.toBase64().substring(0,4)); + boolean removed = this.subscriptions.remove(dest); + if(removed) + multi.remove(dest); + } else { + // invalid packet + // TODO: write to log + } + } + } + + + + + + + + + + + private I2PSession sess; + private Source listener; + private Set subscriptions; + private MultiSource multi; + private Source server; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSink.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSink.java new file mode 100644 index 000000000..e08596af1 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSink.java @@ -0,0 +1,73 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +// i2p +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.data.Destination; +import net.i2p.client.datagram.I2PDatagramMaker; + +/** + * Producer + * + * This sends to a fixed destination specified in the constructor + * + * @author welterde + */ +public class I2PSink implements Sink { + public I2PSink(I2PSession sess, Destination dest) { + this(sess, dest, false); + } + public I2PSink(I2PSession sess, Destination dest, boolean raw) { + this.sess = sess; + this.dest = dest; + this.raw = raw; + + // create maker + if (!raw) + this.maker = new I2PDatagramMaker(this.sess); + } + + /** @param src ignored */ + public synchronized void send(Destination src, byte[] data) { + //System.out.print("w"); + // create payload + byte[] payload; + if(!this.raw) { + synchronized(this.maker) { + payload = this.maker.makeI2PDatagram(data); + } + } else + payload = data; + + // send message + try { + this.sess.sendMessage(this.dest, payload, I2PSession.PROTO_DATAGRAM, + I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED); + } catch(I2PSessionException exc) { + // TODO: handle better + exc.printStackTrace(); + } + } + + + + + + + + + + + + + + protected boolean raw; + protected I2PSession sess; + protected Destination dest; + protected I2PDatagramMaker maker; // should be final and use a factory. LINT +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSinkAnywhere.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSinkAnywhere.java new file mode 100644 index 000000000..2da942a74 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSinkAnywhere.java @@ -0,0 +1,71 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +// i2p +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.data.Destination; +import net.i2p.client.datagram.I2PDatagramMaker; + +/** + * Producer + * + * This sends to any destination specified in send() + * + * @author zzz modded from I2PSink by welterde + */ +public class I2PSinkAnywhere implements Sink { + public I2PSinkAnywhere(I2PSession sess) { + this(sess, false); + } + public I2PSinkAnywhere(I2PSession sess, boolean raw) { + this.sess = sess; + this.raw = raw; + + // create maker + if (!raw) + this.maker = new I2PDatagramMaker(this.sess); + } + + /** @param to - where it's going */ + public synchronized void send(Destination to, byte[] data) { + // create payload + byte[] payload; + if(!this.raw) { + synchronized(this.maker) { + payload = this.maker.makeI2PDatagram(data); + } + } else + payload = data; + + // send message + try { + this.sess.sendMessage(to, payload, I2PSession.PROTO_DATAGRAM, + I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED); + } catch(I2PSessionException exc) { + // TODO: handle better + exc.printStackTrace(); + } + } + + + + + + + + + + + + + + protected boolean raw; + protected I2PSession sess; + protected Destination dest; + protected I2PDatagramMaker maker; // should be final and use a factory. LINT +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSource.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSource.java new file mode 100644 index 000000000..0b5474777 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSource.java @@ -0,0 +1,123 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +// system +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +// i2p +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionListener; +import net.i2p.client.datagram.I2PDatagramDissector; + +/** + * + * @author welterde + */ +public class I2PSource implements Source, Runnable { + public I2PSource(I2PSession sess) { + this(sess, true, false); + } + public I2PSource(I2PSession sess, boolean verify) { + this(sess, verify, false); + } + public I2PSource(I2PSession sess, boolean verify, boolean raw) { + this.sess = sess; + this.sink = null; + this.verify = verify; + this.raw = raw; + + // create queue + this.queue = new ArrayBlockingQueue(256); + + // create listener + this.sess.setSessionListener(new Listener()); + + // create thread + this.thread = new Thread(this); + } + + public void setSink(Sink sink) { + this.sink = sink; + } + + public void start() { + this.thread.start(); + } + + public void run() { + // create dissector + I2PDatagramDissector diss = new I2PDatagramDissector(); + while(true) { + try { + // get id + int id = this.queue.take(); + + // receive message + byte[] msg = this.sess.receiveMessage(id); + + if(!this.raw) { + // load datagram into it + diss.loadI2PDatagram(msg); + + // now call sink + if(this.verify) + this.sink.send(diss.getSender(), diss.getPayload()); + else + this.sink.send(diss.extractSender(), diss.extractPayload()); + } else { + // verify is ignored + this.sink.send(null, msg); + } + //System.out.print("r"); + } catch(Exception e) { + e.printStackTrace(); + } + } + } + + + + + + + protected class Listener implements I2PSessionListener { + + public void messageAvailable(I2PSession sess, int id, long size) { + try { + queue.put(id); + } catch(Exception e) { + // ignore + } + } + + public void reportAbuse(I2PSession arg0, int arg1) { + // ignore + } + + public void disconnected(I2PSession arg0) { + // ignore + } + + public void errorOccurred(I2PSession arg0, String arg1, Throwable arg2) { + // ignore + } + + } + + + + + + + protected I2PSession sess; + protected BlockingQueue queue; + protected Sink sink; + protected Thread thread; + protected boolean verify; + protected boolean raw; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Sink.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Sink.java new file mode 100644 index 000000000..49e3e47a3 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Sink.java @@ -0,0 +1,17 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +// i2p +import net.i2p.data.Destination; + +/** + * + * @author welterde + */ +public interface Sink { + public void send(Destination src, byte[] data); +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Source.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Source.java new file mode 100644 index 000000000..f65d03b19 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Source.java @@ -0,0 +1,15 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +/** + * + * @author welterde + */ +public interface Source { + public void setSink(Sink sink); + public void start(); +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Stream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Stream.java new file mode 100644 index 000000000..b8b57e696 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/Stream.java @@ -0,0 +1,15 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +/** + * + * @author welterde + */ +public interface Stream { + public void start(); + public void stop(); +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSink.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSink.java new file mode 100644 index 000000000..d2e8e8924 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSink.java @@ -0,0 +1,77 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +// system +import java.net.DatagramSocket; +import java.net.DatagramPacket; +import java.net.InetAddress; + +// i2p +import net.i2p.data.Destination; + +/** + * + * @author welterde + */ +public class UDPSink implements Sink { + public UDPSink(InetAddress host, int port) { + // create socket + try { + this.sock = new DatagramSocket(); + } catch(Exception e) { + // TODO: fail better + throw new RuntimeException("failed to open udp-socket", e); + } + + this.remoteHost = host; + + // remote port + this.remotePort = port; + } + + public void send(Destination src, byte[] data) { + // if data.length > this.sock.getSendBufferSize() ... + + // create packet + DatagramPacket packet = new DatagramPacket(data, data.length, this.remoteHost, this.remotePort); + + // send packet + try { + this.sock.send(packet); + } catch(Exception e) { + // TODO: fail a bit better + e.printStackTrace(); + } + } + + public int getPort() { + return this.sock.getLocalPort(); + } + + /** to pass to UDPSource constructor */ + public DatagramSocket getSocket() { + return this.sock; + } + + public void stop() { + this.sock.close(); + } + + + + + + + + + + + protected DatagramSocket sock; + protected InetAddress remoteHost; + protected int remotePort; + +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSource.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSource.java new file mode 100644 index 000000000..fc1dd5bf2 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSource.java @@ -0,0 +1,91 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package net.i2p.i2ptunnel.udp; + +// system +import java.net.DatagramSocket; +import java.net.DatagramPacket; + +/** + * + * @author welterde + */ +public class UDPSource implements Source, Runnable { + public static final int MAX_SIZE = 15360; + public UDPSource(int port) { + this.sink = null; + + // create udp-socket + try { + this.sock = new DatagramSocket(port); + } catch(Exception e) { + throw new RuntimeException("failed to listen...", e); + } + + // create thread + this.thread = new Thread(this); + } + + /** use socket from UDPSink */ + public UDPSource(DatagramSocket sock) { + this.sink = null; + this.sock = sock; + this.thread = new Thread(this); + } + + public void setSink(Sink sink) { + this.sink = sink; + } + + public void start() { + this.thread.start(); + } + + public void run() { + // create packet + byte[] buf = new byte[MAX_SIZE]; + DatagramPacket pack = new DatagramPacket(buf, buf.length); + while(true) { + try { + // receive... + this.sock.receive(pack); + + // create new data array + byte[] nbuf = new byte[pack.getLength()]; + + // copy over + System.arraycopy(pack.getData(), 0, nbuf, 0, nbuf.length); + + // transfer to sink + this.sink.send(null, nbuf); + //System.out.print("i"); + } catch(Exception e) { + e.printStackTrace(); + break; + } + } + } + + public void stop() { + this.sock.close(); + } + + + + + + + + + + + + + + protected DatagramSocket sock; + protected Sink sink; + protected Thread thread; +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java new file mode 100644 index 000000000..14945c842 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java @@ -0,0 +1,197 @@ +/* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java) + * (c) 2003 - 2004 mihi + */ +package net.i2p.i2ptunnel.udpTunnel; + +import java.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; +import java.net.ServerSocket; + +import net.i2p.I2PAppContext; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PClientFactory; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.data.DataFormatException; +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.i2ptunnel.I2PTunnelTask; +import net.i2p.i2ptunnel.Logging; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.util.EventDispatcher; +import net.i2p.util.Log; + + /** + * Base client class that sets up an I2P Datagram client destination. + * The UDP side is not implemented here, as there are at least + * two possibilities: + * + * 1) UDP side is a "server" + * Example: Streamr Consumer + * - Configure a destination host and port + * - External application sends no data + * - Extending class must have a constructor with host and port arguments + * + * 2) UDP side is a client/server + * Example: SOCKS UDP (DNS requests?) + * - configure an inbound port and a destination host and port + * - External application sends and receives data + * - Extending class must have a constructor with host and 2 port arguments + * + * So the implementing class must create a UDPSource and/or UDPSink, + * and must call setSink(). + * + * @author zzz with portions from welterde's streamr + */ + public abstract class I2PTunnelUDPClientBase extends I2PTunnelTask implements Source, Sink { + + private static final Log _log = new Log(I2PTunnelUDPClientBase.class); + protected I2PAppContext _context; + protected Logging l; + + static final long DEFAULT_CONNECT_TIMEOUT = 60 * 1000; + + private static volatile long __clientId = 0; + protected long _clientId; + + protected Destination dest = null; + + private boolean listenerReady = false; + + private ServerSocket ss; + + private Object startLock = new Object(); + private boolean startRunning = false; + + private byte[] pubkey; + + private String handlerName; + + private Object conLock = new Object(); + + /** How many connections will we allow to be in the process of being built at once? */ + private int _numConnectionBuilders; + /** How long will we allow sockets to sit in the _waitingSockets map before killing them? */ + private int _maxWaitTime; + + private I2PSession _session; + private Source _i2pSource; + private Sink _i2pSink; + private Destination _otherDest; + /** + * @throws IllegalArgumentException if the I2CP configuration is b0rked so + * badly that we cant create a socketManager + */ + public I2PTunnelUDPClientBase(String destination, Logging l, EventDispatcher notifyThis, + I2PTunnel tunnel) throws IllegalArgumentException { + super("UDPServer", notifyThis, tunnel); + _clientId = ++__clientId; + this.l = l; + + _context = tunnel.getContext(); + + tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true"); + + // create i2pclient and destination + I2PClient client = I2PClientFactory.createClient(); + Destination destN; + byte[] key; + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(512); + destN = client.createDestination(out); + key = out.toByteArray(); + } catch(Exception exc) { + throw new RuntimeException("failed to create i2p-destination", exc); + } + + // create a session + try { + ByteArrayInputStream in = new ByteArrayInputStream(key); + _session = client.createSession(in, tunnel.getClientOptions()); + } catch(Exception exc) { + throw new RuntimeException("failed to create session", exc); + } + + // Setup the source. Always expect raw unverified datagrams. + _i2pSource = new I2PSource(_session, false, true); + + // Setup the sink. Always send repliable datagrams. + if (destination != null && destination.length() > 0) { + try { + _otherDest = I2PTunnel.destFromName(destination); + } catch (DataFormatException dfe) {} + if (_otherDest == null) { + l.log("Could not resolve " + destination); + throw new RuntimeException("failed to create session - could not resolve " + destination); + } + _i2pSink = new I2PSink(_session, _otherDest, false); + } else { + _i2pSink = new I2PSinkAnywhere(_session, false); + } + } + + /** + * Actually start working on outgoing connections. + * Classes should override to start UDP side as well. + * + * Not specified in I2PTunnelTask but used in both + * I2PTunnelClientBase and I2PTunnelServer so let's + * implement it here too. + */ + public void startRunning() { + synchronized (startLock) { + try { + _session.connect(); + } catch(I2PSessionException exc) { + throw new RuntimeException("failed to connect session", exc); + } + start(); + startRunning = true; + startLock.notify(); + } + open = true; + } + + /** + * I2PTunnelTask Methods + * + * Classes should override to close UDP side as well + */ + public boolean close(boolean forced) { + if (!open) return true; + if (_session != null) { + try { + _session.destroySession(); + } catch (I2PSessionException ise) {} + } + l.log("Closing client " + toString()); + open = false; + return true; + } + + /** + * Source Methods + * + * Sets the receiver of the UDP datagrams from I2P + * Subclass must call this after constructor + * and before start() + */ + public void setSink(Sink s) { + _i2pSource.setSink(s); + } + + /** start the source */ + public void start() { + _i2pSource.start(); + } + + /** + * Sink Methods + * + * @param to - ignored if configured for a single destination + * (we use the dest specified in the constructor) + */ + public void send(Destination to, byte[] data) { + _i2pSink.send(to, data); + } +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPServerBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPServerBase.java new file mode 100644 index 000000000..6ba8379f9 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPServerBase.java @@ -0,0 +1,204 @@ +/* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java) + * (c) 2003 - 2004 mihi + */ +package net.i2p.i2ptunnel.udpTunnel; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import net.i2p.I2PException; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PClientFactory; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.data.Destination; +import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.i2ptunnel.I2PTunnelTask; +import net.i2p.i2ptunnel.Logging; +import net.i2p.i2ptunnel.udp.*; +import net.i2p.util.EventDispatcher; +import net.i2p.util.Log; + + /** + * Base client class that sets up an I2P Datagram server destination. + * The UDP side is not implemented here, as there are at least + * two possibilities: + * + * 1) UDP side is a "client" + * Example: Streamr Producer + * - configure an inbound port + * - External application receives no data + * - Extending class must have a constructor with a port argument + * + * 2) UDP side is a client/server + * Example: DNS + * - configure an inbound port and a destination host and port + * - External application sends and receives data + * - Extending class must have a constructor with host and 2 port arguments + * + * So the implementing class must create a UDPSource and/or UDPSink, + * and must call setSink(). + * + * @author zzz with portions from welterde's streamr + */ + +public class I2PTunnelUDPServerBase extends I2PTunnelTask implements Source, Sink { + + private final static Log _log = new Log(I2PTunnelUDPServerBase.class); + + private final Object lock = new Object(); + protected Object slock = new Object(); + + private static volatile long __serverId = 0; + + protected Logging l; + + private static final long DEFAULT_READ_TIMEOUT = -1; // 3*60*1000; + /** default timeout to 3 minutes - override if desired */ + protected long readTimeout = DEFAULT_READ_TIMEOUT; + + private I2PSession _session; + private Source _i2pSource; + private Sink _i2pSink; + + /** + * + * @throws IllegalArgumentException if the I2CP configuration is b0rked so + * badly that we cant create a socketManager + * + */ + + public I2PTunnelUDPServerBase(boolean verify, File privkey, String privkeyname, Logging l, + EventDispatcher notifyThis, I2PTunnel tunnel) { + super("UDPServer <- " + privkeyname, notifyThis, tunnel); + FileInputStream fis = null; + try { + fis = new FileInputStream(privkey); + init(verify, fis, privkeyname, l); + } catch (IOException ioe) { + _log.error("Error starting server", ioe); + notifyEvent("openServerResult", "error"); + } finally { + if (fis != null) + try { fis.close(); } catch (IOException ioe) {} + } + } + + private void init(boolean verify, InputStream privData, String privkeyname, Logging l) { + this.l = l; + int portNum = 7654; + if (getTunnel().port != null) { + try { + portNum = Integer.parseInt(getTunnel().port); + } catch (NumberFormatException nfe) { + _log.log(Log.CRIT, "Invalid port specified [" + getTunnel().port + "], reverting to " + portNum); + } + } + + // create i2pclient + I2PClient client = I2PClientFactory.createClient(); + + try { + _session = client.createSession(privData, getTunnel().getClientOptions()); + } catch(I2PSessionException exc) { + throw new RuntimeException("failed to create session", exc); + } + + // Setup the source. Always expect repliable datagrams, optionally verify + _i2pSource = new I2PSource(_session, verify, false); + + // Setup the sink. Always send raw datagrams. + _i2pSink = new I2PSinkAnywhere(_session, true); + } + + /** + * Classes should override to start UDP side as well. + * + * Not specified in I2PTunnelTask but used in both + * I2PTunnelClientBase and I2PTunnelServer so let's + * implement it here too. + */ + public void startRunning() { + //synchronized (startLock) { + try { + _session.connect(); + } catch(I2PSessionException exc) { + throw new RuntimeException("failed to connect session", exc); + } + start(); + //} + + notifyEvent("openServerResult", "ok"); + open = true; + } + + /** + * Set the read idle timeout for newly-created connections (in + * milliseconds). After this time expires without data being reached from + * the I2P network, the connection itself will be closed. + */ + public void setReadTimeout(long ms) { + readTimeout = ms; + } + + /** + * Get the read idle timeout for newly-created connections (in + * milliseconds). + * + * @return The read timeout used for connections + */ + public long getReadTimeout() { + return readTimeout; + } + + /** + * I2PTunnelTask Methods + * + * Classes should override to close UDP side as well + */ + public boolean close(boolean forced) { + if (!open) return true; + synchronized (lock) { + l.log("Shutting down server " + toString()); + try { + if (_session != null) { + _session.destroySession(); + } + } catch (I2PException ex) { + _log.error("Error destroying the session", ex); + } + l.log("Server shut down."); + open = false; + return true; + } + } + + /** + * Source Methods + * + * Sets the receiver of the UDP datagrams from I2P + * Subclass must call this after constructor + * and before start() + */ + public void setSink(Sink s) { + _i2pSource.setSink(s); + } + + /** start the source */ + public void start() { + _i2pSource.start(); + } + + /** + * Sink Methods + * + * @param to + * + */ + public void send(Destination to, byte[] data) { + _i2pSink.send(to, data); + } +} + diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java index e62bd2500..fe1096eea 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -8,7 +8,6 @@ package net.i2p.i2ptunnel.web; * */ -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -60,8 +59,9 @@ public class EditBean extends IndexBean { TunnelController tun = getController(tunnel); if (tun != null && tun.getPrivKeyFile() != null) return tun.getPrivKeyFile(); - else - return ""; + if (tunnel < 0) + tunnel = _group.getControllers().size(); + return "i2ptunnel" + tunnel + "-privKeys.dat"; } public boolean startAutomatically(int tunnel) { @@ -153,7 +153,17 @@ public class EditBean extends IndexBean { } public boolean getNewDest(int tunnel) { - return getBooleanProperty(tunnel, "i2cp.newDestOnResume"); + return getBooleanProperty(tunnel, "i2cp.newDestOnResume") && + getBooleanProperty(tunnel, "i2cp.closeOnIdle") && + !getBooleanProperty(tunnel, "persistentClientKey"); + } + + public boolean getPersistentClientKey(int tunnel) { + return getBooleanProperty(tunnel, "persistentClientKey"); + } + + public boolean getDelayOpen(int tunnel) { + return getBooleanProperty(tunnel, "i2cp.delayOpen"); } private int getProperty(int tunnel, String prop, int def) { @@ -197,7 +207,7 @@ public class EditBean extends IndexBean { if (tun != null) return tun.getI2CPHost(); else - return "localhost"; + return "127.0.0.1"; } public String getI2CPPort(int tunnel) { @@ -213,7 +223,7 @@ public class EditBean extends IndexBean { if (tun != null) { Properties opts = getOptions(tun); if (opts == null) return ""; - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); int i = 0; for (Iterator iter = opts.keySet().iterator(); iter.hasNext(); ) { String key = (String)iter.next(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java index 46b555772..53ed82749 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -77,12 +77,14 @@ public class IndexBean { public static final int RUNNING = 1; public static final int STARTING = 2; public static final int NOT_RUNNING = 3; + public static final int STANDBY = 4; public static final String PROP_TUNNEL_PASSPHRASE = "i2ptunnel.passphrase"; static final String PROP_NONCE = IndexBean.class.getName() + ".nonce"; static final String CLIENT_NICKNAME = "shared clients"; public static final String PROP_THEME_NAME = "routerconsole.theme"; + public static final String DEFAULT_THEME = "light"; public static final String PROP_CSS_DISABLED = "routerconsole.css.disabled"; public static final String PROP_JS_DISABLED = "routerconsole.javascript.disabled"; @@ -142,10 +144,10 @@ public class IndexBean { } private String processAction() { - if ( (_action == null) || (_action.trim().length() <= 0) ) + if ( (_action == null) || (_action.trim().length() <= 0) || ("Cancel".equals(_action))) return ""; if ( (_prevNonce != _curNonce) && (!validPassphrase(_passphrase)) ) - return "Invalid nonce, are you being spoofed?"; + return "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."; if ("Stop all".equals(_action)) return stopAll(); else if ("Start all".equals(_action)) @@ -301,7 +303,7 @@ public class IndexBean { if (_group == null) return ""; - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); if (_action != null) { try { buf.append(processAction()).append("\n"); @@ -318,11 +320,8 @@ public class IndexBean { //// public String getTheme() { - String theme = _context.getProperty(PROP_THEME_NAME); - if (theme != null) - return "/themes/console/" + theme + "/"; - else - return "/themes/console/"; + String theme = _context.getProperty(PROP_THEME_NAME, DEFAULT_THEME); + return "/themes/console/" + theme + "/"; } public boolean allowCSS() { @@ -351,6 +350,7 @@ public class IndexBean { ("httpclient".equals(type)) || ("sockstunnel".equals(type)) || ("connectclient".equals(type)) || + ("streamrclient".equals(type)) || ("ircclient".equals(type))); } @@ -384,8 +384,11 @@ public class IndexBean { else if ("ircclient".equals(internalType)) return "IRC client"; else if ("server".equals(internalType)) return "Standard server"; else if ("httpserver".equals(internalType)) return "HTTP server"; - else if ("sockstunnel".equals(internalType)) return "SOCKS 5 proxy"; + else if ("sockstunnel".equals(internalType)) return "SOCKS 4/4a/5 proxy"; else if ("connectclient".equals(internalType)) return "CONNECT/SSL/HTTPS proxy"; + else if ("ircserver".equals(internalType)) return "IRC server"; + else if ("streamrclient".equals(internalType)) return "Streamr client"; + else if ("streamrserver".equals(internalType)) return "Streamr server"; else return internalType; } @@ -408,8 +411,12 @@ public class IndexBean { public int getTunnelStatus(int tunnel) { TunnelController tun = getController(tunnel); if (tun == null) return NOT_RUNNING; - if (tun.getIsRunning()) return RUNNING; - else if (tun.getIsStarting()) return STARTING; + if (tun.getIsRunning()) { + if (isClient(tunnel) && tun.getIsStandby()) + return STANDBY; + else + return RUNNING; + } else if (tun.getIsStarting()) return STARTING; else return NOT_RUNNING; } @@ -433,7 +440,8 @@ public class IndexBean { TunnelController tun = getController(tunnel); if (tun == null) return ""; String rv; - if ("client".equals(tun.getType())||"ircclient".equals(tun.getType())) + if ("client".equals(tun.getType()) || "ircclient".equals(tun.getType()) || + "streamrclient".equals(tun.getType())) rv = tun.getTargetDestination(); else rv = tun.getProxyList(); @@ -609,8 +617,14 @@ public class IndexBean { public void setAccess(String moo) { _booleanOptions.add("i2cp.enableAccessList"); } - public void setNewDest(String moo) { - _booleanOptions.add("i2cp.newDestOnResume"); + public void setDelayOpen(String moo) { + _booleanOptions.add("i2cp.delayOpen"); + } + public void setNewDest(String val) { + if ("1".equals(val)) + _booleanOptions.add("i2cp.newDestOnResume"); + else if ("2".equals(val)) + _booleanOptions.add("persistentClientKey"); } public void setReduceTime(String val) { @@ -767,12 +781,6 @@ public class IndexBean { config.setProperty("interface", _reachableByOther); else config.setProperty("interface", _reachableBy); - config.setProperty("option.inbound.nickname", CLIENT_NICKNAME); - config.setProperty("option.outbound.nickname", CLIENT_NICKNAME); - if (_name != null && !_sharedClient) { - config.setProperty("option.inbound.nickname", _name); - config.setProperty("option.outbound.nickname", _name); - } config.setProperty("sharedClient", _sharedClient + ""); for (String p : _booleanClientOpts) config.setProperty("option." + p, "" + _booleanOptions.contains(p)); @@ -785,8 +793,6 @@ public class IndexBean { config.setProperty("targetHost", _targetHost); if (_targetPort != null) config.setProperty("targetPort", _targetPort); - if (_privKeyFile != null) - config.setProperty("privKeyFile", _privKeyFile); for (String p : _booleanServerOpts) config.setProperty("option." + p, "" + _booleanOptions.contains(p)); for (String p : _otherServerOpts) @@ -797,7 +803,7 @@ public class IndexBean { if ("httpclient".equals(_type) || "connectclient".equals(_type)) { if (_proxyList != null) config.setProperty("proxyList", _proxyList); - } else if ("ircclient".equals(_type) || "client".equals(_type)) { + } else if ("ircclient".equals(_type) || "client".equals(_type) || "streamrclient".equals(_type)) { if (_targetDestination != null) config.setProperty("targetDestination", _targetDestination); } else if ("httpserver".equals(_type)) { @@ -814,7 +820,7 @@ public class IndexBean { "inbound.nickname", "outbound.nickname", "i2p.streaming.connectDelay", "i2p.streaming.maxWindowSize" }; private static final String _booleanClientOpts[] = { - "i2cp.reduceOnIdle", "i2cp.closeOnIdle", "i2cp.newDestOnResume" + "i2cp.reduceOnIdle", "i2cp.closeOnIdle", "i2cp.newDestOnResume", "persistentClientKey", "i2cp.delayOpen" }; private static final String _booleanServerOpts[] = { "i2cp.reduceOnIdle", "i2cp.encryptLeaseSet", "i2cp.enableAccessList" @@ -847,6 +853,8 @@ public class IndexBean { } else { config.setProperty("i2cpPort", "7654"); } + if (_privKeyFile != null) + config.setProperty("privKeyFile", _privKeyFile); if (_customOptions != null) { StringTokenizer tok = new StringTokenizer(_customOptions); @@ -885,14 +893,12 @@ public class IndexBean { config.setProperty("option.i2p.streaming.connectDelay", "1000"); else config.setProperty("option.i2p.streaming.connectDelay", "0"); - if (_name != null) { - if ( (!isClient(_type)) || (!_sharedClient) ) { - config.setProperty("option.inbound.nickname", _name); - config.setProperty("option.outbound.nickname", _name); - } else { - config.setProperty("option.inbound.nickname", CLIENT_NICKNAME); - config.setProperty("option.outbound.nickname", CLIENT_NICKNAME); - } + if (isClient(_type) && _sharedClient) { + config.setProperty("option.inbound.nickname", CLIENT_NICKNAME); + config.setProperty("option.outbound.nickname", CLIENT_NICKNAME); + } else if (_name != null) { + config.setProperty("option.inbound.nickname", _name); + config.setProperty("option.outbound.nickname", _name); } if ("interactive".equals(_profile)) // This was 1 which doesn't make much sense @@ -919,11 +925,11 @@ public class IndexBean { } private String getMessages(List msgs) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); getMessages(msgs, buf); return buf.toString(); } - private void getMessages(List msgs, StringBuffer buf) { + private void getMessages(List msgs, StringBuilder buf) { if (msgs == null) return; for (int i = 0; i < msgs.size(); i++) { buf.append((String)msgs.get(i)).append("\n"); diff --git a/apps/i2ptunnel/jsp/edit.jsp b/apps/i2ptunnel/jsp/edit.jsp index 67fdf016c..b58798b20 100644 --- a/apps/i2ptunnel/jsp/edit.jsp +++ b/apps/i2ptunnel/jsp/edit.jsp @@ -16,10 +16,8 @@ String tun = request.getParameter("tunnel"); int curTunnel = -1; if (EditBean.isClient(type)) { %><% - } else if ("server".equals(type) || "httpserver".equals(type)) { - %><% } else { - %>Invalid tunnel type<% + %><% } } %> diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index 3e4c3ecd8..26e40afad 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -18,7 +18,7 @@ <% if (editBean.allowCSS()) { - %> + %> <% } @@ -75,7 +75,11 @@
+ <% if ("streamrclient".equals(tunnelType)) { %> + + <% } else { %> + <% } %>
+ <% String otherInterface = ""; + String clientInterface = editBean.getClientInterface(curTunnel); + if ("streamrclient".equals(tunnelType)) { + otherInterface = clientInterface; + } else { %>
+ <% } // streamrclient %>
@@ -123,7 +139,7 @@ - <% } else if ("client".equals(tunnelType) || "ircclient".equals(tunnelType)) { + <% } else if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "streamrclient".equals(tunnelType)) { %>
- <% } - %>
+ <% } %> + <% if (!"streamrclient".equals(tunnelType)) { %> +
@@ -160,6 +177,7 @@ class="tickbox" /> (Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)
+ <% } // !streamrclient %>
-
-
-
- -
- -
-
- - class="tickbox" /> -
-
- - class="tickbox" /> -
-
- - -
- + <% if (!"streamrclient".equals(tunnelType)) { // streamr client sends pings so it will never be idle %>

@@ -317,7 +308,7 @@
@@ -326,6 +317,86 @@
+
+ +
+
+ + class="tickbox" /> +
+
+ + +
class="tickbox" /> + Enable + class="tickbox" /> + Disable +
+
+
+ + +
+ +
+
+
+ +
+ +
+
+ + class="tickbox" /> +
+ <% } // !streamrclient %> + +
+
+
+ + <% if ("client".equals(tunnelType) || "ircclient".equals(tunnelType)) { %> +
+ +
+
+ + class="tickbox" /> +
+
+ + +
+
+ + + (if known) +
+ +
+
+
+ <% } %> +
+ <% if ("streamrserver".equals(tunnelType)) { %> + + <% } else { %> + <% } %>
@@ -124,6 +132,7 @@ + <% if (!"streamrserver".equals(tunnelType)) { %>
+ <% } // !streamrserver %>
- - (if known) + + <% if (!"".equals(editBean.getDestinationBase64(curTunnel))) { %> + Add to local addressbook + <% } %>
- +
- + (Tunnel must be stopped first)
@@ -274,7 +286,7 @@
@@ -287,7 +299,7 @@ - + (Restrict to these clients only)
@@ -314,7 +326,7 @@
@@ -342,7 +354,7 @@
diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp index b96236ae1..4c26bd3da 100644 --- a/apps/i2ptunnel/jsp/index.jsp +++ b/apps/i2ptunnel/jsp/index.jsp @@ -1,282 +1,295 @@ -<%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean"%> - - - - - - I2PTunnel Webmanager - List - - - - - <% if (indexBean.allowCSS()) { - %> - - - <% } - %> - - - - -
-
-

Status Messages

-
- -
-
-
- - - -
-
-
- - -
- -
-
-

Local Client Tunnels

-
- -
-
-
- -
- -
-
- -
-
- -
-
- -
-
- -
- -
-
-
- <% - for (int curClient = 0; curClient < indexBean.getTunnelCount(); curClient++) { - if (!indexBean.isClient(curClient)) continue; - %> - -
- - <%=indexBean.getClientPort(curClient)%> -
-
- - <%=indexBean.getTunnelType(curClient)%> -
-
- - <%=indexBean.getClientInterface(curClient)%> -
-
- - <% - switch (indexBean.getTunnelStatus(curClient)) { - case IndexBean.STARTING: - %>
Starting...
- Stop - <% - break; - case IndexBean.RUNNING: - %>
Running
- Stop - <% - break; - case IndexBean.NOT_RUNNING: - %>
Stopped
- Start - <% - break; - } - %>
- - <% if (!"sockstunnel".equals(indexBean.getInternalType(curClient))) { %> -
- - -
- <% } %> - -
- -
<%=indexBean.getTunnelDescription(curClient)%>
-
- -
-
-
- <% - } - %> -
-
-
- - -
- -
-
-

Local Server Tunnels

-
- -
-
-
- -
- -
-
- -
-
- -
-
- -
- - <% - for (int curServer = 0; curServer < indexBean.getTunnelCount(); curServer++) { - if (indexBean.isClient(curServer)) continue; - - %> - -
- - - <% - if ("httpserver".equals(indexBean.getInternalType(curServer))) { - %> - <%=indexBean.getServerTarget(curServer)%> - <% - } else { - %><%=indexBean.getServerTarget(curServer)%> - <% - } - %> -
-
- <% - if ("httpserver".equals(indexBean.getInternalType(curServer)) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) { - %> - Preview - <% - } else if (indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) { - %>Base32 Address:
<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p
- <% - } else { - %>No Preview - <% - } - %>
-
- - <% - switch (indexBean.getTunnelStatus(curServer)) { - case IndexBean.STARTING: - %>
Starting...
- Stop - <% - break; - case IndexBean.RUNNING: - %>
Running
- Stop - <% - break; - case IndexBean.NOT_RUNNING: - %>
Stopped
- Start - <% - break; - } - %>
- -
- -
<%=indexBean.getTunnelDescription(curServer)%>
-
- -
-
-
- <% - } - %> -
-
-
- - -
- - - - - - +<%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean"%> + + + + + + I2PTunnel Webmanager - List + + + + + <% if (indexBean.allowCSS()) { + %> + + + <% } + %> + + + + +
+
+

Status Messages

+
+ +
+
+
+ + + +
+
+
+ + +
+ + + + + +
+
+ +

I2P Server Tunnels

+
+ + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ + <% + for (int curServer = 0; curServer < indexBean.getTunnelCount(); curServer++) { + if (indexBean.isClient(curServer)) continue; + + %> + +
+ + + <% + if ("httpserver".equals(indexBean.getInternalType(curServer))) { + %> + <%=indexBean.getServerTarget(curServer)%> + <% + } else { + %><%=indexBean.getServerTarget(curServer)%> + <% + } + %> +
+
+ <% + if ("httpserver".equals(indexBean.getInternalType(curServer)) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) { + %> + Preview + <% + } else if (indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) { + %>Base32 Address:
<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p
+ <% + } else { + %>No Preview + <% + } + %>
+
+ + <% + switch (indexBean.getTunnelStatus(curServer)) { + case IndexBean.STARTING: + %>
Starting...
+ Stop + <% + break; + case IndexBean.RUNNING: + %>
Running
+ Stop + <% + break; + case IndexBean.NOT_RUNNING: + %>
Stopped
+ Start + <% + break; + } + %>
+ +
+ +
<%=indexBean.getTunnelDescription(curServer)%>
+
+ +
+
+
+ <% + } + %> +
+
+
+ + +
+ + +
+
+ +

I2P Client Tunnels

+
+ + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+ <% + for (int curClient = 0; curClient < indexBean.getTunnelCount(); curClient++) { + if (!indexBean.isClient(curClient)) continue; + %> + +
+ + <%=indexBean.getClientPort(curClient)%> +
+
+ + <%=indexBean.getTunnelType(curClient)%> +
+
+ + <%=indexBean.getClientInterface(curClient)%> +
+
+ + <% + switch (indexBean.getTunnelStatus(curClient)) { + case IndexBean.STARTING: + %>
Starting...
+ Stop + <% + break; + case IndexBean.STANDBY: + %>
Standby
+ Stop + <% + break; + case IndexBean.RUNNING: + %>
Running
+ Stop + <% + break; + case IndexBean.NOT_RUNNING: + %>
Stopped
+ Start + <% + break; + } + %>
+ + <% if (!"sockstunnel".equals(indexBean.getInternalType(curClient))) { %> +
+ + +
+ <% } %> + +
+ +
<%=indexBean.getTunnelDescription(curClient)%>
+
+ +
+
+
+ <% + } + %> +
+
+
+ + +
+ + + diff --git a/apps/jetty/build.xml b/apps/jetty/build.xml index 643dd79fd..dab064c5e 100644 --- a/apps/jetty/build.xml +++ b/apps/jetty/build.xml @@ -6,6 +6,7 @@ + @@ -90,9 +91,11 @@ + classpath="./jettylib/commons-logging.jar:./jettylib/javax.servlet.jar:./jettylib/org.mortbay.jetty.jar" > + + diff --git a/apps/jetty/java/src/org/mortbay/http/HttpContext.java b/apps/jetty/java/src/org/mortbay/http/HttpContext.java new file mode 100644 index 000000000..061d3ad17 --- /dev/null +++ b/apps/jetty/java/src/org/mortbay/http/HttpContext.java @@ -0,0 +1,2198 @@ +// ======================================================================== +// $Id: HttpContext.java,v 1.136 2006/02/21 09:47:43 gregwilkins Exp $ +// Copyright 2000-2004 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ======================================================================== + +package org.mortbay.http; + +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.UnknownHostException; +import java.security.Permission; +import java.security.PermissionCollection; +import java.security.Permissions; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.apache.commons.logging.Log; +import org.mortbay.log.LogFactory; +import org.mortbay.http.ResourceCache.ResourceMetaData; +import org.mortbay.http.handler.ErrorPageHandler; +import org.mortbay.util.Container; +import org.mortbay.util.EventProvider; +import org.mortbay.util.IO; +import org.mortbay.util.LazyList; +import org.mortbay.util.LifeCycle; +import org.mortbay.util.LogSupport; +import org.mortbay.util.MultiException; +import org.mortbay.util.Resource; +import org.mortbay.util.URI; + + +/* ------------------------------------------------------------ */ +/** Context for a collection of HttpHandlers. + * HTTP Context provides an ordered container for HttpHandlers + * that share the same path prefix, filebase, resourcebase and/or + * classpath. + *

+ * A HttpContext is analagous to a ServletContext in the + * Servlet API, except that it may contain other types of handler + * other than servlets. + *

+ * A ClassLoader is created for the context and it uses + * Thread.currentThread().getContextClassLoader(); as it's parent loader. + * The class loader is initialized during start(), when a derived + * context calls initClassLoader() or on the first call to loadClass() + *

+ * + * Note. that order is important when configuring a HttpContext. + * For example, if resource serving is enabled before servlets, then resources + * take priority. + * + * @see HttpServer + * @see HttpHandler + * @see org.mortbay.jetty.servlet.ServletHttpContext + * @version $Id: HttpContext.java,v 1.136 2006/02/21 09:47:43 gregwilkins Exp $ + * @author Greg Wilkins (gregw) + */ +public class HttpContext extends Container + implements LifeCycle, + HttpHandler, + EventProvider, + Serializable +{ + private static Log log = LogFactory.getLog(HttpContext.class); + + /* ------------------------------------------------------------ */ + /** File class path attribute. + * If this name is set as a context init parameter, then the attribute + * name given will be used to set the file classpath for the context as a + * context attribute. + */ + public final static String __fileClassPathAttr= + "org.mortbay.http.HttpContext.FileClassPathAttribute"; + + public final static String __ErrorHandler= + "org.mortbay.http.ErrorHandler"; + + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + // These attributes are serialized by WebApplicationContext, which needs + // to be updated if you add to these + private String _contextPath; + private List _vhosts=new ArrayList(2); + private List _hosts=new ArrayList(2); + private List _handlers=new ArrayList(3); + private Map _attributes = new HashMap(3); + private boolean _redirectNullPath=true; + private boolean _statsOn=false; + private PermissionCollection _permissions; + private boolean _classLoaderJava2Compliant=true; + private ResourceCache _resources; + private String[] _systemClasses=new String [] {"java.","javax.servlet.","javax.xml.","org.mortbay.","org.xml.","org.w3c.","org.apache.commons.logging."}; + private String[] _serverClasses = new String[] {"-org.mortbay.http.PathMap","-org.mortbay.jetty.servlet.Invoker","-org.mortbay.jetty.servlet.JSR154Filter","-org.mortbay.jetty.servlet.Default","org.mortbay.jetty.Server","org.mortbay.http.","org.mortbay.start.","org.mortbay.stop."}; + + /* ------------------------------------------------------------ */ + private String _contextName; + private String _classPath; + private Map _initParams = new HashMap(11); + private UserRealm _userRealm; + private String _realmName; + private PathMap _constraintMap=new PathMap(); + private Authenticator _authenticator; + private RequestLog _requestLog; + + + private String[] _welcomes= + { + "welcome.html", + "index.html", + "index.htm", + "index.jsp" + }; + + + /* ------------------------------------------------------------ */ + private transient boolean _gracefulStop; + private transient ClassLoader _parent; + private transient ClassLoader _loader; + private transient HttpServer _httpServer; + private transient File _tmpDir; + private transient HttpHandler[] _handlersArray; + private transient String[] _vhostsArray; + + + /* ------------------------------------------------------------ */ + transient Object _statsLock=new Object[0]; + transient long _statsStartedAt; + transient int _requests; + transient int _requestsActive; + transient int _requestsActiveMax; + transient int _responses1xx; // Informal + transient int _responses2xx; // Success + transient int _responses3xx; // Redirection + transient int _responses4xx; // Client Error + transient int _responses5xx; // Server Error + + + /* ------------------------------------------------------------ */ + /** Constructor. + */ + public HttpContext() + { + setAttribute(__ErrorHandler, new ErrorPageHandler()); + _resources=new ResourceCache(); + addComponent(_resources); + } + + /* ------------------------------------------------------------ */ + /** Constructor. + * @param httpServer + * @param contextPathSpec + */ + public HttpContext(HttpServer httpServer,String contextPathSpec) + { + this(); + setHttpServer(httpServer); + setContextPath(contextPathSpec); + } + + /* ------------------------------------------------------------ */ + private void readObject(java.io.ObjectInputStream in) + throws IOException, ClassNotFoundException + { + in.defaultReadObject(); + _statsLock=new Object[0]; + getHandlers(); + for (int i=0;i<_handlersArray.length;i++) + _handlersArray[i].initialize(this); + } + + /* ------------------------------------------------------------ */ + /** Get the ThreadLocal HttpConnection. + * Get the HttpConnection for current thread, if any. This method is + * not static in order to control access. + * @return HttpConnection for this thread. + */ + public HttpConnection getHttpConnection() + { + return HttpConnection.getHttpConnection(); + } + + /* ------------------------------------------------------------ */ + void setHttpServer(HttpServer httpServer) + { + _httpServer=httpServer; + _contextName=null; + + } + + /* ------------------------------------------------------------ */ + public HttpServer getHttpServer() + { + return _httpServer; + } + + /* ------------------------------------------------------------ */ + public void setStopGracefully(boolean graceful) + { + _gracefulStop=graceful; + } + + /* ------------------------------------------------------------ */ + public boolean getStopGracefully() + { + return _gracefulStop; + } + + + /* ------------------------------------------------------------ */ + public static String canonicalContextPathSpec(String contextPathSpec) + { + // check context path + if (contextPathSpec==null || + contextPathSpec.indexOf(',')>=0 || + contextPathSpec.startsWith("*")) + throw new IllegalArgumentException ("Illegal context spec:"+contextPathSpec); + + if(!contextPathSpec.startsWith("/")) + contextPathSpec='/'+contextPathSpec; + + if (contextPathSpec.length()>1) + { + if (contextPathSpec.endsWith("/")) + contextPathSpec+="*"; + else if (!contextPathSpec.endsWith("/*")) + contextPathSpec+="/*"; + } + + return contextPathSpec; + } + + /* ------------------------------------------------------------ */ + public void setContextPath(String contextPathSpec) + { + if (_httpServer!=null) + _httpServer.removeMappings(this); + + contextPathSpec=canonicalContextPathSpec(contextPathSpec); + + if (contextPathSpec.length()>1) + _contextPath=contextPathSpec.substring(0,contextPathSpec.length()-2); + else + _contextPath="/"; + + _contextName=null; + + if (_httpServer!=null) + _httpServer.addMappings(this); + } + + + /* ------------------------------------------------------------ */ + /** + * @return The context prefix + */ + public String getContextPath() + { + return _contextPath; + } + + + /* ------------------------------------------------------------ */ + /** Add a virtual host alias to this context. + * @see #setVirtualHosts + * @param hostname A hostname. A null host name means any hostname is + * acceptable. Host names may String representation of IP addresses. + */ + public void addVirtualHost(String hostname) + { + // Note that null hosts are also added. + if (!_vhosts.contains(hostname)) + { + _vhosts.add(hostname); + _contextName=null; + + if (_httpServer!=null) + { + if (_vhosts.size()==1) + _httpServer.removeMapping(null,this); + _httpServer.addMapping(hostname,this); + } + _vhostsArray=null; + } + } + + /* ------------------------------------------------------------ */ + /** remove a virtual host alias to this context. + * @see #setVirtualHosts + * @param hostname A hostname. A null host name means any hostname is + * acceptable. Host names may String representation of IP addresses. + */ + public void removeVirtualHost(String hostname) + { + // Note that null hosts are also added. + if (_vhosts.remove(hostname)) + { + _contextName=null; + if (_httpServer!=null) + { + _httpServer.removeMapping(hostname,this); + if (_vhosts.size()==0) + _httpServer.addMapping(null,this); + } + _vhostsArray=null; + } + } + + /* ------------------------------------------------------------ */ + /** Set the virtual hosts for the context. + * Only requests that have a matching host header or fully qualified + * URL will be passed to that context with a virtual host name. + * A context with no virtual host names or a null virtual host name is + * available to all requests that are not served by a context with a + * matching virtual host name. + * @param hosts Array of virtual hosts that this context responds to. A + * null host name or null/empty array means any hostname is acceptable. + * Host names may String representation of IP addresses. + */ + public void setVirtualHosts(String[] hosts) + { + List old = new ArrayList(_vhosts); + + if (hosts!=null) + { + for (int i=0;i 0) + { + Object constraints= null; + + // for each path match + // Add only constraints that have the correct method + // break if the matching pattern changes. This allows only + // constraints with matching pattern and method to be combined. + loop: + for (int m= 0; m < scss.size(); m++) + { + Map.Entry entry= (Map.Entry)scss.get(m); + Object scs= entry.getValue(); + String p=(String)entry.getKey(); + for (int c=0;c0) + { + Object o = request.getHttpConnection().getConnection(); + if (o instanceof Socket) + { + Socket s=(Socket)o; + if (!_hosts.contains(s.getLocalAddress())) + { + if(log.isDebugEnabled())log.debug(s.getLocalAddress()+" not in "+_hosts); + return; + } + } + } + + // handle stats + if (_statsOn) + { + synchronized(_statsLock) + { + _requests++; + _requestsActive++; + if (_requestsActive>_requestsActiveMax) + _requestsActiveMax=_requestsActive; + } + } + + String pathInContext = URI.canonicalPath(request.getPath()); + if (pathInContext==null) + { + // Must be a bad request. + throw new HttpException(HttpResponse.__400_Bad_Request); + } + + if (_contextPath.length()>1) + pathInContext=pathInContext.substring(_contextPath.length()); + + if (_redirectNullPath && (pathInContext==null || + pathInContext.length()==0)) + { + StringBuffer buf=request.getRequestURL(); + buf.append("/"); + String q=request.getQuery(); + if (q!=null&&q.length()!=0) + buf.append("?"+q); + + response.sendRedirect(buf.toString()); + if (log.isDebugEnabled()) + log.debug(this+" consumed all of path "+ + request.getPath()+ + ", redirect to "+buf.toString()); + return; + } + + String pathParams=null; + int semi = pathInContext.lastIndexOf(';'); + if (semi>=0) + { + int pl = pathInContext.length()-semi; + String ep=request.getEncodedPath(); + if(';'==ep.charAt(ep.length()-pl)) + { + pathParams=pathInContext.substring(semi+1); + pathInContext=pathInContext.substring(0,semi); + } + } + + try + { + handle(pathInContext,pathParams,request,response); + } + finally + { + if (_userRealm!=null && request.hasUserPrincipal()) + _userRealm.disassociate(request.getUserPrincipal()); + } + } + + /* ------------------------------------------------------------ */ + /** Handler request. + * Call each HttpHandler until request is handled. + * @param pathInContext Path in context + * @param pathParams Path parameters such as encoded Session ID + * @param request + * @param response + * @return True if the request has been handled. + * @exception HttpException + * @exception IOException + */ + public void handle(String pathInContext, + String pathParams, + HttpRequest request, + HttpResponse response) + throws HttpException, IOException + { + Object old_scope= null; + try + { + old_scope= enterContextScope(request,response); + HttpHandler[] handlers= getHandlers(); + for (int k= 0; k < handlers.length; k++) + { + HttpHandler handler= handlers[k]; + if (handler == null) + { + handlers= getHandlers(); + k= -1; + continue; + } + if (!handler.isStarted()) + { + if (log.isDebugEnabled()) + log.debug(handler + " not started in " + this); + continue; + } + if (log.isDebugEnabled()) + log.debug("Handler " + handler); + handler.handle(pathInContext, pathParams, request, response); + if (request.isHandled()) + { + if (log.isDebugEnabled()) + log.debug("Handled by " + handler); + return; + } + } + return; + } + finally + { + leaveContextScope(request, response, old_scope); + } + } + + /* ------------------------------------------------------------ */ + /** Enter the context scope. + * This method is called (by handle or servlet dispatchers) to indicate that + * request handling is entering the scope of this context. The opaque scope object + * returned, should be passed to the leaveContextScope method. + */ + public Object enterContextScope(HttpRequest request, HttpResponse response) + { + // Save the thread context loader + Thread thread = Thread.currentThread(); + ClassLoader cl=thread.getContextClassLoader(); + HttpContext c=response.getHttpContext(); + + Scope scope=null; + if (cl!=HttpContext.class.getClassLoader() || c!=null) + { + scope=new Scope(); + scope._classLoader=cl; + scope._httpContext=c; + } + + if (_loader!=null) + thread.setContextClassLoader(_loader); + response.setHttpContext(this); + + return scope; + } + + /* ------------------------------------------------------------ */ + /** Leave the context scope. + * This method is called (by handle or servlet dispatchers) to indicate that + * request handling is leaveing the scope of this context. The opaque scope object + * returned by enterContextScope should be passed in. + */ + public void leaveContextScope(HttpRequest request, HttpResponse response,Object oldScope) + { + if (oldScope==null) + { + Thread.currentThread() + .setContextClassLoader(HttpContext.class.getClassLoader()); + response.setHttpContext(null); + } + else + { + Scope old = (Scope)oldScope; + Thread.currentThread().setContextClassLoader(old._classLoader); + response.setHttpContext(old._httpContext); + } + } + + + /* ------------------------------------------------------------ */ + public String getHttpContextName() + { + if (_contextName==null) + _contextName = (_vhosts.size()>1?(_vhosts.toString()+":"):"")+_contextPath; + return _contextName; + } + + /* ------------------------------------------------------------ */ + public void setHttpContextName(String s) + { + _contextName=s; + } + + /* ------------------------------------------------------------ */ + public String toString() + { + return "HttpContext["+getContextPath()+","+getHttpContextName()+"]"; + } + + /* ------------------------------------------------------------ */ + public String toString(boolean detail) + { + return "HttpContext["+getContextPath()+","+getHttpContextName()+"]" + + (detail?("="+_handlers):""); + } + + + /* ------------------------------------------------------------ */ + protected synchronized void doStart() + throws Exception + { + if (isStarted()) + return; + + if (_httpServer.getServerClasses()!=null) + _serverClasses=_httpServer.getServerClasses(); + if (_httpServer.getSystemClasses()!=null) + _systemClasses=_httpServer.getSystemClasses(); + + _resources.start(); + + statsReset(); + + if (_httpServer==null) + throw new IllegalStateException("No server for "+this); + + // start the context itself + _resources.getMimeMap(); + _resources.getEncodingMap(); + + // Setup realm + if (_userRealm==null && _authenticator!=null) + { + _userRealm=_httpServer.getRealm(_realmName); + if (_userRealm==null) + log.warn("No Realm: "+_realmName); + } + + // setup the context loader + initClassLoader(false); + + // Set attribute if needed + String attr = getInitParameter(__fileClassPathAttr); + if (attr!=null && attr.length()>0) + setAttribute(attr,getFileClassPath()); + + // Start the handlers + Thread thread = Thread.currentThread(); + ClassLoader lastContextLoader=thread.getContextClassLoader(); + try + { + if (_loader!=null) + thread.setContextClassLoader(_loader); + + if (_requestLog!=null) + _requestLog.start(); + + startHandlers(); + } + finally + { + thread.setContextClassLoader(lastContextLoader); + getHandlers(); + } + + } + + /* ------------------------------------------------------------ */ + /** Start the handlers. + * This is called by start after the classloader has been + * initialized and set as the thread context loader. + * It may be specialized to provide custom handling + * before any handlers are started. + * @exception Exception + */ + protected void startHandlers() + throws Exception + { + // Prepare a multi exception + MultiException mx = new MultiException(); + + Iterator handlers = _handlers.iterator(); + while(handlers.hasNext()) + { + HttpHandler handler=(HttpHandler)handlers.next(); + if (!handler.isStarted()) + try{handler.start();}catch(Exception e){mx.add(e);} + } + mx.ifExceptionThrow(); + } + + /* ------------------------------------------------------------ */ + /** Stop the context. + * @param graceful If true and statistics are on, then this method will wait + * for requestsActive to go to zero before calling stop() + */ + public void stop(boolean graceful) + throws InterruptedException + { + boolean gs=_gracefulStop; + try + { + _gracefulStop=true; + + // wait for all requests to complete. + while (graceful && _statsOn && _requestsActive>0 && _httpServer!=null) + try {Thread.sleep(100);} + catch (InterruptedException e){throw e;} + catch (Exception e){LogSupport.ignore(log,e);} + + stop(); + } + finally + { + _gracefulStop=gs; + } + } + + /* ------------------------------------------------------------ */ + /** Stop the context. + */ + protected void doStop() + throws Exception + { + if (_httpServer==null) + throw new InterruptedException("Destroy called"); + + synchronized(this) + { + // Notify the container for the stop + Thread thread = Thread.currentThread(); + ClassLoader lastContextLoader=thread.getContextClassLoader(); + try + { + if (_loader!=null) + thread.setContextClassLoader(_loader); + Iterator handlers = _handlers.iterator(); + while(handlers.hasNext()) + { + HttpHandler handler=(HttpHandler)handlers.next(); + if (handler.isStarted()) + { + try{handler.stop();} + catch(Exception e){log.warn(LogSupport.EXCEPTION,e);} + } + } + + if (_requestLog!=null) + _requestLog.stop(); + } + finally + { + thread.setContextClassLoader(lastContextLoader); + } + + // TODO this is a poor test + if (_loader instanceof ContextLoader) + { + ((ContextLoader)_loader).destroy(); + LogFactory.release(_loader); + } + + _loader=null; + } + _resources.flushCache(); + _resources.stop(); + } + + + /* ------------------------------------------------------------ */ + /** Destroy a context. + * Destroy a context and remove it from the HttpServer. The + * HttpContext must be stopped before it can be destroyed. + */ + public void destroy() + { + if (isStarted()) + throw new IllegalStateException("Started"); + + if (_httpServer!=null) + _httpServer.removeContext(this); + + _httpServer=null; + + if (_handlers!=null) + _handlers.clear(); + + _handlers=null; + _parent=null; + _loader=null; + if (_attributes!=null) + _attributes.clear(); + _attributes=null; + if (_initParams!=null) + _initParams.clear(); + _initParams=null; + if (_vhosts!=null) + _vhosts.clear(); + _vhosts=null; + _hosts=null; + _tmpDir=null; + + _permissions=null; + + removeComponent(_resources); + if (_resources!=null) + { + _resources.flushCache(); + if (_resources.isStarted()) + try{_resources.stop();}catch(Exception e){LogSupport.ignore(log,e);} + _resources.destroy(); + } + _resources=null; + + super.destroy(); + + } + + + /* ------------------------------------------------------------ */ + /** Set the request log. + * @param log RequestLog to use. + */ + public void setRequestLog(RequestLog log) + { + _requestLog=log; + } + + /* ------------------------------------------------------------ */ + public RequestLog getRequestLog() + { + return _requestLog; + } + + + /* ------------------------------------------------------------ */ + /** Send an error response. + * This method may be specialized to provide alternative error handling for + * errors generated by the container. The default implemenation calls HttpResponse.sendError + * @param response the response to send + * @param code The error code + * @param msg The message for the error or null for the default + * @throws IOException Problem sending response. + */ + public void sendError(HttpResponse response,int code,String msg) + throws IOException + { + response.sendError(code,msg); + } + + /* ------------------------------------------------------------ */ + /** Send an error response. + * This method obtains the responses context and call sendError for context specific + * error handling. + * @param response the response to send + * @param code The error code + * @param msg The message for the error or null for the default + * @throws IOException Problem sending response. + */ + public static void sendContextError(HttpResponse response,int code,String msg) + throws IOException + { + HttpContext context = response.getHttpContext(); + if (context!=null) + context.sendError(response,code,msg); + else + response.sendError(code,msg); + } + + /* ------------------------------------------------------------ */ + /** True set statistics recording on for this context. + * @param on If true, statistics will be recorded for this context. + */ + public void setStatsOn(boolean on) + { + log.info("setStatsOn "+on+" for "+this); + _statsOn=on; + statsReset(); + } + + /* ------------------------------------------------------------ */ + public boolean getStatsOn() {return _statsOn;} + + /* ------------------------------------------------------------ */ + public long getStatsOnMs() + {return _statsOn?(System.currentTimeMillis()-_statsStartedAt):0;} + + /* ------------------------------------------------------------ */ + public void statsReset() + { + synchronized(_statsLock) + { + if (_statsOn) + _statsStartedAt=System.currentTimeMillis(); + _requests=0; + _requestsActiveMax=_requestsActive; + _responses1xx=0; + _responses2xx=0; + _responses3xx=0; + _responses4xx=0; + _responses5xx=0; + } + } + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of requests handled by this context + * since last call of statsReset(). If setStatsOn(false) then this + * is undefined. + */ + public int getRequests() {return _requests;} + + /* ------------------------------------------------------------ */ + /** + * @return Number of requests currently active. + * Undefined if setStatsOn(false). + */ + public int getRequestsActive() {return _requestsActive;} + + /* ------------------------------------------------------------ */ + /** + * @return Maximum number of active requests + * since statsReset() called. Undefined if setStatsOn(false). + */ + public int getRequestsActiveMax() {return _requestsActiveMax;} + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of responses with a 2xx status returned + * by this context since last call of statsReset(). Undefined if + * if setStatsOn(false). + */ + public int getResponses1xx() {return _responses1xx;} + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of responses with a 100 status returned + * by this context since last call of statsReset(). Undefined if + * if setStatsOn(false). + */ + public int getResponses2xx() {return _responses2xx;} + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of responses with a 3xx status returned + * by this context since last call of statsReset(). Undefined if + * if setStatsOn(false). + */ + public int getResponses3xx() {return _responses3xx;} + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of responses with a 4xx status returned + * by this context since last call of statsReset(). Undefined if + * if setStatsOn(false). + */ + public int getResponses4xx() {return _responses4xx;} + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of responses with a 5xx status returned + * by this context since last call of statsReset(). Undefined if + * if setStatsOn(false). + */ + public int getResponses5xx() {return _responses5xx;} + + + /* ------------------------------------------------------------ */ + /** Log a request and response. + * Statistics are also collected by this method. + * @param request + * @param response + */ + public void log(HttpRequest request, + HttpResponse response, + int length) + { + if (_statsOn) + { + synchronized(_statsLock) + { + if (--_requestsActive<0) + _requestsActive=0; + + if (response!=null) + { + switch(response.getStatus()/100) + { + case 1: _responses1xx++;break; + case 2: _responses2xx++;break; + case 3: _responses3xx++;break; + case 4: _responses4xx++;break; + case 5: _responses5xx++;break; + } + } + } + } + + if (_requestLog!=null && + request!=null && + response!=null) + _requestLog.log(request,response,length); + else if (_httpServer!=null) + _httpServer.log(request,response,length); + } + + + + /* ------------------------------------------------------------ */ + /* Class to save scope of nested context calls + */ + private static class Scope + { + ClassLoader _classLoader; + HttpContext _httpContext; + } + + /* + * @see org.mortbay.http.HttpHandler#getName() + */ + public String getName() + { + return this.getContextPath(); + } + + /* + * @see org.mortbay.http.HttpHandler#getHttpContext() + */ + public HttpContext getHttpContext() + { + return this; + } + + /* + * @see org.mortbay.http.HttpHandler#initialize(org.mortbay.http.HttpContext) + */ + public void initialize(HttpContext context) + { + throw new UnsupportedOperationException(); + } + + + /** + * @return + */ + public Resource getBaseResource() + { + return _resources.getBaseResource(); + } + /** + * @param type + * @return + */ + public String getEncodingByMimeType(String type) + { + return _resources.getEncodingByMimeType(type); + } + /** + * @return + */ + public Map getEncodingMap() + { + return _resources.getEncodingMap(); + } + /** + * @return + */ + public int getMaxCachedFileSize() + { + return _resources.getMaxCachedFileSize(); + } + /** + * @return + */ + public int getMaxCacheSize() + { + return _resources.getMaxCacheSize(); + } + /** + * @param filename + * @return + */ + public String getMimeByExtension(String filename) + { + return _resources.getMimeByExtension(filename); + } + /** + * @return + */ + public Map getMimeMap() + { + return _resources.getMimeMap(); + } + /** + * @param pathInContext + * @return + * @throws IOException + */ + public Resource getResource(String pathInContext) throws IOException + { + return _resources.getResource(pathInContext); + } + /** + * @return + */ + public String getResourceBase() + { + return _resources.getResourceBase(); + } + /** + * @param resource + * @return + */ + public ResourceMetaData getResourceMetaData(Resource resource) + { + return _resources.getResourceMetaData(resource); + } + /** + * @param base + */ + public void setBaseResource(Resource base) + { + _resources.setBaseResource(base); + } + /** + * @param encodingMap + */ + public void setEncodingMap(Map encodingMap) + { + _resources.setEncodingMap(encodingMap); + } + /** + * @param maxCachedFileSize + */ + public void setMaxCachedFileSize(int maxCachedFileSize) + { + _resources.setMaxCachedFileSize(maxCachedFileSize); + } + /** + * @param maxCacheSize + */ + public void setMaxCacheSize(int maxCacheSize) + { + _resources.setMaxCacheSize(maxCacheSize); + } + /** + * @param mimeMap + */ + public void setMimeMap(Map mimeMap) + { + _resources.setMimeMap(mimeMap); + } + /** + * @param extension + * @param type + */ + public void setMimeMapping(String extension, String type) + { + _resources.setMimeMapping(extension, type); + } + /** + * @param resourceBase + */ + public void setResourceBase(String resourceBase) + { + _resources.setResourceBase(resourceBase); + } + /** + * @param mimeType + * @param encoding + */ + public void setTypeEncoding(String mimeType, String encoding) + { + _resources.setTypeEncoding(mimeType, encoding); + } +} diff --git a/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java b/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java index 4c96e49f2..c83756332 100644 --- a/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java +++ b/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java @@ -88,7 +88,7 @@ public class I2PRequestLog extends NCSARequestLog if (_fileOut==null) return; - StringBuffer buf = new StringBuffer(160); + StringBuilder buf = new StringBuilder(160); String addr = request.getField("X-I2P-DestHash"); if(addr != null) diff --git a/apps/jetty/java/src/org/mortbay/util/InetAddrPort.java b/apps/jetty/java/src/org/mortbay/util/InetAddrPort.java new file mode 100644 index 000000000..7f0968798 --- /dev/null +++ b/apps/jetty/java/src/org/mortbay/util/InetAddrPort.java @@ -0,0 +1,253 @@ +// ======================================================================== +// $Id: InetAddrPort.java,v 1.7 2004/10/23 09:03:22 gregwilkins Exp $ +// Copyright 1996-2004 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ======================================================================== + +package org.mortbay.util; + +import java.io.Serializable; +import java.net.InetAddress; + +/* ======================================================================== */ +/** InetAddress and Port. + */ +public class InetAddrPort implements Serializable +{ + /* ------------------------------------------------------------ */ + public final static String __0_0_0_0 = "0.0.0.0"; + + /* ------------------------------------------------------------ */ + private InetAddress _addr=null; + private boolean _addrIsHost=false; + private int _port=0; + + /* ------------------------------------------------------------------- */ + public InetAddrPort() + {} + + /* ------------------------------------------------------------ */ + /** Constructor for a port on all local host address. + * @param port + */ + public InetAddrPort(int port) + { + _port=port; + } + + /* ------------------------------------------------------------ */ + /** Constructor. + * @param addr + * @param port + */ + public InetAddrPort(InetAddress addr, int port) + { + _addr=addr; + _port=port; + } + + /* ------------------------------------------------------------ */ + /** Constructor. + * @param host + * @param port + */ + public InetAddrPort(String host, int port) + throws java.net.UnknownHostException + { + setHost(host); + setPort(port); + } + + /* ------------------------------------------------------------ */ + /** Constructor. + * Patched to support [::1]:port for I2P + * + * @param inetAddrPort String of the form "addr:port" + */ + public InetAddrPort(String inetAddrPort) + throws java.net.UnknownHostException + { + int b = inetAddrPort.indexOf('['); + if (b>0) + throw new java.net.UnknownHostException("Bad [] syntax"); + if (b==0) // IPV6 + { + int b2 = inetAddrPort.indexOf(']'); + if (b2<2) + throw new java.net.UnknownHostException("Bad [] syntax"); + String addr=inetAddrPort.substring(1,b2); + if (addr.indexOf('/')>0) + addr=addr.substring(addr.indexOf('/')+1); + inetAddrPort=inetAddrPort.substring(b2+1); + int c = inetAddrPort.indexOf(':'); + if (c>0) + throw new java.net.UnknownHostException("Bad [] syntax"); + if (c==0) + inetAddrPort=inetAddrPort.substring(1); + + if (addr.length()>0 && ! __0_0_0_0.equals(addr)) + { + _addrIsHost=!Character.isDigit((addr.charAt(0))); + this._addr=InetAddress.getByName(addr); + } + } else { // IPV4 + int c = inetAddrPort.indexOf(':'); + if (c>=0) + { + String addr=inetAddrPort.substring(0,c); + if (addr.indexOf('/')>0) + addr=addr.substring(addr.indexOf('/')+1); + inetAddrPort=inetAddrPort.substring(c+1); + + if (addr.length()>0 && ! __0_0_0_0.equals(addr)) + { + _addrIsHost=!Character.isDigit((addr.charAt(0))); + this._addr=InetAddress.getByName(addr); + } + } + } + + _port = Integer.parseInt(inetAddrPort); + } + + /* ------------------------------------------------------------ */ + /** Constructor. + * @param address InetAddrPort top copy. + */ + public InetAddrPort(InetAddrPort address) + { + if (address!=null) + { + _addr=address._addr; + _port=address._port; + } + } + + /* ------------------------------------------------------------ */ + /** Get the Host. + * @return The IP address + */ + public String getHost() + { + if (_addr==null) + return __0_0_0_0; + + return _addrIsHost?_addr.getHostName():_addr.getHostAddress(); + } + + /* ------------------------------------------------------------ */ + /** Set the Host. + * @param host + * @exception java.net.UnknownHostException + */ + public void setHost(String host) + throws java.net.UnknownHostException + { + _addr=null; + if (host!=null) + { + if (host.indexOf('/')>0) + host=host.substring(0,host.indexOf('/')); + _addrIsHost=!Character.isDigit((host.charAt(0))); + _addr=InetAddress.getByName(host); + } + } + + /* ------------------------------------------------------------ */ + /** Get the IP address. + * @return The IP address + */ + public InetAddress getInetAddress() + { + return _addr; + } + + /* ------------------------------------------------------------ */ + /** Set the IP address. + * @param addr The IP address + */ + public void setInetAddress(InetAddress addr) + { + _addrIsHost=false; + _addr=addr; + } + + /* ------------------------------------------------------------ */ + /** Get the port. + * @return The port number + */ + public int getPort() + { + return _port; + } + + /* ------------------------------------------------------------ */ + /** Set the port. + * @param port The port number + */ + public void setPort(int port) + { + _port=port; + } + + + /* ------------------------------------------------------------------- */ + public String toString() + { + return getHost()+':'+_port; + } + + /* ------------------------------------------------------------ */ + /** Clone the InetAddrPort. + * @return A new instance. + */ + public Object clone() + { + return new InetAddrPort(this); + } + + /* ------------------------------------------------------------ */ + /** Hash Code. + * @return hash Code. + */ + public int hashCode() + { + return _port+((_addr==null)?0:_addr.hashCode()); + } + + /* ------------------------------------------------------------ */ + /** Equals. + * @param o + * @return True if is the same address and port. + */ + public boolean equals(Object o) + { + if (o==null) + return false; + if (o==this) + return true; + if (o instanceof InetAddrPort) + { + InetAddrPort addr=(InetAddrPort)o; + return addr._port==_port && + ( addr._addr==_addr || + addr._addr!=null && addr._addr.equals(_addr)); + } + return false; + } +} + + + + + + diff --git a/apps/ministreaming/java/build.xml b/apps/ministreaming/java/build.xml index 48920deef..1f83b640d 100644 --- a/apps/ministreaming/java/build.xml +++ b/apps/ministreaming/java/build.xml @@ -19,10 +19,13 @@ + - + + + diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PServerSocketImpl.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PServerSocketImpl.java index 93db8595b..41d49af03 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PServerSocketImpl.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PServerSocketImpl.java @@ -20,15 +20,15 @@ class I2PServerSocketImpl implements I2PServerSocket { private final static Log _log = new Log(I2PServerSocketImpl.class); private I2PSocketManager mgr; /** list of sockets waiting for the client to accept them */ - private List pendingSockets = Collections.synchronizedList(new ArrayList(4)); + private final List pendingSockets = Collections.synchronizedList(new ArrayList(4)); /** have we been closed */ private volatile boolean closing = false; /** lock on this when accepting a pending socket, and wait on it for notification of acceptance */ - private Object socketAcceptedLock = new Object(); + private final Object socketAcceptedLock = new Object(); /** lock on this when adding a new socket to the pending list, and wait on it accordingly */ - private Object socketAddedLock = new Object(); + private final Object socketAddedLock = new Object(); /** * Set Sock Option accept timeout stub, does nothing in ministreaming diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java index 33477a4a8..0370ab16b 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java @@ -196,7 +196,7 @@ public class I2PSocketManagerFactory { } private static String getHost() { - return System.getProperty(I2PClient.PROP_TCP_HOST, "localhost"); + return System.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1"); } private static int getPort() { int i2cpPort = 7654; diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java index 406f71847..7015f0a9d 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java @@ -40,15 +40,15 @@ import net.i2p.util.Log; class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener { private I2PAppContext _context; private Log _log; - private I2PSession _session; + private /* final */ I2PSession _session; private I2PServerSocketImpl _serverSocket = null; - private Object lock = new Object(); // for locking socket lists - private HashMap _outSockets; - private HashMap _inSockets; + private final Object lock = new Object(); // for locking socket lists + private HashMap _outSockets; + private HashMap _inSockets; private I2PSocketOptions _defaultOptions; private long _acceptTimeout; private String _name; - private List _listeners; + private final List _listeners = new ArrayList(1);; private static int __managerId = 0; public static final short ACK = 0x51; @@ -76,10 +76,10 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener { _name = name; _context = context; _log = _context.logManager().getLog(I2PSocketManager.class); - _inSockets = new HashMap(16); - _outSockets = new HashMap(16); + _inSockets = new HashMap(16); + _outSockets = new HashMap(16); _acceptTimeout = ACCEPT_TIMEOUT_DEFAULT; - _listeners = new ArrayList(1); + // _listeners = new ArrayList(1); setSession(session); setDefaultOptions(buildOptions(opts)); _context.statManager().createRateStat("streaming.lifetime", "How long before the socket is closed?", "streaming", new long[] { 10*60*1000, 60*60*1000, 24*60*60*1000 }); @@ -113,9 +113,9 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener { public void disconnected(I2PSession session) { _log.info(getName() + ": Disconnected from the session"); destroySocketManager(); - List listeners = null; + List listeners = null; synchronized (_listeners) { - listeners = new ArrayList(_listeners); + listeners = new ArrayList(_listeners); _listeners.clear(); } for (int i = 0; i < listeners.size(); i++) { @@ -660,7 +660,7 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener { * */ public Set listSockets() { - Set sockets = new HashSet(8); + Set sockets = new HashSet(8); synchronized (lock) { sockets.addAll(_inSockets.values()); sockets.addAll(_outSockets.values()); diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java index eb58b6871..4ecf34d6a 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java @@ -6,7 +6,7 @@ import java.util.Properties; * Define the configuration for streaming and verifying data on the socket. * */ -class I2PSocketOptionsImpl implements I2PSocketOptions { +public class I2PSocketOptionsImpl implements I2PSocketOptions { private long _connectTimeout; private long _readTimeout; private long _writeTimeout; @@ -53,7 +53,7 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { _writeTimeout = getInt(opts, PROP_WRITE_TIMEOUT, DEFAULT_WRITE_TIMEOUT); } - protected int getInt(Properties opts, String name, int defaultVal) { + protected static int getInt(Properties opts, String name, int defaultVal) { if (opts == null) return defaultVal; String val = opts.getProperty(name); if (val == null) { diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/TestSwarm.java b/apps/ministreaming/java/test/net/i2p/client/streaming/TestSwarm.java similarity index 100% rename from apps/ministreaming/java/src/net/i2p/client/streaming/TestSwarm.java rename to apps/ministreaming/java/test/net/i2p/client/streaming/TestSwarm.java diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml index 00168963b..f77a14387 100644 --- a/apps/routerconsole/java/build.xml +++ b/apps/routerconsole/java/build.xml @@ -40,6 +40,7 @@ + @@ -47,6 +48,7 @@ srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" destdir="./build/obj"> + @@ -73,8 +75,9 @@ + + basedir="../jsp/" excludes="web.xml, *.css, *.java, *.jsp, web-fragment.xml"> @@ -84,7 +87,7 @@ - + @@ -114,11 +117,13 @@ + + @@ -140,7 +145,7 @@ - + diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java new file mode 100644 index 000000000..a2f3341f9 --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java @@ -0,0 +1,25 @@ +package net.i2p.router.web; + +/** + * Copied and modded from I2PTunnel IndexBean (GPL) + * @author zzz + */ +public class CSSHelper extends HelperBase { + public CSSHelper() {} + + public static final String PROP_THEME_NAME = "routerconsole.theme"; + public static final String DEFAULT_THEME = "light"; + private static final String BASE = "/themes/console/"; + private static final String FORCE = "classic"; + + public String getTheme(String userAgent) { + String url = BASE; + if (userAgent != null && userAgent.contains("MSIE")) { + url += FORCE + "/"; + } else { + String theme = _context.getProperty(PROP_THEME_NAME, DEFAULT_THEME); + url += theme + "/"; + } + return url; + } +} diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java index 3ab6354a6..5bffa2a21 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java @@ -10,7 +10,7 @@ public class ConfigAdvancedHelper extends HelperBase { public ConfigAdvancedHelper() {} public String getSettings() { - StringBuffer buf = new StringBuffer(4*1024); + StringBuilder buf = new StringBuilder(4*1024); Set names = _context.router().getConfigSettings(); TreeSet sortedNames = new TreeSet(names); for (Iterator iter = sortedNames.iterator(); iter.hasNext(); ) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java index 7af6125d6..285cdd385 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java @@ -1,5 +1,6 @@ package net.i2p.router.web; +import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; @@ -41,8 +42,20 @@ public class ConfigClientsHandler extends FormHandler { startClient(appnum); else startWebApp(app); + } else if (_action.toLowerCase().startsWith("start ") && + _action.toLowerCase().endsWith("")) { + // IE sucks + String app = _action.substring(23, _action.length() - 7); + int appnum = -1; + try { + appnum = Integer.parseInt(app); + } catch (NumberFormatException nfe) {} + if (appnum >= 0) + startClient(appnum); + else + startWebApp(app); } else { - addFormError("Unsupported " + _action); + addFormError("Unsupported " + _action + "."); } } @@ -57,18 +70,18 @@ public class ConfigClientsHandler extends FormHandler { ca.disabled = val == null; } ClientAppConfig.writeClientAppConfig(_context, clients); - addFormNotice("Client configuration saved successfully - restart required to take effect"); + addFormNotice("Client configuration saved successfully - restart required to take effect."); } private void startClient(int i) { List clients = ClientAppConfig.getClientApps(_context); if (i >= clients.size()) { - addFormError("Bad client index"); + addFormError("Bad client index."); return; } ClientAppConfig ca = (ClientAppConfig) clients.get(i); LoadClientAppsJob.runClient(ca.className, ca.clientName, LoadClientAppsJob.parseArgs(ca.args), _log); - addFormNotice("Client " + ca.clientName + " started"); + addFormNotice("Client " + ca.clientName + " started."); } private void saveWebAppChanges() { @@ -85,7 +98,7 @@ public class ConfigClientsHandler extends FormHandler { props.setProperty(name, "" + (val != null)); } RouterConsoleRunner.storeWebAppProperties(props); - addFormNotice("WebApp configuration saved successfully - restart required to take effect"); + addFormNotice("WebApp configuration saved successfully - restart required to take effect."); } // Big hack for the moment, not using properties for directory and port @@ -99,16 +112,18 @@ public class ConfigClientsHandler extends FormHandler { for (int j = 0; j < hl.length; j++) { if (hl[j].getPort() == 7657) { try { - s.addWebApplication("/"+ app, "./webapps/" + app + ".war").start(); + File path = new File(_context.getBaseDir(), "webapps"); + path = new File(path, app + ".war"); + s.addWebApplication("/"+ app, path.getAbsolutePath()).start(); // no passwords... initialize(wac); - addFormNotice("WebApp " + app + " started"); + addFormNotice("WebApp " + app + " started."); } catch (Exception ioe) { - addFormError("Failed to start " + app + " " + ioe); + addFormError("Failed to start " + app + " " + ioe + "."); } return; } } } - addFormError("Failed to find server"); + addFormError("Failed to find server."); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java index 2bee43533..47b301d28 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -13,9 +13,9 @@ public class ConfigClientsHelper extends HelperBase { public ConfigClientsHelper() {} public String getForm1() { - StringBuffer buf = new StringBuffer(1024); - buf.append("\n"); - buf.append("\n"); + StringBuilder buf = new StringBuilder(1024); + buf.append("
ClientRun at Startup?Start NowClass and arguments
\n"); + buf.append("\n"); List clients = ClientAppConfig.getClientApps(_context); for (int cur = 0; cur < clients.size(); cur++) { @@ -29,9 +29,9 @@ public class ConfigClientsHelper extends HelperBase { } public String getForm2() { - StringBuffer buf = new StringBuffer(1024); - buf.append("
ClientRun at Startup?Start NowClass and arguments
\n"); - buf.append("\n"); + StringBuilder buf = new StringBuilder(1024); + buf.append("
WebAppRun at Startup?Start NowDescription
\n"); + buf.append("\n"); Properties props = RouterConsoleRunner.webAppProperties(); Set keys = new TreeSet(props.keySet()); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { @@ -46,8 +46,8 @@ public class ConfigClientsHelper extends HelperBase { return buf.toString(); } - private void renderForm(StringBuffer buf, String index, String name, boolean urlify, boolean enabled, boolean ro, String desc) { - buf.append("\n"); + buf.append("\n"); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java index 09f0905bf..b43bc4d1f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java @@ -2,9 +2,9 @@ package net.i2p.router.web; import net.i2p.I2PAppContext; import net.i2p.data.DataFormatException; -import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.SessionKey; +import net.i2p.util.ConvertToHash; /** * Support additions via B64 Destkey, B64 Desthash, or blahblah.i2p @@ -19,27 +19,12 @@ public class ConfigKeyringHandler extends FormHandler { addFormError("You must enter a destination and a key"); return; } - Hash h = new Hash(); - try { - h.fromBase64(_peer); - } catch (DataFormatException dfe) {} - if (h.getData() == null) { - try { - Destination d = new Destination(); - d.fromBase64(_peer); - h = d.calculateHash(); - } catch (DataFormatException dfe) {} - } - if (h.getData() == null) { - Destination d = _context.namingService().lookup(_peer); - if (d != null) - h = d.calculateHash(); - } + Hash h = ConvertToHash.getHash(_peer); SessionKey sk = new SessionKey(); try { sk.fromBase64(_key); } catch (DataFormatException dfe) {} - if (h.getData() != null && sk.getData() != null) { + if (h != null && h.getData() != null && sk.getData() != null) { _context.keyRing().put(h, sk); addFormNotice("Key for " + h.toBase64() + " added to keyring"); } else { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java index 635d2e544..ab23fce6f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java @@ -29,7 +29,7 @@ public class ConfigLoggingHelper extends HelperBase { return (bytes/(1024)) + "k"; } public String getLogLevelTable() { - StringBuffer buf = new StringBuffer(32*1024); + StringBuilder buf = new StringBuilder(32*1024); Properties limits = _context.logManager().getLimits(); TreeSet sortedLogs = new TreeSet(); for (Iterator iter = limits.keySet().iterator(); iter.hasNext(); ) { @@ -37,7 +37,7 @@ public class ConfigLoggingHelper extends HelperBase { sortedLogs.add(prefix); } - buf.append("
- - If you are changing any of the I2NP settings, you should go to the - service config page and do a graceful restart after saving. - - - - - +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +I2P Router Console - config advanced +<%@include file="css.jsp" %> + + +<%@include file="summary.jsp" %> + + +" /> + +

I2P Advanced Configuration

+
+ + <%@include file="confignav.jsp" %> + + + + " /> + +
+
+
+ <% String prev = System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce"); + if (prev != null) System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce", new java.util.Random().nextLong()+""); %> + " /> + +

Advanced I2P Configuration

+

+
+ +
+ NOTE: Some changes may require a restart to take effect. +
+ +
+
+
+ + diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index 724028198..8921987f4 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -4,15 +4,19 @@ I2P Router Console - config clients - +<%@include file="css.jsp" %> + -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> " /> - +

I2P Client Configuration

<%@include file="confignav.jsp" %> @@ -21,9 +25,8 @@ " /> " /> - - - + +
<% String prev = System.getProperty("net.i2p.router.web.ConfigClientsHandler.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.ConfigClientsHandler.noncePrev", prev); @@ -32,14 +35,13 @@

Client Configuration

The Java clients listed below are started by the router and run in the same JVM. -

+

- -

All changes require restart to take effect. To change other client options, edit the clients.config file. -

-
+


+ +

WebApp Configuration

The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. @@ -51,15 +53,18 @@ A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method. -

+

-

- -

+

+

All changes require restart to take effect. To change other webapp options, edit the webapps.config file.

+
+ +
- +
+
diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 7dd8bf178..7e58f4a15 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -4,32 +4,31 @@ I2P Router Console - config keyring - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Keyring Configuration

<%@include file="confignav.jsp" %> - + " /> - - + " /> - +

-

Keyring

+

Keyring

The router keyring is used to decrypt encrypted leaseSets. The keyring may contain keys for local or remote encrypted destinations. -

-

+

+ +


@@ -38,21 +37,27 @@ if (prev != null) System.setProperty("net.i2p.router.web.ConfigKeyringHandler.noncePrev", prev); System.setProperty("net.i2p.router.web.ConfigKeyringHandler.nonce", new java.util.Random().nextLong()+""); %> " /> -

Manual Keyring Addition

+

Manual Keyring Addition

Enter keys for encrypted remote destinations here. Keys for local destinations must be entered on the I2PTunnel page.

-

WebAppRun at Startup?Start NowDescription
"); + private void renderForm(StringBuilder buf, String index, String name, boolean urlify, boolean enabled, boolean ro, String desc) { + buf.append("
"); if (urlify && enabled) { String link = "/"; if (! RouterConsoleRunner.ROUTERCONSOLE.equals(name)) @@ -56,16 +56,16 @@ public class ConfigClientsHelper extends HelperBase { } else { buf.append(name); } - buf.append(" "); + buf.append("/>"); if (!enabled) { - buf.append(""); + buf.append(""); } - buf.append(" ").append(desc).append("
").append(desc).append("
-
Dest. name, hash, or full key: - -
Session Key: - -
-
+

+ + + + + + + + + +
Dest. name, hash, or full key:
Session Key:
+ +
-
- + + diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index b660a1519..432acdfb8 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -1,53 +1,70 @@ -<%@page contentType="text/html"%> -<%@page pageEncoding="UTF-8"%> - - - -I2P Router Console - config logging - - - -" /> - -<%@include file="nav.jsp" %> -<%@include file="summary.jsp" %> - -
- <%@include file="confignav.jsp" %> - - - - " /> - - - -
- <% String prev = System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigLoggingHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigLoggingHandler.nonce", new java.util.Random().nextLong()+""); %> - " /> - - Logging filename: - " />
- (the symbol '@' will be replaced during log rotation)
- Log record format: - " />
- (use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)
- Log date format: - " />
- ('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)
- Max log file size: - " />
-
- Log levels:
- Default log level: -
- -
- - - -
- - - +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +I2P Router Console - config logging +<%@include file="css.jsp" %> + + +" /> + +<%@include file="summary.jsp" %> +

I2P Logging Configuration

+
+ <%@include file="confignav.jsp" %> + + + + " /> + +
+
+ <% String prev = System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce"); + if (prev != null) System.setProperty("net.i2p.router.web.ConfigLoggingHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.ConfigLoggingHandler.nonce", new java.util.Random().nextLong()+""); %> + " /> + +

Configure I2P Logging Options

+
+ + + + + + + + + +
Logging filename: + " /> +
(the symbol '@' will be replaced during log rotation) +
Log record format: + " /> +
(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, + 'm' = message) +
Log date format: + " /> +
('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' + = second, 'SSS' = millisecond) +
Max log file size: + " /> +
+
Default log level: +
(DEBUG and INFO are not recommended defaults, + as they will drastically slow down your router) +
Log level overrides: + +

+
+
+ + +
+
+ +
+
+
+ + diff --git a/apps/routerconsole/jsp/confignav.jsp b/apps/routerconsole/jsp/confignav.jsp index 851ab79b5..37b6adbd0 100644 --- a/apps/routerconsole/jsp/confignav.jsp +++ b/apps/routerconsole/jsp/confignav.jsp @@ -1,5 +1,12 @@ -

<% if (request.getRequestURI().indexOf("config.jsp") != -1) { +
+
+<% if (request.getRequestURI().indexOf("config.jsp") != -1) { %>Network | <% } else { %>Network | <% } + String userAgent = request.getHeader("User-Agent"); + if (userAgent == null || !userAgent.contains("MSIE")) { + if (request.getRequestURI().indexOf("configui.jsp") != -1) { + %>UI | <% } else { %>UI | <% } + } if (request.getRequestURI().indexOf("configservice.jsp") != -1) { %>Service | <% } else { %>Service | <% } if (request.getRequestURI().indexOf("configupdate.jsp") != -1) { @@ -17,4 +24,6 @@ if (request.getRequestURI().indexOf("configstats.jsp") != -1) { %>Stats | <% } else { %>Stats | <% } if (request.getRequestURI().indexOf("configadvanced.jsp") != -1) { - %>Advanced<% } else { %>Advanced<% } %>

+ %>Advanced<% } else { %>Advanced<% } %> + + diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index 5690e470e..cc759d936 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -4,20 +4,18 @@ I2P Router Console - config peers - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Peer Configuration

<%@include file="confignav.jsp" %> " /> - - + @@ -28,58 +26,59 @@ if (request.getParameter("peer") != null) peer = request.getParameter("peer"); %> - +
<% String prev = System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.ConfigPeerHandler.noncePrev", prev); System.setProperty("net.i2p.router.web.ConfigPeerHandler.nonce", new java.util.Random().nextLong()+""); %> " /> -
-

+

Manual Peer Controls

- Router Hash: - -

Manually Shitlist / Unshitlist a Router

- Shitlisting will prevent the participation of this peer in tunnels you create. -

- - - <% if (! "".equals(peer)) { %> - <---- click to verify action - <% } %> -

+
Router Hash: +
+

Manually Ban / Unban a Peer

+ Shitlisting will prevent the participation of this peer in tunnels you create. +
+
+ + + <% if (! "".equals(peer)) { %> + + <% } %> +

Adjust Profile Bonuses

- Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. - Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. - Current bonuses are displayed on the profiles page. -

+ Bonuses may be positive or negative, and affect the peer's inclusion in Fast + and High Capacity tiers. Fast peers are used for client tunnels, and High + Capacity peers are used for some exploratory tunnels. Current bonuses are + displayed on the profiles page. +

<% long speed = 0; long capacity = 0; if (! "".equals(peer)) { // get existing bonus values? } - %> - Speed: + %> +


+
Speed: Capacity: - +

- -
" />
+
-
- +
+
diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index 59dfc3e75..942aedf0d 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -4,79 +4,87 @@ I2P Router Console - config service - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Service Configuration

<%@include file="confignav.jsp" %> " /> - - - + +
<% String prev = System.getProperty("net.i2p.router.web.ConfigServiceHandler.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.ConfigServiceHandler.noncePrev", prev); System.setProperty("net.i2p.router.web.ConfigServiceHandler.nonce", new java.util.Random().nextLong()+""); %> " /> -

Shutdown the router

+

Shutdown the router

Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes. If you need to kill the router immediately, that option is available as well.

- +
- +
+ <% if (System.getProperty("wrapper.version") != null) { %>

If you want the router to restart itself after shutting down, you can choose one of the following. This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on. A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately. After tearing down the router, it will wait 1 minute before starting back up again.

- +
- + <% } %>
+ <% if ( (System.getProperty("os.name") != null) && (System.getProperty("os.name").startsWith("Win")) ) { %> -

Systray integration

+

Systray integration

On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status (later on, I2P client applications will be able to integrate their own functionality into the system tray as well). If you are on windows, you can either enable or disable that icon here.

+
-

Run on startup

+
+

Run on startup

You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly. You can also run the install_i2p_service_winnt.bat (or uninstall_i2p_service_winnt.bat) from the command line, if you prefer.

+
-
+

Note: If you are running I2P as service right now, removing it will shut down your router immediately. You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.

<% } %> -

Debugging

+ + <% if (System.getProperty("wrapper.version") != null) { %> +

Debugging

At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.

+
+<% } %>
-

Launch browser on router startup?

+

Launch browser on router startup?

I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser pointing at - http://localhost:7657/index.jsp whenever + http://127.0.0.1:7657/index.jsp whenever the router starts up.

+
- +
+
- diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index 651636176..9a2435ec4 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -1,112 +1,111 @@ -<%@page contentType="text/html"%> -<%@page pageEncoding="UTF-8"%> - - - -I2P Router Console - config stats - - - -<%@include file="nav.jsp" %> -<%@include file="summary.jsp" %> - -
- <%@include file="confignav.jsp" %> - - - " /> - - - - - - " /> - -
- <% String prev = System.getProperty("net.i2p.router.web.ConfigStatsHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigStatsHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigStatsHandler.nonce", new java.util.Random().nextLong()+""); %> - - " /> - Enable full stats? - checked="true" <% } %>/> - (change requires restart to take effect)
- Stat file:
- Filter: (toggle all)
- - <% while (statshelper.hasMoreStats()) { - while (statshelper.groupRequired()) { %> - <% - } // end iterating over required groups for the current stat %> - - - <% - } // end iterating over all stats %> - - - - - - - -
- <%=statshelper.getCurrentGroupName()%> - (toggle all) -
LogGraph
- checked="true" <% } %>/> - <% if (statshelper.getCurrentCanBeGraphed()) { %> - checked="true" <% } %>/><% } %><%=statshelper.getCurrentStatName()%>:
- <%=statshelper.getCurrentStatDescription()%>

Advanced filter: -

-
- - - +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +I2P Router Console - config stats +<%@include file="css.jsp" %> + + +<%@include file="summary.jsp" %> +

I2P Stats Configuration

+
+ <%@include file="confignav.jsp" %> + + + " /> + + + + + " /> +
+
+ <% String prev = System.getProperty("net.i2p.router.web.ConfigStatsHandler.nonce"); + if (prev != null) System.setProperty("net.i2p.router.web.ConfigStatsHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.ConfigStatsHandler.nonce", new java.util.Random().nextLong()+""); %> + + " /> +

Configure I2P Stat Collection

+ Enable full stats? + checked="true" <% } %>/> + (change requires restart to take effect)
+ Stat file:
+ Filter: (toggle all)
+
+ + <% while (statshelper.hasMoreStats()) { + while (statshelper.groupRequired()) { %> + <% + } // end iterating over required groups for the current stat %> + + + <% + } // end iterating over all stats %> + + + + +
+ <%=statshelper.getCurrentGroupName()%> + (toggle all) +
LogGraph
+ + checked="true" <% } %>/> + <% if (statshelper.getCurrentCanBeGraphed()) { %> + checked="true" <% } %>/><% } %><%=statshelper.getCurrentStatName()%>:
+ <%=statshelper.getCurrentStatDescription()%>
Advanced filter: +
+
+
+
+ + diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index e4559b86c..f6ccb44d7 100644 --- a/apps/routerconsole/jsp/configtunnels.jsp +++ b/apps/routerconsole/jsp/configtunnels.jsp @@ -4,27 +4,24 @@ I2P Router Console - config tunnels - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> " /> - +

I2P Tunnel Configuration

<%@include file="confignav.jsp" %> - " /> " /> " /> " /> - - - + +

NOTE: The default settings work for most people. There is a fundamental tradeoff between anonymity and performance. @@ -33,7 +30,7 @@ High CPU and/or high outbound bandwidth usage may result. Change these settings with care, and adjust them if you have problems.

- +
<% String prev = System.getProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.ConfigTunnelsHandler.noncePrev", prev); @@ -41,13 +38,13 @@ " /> -
Note - Exploratory tunnel setting changes are stored in the router.config file.
Client tunnel changes are temporary and are not saved.
To make permanent client tunnel changes see the i2ptunnel page.
- +
- +
+
diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp new file mode 100644 index 000000000..f918bd5b5 --- /dev/null +++ b/apps/routerconsole/jsp/configui.jsp @@ -0,0 +1,47 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +I2P Router Console - config UI +<%@include file="css.jsp" %> + + +<%@include file="summary.jsp" %> + + +" /> + +

I2P UI Configuration

+
+ + <%@include file="confignav.jsp" %> + + + + " /> + +
+

Router Console Theme

+<% + // userAgent defined in confignav + if (userAgent == null || !userAgent.contains("MSIE")) { +%> +
+ <% String prev = System.getProperty("net.i2p.router.web.ConfigUIHandler.nonce"); + if (prev != null) System.setProperty("net.i2p.router.web.ConfigUIHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.ConfigUIHandler.nonce", new java.util.Random().nextLong()+""); %> + " /> + + +
+ +
+<% } else { %> +Theme selection disabled for Internet Explorer, sorry.
If you're not using IE, it's likely that +your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes. +<% } %> +
+
+ + diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index ae6f9bc0c..136876d37 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -4,53 +4,81 @@ I2P Router Console - config update - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Update Configuration

<%@include file="confignav.jsp" %> " /> - - + " /> - -

 
+
+
+
<% String prev = System.getProperty("net.i2p.router.web.ConfigUpdateHandler.nonce"); if (prev != null) System.setProperty("net.i2p.router.web.ConfigUpdateHandler.noncePrev", prev); System.setProperty("net.i2p.router.web.ConfigUpdateHandler.nonce", new java.util.Random().nextLong()+""); %> " /> - <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> - Update In Progress

- <% } else { %> -

- <% } %> - News URL: - ">
- Refresh frequency: -
- Update policy: -
-

Update through the eepProxy? -
- eepProxy host: " />
- eepProxy port: " />

-

Update URLs:
-

-

Trusted keys:
-

-
- +

Check for I2P and news updates

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
News: <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> Update In Progress
<% } else { %> + <% } %>

News URL:">
Refresh frequency: + +
Update policy: + +
Update through the eepProxy? + +
eepProxy host: + " /> +
eepProxy port: + " /> +
Update URLs: + +
Trusted keys: + +
Update with unsigned development builds? + +
Unsigned Build URL:">
+
+ + +
+
+
- +
diff --git a/apps/routerconsole/jsp/css.jsp b/apps/routerconsole/jsp/css.jsp new file mode 100644 index 000000000..37b649780 --- /dev/null +++ b/apps/routerconsole/jsp/css.jsp @@ -0,0 +1,21 @@ +<% + /* + * This should be included inside ..., + * as it sets the stylesheet. + */ + + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control","no-cache"); + response.setDateHeader("Expires", 0); + // the above will b0rk if the servlet engine has already flushed + // the response prior to including this file, so it should be + // near the top + + if (request.getParameter("i2p.contextId") != null) { + session.setAttribute("i2p.contextId", request.getParameter("i2p.contextId")); + } +%> + +" /> +console.css" rel="stylesheet" type="text/css" /> + \ No newline at end of file diff --git a/apps/routerconsole/jsp/error.jsp b/apps/routerconsole/jsp/error.jsp new file mode 100644 index 000000000..da2dfeac8 --- /dev/null +++ b/apps/routerconsole/jsp/error.jsp @@ -0,0 +1,32 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<% + // Let's make this easy... + final Integer ERROR_CODE = (Integer) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_STATUS_CODE); + final String ERROR_URI = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_REQUEST_URI); + final String ERROR_MESSAGE = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_MESSAGE); + if (ERROR_CODE != null && ERROR_MESSAGE != null) { + // this is deprecated but we don't want sendError() + response.setStatus(ERROR_CODE.intValue(), ERROR_MESSAGE); + } + // If it can't find the iframe or viewtheme.jsp I wonder if the whole thing blows up... +%> + +I2P Router Console + +<%@include file="css.jsp" %> + + +<% +if (System.getProperty("router.consoleNonce") == null) { + System.setProperty("router.consoleNonce", new java.util.Random().nextLong() + ""); +} +%> +<%@include file="summary.jsp" %> +

<%=ERROR_CODE%> <%=ERROR_MESSAGE%>

+
+The Router Console page <%=ERROR_URI%> was not found. +
+ + diff --git a/apps/routerconsole/jsp/flags.jsp b/apps/routerconsole/jsp/flags.jsp new file mode 100644 index 000000000..fc93fcea7 --- /dev/null +++ b/apps/routerconsole/jsp/flags.jsp @@ -0,0 +1,30 @@ +<% +/* + * USE CAUTION WHEN EDITING + * Trailing whitespace OR NEWLINE on the last line will cause + * IllegalStateExceptions !!! + */ + +/** + * flags.jsp?c=de => icons/flags/de.png + * with headers set so the browser caches. + */ +boolean rendered = false; +String c = request.getParameter("c"); +if (c != null && c.length() > 0) { + java.io.OutputStream cout = response.getOutputStream(); + response.setContentType("image/png"); + response.setHeader("Cache-Control", "max-age=86400"); // cache for a day + String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath(); + String file = "docs" + java.io.File.separatorChar + "icons" + java.io.File.separatorChar + + "flags" + java.io.File.separatorChar + c + ".png"; + try { + net.i2p.util.FileUtil.readFile(file, base, cout); + rendered = true; + } catch (java.io.IOException ioe) {} + if (rendered) + cout.close(); +} +if (!rendered) + response.sendError(404, "Not found"); +%> \ No newline at end of file diff --git a/apps/routerconsole/jsp/graphs.jsp b/apps/routerconsole/jsp/graphs.jsp index 06807f397..34ee723b7 100644 --- a/apps/routerconsole/jsp/graphs.jsp +++ b/apps/routerconsole/jsp/graphs.jsp @@ -1,23 +1,24 @@ -<%@page contentType="text/html"%> -<%@page pageEncoding="UTF-8"%> - - - -I2P Router Console - graphs - - - -<%@include file="nav.jsp" %> -<%@include file="summary.jsp" %> - -
- - - " /> - - - -
- - - +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +I2P Router Console - graphs +<%@include file="css.jsp" %> + + +<%@include file="summary.jsp" %> +

I2P Performance Graphs

+
+
+
+ + + " /> + + + +
+
+ + \ No newline at end of file diff --git a/apps/routerconsole/jsp/help.jsp b/apps/routerconsole/jsp/help.jsp index d53f93a88..97eda87ed 100644 --- a/apps/routerconsole/jsp/help.jsp +++ b/apps/routerconsole/jsp/help.jsp @@ -4,28 +4,156 @@ I2P Router Console - help - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> +

I2P Router Help & Support

+
+If you'd like to help improve or translate the documentation, or +help with other aspects of the project, please see the documentation for +volunteers. +

Further assistance is available here: +
+ +
+You may also try the I2P forum +or IRC.
-
-

Help

-Sorry, there's no help text here yet, so check out the -FAQ on www.i2p2.i2p -or the -Deutsch FAQ. -
+

Summary Bar Information

+Many of the stats on the summary bar may be +configured to be +graphed for further analysis. +
+

General

+
    +
  • Ident: +The first four characters (24 bits) of your 44-character (256-bit) Base64 router hash. +The full hash is shown on your router info page. +Never reveal this to anyone, as your router info contains your IP. +
  • Version: +The version of the I2P software you are running. +
  • Now: +The current time (UTC) and the skew, if any. I2P requires your computer's time be accurate. +If the skew is more than a few seconds, please correct the problem by adjusting +your computer's time. +
  • Reachability: +The router's view of whether it can be contacted by other routers. +Further information is on the configuration page. +
-

Legal stuff

+

Peers

+
    +
  • Active: +The first number is the number of peers you've sent or received a message from in the last few minutes. +This may range from 8-10 to several hundred, depending on your total bandwidth, +shared bandwidth, and locally-generated traffic. +The second number is the number of peers seen in the last hour or so. +Do not be concerned if these numbers vary widely. +[Enable graphing]. +
  • Fast: +This is the number of peers you use for building client tunnels. It is generally in the +range 8-15. Your fast peers are shown on the profiles page. +[Enable graphing]. +
  • High Capacity: +This is the number of peers you use for building some of your exploratory tunnels. It is generally in the +range 8-25. The fast peers are included in the high capacity tier. +Your high capacity peers are shown on the profiles page. +[Enable graphing]. +
  • Well Integrated: +This is the number of peers you use for network database inquiries. +These are usually the "floodfill" peers. +Your well integrated peers are shown on the bottom of the profiles page. +
  • Known: +This is the total number of routers you know about. +They are listed on the network database page. +This may range from under 100 to 1000 or more. +This number is not the total size of the network; +it may vary widely depending on your total bandwidth, +shared bandwidth, and locally-generated traffic. +I2P does not require a router to know every other router. +
+ +

Bandwidth in/out

+Should be self-explanatory. All values are in bytes per second, not bits per second. +Change your bandwidth limits on the configuration page. +Bandwidth is graphed by default. +
+

Local destinations

+The local applications connecting through your router. +These may be clients started through I2PTunnel +or external programs connecting through SAM, BOB, or directly to I2CP. +
+

Tunnels in/out

+The actual tunnels are shown on the the tunnels page.

+
    +
  • Exploratory: +Tunnels built by your router and used for communication with the floodfill peers, +building new tunnels, and testing existing tunnels.
    +
  • Client: +Tunnels built by your router for each client's use. +
  • Participating: +Tunnels built by other routers through your router. +This may vary widely depending on network demand, your +shared bandwidth, and amount of locally-generated traffic. +The recommended method for limiting participating tunnels is +to change your share percentage on the configuration page. +You may also limit the total number by setting router.maxParticipatingTunnels=nnn on +the advanced configuration page. [Enable graphing]. +
+ +

Congestion

+Some basic indications of router overload:

+
    +
  • Job lag: +How long jobs are waiting before execution. The job queue is listed on the jobs page. +Unfortunately, there are several other job queues in the router that may be congested, +and their status is not available in the router console. +The job lag should generally be zero. +If it is consistently higher than 500ms, your computer is very slow, or the +router has serious problems. +[Enable graphing]. +
  • Message delay: +How long an outbound message waits in the queue. +This should generally be a few hundred milliseconds or less. +If it is consistently higher than 1000ms, your computer is very slow, +or you should adjust your bandwidth limits, or your (bittorrent?) clients +may be sending too much data and should have their transmit bandwidth limit reduced. +[Enable graphing] (transport.sendProcessingTime). +
  • Tunnel lag: +This is the round trip time for a tunnel test, which sends a single message +out a client tunnel and in an exploratory tunnel, or vice versa. +It should usually be less than 5 seconds. +If it is consistently higher than that, your computer is very slow, +or you should adjust your bandwidth limits, or there are network problems. +[Enable graphing] (tunnel.testSuccessTime). +
  • Handle backlog: +This is the number of pending requests from other routers to build a +participating tunnel through your router. +It should usually be close to zero. +If it is consistently high, your computer is too slow, +and you should reduce your share bandwidth limits. +
  • Accepting/Rejecting: +Your router's status on accepting or rejecting +requests from other routers to build a +participating tunnel through your router. +Your router may accept all requests, accept or reject a percentage of requests, +or reject all requests for a number of reasons, to control +the bandwidth and CPU demands and maintain capacity for +local clients. +
+ +

Legal stuff

The I2P router (router.jar) and SDK (i2p.jar) are almost entirely public domain, with -a few notable exceptions:
    -
  • ElGamal and DSA code, under the BSD license, written by TheCrypto
  • -
  • SHA256 and HMAC-SHA256, under the MIT license, written by the Legion of the Bouncycastle
  • -
  • AES code, under the Cryptix (MIT) license, written by the Cryptix team
  • -
  • SNTP code, under the BSD license, written by Adam Buckley
  • -
  • The rest is outright public domain, written by jrandom, mihi, hypercubus, oOo, +a few notable exceptions:

    +
  • ElGamal and DSA code, under the BSD license, written by TheCrypto
  • +
  • SHA256 and HMAC-SHA256, under the MIT license, written by the Legion of the Bouncycastle
  • +
  • AES code, under the Cryptix (MIT) license, written by the Cryptix team
  • +
  • SNTP code, under the BSD license, written by Adam Buckley
  • +
  • The rest is outright public domain, written by jrandom, mihi, hypercubus, oOo, ugha, duck, shendaras, and others.
@@ -57,16 +185,15 @@ client applications can be found on our d

Release history

- - + <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "history.txt"); %> + + -

- A more complete list of changes can be found +

A more complete list of changes can be found in the history.txt file in your i2p directory. -

+


- diff --git a/apps/routerconsole/jsp/i2plogo.png b/apps/routerconsole/jsp/i2plogo.png deleted file mode 100644 index ee5c91da2..000000000 Binary files a/apps/routerconsole/jsp/i2plogo.png and /dev/null differ diff --git a/apps/routerconsole/jsp/i2psnark/index.html b/apps/routerconsole/jsp/i2psnark/index.html index 290497311..a1500fad3 100644 --- a/apps/routerconsole/jsp/i2psnark/index.html +++ b/apps/routerconsole/jsp/i2psnark/index.html @@ -1,8 +1,8 @@ -I2PSnark Disabled +I2PSnark Anonymous BitTorrent Client Disabled -I2PSnark is not running. Go to the config clients page +The I2PSnark Anonymous BitTorrent Client is not running. Please visit the config clients page to start it. diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp index ce820f5b7..3056741e6 100644 --- a/apps/routerconsole/jsp/index.jsp +++ b/apps/routerconsole/jsp/index.jsp @@ -3,10 +3,10 @@ +<%@include file="css.jsp" %> I2P Router Console - home - - + <% if (System.getProperty("router.consoleNonce") == null) { @@ -14,23 +14,25 @@ if (System.getProperty("router.consoleNonce") == null) { } %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> +

I2P Router Console

- + <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); %> + " /> -

+

- + <% fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %> + " /> diff --git a/apps/routerconsole/jsp/jobs.jsp b/apps/routerconsole/jsp/jobs.jsp index 56701af6b..6677dc916 100644 --- a/apps/routerconsole/jsp/jobs.jsp +++ b/apps/routerconsole/jsp/jobs.jsp @@ -4,12 +4,11 @@ I2P Router Console - job queue - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Router Job Queue

" /> diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp index 6bfc9c469..d9e9886bf 100644 --- a/apps/routerconsole/jsp/logs.jsp +++ b/apps/routerconsole/jsp/logs.jsp @@ -4,24 +4,34 @@ I2P Router Console - logs - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Router Logs

+
+

Version:

+ Please include this information in bug reports. +

+I2P
+<%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%>
+<%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%>
+CPU <%=net.i2p.util.NativeBigInteger.cpuModel()%> (<%=net.i2p.util.NativeBigInteger.cpuType()%>)
+jbigi <%=net.i2p.util.NativeBigInteger.loadStatus()%>
+

+
" /> -

Router logs:

- -
-

Critical logs:

+

Critical logs:


-

Service (Wrapper) logs:

+

Router logs (configure):

+ +
+

Service (Wrapper) logs:

- +
diff --git a/apps/routerconsole/jsp/nav.jsp b/apps/routerconsole/jsp/nav.jsp deleted file mode 100644 index 22bb8ec24..000000000 --- a/apps/routerconsole/jsp/nav.jsp +++ /dev/null @@ -1,46 +0,0 @@ -<%@page import="java.io.File" %> -<% response.setHeader("Pragma", "no-cache"); - response.setHeader("Cache-Control","no-cache"); - response.setDateHeader("Expires", 0); - // the above will b0rk if the servlet engine has already flushed - // the response prior to including nav.jsp, so nav should be - // near the top - - if (request.getParameter("i2p.contextId") != null) { - session.setAttribute("i2p.contextId", request.getParameter("i2p.contextId")); - }%> - - -
- <% if (new File("docs/toolbar.html").exists()) { %> - - - - -<% } else { %> - - Susimail | - SusiDNS | - - I2PSnark | - My Eepsite
- I2PTunnel | - Tunnels | - Profiles | - NetDB | - Logs | - Jobs | - Graphs | - Stats -<% } %> - - " /> - -
- - -" /> - diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index 08a1377d3..cac11bf05 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -4,20 +4,21 @@ I2P Router Console - network database summary - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Network Database Summary

+
" /> " /> " /> + " />
- +
diff --git a/apps/routerconsole/jsp/oldconsole.jsp b/apps/routerconsole/jsp/oldconsole.jsp index 9ac26ced4..e9a557380 100644 --- a/apps/routerconsole/jsp/oldconsole.jsp +++ b/apps/routerconsole/jsp/oldconsole.jsp @@ -4,16 +4,15 @@ I2P Router Console - internals - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> " /> - +

I2P Router » Old Console

diff --git a/apps/routerconsole/jsp/oldstats.jsp b/apps/routerconsole/jsp/oldstats.jsp index 5764eeb07..e17fa0ba8 100644 --- a/apps/routerconsole/jsp/oldstats.jsp +++ b/apps/routerconsole/jsp/oldstats.jsp @@ -4,19 +4,18 @@ I2P Router Console - statistics - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> " /> - +

I2P Router Statistics

- +
diff --git a/apps/routerconsole/jsp/peers.jsp b/apps/routerconsole/jsp/peers.jsp index d3b941a34..3d24ce65c 100644 --- a/apps/routerconsole/jsp/peers.jsp +++ b/apps/routerconsole/jsp/peers.jsp @@ -4,12 +4,11 @@ I2P Router Console - peer connections - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Network Peers

" /> diff --git a/apps/routerconsole/jsp/profiles.jsp b/apps/routerconsole/jsp/profiles.jsp index 8be3b801a..11529cf55 100644 --- a/apps/routerconsole/jsp/profiles.jsp +++ b/apps/routerconsole/jsp/profiles.jsp @@ -4,13 +4,12 @@ I2P Router Console - peer profiles - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - -
+

I2P Network Peer Profiles

+
" /> @@ -18,6 +17,6 @@
- +
diff --git a/apps/routerconsole/jsp/summary.jsp b/apps/routerconsole/jsp/summary.jsp index 48f3b4fef..786e48353 100644 --- a/apps/routerconsole/jsp/summary.jsp +++ b/apps/routerconsole/jsp/summary.jsp @@ -1,102 +1,31 @@ -<%@page import="net.i2p.router.web.SummaryHelper" %> - -" /> - - - - - -" /> - - -" /> +<% // put width here too to prevent bad layout at startup %> +
+<% + // skip the iframe if refresh disabled + String d = request.getParameter("refresh"); + String newDelay = ""; + if (d == null || "".equals(d)) + d = System.getProperty("routerconsole.summaryRefresh"); + else + // pass the new delay parameter to the iframe + newDelay = "?refresh=" + d; + if (!"0".equals(d)) + out.print("\n"); + } else { + // since we don't have an iframe this will reload the base page, and + // the new delay will be passed to the iframe above + out.print("

\n"); + out.print("Refresh (s): \n"); + out.print("\n"); + out.print("

\n"); } - %> -

- <%=net.i2p.router.web.ConfigRestartBean.renderStatus(request.getRequestURI(), request.getParameter("action"), request.getParameter("consoleNonce"))%> -

-
- - Peers
- Active: /
- Fast:
- High capacity:
- Well integrated:
- Known:
<% - if (helper.getActivePeers() <= 0) { - %>check your NAT/firewall
<% - } - // If showing the reseed link is allowed - if (helper.allowReseed()) { - if ("true".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) { - // While reseed occurring, show status message instead - out.print("" + System.getProperty("net.i2p.router.web.ReseedHandler.statusMessage","") + "
"); - } else { - // While no reseed occurring, show reseed link - long nonce = new java.util.Random().nextLong(); - String prev = System.getProperty("net.i2p.router.web.ReseedHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ReseedHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ReseedHandler.nonce", nonce+""); - String uri = request.getRequestURI(); - out.print("

\n"); - out.print("\n"); - out.print("

\n"); - } - } - // If a new reseed ain't running, and the last reseed had errors, show error message - if ("false".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) { - String reseedErrorMessage = System.getProperty("net.i2p.router.web.ReseedHandler.errorMessage",""); - if (reseedErrorMessage.length() > 0) { - out.print("" + reseedErrorMessage + "
"); - } - } - %>
- - Bandwidth in/out
- 1s: /KBps
- 5m: /KBps
- Total: /KBps
- Used: /
-
- - - - Tunnels in/out
- Exploratory: /
- Client: /
- Participating:
-
- - Congestion
- Job lag:
- Message delay:
- Tunnel lag:
- Handle backlog:
-
- +%>
diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp new file mode 100644 index 000000000..6be164560 --- /dev/null +++ b/apps/routerconsole/jsp/summaryframe.jsp @@ -0,0 +1,76 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<% +/* + * All links in the summary bar must have target="_top" + * so they don't load in the iframe + */ +%> + +<%@include file="css.jsp" %> +Summary Bar + +<% + // try hard to avoid an error page in the iframe after shutdown + String action = request.getParameter("action"); + String d = request.getParameter("refresh"); + // Normal browsers send value, IE sends button label + boolean shutdownSoon = "shutdownImmediate".equals(action) || "restartImmediate".equals(action) || + "Shutdown immediately".equals(action) || "Restart immediately".equals(action); + if (!shutdownSoon) { + if (d == null || "".equals(d)) { + d = System.getProperty("routerconsole.summaryRefresh"); + if (d == null || "".equals(d)) + d = "60"; + } else { + System.setProperty("routerconsole.summaryRefresh", d); + } + // we probably don't get here if d == "0" since caught in summary.jsp, but just + // to be sure... + if (!"0".equals(d)) { + // doesn't work for restart or shutdown with no expl. tunnels, + // since the call to ConfigRestartBean.renderStatus() hasn't happened yet... + // So we delay slightly + if ("restart".equalsIgnoreCase(action) || "shutdown".equalsIgnoreCase(action)) { + synchronized(this) { + try { + wait(1000); + } catch(InterruptedException ie) {} + } + } + long timeleft = net.i2p.router.web.ConfigRestartBean.getRestartTimeRemaining(); + long delay = 60; + try { delay = Long.parseLong(d); } catch (NumberFormatException nfe) {} + if (delay*1000 < timeleft + 5000) + out.print("\n"); + else + shutdownSoon = true; + } + } +%> + + + + +
+<%@include file="summarynoframe.jsp" %> +<% + // d and shutdownSoon defined above + if (!shutdownSoon) { + out.print("

\n"); + if ("0".equals(d)) { + out.print("Refresh (s): \n"); + out.print("\n"); + } else { + // this will load in the iframe but subsequent pages will not have the iframe + out.print("\n"); + out.print("\n"); + } + out.print("


\n"); + } +%> +
+ + + diff --git a/apps/routerconsole/jsp/summarynoframe.jsp b/apps/routerconsole/jsp/summarynoframe.jsp new file mode 100644 index 000000000..2a473d1f5 --- /dev/null +++ b/apps/routerconsole/jsp/summarynoframe.jsp @@ -0,0 +1,144 @@ +<%@page import="net.i2p.router.web.SummaryHelper" %> +<% +/* + * Note: + * This is included almost 30 times, so keep whitespace etc. to a minimum. + */ +%> + +" /> + + + + +" /> +I2P Router Console
+<% java.io.File lpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/toolbar.html"); + // you better have target="_top" for the links in there... + if (lpath.exists()) { %> + + + + +<% } else { %> +

I2P Services


+ + + +
Addressbook +Torrents +Webmail +Webserver

+

I2P Internals


+ +
+Tunnels +Peers +Profiles +NetDB +Logs +Jobs +Graphs +Stats +
+<% } %> + +
+

General


+

+, never reveal it to anyone" href="netdb.jsp?r=." target="_top">Local Identity

+
+ + + + + +
+Version:
+Uptime:
+

+
+<% + if (helper.updateAvailable() || helper.unsignedUpdateAvailable()) { + // display all the time so we display the final failure message + out.print("
" + update.getStatus()); + if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress"))) { + } else if((!update.isDone()) && + request.getParameter("action") == null && + request.getParameter("updateNonce") == null && + net.i2p.router.web.ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) { + long nonce = new java.util.Random().nextLong(); + String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce"); + if (prev != null) System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+""); + String uri = request.getRequestURI(); + out.print("

\n"); + out.print("\n"); + if (helper.updateAvailable()) + out.print("\n"); + if (helper.unsignedUpdateAvailable()) + out.print("\n"); + out.print("

\n"); + } + } +%> +

+<%=net.i2p.router.web.ConfigRestartBean.renderStatus(request.getRequestURI(), request.getParameter("action"), request.getParameter("consoleNonce"))%> +

+
+

Peers


+ + + + +
Active:/
Fast:
High capacity:
Integrated:
Known:

<% + if (helper.getActivePeers() <= 0) { + %>

Check NAT/firewall

<% + } + // If showing the reseed link is allowed + if (helper.allowReseed()) { + if ("true".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) { + // While reseed occurring, show status message instead + out.print("" + System.getProperty("net.i2p.router.web.ReseedHandler.statusMessage","") + "
"); + } else { + // While no reseed occurring, show reseed link + long nonce = new java.util.Random().nextLong(); + String prev = System.getProperty("net.i2p.router.web.ReseedHandler.nonce"); + if (prev != null) System.setProperty("net.i2p.router.web.ReseedHandler.noncePrev", prev); + System.setProperty("net.i2p.router.web.ReseedHandler.nonce", nonce+""); + String uri = request.getRequestURI(); + out.print("

\n"); + out.print("\n"); + out.print("

\n"); + } + } + // If a new reseed ain't running, and the last reseed had errors, show error message + if ("false".equals(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress", "false"))) { + String reseedErrorMessage = System.getProperty("net.i2p.router.web.ReseedHandler.errorMessage",""); + if (reseedErrorMessage.length() > 0) { + out.print("" + reseedErrorMessage + "
"); + } + } + %>
+

Bandwidth in/out


+ + + + +
1s:/K/s
5m:/K/s
Total:/K/s
Used:/
+
+

Tunnels in/out


+ + + +
Exploratory:/
Client:/
Participating:
+
+

Congestion


+ + + + +
Job lag:
Message delay:
Tunnel lag:
Backlog:
+

+
+ diff --git a/apps/routerconsole/jsp/tunnels.jsp b/apps/routerconsole/jsp/tunnels.jsp index 3bdcfab08..7f92aeaa4 100644 --- a/apps/routerconsole/jsp/tunnels.jsp +++ b/apps/routerconsole/jsp/tunnels.jsp @@ -4,12 +4,11 @@ I2P Router Console - tunnel summary - +<%@include file="css.jsp" %> -<%@include file="nav.jsp" %> <%@include file="summary.jsp" %> - +

I2P Tunnel Summary

" /> diff --git a/apps/routerconsole/jsp/verifyupdate.jsp b/apps/routerconsole/jsp/verifyupdate.jsp deleted file mode 100644 index 2d13d3508..000000000 --- a/apps/routerconsole/jsp/verifyupdate.jsp +++ /dev/null @@ -1,12 +0,0 @@ -<%@page contentType="text/html" %> - - - -I2P Router Console - verify update file signature - - - - - - - diff --git a/apps/routerconsole/jsp/viewstat.jsp b/apps/routerconsole/jsp/viewstat.jsp index 1847f3731..331ad5ed2 100644 --- a/apps/routerconsole/jsp/viewstat.jsp +++ b/apps/routerconsole/jsp/viewstat.jsp @@ -1,4 +1,10 @@ <% +/* + * USE CAUTION WHEN EDITING + * Trailing whitespace OR NEWLINE on the last line will cause + * IllegalStateExceptions !!! + */ + boolean rendered = false; String templateFile = request.getParameter("template"); if (templateFile != null) { diff --git a/apps/routerconsole/jsp/viewtheme.jsp b/apps/routerconsole/jsp/viewtheme.jsp index 3c344be39..1f7976d2b 100644 --- a/apps/routerconsole/jsp/viewtheme.jsp +++ b/apps/routerconsole/jsp/viewtheme.jsp @@ -1,4 +1,10 @@ -<% +<% +/* + * USE CAUTION WHEN EDITING + * Trailing whitespace OR NEWLINE on the last line will cause + * IllegalStateExceptions !!! + */ + String uri = request.getRequestURI(); if (uri.endsWith(".css")) { response.setContentType("text/css"); @@ -8,7 +14,11 @@ if (uri.endsWith(".css")) { response.setContentType("image/gif"); } else if (uri.endsWith(".jpg")) { response.setContentType("image/jpeg"); +} else if (uri.endsWith(".ico")) { + response.setContentType("image/x-icon"); } - -net.i2p.util.FileUtil.readFile(uri, "./docs", response.getOutputStream()); +response.setHeader("Cache-Control", "max-age=86400"); // cache for a day +String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath() + + java.io.File.separatorChar + "docs"; +net.i2p.util.FileUtil.readFile(uri, base, response.getOutputStream()); %> \ No newline at end of file diff --git a/apps/routerconsole/jsp/web.xml b/apps/routerconsole/jsp/web.xml index 7a8e431ce..a0436d305 100644 --- a/apps/routerconsole/jsp/web.xml +++ b/apps/routerconsole/jsp/web.xml @@ -21,4 +21,8 @@ index.html index.jsp + + 404 + /error.jsp + diff --git a/apps/sam/Demos/datagramTests/README.txt b/apps/sam/Demos/datagramTests/README.txt new file mode 100644 index 000000000..8e79434f9 --- /dev/null +++ b/apps/sam/Demos/datagramTests/README.txt @@ -0,0 +1,15 @@ +# test example + +#in a first terminal, launch : + ./samIn.py inTest + +#in a second terminal, launch : + ./samForward.py 25000 forward + +#in a third terminal, launch : +l=0 +while [ $l -lt 1000 ] +do + l=$((l+1)) + ./samOut.py forward this is message n. $l +done diff --git a/apps/sam/Demos/datagramTests/samForward.py b/apps/sam/Demos/datagramTests/samForward.py new file mode 100755 index 000000000..a1fd5b3e3 --- /dev/null +++ b/apps/sam/Demos/datagramTests/samForward.py @@ -0,0 +1,35 @@ +#!/usr/bin/python + +import socket +import sys + +# create a forward style SAM datagram session +# that forwards messages on specified port (default port : 25000) +# creates a standard datagram server that listens on this port forever +# usage : ./samForward.py [port [SAM session name]] + +if len(sys.argv)>=2 : + port = eval(sys.argv[1]) +else : + port = 25000 + +if len(sys.argv)==3 : + name = sys.argv[2] +else : + name = "datagramSamForward" + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=DATAGRAM PORT="+str(port)+" ID="+name+" DESTINATION=EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHNqwgkhJnBW4ymaRsdVmITAha-ff0UiALfKSlznqp5HcSewgMHbzQ0I01TQytFnW outbound.nickname="+name+" inbound.nickname="+name+" outbound.length=0\n") +sys.stdout.write(sess.recv(10000)) + +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +s.bind(("", port)) +print "waiting on port:", port +while 1: + data, addr = s.recvfrom(40000) + print data, " received from ", addr, "length=", len(data) + diff --git a/apps/sam/Demos/datagramTests/samIn.py b/apps/sam/Demos/datagramTests/samIn.py new file mode 100755 index 000000000..c2c0589f3 --- /dev/null +++ b/apps/sam/Demos/datagramTests/samIn.py @@ -0,0 +1,29 @@ +#!/usr/bin/python + + +# create a SAM datagram session that writes incoming messages on its master session stream +# and a listen forever +# usage : ./samIn.py [session name] + +import socket +import sys + +if len(sys.argv)==2 : + name = sys.argv[1] +else : + name = "datagramSamIn" + + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=DATAGRAM ID="+name+" DESTINATION=tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABngJSS8xMyF4t82otZmCDhrKjbm-QLMtOLoumwR28ebDHEd4clF6O7aRa3d3yRH7p\n") +sys.stdout.write(sess.recv(1000)) +while 1 : + chunk = sess.recv(10000) + sys.stdout.write(chunk+'\n') + if not chunk : break +print + diff --git a/apps/sam/Demos/datagramTests/samOut.py b/apps/sam/Demos/datagramTests/samOut.py new file mode 100755 index 000000000..1a521334f --- /dev/null +++ b/apps/sam/Demos/datagramTests/samOut.py @@ -0,0 +1,31 @@ +#!/usr/bin/python + +# sends a message to datagram destinations opened by samForward.py and samIn.py, using specified sending session name +# at least samForward.py should be running for results to be seen +# usage : ./samOut.py [ sendingSessionName [ message ... ] ] +# sendingSessionName : default = datagramSamForward +# message : default = "this is nice message" + +import socket +import sys +import time + +if len(sys.argv)>=2 : + name = sys.argv[1] +else : + name = "datagramSamForward" + +if len(sys.argv)>2 : + message = ''.join([s+' ' for s in sys.argv[2:]]).strip() +else : + message = "This is a nice message" + + +# client.py +port = 7655 +host = "localhost" +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +s.bind(("", 0)) +s.sendto("3.0 "+name+" tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAA\n"+message, (host, port)) +s.sendto("3.0 "+name+" EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAA\n"+message, (host, port)) + diff --git a/apps/sam/Demos/rawTests/README.txt b/apps/sam/Demos/rawTests/README.txt new file mode 100644 index 000000000..8e79434f9 --- /dev/null +++ b/apps/sam/Demos/rawTests/README.txt @@ -0,0 +1,15 @@ +# test example + +#in a first terminal, launch : + ./samIn.py inTest + +#in a second terminal, launch : + ./samForward.py 25000 forward + +#in a third terminal, launch : +l=0 +while [ $l -lt 1000 ] +do + l=$((l+1)) + ./samOut.py forward this is message n. $l +done diff --git a/apps/sam/Demos/rawTests/samForward.py b/apps/sam/Demos/rawTests/samForward.py new file mode 100755 index 000000000..5a65b6614 --- /dev/null +++ b/apps/sam/Demos/rawTests/samForward.py @@ -0,0 +1,36 @@ +#!/usr/bin/python + +import socket +import sys + +# create a forward style SAM raw datagram session +# that forwards messages on specified port (default port : 25000) +# creates a standard datagram server that listens on this port forever +# usage : ./samForward.py [port [SAM session name]] + +if len(sys.argv)>=2 : + port = eval(sys.argv[1]) +else : + port = 25000 + +if len(sys.argv)==3 : + name = sys.argv[2] +else : + name = "rawSamForward" + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=RAW PORT="+str(port)+" ID="+name+" DESTINATION=EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHNqwgkhJnBW4ymaRsdVmITAha-ff0UiALfKSlznqp5HcSewgMHbzQ0I01TQytFnW\n") +sys.stdout.write(sess.recv(10000)) + +# listening server +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +s.bind(("", port)) +print "waiting on port:", port +while 1: + data, addr = s.recvfrom(40000) + print data, " received from ", addr, "length=", len(data) + diff --git a/apps/sam/Demos/rawTests/samIn.py b/apps/sam/Demos/rawTests/samIn.py new file mode 100755 index 000000000..ee2c3cbc8 --- /dev/null +++ b/apps/sam/Demos/rawTests/samIn.py @@ -0,0 +1,31 @@ +#!/usr/bin/python + + +# create a SAM datagram session that writes incoming messages on its master session stream +# and a listen forever +# usage : ./samIn.py [session name] + +import socket +import sys + +if len(sys.argv)==2 : + name = sys.argv[1] +else : + name = "rawSamIn" + + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=RAW ID="+name+" DESTINATION=tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABngJSS8xMyF4t82otZmCDhrKjbm-QLMtOLoumwR28ebDHEd4clF6O7aRa3d3yRH7p\n") +sys.stdout.write(sess.recv(1000)) + +# listen incoming messages +while 1 : + chunk = sess.recv(10000) + sys.stdout.write(chunk+'\n') + if not chunk : break +print + diff --git a/apps/sam/Demos/rawTests/samOut.py b/apps/sam/Demos/rawTests/samOut.py new file mode 100755 index 000000000..b035d8997 --- /dev/null +++ b/apps/sam/Demos/rawTests/samOut.py @@ -0,0 +1,31 @@ +#!/usr/bin/python + +# sends a message to datagram destinations opened by samForward.py and samIn.py, using specified sending session name +# at least samForward.py should be running for results to be seen +# usage : ./samOut.py [ sendingSessionName [ message ... ] ] +# sendingSessionName : default = datagramSamForward +# message : default = "this is nice message" + +import socket +import sys +import time + +if len(sys.argv)>=2 : + name = sys.argv[1] +else : + name = "rawSamForward" + +if len(sys.argv)>2 : + message = ''.join([s+' ' for s in sys.argv[2:]]).strip() +else : + message = "This is a nice message" + + +# client.py +port = 7655 +host = "localhost" +s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +s.bind(("", 0)) +s.sendto("3.0 "+name+" tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAA\n"+message, (host, port)) +s.sendto("3.0 "+name+" EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAA\n"+message, (host, port)) + diff --git a/apps/sam/Demos/streamTests/README.txt b/apps/sam/Demos/streamTests/README.txt new file mode 100644 index 000000000..6ce7ae57b --- /dev/null +++ b/apps/sam/Demos/streamTests/README.txt @@ -0,0 +1,24 @@ +# test example + +#in a first terminal, launch : + ./samIn.py inTest + +#in a second terminal, launch : + ./samOut.py + +#and again + ./samOut.py + +########## + +# test example n°2 + +#in a first terminal, launch : + ./samForward.py inTest + +#in a second terminal, launch : + ./server.py + +#in a third terminal, launch : + ./samOut.py + diff --git a/apps/sam/Demos/streamTests/samForward.py b/apps/sam/Demos/streamTests/samForward.py new file mode 100755 index 000000000..687b265f6 --- /dev/null +++ b/apps/sam/Demos/streamTests/samForward.py @@ -0,0 +1,64 @@ +#!/usr/bin/python + +import socket +import sys + +# create a master SAM stream session that opens a destination in I2P world +# then open another session that tells SAM to forward incoming connections +# to the specified address +# +# usage : +# ./samForward.py [ silent [ port [ sessionName [ host ] ] ] ] +# +# silent : should the first line of incoming socket contain the peer destination (true or false) +# port : port to which connections are forwarded (default : 25000) +# sessionName : session id (default : "forward") +# host : host to which connections are forwarded (default : this host) + +if len(sys.argv)>=2 : + silent = " SILENT="+sys.argv[1] +else : silent = " SILENT=false" + +if len(sys.argv)>=3 : + port = " PORT="+sys.argv[2] +else : port = " PORT=25000" + +if len(sys.argv)>=4 : + name = " ID="+sys.argv[3] +else : name = " ID=forward" + +if len(sys.argv)>=5 : + host = " HOST="+sys.argv[4] +else : host = "" + + + + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=STREAM"+name+" DESTINATION=tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABngJSS8xMyF4t82otZmCDhrKjbm-QLMtOLoumwR28ebDHEd4clF6O7aRa3d3yRH7p\n") +sys.stdout.write(sess.recv(1000)) + +sock = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sock.connect(("127.0.0.1",7656)); +sock.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sock.recv(1000)) +sock.send("STREAM FORWARD" + name + host + port + silent + "\n") +sys.stdout.write(sock.recv(1000)) + +l=0 +while 1 : + chunk = sock.recv(100) + sys.stdout.write(chunk) + if not chunk : break +print "Forward socket closed" +l=0 +while 1 : + chunk = sess.recv(100) + sys.stdout.write(chunk) + if not chunk : break + diff --git a/apps/sam/Demos/streamTests/samIn.py b/apps/sam/Demos/streamTests/samIn.py new file mode 100755 index 000000000..ab2e3fa52 --- /dev/null +++ b/apps/sam/Demos/streamTests/samIn.py @@ -0,0 +1,91 @@ +#!/usr/bin/python + + +# create an stream session +# then an "accept" stream connected to this session +# then another "accept" stream from the same session +# then listen from the first stream and then listen from the second +# usage : ./samIn.py [ silent [ name ] ] +# name : the session id ( defaults to InTest ) +# silent : true or false : tells wether we want to receive the incoming stream destination +# as first line + +import socket +import sys +import time + +if len(sys.argv)>=2 : + silent = " SILENT="+sys.argv[1] +else : silent = " SILENT=false" + +if len(sys.argv)>=3 : + name = sys.argv[2] +else : name = "inTest" + + + + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=STREAM ID="+name+" DESTINATION=tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABngJSS8xMyF4t82otZmCDhrKjbm-QLMtOLoumwR28ebDHEd4clF6O7aRa3d3yRH7p\n") +sys.stdout.write(sess.recv(1000)) + + + + + +def accept() : + sock = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) + sock.connect(("127.0.0.1",7656)); + sock.send("HELLO VERSION MIN=3.0 MAX=3.0\n") + sys.stdout.write(sock.recv(1000)) + sock.send("STREAM ACCEPT ID=" + name + silent+"\n") + print "STREAM ACCEPT ID="+name+silent + if (silent==" SILENT=false") : + sys.stdout.write( sock.recv(100) ) + return sock + +def echo( sock, lines ) : + l = 0 + while lines==-1 or l=2 : + silent = " SILENT="+sys.argv[1] +else : silent = " SILENT=false" + +if len(sys.argv)>=3 : + name = " ID="+sys.argv[2] +else : name = " ID=testOutStream" + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=STREAM"+name+" DESTINATION=EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHNqwgkhJnBW4ymaRsdVmITAha-ff0UiALfKSlznqp5HcSewgMHbzQ0I01TQytFnW\n") +sys.stdout.write(sess.recv(1000)) + +sock = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sock.connect(("127.0.0.1",7656)); +sock.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sock.recv(1000)) +sock.send("STREAM CONNECT"+name+" DESTINATION=tYhjbFlFL38WFuO5eCzTvE0UBr4RfaqWMKlekGeMoB-Ouz7nYaWfiS-9j3jMiZT7FH~pwdmoSREOs2ZbXK84sR59P~pPfeCMxnJrk57f3U9uKzXkesjkKWYco3YAGs-G8sw8Fu2FBx0Do57yBdA9~j8Zq6pMjmgPBXCLuXG3vo0Z8zUWCjApJyFY6OXYopHck9Fz9vKy7YhC6zXFHfEuNHVkAooduiLd~aCoGij0TW3lH2rTVU-lx-DUdi6edxQ5-RvDNkXfikvytoCpRkivbNVytjCJLk~7RNU4FpBD20wTZWNJmEG3OY3cjNjawJVFdNjtgczh9K7gZ7ad-NjVjZVhXEj1lU8mk~vAH-2QE5om8dstWUwWoNDwmVDlvIJNKzQmahG~VrpFexFHXO0n3fKIXcSgWGOHDExM8w9neCt7AxUjxPDtXXuYNW~bRwcfiL-C9~z4K9rmwiTPZX0lmsToSXTF28l7WAoj~TMT9kZAjQeFRRWU5oW5oxVuonVvAAAA"+silent+"\n") + +# wait for acknowledgement before sending data, if we asked for it +if (silent==" SILENT=false") : + sys.stdout.write(sock.recv(1000)) + +for i in range(1,11) : + sock.send(str(i)+'\n') + buf=sock.recv(1000) + sys.stdout.write(str(i)+' '+buf) + if not buf : break + +print + + diff --git a/apps/sam/Demos/streamTests/samOutWithNaming.py b/apps/sam/Demos/streamTests/samOutWithNaming.py new file mode 100755 index 000000000..6aa6476bc --- /dev/null +++ b/apps/sam/Demos/streamTests/samOutWithNaming.py @@ -0,0 +1,51 @@ +#!/usr/bin/python + + +# open a I2P stream destination +# then open another stream that connects to the destination created by samForward.py or samIn.py +# then send bytes through the stream +# usage : +# ./samOut.py [ silent [ sessionName ] ] +# +# silent : should the first incoming after the connection request contain the connection status message (true or false) +# sessionName : session id (default : "forward") + +import socket +import sys +import time + +if len(sys.argv)>=2 : + silent = " SILENT="+sys.argv[1] +else : silent = " SILENT=false" + +if len(sys.argv)>=3 : + name = " ID="+sys.argv[2] +else : name = " ID=testOutStream" + +sess = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sess.connect(("127.0.0.1",7656)); +sess.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sess.recv(1000)) +sess.send("SESSION CREATE STYLE=STREAM"+name+" DESTINATION=EYUpJFeW9tiubXR0aOjvCJ~ndj3xN0Wn-ljuGdbpOEttPg7nj0VCTOQDJ~FAolzn9FIDdmR3VjM0OFFDT46Q5HN4vShXFE2VNC8e3~GjzxJfaJhijRC2R9oIOzsNlzKtInD2o9lh0PxPioNMCigwmgWuqlQHs4tjWeaYRAtooHxbrtuoCIhIdGfyVV-nAcPiyYbouKq3leETXE~4kBXm-LfWfyPtrv6OuDk3GBVVcthv19GYBmnl2YI8HpJjc-G-TvNkgYishjzIJyEW-Xrpy43R4ZBXlyQqnheGLlbOEY8NLDbyNHLRMMOGbcr~67SVE3Iw3RqQ3Dhrkq2FCaQwcDucfIUCCbOfCZgu0hlnCkS42xsUvegQeiwMxbdI~h9v7vcR3yFFOrHX6WQvIZSbFLKNGArGJcfmOJVLqw1wTC4AgYXjk3csVDPd-QWbMXOuodyBgrg27Ds2BBYTsVXWskoo6ASsMIQZ6jMfL7PkY9dPLCRParIyzb9aPmf~MntNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHNqwgkhJnBW4ymaRsdVmITAha-ff0UiALfKSlznqp5HcSewgMHbzQ0I01TQytFnW\n") +sys.stdout.write(sess.recv(1000)) + +sock = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +sock.connect(("127.0.0.1",7656)); +sock.send("HELLO VERSION MIN=3.0 MAX=3.0\n") +sys.stdout.write(sock.recv(1000)) +sock.send("STREAM CONNECT"+name+" DESTINATION=http://amiga.i2p"+silent+"\n") + +# wait for acknowledgement before sending data, if we asked for it +if (silent==" SILENT=false") : + sys.stdout.write(sock.recv(1000)) + +while (1) : + buf=sock.recv(1000) + sys.stdout.write(buf) + if not buf : break + +print + + diff --git a/apps/sam/Demos/streamTests/server.py b/apps/sam/Demos/streamTests/server.py new file mode 100755 index 000000000..829a37e32 --- /dev/null +++ b/apps/sam/Demos/streamTests/server.py @@ -0,0 +1,41 @@ +#!/usr/bin/python + + +# echo server +# accepts a socket on specified port, writes on stdout and send back incoming data + +import socket +import sys + +if len(sys.argv)>=2 : + port = eval(sys.argv[1]) +else : port = 25000 + +#create an INET, STREAMing socket +serversocket = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) +#bind the socket to a public host, +# and a well-known port +serversocket.bind(("0.0.0.0", port)) + #become a server socket +serversocket.listen(1) + + + #accept connections from outside +(clientsocket, address) = serversocket.accept() + #now do something with the clientsocket + #in this case, we'll pretend this is a threaded server + +i = 0 +while 1 : + chunk = clientsocket.recv(1024) + i = i + 1 + sys.stdout.write(str(i)+' '+chunk) + if not chunk: break + clientsocket.send(str(i)+' '+chunk) + + +clientsocket.close() + +print + diff --git a/apps/sam/doc/sam.3.0-protocol.txt b/apps/sam/doc/sam.3.0-protocol.txt new file mode 100644 index 000000000..51c559798 --- /dev/null +++ b/apps/sam/doc/sam.3.0-protocol.txt @@ -0,0 +1,487 @@ +---------------------------------------------------------------------- +Simple Anonymous Messaging (SAM version 3.0) +---------------------------------------------------------------------- +Client application talks to SAM bridge, which deals with +all of the I2P functionality (using the ministreaming +lib for virtual streams, or I2CP directly for async messages). + +All client<-->SAM bridge communication is unencrypted and +unauthenticated. Access to the SAM +bridge should be protected through firewalls or other means +(perhaps the bridge may have ACLs on what IPs it accepts +connections from). + +All of these SAM messages are sent on a single line in plain ASCII, +terminated by the newline character (\n). The formatting shown +below is merely for readability, and while the first two words in +each message must stay in their specific order, the ordering of +the key=value pairs can change (e.g. "ONE TWO A=B C=D" or +"ONE TWO C=D A=B" are both perfectly valid constructions). In +addition, the protocol is case-sensitive. +In the following, message examples are preceded by "-> " for +messages sent by the client to the SAM bridge, and by "<- " for +messages sent by the SAM bridge to the client. + +I2P communications can take three distinct forms: +* Virtual streams +* Repliable datagrams (messages with a FROM field) +* Anonymous datagrams (raw anonymous messages) + +I2P communications are supported by I2P sessions, and each I2P +session is bound to an address (called destination). An I2P session +is associated with one of the three types above, and cannot carry +communications of another type. + + +---------------------------------------------------------------------- +SAM connection handshake +---------------------------------------------------------------------- +No SAM communication can occur until after the client and bridge have +agreed on a protocol version, which is done by the client sending +a HELLO and the bridge sending a HELLO REPLY: + +-> HELLO VERSION MIN=$min MAX=$max + +and + +<- HELLO REPLY RESULT=OK VERSION=3.0 + +*** In order to force protocol version 3.0, the values of $min and $max +*** must be "3.0". + +If the SAM bridge cannot find a suitable version, it replies with : + +<- HELLO REPLY RESULT=NOVERSION + +If some error occurred, such as a bad request format, it replies with : + +<- HELLO REPLY RESULT=I2P_ERROR MESSAGE={$message} + + +---------------------------------------------------------------------- +SAM sessions +---------------------------------------------------------------------- +A SAM session is created by a client opening a socket to the SAM +bridge, operating a handshake, and sending a SESSION CREATE message, +and the session terminates when the socket is disconnected. + +Each registered I2P Destination is uniquely associated with a session ID +(or nickname). + +Each session is uniquely associated with : + * the socket from which the client creates the session + * its ID (or nickname) + +The session creation message can only use one of these forms (messages +received through other forms are answered with an error message) : + +-> SESSION CREATE + STYLE={STREAM,DATAGRAM,RAW} + ID={$nickname} + DESTINATION={$private_destination_key,TRANSIENT} + [option=value]* + +DESTINATION specifies what destination should be used for +sending and receiving messages/streams. It has to be a suitable +private base64 destination key. If the destination is +specified as TRANSIENT, the SAM bridge creates a new destination. + +{$nickname} is the choice of the client. No whitespace is allowed. + +Additional options given are passed to the I2P session +configuration if not interpreted by the SAM bridge (e.g. +outbound.length=0). These options are documented below. + +The SAM bridge itself should already be configured with what router +it should communicate over I2P through (though if need be there may +be a way to provide an override, e.g. i2cp.tcp.host=localhost and +i2cp.tcp.port=7654). + +After receiving the session create message, the SAM bridge will reply +with a session status message, as follows: + +If the creation was successful : +<- SESSION STATUS RESULT=OK DESTINATION={$private_destination_key} + +If the nickname is already associated with a session : +<- SESSION STATUS RESULT=DUPLICATED_ID + +If the destination is already in use : +<- SESSION STATUS RESULT=DUPLICATED_DEST + +If the destination is not a valid private destination key : +<- SESSION STATUS RESULT=INVALID_KEY + +If some other error has occurred : +<- SESSION STATUS RESULT=I2P_ERROR MESSAGE={$message} + +If it's not OK, the MESSAGE should contain human-readable information +as to why the session could not be created. + + +SAM sessions live and die with the socket they are associated with. +When the socket is closed, the session dies, and all communications +using the session die at the same time. And the other way round, when +the session dies for any reason, the SAM bridge closes the socket. + + +---------------------------------------------------------------------- +SAM virtual streams +---------------------------------------------------------------------- +Virtual streams are guaranteed to be sent reliably and in order, with +failure and success notification as soon as it is available. + +Streams are bidirectional communication sockets between two I2P +destinations, but their opening has to be requested by one of them. +Hereafter, CONNECT commands are used by the SAM client for such a +request. FORWARD / ACCEPT commands are used by the SAM client when +he wants to listen to requests coming from other I2P destinations. + + +----------------------------- +SAM virtual streams : CONNECT +----------------------------- +A client asks for a connection by : + * opening a new socket with the SAM bridge + * passing the same HELLO handshake as above + * sending the connection command : + +-> STREAM CONNECT + ID={$nickname} + DESTINATION=$peer_public_base64_key + [SILENCE={true,false}] + +This establishes a new virtual connection from the local session +whose ID is {$nickname} to the specified peer. + +If SILENCE=true is passed, the SAM bridge won't issue any other message +on the socket : if the connection fails, the socket will be closed. +If the connection succeeds, all remaining data passing through the +current socket is forwarded from and to the connected I2P destination +peer. + +If SILENCE=false, which is the default value, the SAM bridge sends a +last message to its client before forwarding or shutting down the +socket : + +<- STREAM STATUS + RESULT=$result + [MESSAGE=...] + +The RESULT value may be one of: + + OK + CANT_REACH_PEER + I2P_ERROR + INVALID_KEY + INVALID_ID + TIMEOUT + +If the RESULT is OK, all remaining data passing through the +current socket is forwarded from and to the connected I2P destination +peer. If the connection was not possible (timeout, etc), +RESULT will contain the appropriate error value (accompanied by an +optional human-readable MESSAGE), and the SAM bridge closes the +socket. + +---------------------------- +SAM virtual streams : ACCEPT +---------------------------- + +A client waits for an incoming connection request by : + * opening a new socket with the SAM bridge + * passing the same HELLO handshake as above + * sending the accept command : + +-> STREAM ACCEPT + ID={$nickname} + [SILENCE={true,false}] + +This makes the session ${nickname} listen for one incoming +connection request from the I2P network. + +The SAM bridge answers with : + +<- STREAM STATUS + RESULT=$result + [MESSAGE=...] + +The RESULT value may be one of: + + OK + I2P_ERROR + INVALID_ID + +If the result is not OK, the socket is closed immediately by the SAM +bridge. If the result is OK, the SAM bridge starts waiting for an +incoming connection request from another I2P peer. When a request +arrives, the SAM bridge accepts it and : + + * If SILENCE=true was passed, the SAM bridge won't issue any other message +on the client socket : all remaining data passing through the +current socket is forwarded from and to the connected I2P destination +peer. + * If SILENCE=false was passed, which is the default value, the SAM bridge +sends the client an ASCII line containing the base64 public destination key +of the requesting peer. After this '\n' terminated line, all remaining data +passing through the current socket is forwarded from and to the connected +I2P destination peer, until one of the peer closes the socket. + +----------------------------- +SAM virtual streams : FORWARD +----------------------------- + +A client can use a regular socket server and wait for connection requests +coming from I2P. For that, the client has to : + * open a new socket with the SAM bridge + * pass the same HELLO handshake as above + * send the forward command : + +-> STREAM FORWARD + ID={$nickname} + PORT={$port} + [HOST={$host}] + [SILENCE={true,false}] + +This makes the session ${nickname} listen for incoming +connection requests from the I2P network. + +The SAM bridge answers with : + +<- STREAM STATUS + RESULT=$result + [MESSAGE=...] + +The RESULT value may be one of: + + OK + I2P_ERROR + INVALID_ID + + * {$host} is the hostname or IP address of the socket server to which +SAM will forward connection requests. If not given, SAM takes the IP +of the socket that issued the forward command. + + * {$port} is the port number of the socket server to which SAM will +forward connection requests. It is mandatory. + +When a connexion request arrives from I2P, the SAM bridge requests a +socket connexion from {$host}:{$port}. If it is accepted after no more +than 3 seconds, SAM will accept the connexion from I2P, and then : + + * If SILENCE=true was passed, all data passing through the obtained +current socket is forwarded from and to the connected I2P destination +peer. + * If SILENCE=false was passed, which is the default value, the SAM bridge +sends on the obtained socket an ASCII line containing the base64 public +destination key of the requesting peer. After this '\n' terminated line, +all remaining data passing through the socket is forwarded from and to +the connected I2P destination peer, until one of the sides closes the +socket. + + + +The I2P router will stop listening to incoming connection requests as +soon as the "forwarding" socket is closed. + + + + +---------------------------------------------------------------------- +SAM repliable datagrams : sending a datagram +---------------------------------------------------------------------- +While I2P doesn't inherently contain a FROM address, for ease of use +an additional layer is provided as repliable datagrams - unordered +and unreliable messages of up to 31KB in size that include a FROM +address (leaving up to 1KB for header material). This FROM address +is authenticated internally by SAM (making use of the destination's +signing key to verify the source) and includes replay prevention. + +** First method : + +After establishing a SAM session with STYLE=DATAGRAM, the client can +send datagrams through SAM's UDP port (7655). + +The first line of a datagram sent through this port has to be in the +following format : + +3.0 {$nickname} {$base64_public_destination_key} + + * 3.0 is the version of SAM + * {$nickname} is the id of the DGRAM session that will be used + * {$base64_public_destination_key} is the destination of the + datagram + * this line is '\n' terminated. + +The first line will be discarded by SAM before sending the remaining +of the message to the specified destination. + +** Second method : + +Datagrams can also be sent through the socket from which the datagram +session was opened. See the "DATAGRAM SEND" command of SAM versions 1 +and 2. + +---------------------------------------------------------------------- +SAM repliable datagrams : receiving a datagram +---------------------------------------------------------------------- +Received datagrams are written by SAM on the socket from which the +datagram session was opened, unless specified otherwise by the CREATE +command. + +When a datagram arrives, the bridge delivers it to the client via the +message : + +<- DATAGRAM RECEIVED + DESTINATION=$base64key + SIZE=$numBytes\n[$numBytes of data] + +The SAM bridge never exposes to the client the authentication headers +or other fields, merely the data that the sender provided. This +continues until the session is closed (by the client dropping the +connection). + +---------------------------------------------------------------------- +SAM repliable datagrams : forwarding datagrams +---------------------------------------------------------------------- +When creating a datagram session, the client can ask SAM to forward +incoming messages to a specified ip:port. It does so by issuing the +CREATE command with PORT and HOST options : + +-> SESSION CREATE + STYLE=DATAGRAM + ID={$nickname} + DESTINATION={$private_destination_key,TRANSIENT} + PORT={$port} + [HOST={$host}] + [option=value]* + + * {$host} is the hostname or IP address of the datagram server to + which SAM will forward datagrams. If not given, SAM takes the + IP of the socket that issued the forward command. + + * {$port} is the port number of the datagram server to which SAM + will forward datagrams. + +When a datagram arrives, the bridge sends to the specified host:port +a message containing the following data : + +${sender_base64_destination_key}\n{$datagram_payload} + + +---------------------------------------------------------------------- +SAM anonymous datagrams +---------------------------------------------------------------------- +Squeezing the most out of I2P's bandwidth, SAM allows clients to send +and receive anonymous datagrams, leaving authentication and reply +information up to the client themselves. These datagrams are +unreliable and unordered, and may be up to 32KB in size. + +After establishing a SAM session with STYLE=RAW, the client can +send anonymous datagrams throug the SAM bridge exactly the same way +he sends non anonymous datagrams. + +Both ways of receiving datagrams are also available for anonymous +datagrams. + +When anonymous datagrams are to be written to the socket that created +the session,the bridge delivers it to the client via: + +<- RAW RECEIVED + SIZE=$numBytes\n[$numBytes of data] + +When anonymous datagrams are to be forwarded to some host:port, +the bridge sends to the specified host:port a message containing +the following data : + +{$datagram_payload} + + +---------------------------------------------------------------------- +SAM utility functionality +---------------------------------------------------------------------- +The following message can be used by the client to query the SAM +bridge for name resolution: + + NAMING LOOKUP + NAME=$name + +which is answered by + + NAMING REPLY + RESULT=$result + NAME=$name + [VALUE=$base64key] + [MESSAGE=$message] + + +The RESULT value may be one of: + + OK + INVALID_KEY + KEY_NOT_FOUND + +If NAME=ME, then the reply will contain the base64key used by the +current session (useful if you're using a TRANSIENT one). If $result +is not OK, MESSAGE may convey a descriptive message, such as "bad +format", etc. + +Public and private base64 keys can be generated using the following +message: + + DEST GENERATE + +which is answered by + + DEST REPLY + PUB=$pubkey + PRIV=$privkey + +---------------------------------------------------------------------- +RESULT values +---------------------------------------------------------------------- +These are the values that can be carried by the RESULT field, with +their meaning: + + OK Operation completed succesfully + CANT_REACH_PEER The peer exists, but cannot be reached + DUPLICATED_DEST The specified Destination is already in use + I2P_ERROR A generic I2P error (e.g. I2CP disconnection, etc.) + INVALID_KEY The specified key is not valid (bad format, etc.) + KEY_NOT_FOUND The naming system can't resolve the given name + PEER_NOT_FOUND The peer cannot be found on the network + TIMEOUT Timeout while waiting for an event (e.g. peer answer) + +---------------------------------------------------------------------- +Tunnel Pool Options +---------------------------------------------------------------------- + +These options can be passed in as name=value pairs at the end of a +SAM SESSION CREATE line. + + inbound.nickname - Name shows up in I2P router console. + inbound.quantity - Number of tunnels, default 2. + inbound.backupQuantity - Number of backup tunnels, default 0. + inbound.rebuildPeriod - Obsolete - ignored - the router controls rebuilding + inbound.duration - Tunnels last X ms, default 10*60*1000. + (change not recommended, will break anonymmity + if it works at all) + inbound.length - Depth of tunnels, default 2. + inbound.lengthVariance - If negative, randomly skews from + (length - variance) to + (length + variance). If positive, from + length to (length + var), inclusive. + Default -1. + inbound.allowZeroHop - Zero hop allowed? Default "true". + outbound.* - Same properties as inbound. + i2p.streaming.connectDelay - If 0, connect ASAP. If positive, wait + until X ms have passed or output stream + is flushed or buffer fills. Default 0. + i2p.streaming.maxWindowSize - Max window size, default 64. + +---------------------------------------------------------------------- +Client library implementations: +---------------------------------------------------------------------- + C/C++: libSAM: http://www.innographx.com/mpc/libsam/ or i2p/sam/c/ + Python: Python/I2P: http://dev.i2p.net/contrib/apps/sam/python/index.html + Others: See apps/sam/ in I2P CVS. diff --git a/apps/sam/java/build.xml b/apps/sam/java/build.xml index bb692f2db..6a987b341 100644 --- a/apps/sam/java/build.xml +++ b/apps/sam/java/build.xml @@ -4,6 +4,7 @@ + @@ -18,9 +19,11 @@ + + @@ -28,20 +31,24 @@ srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" destdir="./build/obj" - classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" /> + classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar:../../streaming/java/build/streaming.jar" > + + + classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar:../../streaming/java/build/streaming.jar" > + + - + @@ -52,7 +59,7 @@ + + diff --git a/apps/sam/java/src/net/i2p/sam/SAMBridge.java b/apps/sam/java/src/net/i2p/sam/SAMBridge.java index ee7e33bb4..d6ed45ffe 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMBridge.java +++ b/apps/sam/java/src/net/i2p/sam/SAMBridge.java @@ -14,9 +14,10 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; +import java.net.InetSocketAddress; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -34,7 +35,7 @@ import net.i2p.util.Log; */ public class SAMBridge implements Runnable { private final static Log _log = new Log(SAMBridge.class); - private ServerSocket serverSocket; + private ServerSocketChannel serverSocket; private Properties i2cpProps; /** * filename in which the name to private key mapping should @@ -45,12 +46,23 @@ public class SAMBridge implements Runnable { * app designated destination name to the base64 of the I2P formatted * destination keys (Destination+PrivateKey+SigningPrivateKey) */ - private Map nameToPrivKeys; + private Map nameToPrivKeys; private boolean acceptConnections = true; private static final int SAM_LISTENPORT = 7656; + public static final String DEFAULT_SAM_KEYFILE = "sam.keys"; + public static final String PROP_TCP_HOST = "sam.tcp.host"; + public static final String PROP_TCP_PORT = "sam.tcp.port"; + protected static final String DEFAULT_TCP_HOST = "0.0.0.0"; + protected static final String DEFAULT_TCP_PORT = "7656"; + + public static final String PROP_DATAGRAM_HOST = "sam.udp.host"; + public static final String PROP_DATAGRAM_PORT = "sam.udp.port"; + protected static final String DEFAULT_DATAGRAM_HOST = "0.0.0.0"; + protected static final String DEFAULT_DATAGRAM_PORT = "7655"; + private SAMBridge() {} @@ -64,16 +76,18 @@ public class SAMBridge implements Runnable { */ public SAMBridge(String listenHost, int listenPort, Properties i2cpProps, String persistFile) { persistFilename = persistFile; - nameToPrivKeys = new HashMap(8); + nameToPrivKeys = new HashMap(8); loadKeys(); try { if ( (listenHost != null) && !("0.0.0.0".equals(listenHost)) ) { - serverSocket = new ServerSocket(listenPort, 0, InetAddress.getByName(listenHost)); + serverSocket = ServerSocketChannel.open(); + serverSocket.socket().bind(new InetSocketAddress(listenHost, listenPort)); if (_log.shouldLog(Log.DEBUG)) _log.debug("SAM bridge listening on " + listenHost + ":" + listenPort); } else { - serverSocket = new ServerSocket(listenPort); + serverSocket = ServerSocketChannel.open(); + serverSocket.socket().bind(new InetSocketAddress(listenPort)); if (_log.shouldLog(Log.DEBUG)) _log.debug("SAM bridge listening on 0.0.0.0:" + listenPort); } @@ -191,36 +205,50 @@ public class SAMBridge implements Runnable { } } + static class HelpRequested extends Exception {static final long serialVersionUID=0x1;} + /** * Usage: - *
SAMBridge [[listenHost ]listenPort[ name=val]*]
- * + *
SAMBridge [ keyfile [listenHost ] listenPort [ name=val ]* ]
+ * or: + *
SAMBridge [ name=val ]* 
+ * * name=val options are passed to the I2CP code to build a session, * allowing the bridge to specify an alternate I2CP host and port, tunnel * depth, etc. - * @param args [[listenHost ]listenPort[ name=val]*] + * @param args [ keyfile [ listenHost ] listenPort [ name=val ]* ] */ public static void main(String args[]) { String keyfile = DEFAULT_SAM_KEYFILE; int port = SAM_LISTENPORT; - String host = "0.0.0.0"; + String host = DEFAULT_TCP_HOST; Properties opts = null; if (args.length > 0) { - keyfile = args[0]; - int portIndex = 1; - try { - port = Integer.parseInt(args[portIndex]); - } catch (NumberFormatException nfe) { - host = args[1]; - portIndex++; - try { - port = Integer.parseInt(args[portIndex]); - } catch (NumberFormatException nfe1) { - usage(); - return; - } - } - opts = parseOptions(args, portIndex+1); + try { + opts = parseOptions(args, 0); + keyfile = args[0]; + int portIndex = 1; + try { + if (args.length>portIndex) port = Integer.parseInt(args[portIndex]); + } catch (NumberFormatException nfe) { + host = args[portIndex]; + portIndex++; + try { + if (args.length>portIndex) port = Integer.parseInt(args[portIndex]); + } catch (NumberFormatException nfe1) { + try { + port = Integer.parseInt(opts.getProperty(SAMBridge.PROP_TCP_PORT, SAMBridge.DEFAULT_TCP_PORT)); + host = opts.getProperty(SAMBridge.PROP_TCP_HOST, SAMBridge.DEFAULT_TCP_HOST); + } catch (NumberFormatException e) { + usage(); + return; + } + } + } + } catch (HelpRequested e) { + usage(); + return; + } } SAMBridge bridge = new SAMBridge(host, port, opts, keyfile); I2PAppThread t = new I2PAppThread(bridge, "SAMListener"); @@ -236,10 +264,11 @@ public class SAMBridge implements Runnable { t.start(); } - private static Properties parseOptions(String args[], int startArgs) { + private static Properties parseOptions(String args[], int startArgs) throws HelpRequested { Properties props = new Properties(); // skip over first few options for (int i = startArgs; i < args.length; i++) { + if (args[i].equals("-h")) throw new HelpRequested(); int eq = args[i].indexOf('='); if (eq <= 0) continue; if (eq >= args[i].length()-1) continue; @@ -255,50 +284,76 @@ public class SAMBridge implements Runnable { private static void usage() { System.err.println("Usage: SAMBridge [keyfile [listenHost] listenPortNum[ name=val]*]"); + System.err.println("or:"); + System.err.println(" SAMBridge [ name=val ]*"); System.err.println(" keyfile: location to persist private keys (default sam.keys)"); System.err.println(" listenHost: interface to listen on (0.0.0.0 for all interfaces)"); System.err.println(" listenPort: port to listen for SAM connections on (default 7656)"); System.err.println(" name=val: options to pass when connecting via I2CP, such as "); System.err.println(" i2cp.host=localhost and i2cp.port=7654"); + System.err.println(""); + System.err.println("Host and ports of the SAM bridge can be specified with the alternate"); + System.err.println("form by specifying options "+SAMBridge.PROP_TCP_HOST+" and/or "+ + SAMBridge.PROP_TCP_PORT); + System.err.println(""); + System.err.println("Options "+SAMBridge.PROP_DATAGRAM_HOST+" and "+SAMBridge.PROP_DATAGRAM_PORT+ + " specify the listening ip"); + System.err.println("range and the port of SAM datagram server. This server is"); + System.err.println("only launched after a client creates the first SAM datagram"); + System.err.println("or raw session, after a handshake with SAM version >= 3.0."); + System.err.println(""); + System.err.println("The option loglevel=[DEBUG|WARN|ERROR|CRIT] can be used"); + System.err.println("for tuning the log verbosity.\n"); } public void run() { if (serverSocket == null) return; try { while (acceptConnections) { - Socket s = serverSocket.accept(); + SocketChannel s = serverSocket.accept(); if (_log.shouldLog(Log.DEBUG)) _log.debug("New connection from " - + s.getInetAddress().toString() + ":" - + s.getPort()); + + s.socket().getInetAddress().toString() + ":" + + s.socket().getPort()); - try { - SAMHandler handler = SAMHandlerFactory.createSAMHandler(s, i2cpProps); - if (handler == null) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("SAM handler has not been instantiated"); + class HelloHandler implements Runnable { + SocketChannel s ; + SAMBridge parent ; + HelloHandler(SocketChannel s, SAMBridge parent) { + this.s = s ; + this.parent = parent ; + } + public void run() { try { - s.close(); - } catch (IOException e) {} - continue; - } - handler.setBridge(this); - handler.startHandling(); - } catch (SAMException e) { - if (_log.shouldLog(Log.ERROR)) - _log.error("SAM error: " + e.getMessage(), e); - try { - String reply = "HELLO REPLY RESULT=I2P_ERROR MESSAGE=\"" + e.getMessage() + "\"\n"; - s.getOutputStream().write(reply.getBytes("ISO-8859-1")); - } catch (IOException ioe) { - if (_log.shouldLog(Log.ERROR)) - _log.error("SAM Error sending error reply", ioe); - } - try { s.close(); } catch (IOException ioe) {} - } catch (Exception ee) { - try { s.close(); } catch (IOException ioe) {} - _log.log(Log.CRIT, "Unexpected error handling SAM connection", ee); - } + SAMHandler handler = SAMHandlerFactory.createSAMHandler(s, i2cpProps); + if (handler == null) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("SAM handler has not been instantiated"); + try { + s.close(); + } catch (IOException e) {} + return; + } + handler.setBridge(parent); + handler.startHandling(); + } catch (SAMException e) { + if (_log.shouldLog(Log.ERROR)) + _log.error("SAM error: " + e.getMessage(), e); + try { + String reply = "HELLO REPLY RESULT=I2P_ERROR MESSAGE=\"" + e.getMessage() + "\"\n"; + s.write(ByteBuffer.wrap(reply.getBytes("ISO-8859-1"))); + } catch (IOException ioe) { + if (_log.shouldLog(Log.ERROR)) + _log.error("SAM Error sending error reply", ioe); + } + try { s.close(); } catch (IOException ioe) {} + } catch (Exception ee) { + try { s.close(); } catch (IOException ioe) {} + _log.log(Log.CRIT, "Unexpected error handling SAM connection", ee); + } + } + } + new I2PAppThread(new HelloHandler(s,this), "HelloHandler").start(); } } catch (Exception e) { if (_log.shouldLog(Log.ERROR)) diff --git a/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java b/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java index a3e20f7df..c8d31b489 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMDatagramSession.java @@ -30,7 +30,7 @@ public class SAMDatagramSession extends SAMMessageSession { private final static Log _log = new Log(SAMDatagramSession.class); public static int DGRAM_SIZE_MAX = 31*1024; - private SAMDatagramReceiver recv = null; + protected SAMDatagramReceiver recv = null; private I2PDatagramMaker dgramMaker; private I2PDatagramDissector dgramDissector = new I2PDatagramDissector(); @@ -84,9 +84,10 @@ public class SAMDatagramSession extends SAMMessageSession { public boolean sendBytes(String dest, byte[] data) throws DataFormatException { if (data.length > DGRAM_SIZE_MAX) throw new DataFormatException("Datagram size exceeded (" + data.length + ")"); - - byte[] dgram = dgramMaker.makeI2PDatagram(data); - + byte[] dgram ; + synchronized (dgramMaker) { + dgram = dgramMaker.makeI2PDatagram(data); + } return sendBytesThroughMessageSession(dest, dgram); } diff --git a/apps/sam/java/src/net/i2p/sam/SAMException.java b/apps/sam/java/src/net/i2p/sam/SAMException.java index e51e35ea4..ae965a4c8 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMException.java +++ b/apps/sam/java/src/net/i2p/sam/SAMException.java @@ -15,11 +15,13 @@ package net.i2p.sam; */ public class SAMException extends Exception { + static final long serialVersionUID = 1 ; + public SAMException() { - super(); + super(); } public SAMException(String s) { - super(s); + super(s); } } diff --git a/apps/sam/java/src/net/i2p/sam/SAMHandler.java b/apps/sam/java/src/net/i2p/sam/SAMHandler.java index 64d824a57..d53a5a662 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMHandler.java +++ b/apps/sam/java/src/net/i2p/sam/SAMHandler.java @@ -9,9 +9,8 @@ package net.i2p.sam; */ import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; +import java.nio.channels.SocketChannel; +import java.nio.ByteBuffer; import java.util.Properties; import net.i2p.util.I2PAppThread; @@ -32,8 +31,7 @@ public abstract class SAMHandler implements Runnable { protected SAMBridge bridge = null; private Object socketWLock = new Object(); // Guards writings on socket - private Socket socket = null; - private OutputStream socketOS = null; // Stream associated to socket + protected SocketChannel socket = null; protected int verMajor = 0; protected int verMinor = 0; @@ -53,10 +51,9 @@ public abstract class SAMHandler implements Runnable { * @param i2cpProps properties to configure the I2CP connection (host, port, etc) * @throws IOException */ - protected SAMHandler(Socket s, + protected SAMHandler(SocketChannel s, int verMajor, int verMinor, Properties i2cpProps) throws IOException { socket = s; - socketOS = socket.getOutputStream(); this.verMajor = verMajor; this.verMinor = verMinor; @@ -86,8 +83,8 @@ public abstract class SAMHandler implements Runnable { * @return input stream * @throws IOException */ - protected final InputStream getClientSocketInputStream() throws IOException { - return socket.getInputStream(); + protected final SocketChannel getClientSocket() { + return socket ; } /** @@ -98,13 +95,17 @@ public abstract class SAMHandler implements Runnable { * @param data A byte array to be written * @throws IOException */ - protected final void writeBytes(byte[] data) throws IOException { + protected final void writeBytes(ByteBuffer data) throws IOException { synchronized (socketWLock) { - socketOS.write(data); - socketOS.flush(); + writeBytes(data, socket); } } + static public void writeBytes(ByteBuffer data, SocketChannel out) throws IOException { + while (data.hasRemaining()) out.write(data); + out.socket().getOutputStream().flush(); + } + /** * If you're crazy enough to write to the raw socket, grab the write lock * with getWriteLock(), synchronize against it, and write to the getOut() @@ -112,7 +113,6 @@ public abstract class SAMHandler implements Runnable { * @return socket Write lock object */ protected Object getWriteLock() { return socketWLock; } - protected OutputStream getOut() { return socketOS; } /** * Write a string to the handler's socket. This method must @@ -121,21 +121,25 @@ public abstract class SAMHandler implements Runnable { * * @param str A byte array to be written * - * @return True is the string was successfully written, false otherwise + * @return True if the string was successfully written, false otherwise */ protected final boolean writeString(String str) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Sending the client: [" + str + "]"); - try { - writeBytes(str.getBytes("ISO-8859-1")); + return writeString(str, socket); + } + + public static boolean writeString(String str, SocketChannel out) + { + try { + writeBytes(ByteBuffer.wrap(str.getBytes("ISO-8859-1")), out); } catch (IOException e) { _log.debug("Caught IOException", e); return false; } - - return true; + return true ; } - + /** * Close the socket connected to the SAM client. * @@ -178,8 +182,8 @@ public abstract class SAMHandler implements Runnable { return ("SAM handler (class: " + this.getClass().getName() + "; SAM version: " + verMajor + "." + verMinor + "; client: " - + this.socket.getInetAddress().toString() + ":" - + this.socket.getPort() + ")"); + + this.socket.socket().getInetAddress().toString() + ":" + + this.socket.socket().getPort() + ")"); } public final void run() { diff --git a/apps/sam/java/src/net/i2p/sam/SAMHandlerFactory.java b/apps/sam/java/src/net/i2p/sam/SAMHandlerFactory.java index 21a0e97d2..e9a51214b 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMHandlerFactory.java +++ b/apps/sam/java/src/net/i2p/sam/SAMHandlerFactory.java @@ -9,9 +9,9 @@ package net.i2p.sam; */ import java.io.IOException; -import java.io.OutputStream; import java.io.UnsupportedEncodingException; -import java.net.Socket; +import java.nio.channels.SocketChannel; +import java.nio.ByteBuffer; import java.util.Properties; import java.util.StringTokenizer; @@ -34,17 +34,17 @@ public class SAMHandlerFactory { * @throws SAMException if the connection handshake (HELLO message) was malformed * @return A SAM protocol handler, or null if the client closed before the handshake */ - public static SAMHandler createSAMHandler(Socket s, Properties i2cpProps) throws SAMException { + public static SAMHandler createSAMHandler(SocketChannel s, Properties i2cpProps) throws SAMException { String line; StringTokenizer tok; try { - line = DataHelper.readLine(s.getInputStream()); + line = DataHelper.readLine(s.socket().getInputStream()); if (line == null) { _log.debug("Connection closed by client"); return null; } - tok = new StringTokenizer(line, " "); + tok = new StringTokenizer(line.trim(), " "); } catch (IOException e) { throw new SAMException("Error reading from socket: " + e.getMessage()); @@ -84,14 +84,15 @@ public class SAMHandlerFactory { } String ver = chooseBestVersion(minVer, maxVer); - if (ver == null) - throw new SAMException("No version specified"); - // Let's answer positively try { - OutputStream out = s.getOutputStream(); - out.write(("HELLO REPLY RESULT=OK VERSION=" - + ver + "\n").getBytes("ISO-8859-1")); + if (ver == null) { + s.write(ByteBuffer.wrap(("HELLO REPLY RESULT=NOVERSION\n").getBytes("ISO-8859-1"))); + return null ; + } + // Let's answer positively + s.write(ByteBuffer.wrap(("HELLO REPLY RESULT=OK VERSION=" + + ver + "\n").getBytes("ISO-8859-1"))); } catch (UnsupportedEncodingException e) { _log.error("Caught UnsupportedEncodingException (" + e.getMessage() + ")"); @@ -115,6 +116,9 @@ public class SAMHandlerFactory { case 2: handler = new SAMv2Handler(s, verMajor, verMinor, i2cpProps); break; + case 3: + handler = new SAMv3Handler(s, verMajor, verMinor, i2cpProps); + break; default: _log.error("BUG! Trying to initialize the wrong SAM version!"); throw new SAMException("BUG! (in handler instantiation)"); @@ -128,6 +132,7 @@ public class SAMHandlerFactory { /* Return the best version we can use, or null on failure */ private static String chooseBestVersion(String minVer, String maxVer) { + int minMajor = getMajor(minVer), minMinor = getMinor(minVer); int maxMajor = getMajor(maxVer), maxMinor = getMinor(maxVer); @@ -143,6 +148,8 @@ public class SAMHandlerFactory { float fmaxVer = (float) maxMajor + (float) maxMinor / 10 ; + if ( ( fminVer <= 3.0 ) && ( fmaxVer >= 3.0 ) ) return "3.0" ; + if ( ( fminVer <= 2.0 ) && ( fmaxVer >= 2.0 ) ) return "2.0" ; if ( ( fminVer <= 1.0 ) && ( fmaxVer >= 1.0 ) ) return "1.0" ; diff --git a/apps/sam/java/src/net/i2p/sam/SAMInvalidDirectionException.java b/apps/sam/java/src/net/i2p/sam/SAMInvalidDirectionException.java index b52ecda65..cd1c6b1a5 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMInvalidDirectionException.java +++ b/apps/sam/java/src/net/i2p/sam/SAMInvalidDirectionException.java @@ -15,7 +15,8 @@ package net.i2p.sam; * @author human */ public class SAMInvalidDirectionException extends Exception { - + static final long serialVersionUID = 1 ; + public SAMInvalidDirectionException() { super(); } diff --git a/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java b/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java index b29b2f84c..2c8ed2756 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java @@ -109,8 +109,7 @@ public abstract class SAMMessageSession { * @throws DataFormatException */ protected boolean sendBytesThroughMessageSession(String dest, byte[] data) throws DataFormatException { - Destination d = new Destination(); - d.fromBase64(dest); + Destination d = SAMUtils.getDest(dest); if (_log.shouldLog(Log.DEBUG)) { _log.debug("Sending " + data.length + " bytes to " + dest); diff --git a/apps/sam/java/src/net/i2p/sam/SAMRawSession.java b/apps/sam/java/src/net/i2p/sam/SAMRawSession.java index 7f56066b1..92bf4960d 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMRawSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMRawSession.java @@ -26,7 +26,7 @@ public class SAMRawSession extends SAMMessageSession { private final static Log _log = new Log(SAMRawSession.class); public static final int RAW_SIZE_MAX = 32*1024; - private SAMRawReceiver recv = null; + protected SAMRawReceiver recv = null; /** * Create a new SAM RAW session. * diff --git a/apps/sam/java/src/net/i2p/sam/SAMStreamReceiver.java b/apps/sam/java/src/net/i2p/sam/SAMStreamReceiver.java index 6d6d824b5..a57ddd681 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMStreamReceiver.java +++ b/apps/sam/java/src/net/i2p/sam/SAMStreamReceiver.java @@ -9,6 +9,7 @@ package net.i2p.sam; */ import java.io.IOException; +import java.nio.ByteBuffer; import net.i2p.data.Destination; @@ -53,14 +54,13 @@ public interface SAMStreamReceiver { public void notifyStreamOutgoingConnection(int id, String result, String msg) throws IOException; /** - * Send a byte array to a SAM client. + * Transmit a byte array from I2P to a SAM client. * * @param id Connection id * @param data Byte array to be received - * @param len Number of bytes in data * @throws IOException */ - public void receiveStreamBytes(int id, byte data[], int len) throws IOException; + public void receiveStreamBytes(int id, ByteBuffer data) throws IOException; /** * Notify that a connection has been closed diff --git a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java index 280562e48..aef2802bd 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java @@ -13,6 +13,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; import java.net.ConnectException; import java.net.NoRouteToHostException; import java.util.ArrayList; @@ -51,15 +53,15 @@ public class SAMStreamSession { protected SAMStreamReceiver recv = null; - private SAMStreamSessionServer server = null; + protected SAMStreamSessionServer server = null; protected I2PSocketManager socketMgr = null; private Object handlersMapLock = new Object(); /** stream id (Long) to SAMStreamSessionSocketReader */ - private HashMap handlersMap = new HashMap(); + private HashMap handlersMap = new HashMap(); /** stream id (Long) to StreamSender */ - private HashMap sendersMap = new HashMap(); + private HashMap sendersMap = new HashMap(); private Object idLock = new Object(); private int lastNegativeId = 0; @@ -76,6 +78,10 @@ public class SAMStreamSession { public static String PROP_FORCE_FLUSH = "sam.forceFlush"; public static String DEFAULT_FORCE_FLUSH = "false"; + public SAMStreamSession() { + + } + /** * Create a new SAM STREAM session. * @@ -166,7 +172,7 @@ public class SAMStreamSession { } } - private class DisconnectListener implements I2PSocketManager.DisconnectListener { + protected class DisconnectListener implements I2PSocketManager.DisconnectListener { public void sessionDisconnected() { close(); } @@ -572,19 +578,20 @@ public class SAMStreamSession { _log.debug("run() called for socket reader " + id); int read = -1; - byte[] data = new byte[SOCKET_HANDLER_BUF_SIZE]; + ByteBuffer data = ByteBuffer.allocateDirect(SOCKET_HANDLER_BUF_SIZE); try { InputStream in = i2pSocket.getInputStream(); while (stillRunning) { - read = in.read(data); + data.clear(); + read = Channels.newChannel(in).read(data); if (read == -1) { _log.debug("Handler " + id + ": connection closed"); break; } - - recv.receiveStreamBytes(id, data, read); + data.flip(); + recv.receiveStreamBytes(id, data); } } catch (IOException e) { _log.debug("Caught IOException", e); @@ -650,7 +657,7 @@ public class SAMStreamSession { protected class v1StreamSender extends StreamSender { - private List _data; + private List _data; private int _id; private ByteCache _cache; private OutputStream _out = null; @@ -660,7 +667,7 @@ public class SAMStreamSession { public v1StreamSender ( I2PSocket s, int id ) throws IOException { super ( s, id ); - _data = new ArrayList(1); + _data = new ArrayList(1); _id = id; _cache = ByteCache.getInstance(4, 32*1024); _out = s.getOutputStream(); diff --git a/apps/sam/java/src/net/i2p/sam/SAMUtils.java b/apps/sam/java/src/net/i2p/sam/SAMUtils.java index 8bb3fac30..859154c4f 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMUtils.java +++ b/apps/sam/java/src/net/i2p/sam/SAMUtils.java @@ -8,6 +8,7 @@ package net.i2p.sam; * */ +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Enumeration; @@ -19,8 +20,11 @@ import net.i2p.I2PException; import net.i2p.client.I2PClient; import net.i2p.client.I2PClientFactory; import net.i2p.client.naming.NamingService; +import net.i2p.data.Base64; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; +import net.i2p.data.PrivateKey; +import net.i2p.data.SigningPrivateKey; import net.i2p.util.Log; /** @@ -73,6 +77,22 @@ public class SAMUtils { return false; } } + + public static class InvalidDestination extends Exception { + static final long serialVersionUID = 0x1 ; + } + public static void checkPrivateDestination(String dest) throws InvalidDestination { + ByteArrayInputStream destKeyStream = new ByteArrayInputStream(Base64.decode(dest)); + + try { + new Destination().readBytes(destKeyStream); + new PrivateKey().readBytes(destKeyStream); + new SigningPrivateKey().readBytes(destKeyStream); + } catch (Exception e) { + throw new InvalidDestination(); + } + } + /** * Resolved the specified hostname. @@ -101,6 +121,27 @@ public class SAMUtils { return dest; } + /** + * Resolve the destination from a key or a hostname + * + * @param s Hostname or key to be resolved + * + * @return the Destination for the specified hostname, or null if not found + */ + public static Destination getDest(String s) throws DataFormatException + { + Destination d = new Destination() ; + try { + d.fromBase64(s); + } catch (DataFormatException e) { + d = lookupHost(s, null); + if ( d==null ) { + throw e ; + } + } + return d ; + } + /** * Parse SAM parameters, and put them into a Propetries object * @@ -114,7 +155,7 @@ public class SAMUtils { String token, param; Properties props = new Properties(); - StringBuffer value = new StringBuffer(); + StringBuilder value = new StringBuilder(); for (int i = 0; i < ntoks; ++i) { token = tok.nextToken(); diff --git a/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java b/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java index 93a9a8d66..a44c90543 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java +++ b/apps/sam/java/src/net/i2p/sam/SAMv1Handler.java @@ -12,12 +12,11 @@ import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; -import java.io.InputStream; import java.io.InterruptedIOException; -import java.io.OutputStream; import java.net.ConnectException; import java.net.NoRouteToHostException; -import java.net.Socket; +import java.nio.channels.SocketChannel; +import java.nio.ByteBuffer; import java.util.Properties; import java.util.StringTokenizer; @@ -40,14 +39,15 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag private final static Log _log = new Log(SAMv1Handler.class); - private final static int IN_BUFSIZE = 2048; + protected SAMRawSession rawSession = null; + protected SAMDatagramSession datagramSession = null; + protected SAMStreamSession streamSession = null; + protected SAMRawSession getRawSession() {return rawSession ;} + protected SAMDatagramSession getDatagramSession() {return datagramSession ;} + protected SAMStreamSession getStreamSession() {return streamSession ;} - private SAMRawSession rawSession = null; - private SAMDatagramSession datagramSession = null; - protected SAMStreamSession streamSession = null; - - private long _id; - private static volatile long __id = 0; + protected long _id; + protected static volatile long __id = 0; /** * Create a new SAM version 1 handler. This constructor expects @@ -60,7 +60,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag * @throws SAMException * @throws IOException */ - public SAMv1Handler(Socket s, int verMajor, int verMinor) throws SAMException, IOException { + public SAMv1Handler(SocketChannel s, int verMajor, int verMinor) throws SAMException, IOException { this(s, verMajor, verMinor, new Properties()); } /** @@ -75,7 +75,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag * @throws SAMException * @throws IOException */ - public SAMv1Handler(Socket s, int verMajor, int verMinor, Properties i2cpProps) throws SAMException, IOException { + public SAMv1Handler(SocketChannel s, int verMajor, int verMinor, Properties i2cpProps) throws SAMException, IOException { super(s, verMajor, verMinor, i2cpProps); _id = ++__id; _log.debug("SAM version 1 handler instantiated"); @@ -101,20 +101,32 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag _log.debug("SAM handling started"); try { - InputStream in = getClientSocketInputStream(); - int b = -1; - while (true) { if (shouldStop()) { _log.debug("Stop request found"); break; } - msg = DataHelper.readLine(in); + SocketChannel clientSocketChannel = getClientSocket() ; + if (clientSocketChannel == null) { + _log.info("Connection closed by client"); + break; + } + if (clientSocketChannel.socket() == null) { + _log.info("Connection closed by client"); + break; + } + java.io.InputStream is = clientSocketChannel.socket().getInputStream(); + if (is == null) { + _log.info("Connection closed by client"); + break; + } + msg = DataHelper.readLine(is); if (msg == null) { - _log.debug("Connection closed by client"); + _log.info("Connection closed by client (line read : null)"); break; } + msg = msg.trim(); if (_log.shouldLog(Log.DEBUG)) { _log.debug("New message received: [" + msg + "]"); @@ -175,27 +187,27 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } catch (IOException e) { _log.error("Error closing socket: " + e.getMessage()); } - if (rawSession != null) { - rawSession.close(); + if (getRawSession() != null) { + getRawSession().close(); } - if (datagramSession != null) { - datagramSession.close(); + if (getDatagramSession() != null) { + getDatagramSession().close(); } - if (streamSession != null) { - streamSession.close(); + if (getStreamSession() != null) { + getStreamSession().close(); } } } /* Parse and execute a SESSION message */ - private boolean execSessionMessage(String opcode, Properties props) { + protected boolean execSessionMessage(String opcode, Properties props) { String dest = "BUG!"; try{ if (opcode.equals("CREATE")) { - if ((rawSession != null) || (datagramSession != null) - || (streamSession != null)) { + if ((getRawSession() != null) || (getDatagramSession() != null) + || (getStreamSession() != null)) { _log.debug("Trying to create a session, but one still exists"); return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"Session already exists\"\n"); } @@ -293,7 +305,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } /* Parse and execute a DEST message*/ - private boolean execDestMessage(String opcode, Properties props) { + protected boolean execDestMessage(String opcode, Properties props) { if (opcode.equals("GENERATE")) { if (props.size() > 0) { @@ -318,7 +330,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } /* Parse and execute a NAMING message */ - private boolean execNamingMessage(String opcode, Properties props) { + protected boolean execNamingMessage(String opcode, Properties props) { if (opcode.equals("LOOKUP")) { if (props == null) { _log.debug("No parameters specified in NAMING LOOKUP message"); @@ -331,20 +343,23 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag return false; } - Destination dest; + Destination dest = null ; if (name.equals("ME")) { - if (rawSession != null) { - dest = rawSession.getDestination(); - } else if (streamSession != null) { - dest = streamSession.getDestination(); - } else if (datagramSession != null) { - dest = datagramSession.getDestination(); + if (getRawSession() != null) { + dest = getRawSession().getDestination(); + } else if (getStreamSession() != null) { + dest = getStreamSession().getDestination(); + } else if (getDatagramSession() != null) { + dest = getDatagramSession().getDestination(); } else { _log.debug("Lookup for SESSION destination, but session is null"); return false; } } else { - dest = SAMUtils.lookupHost(name, null); + try { + dest = SAMUtils.getDest(name); + } catch (DataFormatException e) { + } } if (dest == null) { @@ -364,8 +379,8 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag /* Parse and execute a DATAGRAM message */ - private boolean execDatagramMessage(String opcode, Properties props) { - if (datagramSession == null) { + protected boolean execDatagramMessage(String opcode, Properties props) { + if (getDatagramSession() == null) { _log.error("DATAGRAM message received, but no DATAGRAM session exists"); return false; } @@ -403,12 +418,12 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } try { - DataInputStream in = new DataInputStream(getClientSocketInputStream()); + DataInputStream in = new DataInputStream(getClientSocket().socket().getInputStream()); byte[] data = new byte[size]; in.readFully(data); - if (!datagramSession.sendBytes(dest, data)) { + if (!getDatagramSession().sendBytes(dest, data)) { _log.error("DATAGRAM SEND failed"); return true; } @@ -435,8 +450,8 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } /* Parse and execute a RAW message */ - private boolean execRawMessage(String opcode, Properties props) { - if (rawSession == null) { + protected boolean execRawMessage(String opcode, Properties props) { + if (getRawSession() == null) { _log.error("RAW message received, but no RAW session exists"); return false; } @@ -474,12 +489,12 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } try { - DataInputStream in = new DataInputStream(getClientSocketInputStream()); + DataInputStream in = new DataInputStream(getClientSocket().socket().getInputStream()); byte[] data = new byte[size]; in.readFully(data); - if (!rawSession.sendBytes(dest, data)) { + if (!getRawSession().sendBytes(dest, data)) { _log.error("RAW SEND failed"); return true; } @@ -507,7 +522,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag /* Parse and execute a STREAM message */ protected boolean execStreamMessage(String opcode, Properties props) { - if (streamSession == null) { + if (getStreamSession() == null) { _log.error("STREAM message received, but no STREAM session exists"); return false; } @@ -567,11 +582,11 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } try { - if (!streamSession.sendBytes(id, getClientSocketInputStream(), size)) { // data)) { + if (!getStreamSession().sendBytes(id, getClientSocket().socket().getInputStream(), size)) { // data)) { if (_log.shouldLog(Log.WARN)) _log.warn("STREAM SEND [" + size + "] failed"); boolean rv = writeString("STREAM CLOSED RESULT=CANT_REACH_PEER ID=" + id + " MESSAGE=\"Send of " + size + " bytes failed\"\n"); - streamSession.closeConnection(id); + getStreamSession().closeConnection(id); return rv; } @@ -622,7 +637,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag try { try { - if (!streamSession.connect(id, dest, props)) { + if (!getStreamSession().connect(id, dest, props)) { _log.debug("STREAM connection failed"); return false; } @@ -673,7 +688,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } } - boolean closed = streamSession.closeConnection(id); + boolean closed = getStreamSession().closeConnection(id); if ( (!closed) && (_log.shouldLog(Log.WARN)) ) _log.warn("Stream unable to be closed, but this is non fatal"); return true; @@ -691,7 +706,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag // SAMRawReceiver implementation public void receiveRawBytes(byte data[]) throws IOException { - if (rawSession == null) { + if (getRawSession() == null) { _log.error("BUG! Received raw bytes, but session is null!"); throw new NullPointerException("BUG! RAW session is null!"); } @@ -701,17 +716,18 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag String msgText = "RAW RECEIVED SIZE=" + data.length + "\n"; msg.write(msgText.getBytes("ISO-8859-1")); msg.write(data); + msg.flush(); if (_log.shouldLog(Log.DEBUG)) _log.debug("sending to client: " + msgText); - writeBytes(msg.toByteArray()); + writeBytes(ByteBuffer.wrap(msg.toByteArray())); } public void stopRawReceiving() { _log.debug("stopRawReceiving() invoked"); - if (rawSession == null) { + if (getRawSession() == null) { _log.error("BUG! Got raw receiving stop, but session is null!"); throw new NullPointerException("BUG! RAW session is null!"); } @@ -726,7 +742,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag // SAMDatagramReceiver implementation public void receiveDatagramBytes(Destination sender, byte data[]) throws IOException { - if (datagramSession == null) { + if (getDatagramSession() == null) { _log.error("BUG! Received datagram bytes, but session is null!"); throw new NullPointerException("BUG! DATAGRAM session is null!"); } @@ -740,14 +756,14 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag if (_log.shouldLog(Log.DEBUG)) _log.debug("sending to client: " + msgText); msg.write(data); - - writeBytes(msg.toByteArray()); + msg.flush(); + writeBytes(ByteBuffer.wrap(msg.toByteArray())); } public void stopDatagramReceiving() { _log.debug("stopDatagramReceiving() invoked"); - if (datagramSession == null) { + if (getDatagramSession() == null) { _log.error("BUG! Got datagram receiving stop, but session is null!"); throw new NullPointerException("BUG! DATAGRAM session is null!"); } @@ -764,7 +780,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag public void streamSendAnswer( int id, String result, String bufferState ) throws IOException { - if ( streamSession == null ) + if ( getStreamSession() == null ) { _log.error ( "BUG! Want to answer to stream SEND, but session is null!" ); throw new NullPointerException ( "BUG! STREAM session is null!" ); @@ -782,7 +798,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag public void notifyStreamSendBufferFree( int id ) throws IOException { - if ( streamSession == null ) + if ( getStreamSession() == null ) { _log.error ( "BUG! Stream outgoing buffer is free, but session is null!" ); throw new NullPointerException ( "BUG! STREAM session is null!" ); @@ -796,7 +812,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag public void notifyStreamIncomingConnection(int id, Destination d) throws IOException { - if (streamSession == null) { + if (getStreamSession() == null) { _log.error("BUG! Received stream connection, but session is null!"); throw new NullPointerException("BUG! STREAM session is null!"); } @@ -810,7 +826,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag public void notifyStreamOutgoingConnection ( int id, String result, String msg ) throws IOException { - if ( streamSession == null ) + if ( getStreamSession() == null ) { _log.error ( "BUG! Received stream connection, but session is null!" ); throw new NullPointerException ( "BUG! STREAM session is null!" ); @@ -830,34 +846,28 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag } } - public void receiveStreamBytes(int id, byte data[], int len) throws IOException { - if (streamSession == null) { + public void receiveStreamBytes(int id, ByteBuffer data) throws IOException { + if (getStreamSession() == null) { _log.error("Received stream bytes, but session is null!"); throw new NullPointerException("BUG! STREAM session is null!"); } - String msgText = "STREAM RECEIVED ID=" + id +" SIZE=" + len + "\n"; + String msgText = "STREAM RECEIVED ID=" + id +" SIZE=" + data.remaining() + "\n"; if (_log.shouldLog(Log.DEBUG)) _log.debug("sending to client: " + msgText); - byte prefix[] = msgText.getBytes("ISO-8859-1"); + ByteBuffer prefix = ByteBuffer.wrap(msgText.getBytes("ISO-8859-1")); - // dont waste so much memory - //ByteArrayOutputStream msg = new ByteArrayOutputStream(); - //msg.write(msgText.getBytes("ISO-8859-1")); - //msg.write(data, 0, len); - // writeBytes(msg.toByteArray()); Object writeLock = getWriteLock(); - OutputStream out = getOut(); synchronized (writeLock) { - out.write(prefix); - out.write(data, 0, len); - out.flush(); + while (prefix.hasRemaining()) socket.write(prefix); + while (data.hasRemaining()) socket.write(data); + socket.socket().getOutputStream().flush(); } } public void notifyStreamDisconnection(int id, String result, String msg) throws IOException { - if (streamSession == null) { + if (getStreamSession() == null) { _log.error("BUG! Received stream disconnection, but session is null!"); throw new NullPointerException("BUG! STREAM session is null!"); } @@ -873,7 +883,7 @@ public class SAMv1Handler extends SAMHandler implements SAMRawReceiver, SAMDatag public void stopStreamReceiving() { _log.debug("stopStreamReceiving() invoked", new Exception("stopped")); - if (streamSession == null) { + if (getStreamSession() == null) { _log.error("BUG! Got stream receiving stop, but session is null!"); throw new NullPointerException("BUG! STREAM session is null!"); } diff --git a/apps/sam/java/src/net/i2p/sam/SAMv2Handler.java b/apps/sam/java/src/net/i2p/sam/SAMv2Handler.java index 75f1bd4b4..fe1f379b7 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMv2Handler.java +++ b/apps/sam/java/src/net/i2p/sam/SAMv2Handler.java @@ -9,7 +9,7 @@ package net.i2p.sam; */ import java.io.IOException; -import java.net.Socket; +import java.nio.channels.SocketChannel; import java.util.Properties; import net.i2p.data.DataFormatException; @@ -36,7 +36,7 @@ public class SAMv2Handler extends SAMv1Handler implements SAMRawReceiver, SAMDat * @param verMajor SAM major version to manage (should be 2) * @param verMinor SAM minor version to manage */ - public SAMv2Handler ( Socket s, int verMajor, int verMinor ) throws SAMException, IOException + public SAMv2Handler ( SocketChannel s, int verMajor, int verMinor ) throws SAMException, IOException { this ( s, verMajor, verMinor, new Properties() ); } @@ -52,7 +52,7 @@ public class SAMv2Handler extends SAMv1Handler implements SAMRawReceiver, SAMDat * @param i2cpProps properties to configure the I2CP connection (host, port, etc) */ - public SAMv2Handler ( Socket s, int verMajor, int verMinor, Properties i2cpProps ) throws SAMException, IOException + public SAMv2Handler ( SocketChannel s, int verMajor, int verMinor, Properties i2cpProps ) throws SAMException, IOException { super ( s, verMajor, verMinor, i2cpProps ); } @@ -72,7 +72,7 @@ public class SAMv2Handler extends SAMv1Handler implements SAMRawReceiver, SAMDat /* Parse and execute a STREAM message */ protected boolean execStreamMessage ( String opcode, Properties props ) { - if ( streamSession == null ) + if ( getStreamSession() == null ) { _log.error ( "STREAM message received, but no STREAM session exists" ); return false; @@ -173,7 +173,7 @@ public class SAMv2Handler extends SAMv1Handler implements SAMRawReceiver, SAMDat } } - streamSession.setReceiveLimit ( id, limit, nolimit ) ; + getStreamSession().setReceiveLimit ( id, limit, nolimit ) ; return true; } diff --git a/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java index de5b7851b..4197597eb 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMv2StreamSession.java @@ -12,6 +12,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; import java.io.OutputStream; +import java.nio.channels.Channels; +import java.nio.ByteBuffer; import java.net.ConnectException; import java.net.NoRouteToHostException; import java.util.ArrayList; @@ -140,9 +142,6 @@ public class SAMv2StreamSession extends SAMStreamSession public class StreamConnector implements Runnable { - private Object runningLock = new Object(); - private boolean stillRunning = true; - private int id; private Destination dest ; private I2PSocketOptions opts ; @@ -245,7 +244,7 @@ public class SAMv2StreamSession extends SAMStreamSession protected class v2StreamSender extends StreamSender { - private List _data; + private List _data; private int _dataSize; private int _id; private ByteCache _cache; @@ -257,7 +256,7 @@ public class SAMv2StreamSession extends SAMStreamSession public v2StreamSender ( I2PSocket s, int id ) throws IOException { super ( s, id ); - _data = new ArrayList ( 1 ); + _data = new ArrayList ( 1 ); _dataSize = 0; _id = id; _cache = ByteCache.getInstance ( 10, 32 * 1024 ); @@ -511,7 +510,7 @@ public class SAMv2StreamSession extends SAMStreamSession _log.debug ( "run() called for socket reader " + id ); int read = -1; - byte[] data = new byte[SOCKET_HANDLER_BUF_SIZE]; + ByteBuffer data = ByteBuffer.allocateDirect(SOCKET_HANDLER_BUF_SIZE); try { @@ -533,7 +532,8 @@ public class SAMv2StreamSession extends SAMStreamSession break ; } - read = in.read ( data ); + data.clear(); + read = Channels.newChannel(in).read ( data ); if ( read == -1 ) { @@ -542,8 +542,8 @@ public class SAMv2StreamSession extends SAMStreamSession } totalReceived += read ; - - recv.receiveStreamBytes ( id, data, read ); + data.flip(); + recv.receiveStreamBytes ( id, data ); } } catch ( IOException e ) diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java new file mode 100644 index 000000000..d7f119377 --- /dev/null +++ b/apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java @@ -0,0 +1,90 @@ +/** + * @author MKVore + * + */ + +package net.i2p.sam; + +import java.io.IOException; +import java.io.InterruptedIOException; +import java.util.Properties; + +import net.i2p.client.I2PSessionException; +import net.i2p.data.DataFormatException; +import net.i2p.data.Destination; +import net.i2p.util.Log; + +import java.net.InetSocketAddress; +import java.net.SocketAddress ; +import java.nio.ByteBuffer; + +public class SAMv3DatagramSession extends SAMDatagramSession implements SAMv3Handler.Session, SAMDatagramReceiver { + + private final static Log _log = new Log ( SAMv3DatagramSession.class ); + + SAMv3Handler handler = null ; + SAMv3Handler.DatagramServer server = null ; + String nick = null ; + SocketAddress clientAddress = null ; + + public String getNick() { return nick; } + + /** + * build a DatagramSession according to informations registered + * with the given nickname + * @param nick nickname of the session + * @throws IOException + * @throws DataFormatException + * @throws I2PSessionException + */ + public SAMv3DatagramSession(String nick) + throws IOException, DataFormatException, I2PSessionException, SAMException { + + super(SAMv3Handler.sSessionsHash.get(nick).getDest(), + SAMv3Handler.sSessionsHash.get(nick).getProps(), + null + ); + this.nick = nick ; + this.recv = this ; + this.server = SAMv3Handler.DatagramServer.getInstance() ; + + SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick); + if ( rec==null ) throw new SAMException("Record disappeared for nickname : \""+nick+"\"") ; + + this.handler = rec.getHandler(); + + Properties props = rec.getProps(); + String portStr = props.getProperty("PORT") ; + if ( portStr==null ) { + _log.debug("receiver port not specified. Current socket will be used."); + } + else { + int port = Integer.parseInt(portStr); + + String host = props.getProperty("HOST"); + if ( host==null ) { + host = rec.getHandler().getClientIP(); + _log.debug("no host specified. Taken from the client socket : " + host+':'+port); + } + + + this.clientAddress = new InetSocketAddress(host,port); + } + } + + public void receiveDatagramBytes(Destination sender, byte[] data) throws IOException { + if (this.clientAddress==null) { + this.handler.receiveDatagramBytes(sender, data); + } else { + String msg = sender.toBase64()+"\n"; + ByteBuffer msgBuf = ByteBuffer.allocate(msg.length()+data.length); + msgBuf.put(msg.getBytes("ISO-8859-1")); + msgBuf.put(data); + msgBuf.flip(); + this.server.send(this.clientAddress, msgBuf); + } + } + + public void stopDatagramReceiving() { + } +} diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3Handler.java b/apps/sam/java/src/net/i2p/sam/SAMv3Handler.java new file mode 100644 index 000000000..80fa7cf63 --- /dev/null +++ b/apps/sam/java/src/net/i2p/sam/SAMv3Handler.java @@ -0,0 +1,783 @@ +package net.i2p.sam; +/* + * free (adj.): unencumbered; not under the control of others + * Written by human in 2004 and released into the public domain + * with no warranty of any kind, either expressed or implied. + * It probably won't make your computer catch on fire, or eat + * your children, but it might. Use at your own risk. + * + */ + + +import java.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InterruptedIOException; +import java.net.ConnectException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.NoRouteToHostException; +import java.nio.channels.DatagramChannel; +import java.nio.channels.SocketChannel; +import java.nio.ByteBuffer; +import java.util.Properties; +import java.util.HashMap; +import java.util.StringTokenizer; + +import net.i2p.I2PException; +import net.i2p.client.I2PSessionException; +import net.i2p.data.Base64; +import net.i2p.data.DataFormatException; +import net.i2p.data.DataHelper; +import net.i2p.data.Destination; +import net.i2p.util.Log; +import net.i2p.util.I2PAppThread; + +/** + * Class able to handle a SAM version 3 client connection. + * + * @author mkvore + */ + +public class SAMv3Handler extends SAMv1Handler +{ + private final static Log _log = new Log ( SAMv3Handler.class ); + + protected SAMv3RawSession rawSession = null ; + protected SAMv3DatagramSession datagramSession = null ; + protected SAMv3StreamSession streamSession = null ; + + protected SAMRawSession getRawSession() { + return rawSession ; + } + protected SAMDatagramSession getDatagramSession() { + return datagramSession ; + } + protected SAMStreamSession getStreamSession() { + return streamSession ; + } + + protected Session session = null ; + + interface Session { + String getNick(); + void close(); + boolean sendBytes(String dest, byte[] data) throws DataFormatException; + } + + /** + * Create a new SAM version 3 handler. This constructor expects + * that the SAM HELLO message has been still answered (and + * stripped) from the socket input stream. + * + * @param s Socket attached to a SAM client + * @param verMajor SAM major version to manage (should be 3) + * @param verMinor SAM minor version to manage + */ + public SAMv3Handler ( SocketChannel s, int verMajor, int verMinor ) throws SAMException, IOException + { + this ( s, verMajor, verMinor, new Properties() ); + } + + /** + * Create a new SAM version 3 handler. This constructor expects + * that the SAM HELLO message has been still answered (and + * stripped) from the socket input stream. + * + * @param s Socket attached to a SAM client + * @param verMajor SAM major version to manage (should be 3) + * @param verMinor SAM minor version to manage + * @param i2cpProps properties to configure the I2CP connection (host, port, etc) + */ + + public SAMv3Handler ( SocketChannel s, int verMajor, int verMinor, Properties i2cpProps ) throws SAMException, IOException + { + super ( s, verMajor, verMinor, i2cpProps ); + _log.debug("SAM version 3 handler instantiated"); + } + + public boolean verifVersion() + { + return (verMajor == 3 && verMinor == 0) ; + } + + static public class DatagramServer { + + private static DatagramServer _instance = null ; + private static DatagramChannel server = null ; + + public static DatagramServer getInstance() throws IOException { + return getInstance(new Properties()); + } + + public static DatagramServer getInstance(Properties props) throws IOException { + if (_instance==null) { + _instance = new DatagramServer(props); + } + return _instance ; + } + + public DatagramServer(Properties props) throws IOException { + if (server==null) { + server = DatagramChannel.open(); + } + + String host = props.getProperty(SAMBridge.PROP_DATAGRAM_HOST, SAMBridge.DEFAULT_DATAGRAM_HOST); + String portStr = props.getProperty(SAMBridge.PROP_DATAGRAM_PORT, SAMBridge.DEFAULT_DATAGRAM_PORT); + int port ; + try { + port = Integer.parseInt(portStr); + } catch (NumberFormatException e) { + port = Integer.parseInt(SAMBridge.DEFAULT_DATAGRAM_PORT); + } + + server.socket().bind(new InetSocketAddress(host, port)); + new I2PAppThread(new Listener(server), "DatagramListener").start(); + } + + public void send(SocketAddress addr, ByteBuffer msg) throws IOException { + server.send(msg, addr); + } + + class Listener implements Runnable { + + DatagramChannel server = null; + + public Listener(DatagramChannel server) + { + this.server = server ; + } + public void run() + { + ByteBuffer inBuf = ByteBuffer.allocateDirect(SAMRawSession.RAW_SIZE_MAX+1024); + + while (!Thread.interrupted()) + { + inBuf.clear(); + try { + server.receive(inBuf); + } catch (IOException e) { + break ; + } + inBuf.flip(); + ByteBuffer outBuf = ByteBuffer.wrap(new byte[inBuf.remaining()]); + outBuf.put(inBuf); + outBuf.flip(); + new I2PAppThread(new MessageDispatcher(outBuf.array()), "MessageDispatcher").start(); + } + } + } + } + + public static class MessageDispatcher implements Runnable + { + ByteArrayInputStream is = null ; + + public MessageDispatcher(byte[] buf) + { + this.is = new java.io.ByteArrayInputStream(buf) ; + } + + public void run() { + String header = null ; + String nick ; + String dest ; + String version ; + + try { + header = DataHelper.readLine(is).trim(); + StringTokenizer tok = new StringTokenizer(header, " "); + if (tok.countTokens() != 3) { + // This is not a correct message, for sure + _log.debug("Error in message format"); + return; + } + version = tok.nextToken(); + if (!"3.0".equals(version)) return ; + nick = tok.nextToken(); + dest = tok.nextToken(); + + byte[] data = new byte[is.available()]; + is.read(data); + SessionRecord rec = sSessionsHash.get(nick); + if (rec!=null) { + rec.getHandler().session.sendBytes(dest,data); + } + } catch (Exception e) {} + } + } + + public class SessionRecord + { + protected String m_dest ; + protected Properties m_props ; + protected ThreadGroup m_threadgroup ; + protected SAMv3Handler m_handler ; + + public SessionRecord( String dest, Properties props, SAMv3Handler handler ) + { + m_dest = new String(dest) ; + m_props = new Properties() ; + m_props.putAll(props); + m_threadgroup = null ; + m_handler = handler ; + } + + public SessionRecord( SessionRecord in ) + { + m_dest = in.getDest(); + m_props = in.getProps(); + m_threadgroup = in.getThreadGroup(); + m_handler = in.getHandler(); + } + + synchronized public String getDest() + { + return new String(m_dest) ; + } + synchronized public Properties getProps() + { + Properties p = new Properties(); + p.putAll(m_props); + return m_props; + } + synchronized public SAMv3Handler getHandler() + { + return m_handler ; + } + synchronized public ThreadGroup getThreadGroup() + { + return m_threadgroup ; + } + synchronized public void createThreadGroup(String name) + { + if (m_threadgroup == null) + m_threadgroup = new ThreadGroup(name); + } + } + + public static class SessionsDB + { + static final long serialVersionUID = 0x1 ; + + class ExistingId extends Exception { + static final long serialVersionUID = 0x1 ; + } + class ExistingDest extends Exception { + static final long serialVersionUID = 0x1 ; + } + + HashMap map ; + + public SessionsDB() { + map = new HashMap() ; + } + + synchronized public boolean put( String nick, SessionRecord session ) throws ExistingId, ExistingDest + { + if ( map.containsKey(nick) ) { + throw new ExistingId(); + } + for ( SessionRecord r : map.values() ) { + if (r.getDest().equals(session.getDest())) { + throw new ExistingDest(); + } + } + + if ( !map.containsKey(nick) ) { + session.createThreadGroup("SAM session "+nick); + map.put(nick, session) ; + return true ; + } + else + return false ; + } + synchronized public boolean del( String nick ) + { + SessionRecord rec = map.get(nick); + + if ( rec!=null ) { + map.remove(nick); + return true ; + } + else + return false ; + } + synchronized public SessionRecord get(String nick) + { + return map.get(nick); + } + synchronized public boolean containsKey( String nick ) + { + return map.containsKey(nick); + } + } + + public static SessionsDB sSessionsHash = new SessionsDB() ; + + public String getClientIP() + { + return this.socket.socket().getInetAddress().getHostAddress(); + } + + boolean stolenSocket = false ; + + boolean streamForwardingSocket = false ; + + public void stealSocket() + { + stolenSocket = true ; + this.stopHandling(); + } + + public void handle() { + String msg = null; + String domain = null; + String opcode = null; + boolean canContinue = false; + StringTokenizer tok; + Properties props; + + this.thread.setName("SAMv3Handler " + _id); + _log.debug("SAM handling started"); + + try { + InputStream in = getClientSocket().socket().getInputStream(); + + while (true) { + if (shouldStop()) { + _log.debug("Stop request found"); + break; + } + String line = DataHelper.readLine(in) ; + if (line==null) { + _log.debug("Connection closed by client (line read : null)"); + break; + } + msg = line.trim(); + + if (_log.shouldLog(Log.DEBUG)) { + _log.debug("New message received: [" + msg + "]"); + } + + if(msg.equals("")) { + _log.debug("Ignoring newline"); + continue; + } + + tok = new StringTokenizer(msg, " "); + if (tok.countTokens() < 2) { + // This is not a correct message, for sure + _log.debug("Error in message format"); + break; + } + domain = tok.nextToken(); + opcode = tok.nextToken(); + if (_log.shouldLog(Log.DEBUG)) { + _log.debug("Parsing (domain: \"" + domain + + "\"; opcode: \"" + opcode + "\")"); + } + props = SAMUtils.parseParams(tok); + + if (domain.equals("STREAM")) { + canContinue = execStreamMessage(opcode, props); + } else if (domain.equals("SESSION")) { + if (i2cpProps != null) + props.putAll(i2cpProps); // make sure we've got the i2cp settings + canContinue = execSessionMessage(opcode, props); + } else if (domain.equals("DEST")) { + canContinue = execDestMessage(opcode, props); + } else if (domain.equals("NAMING")) { + canContinue = execNamingMessage(opcode, props); + } else if (domain.equals("DATAGRAM")) { + canContinue = execDatagramMessage(opcode, props); + } else { + _log.debug("Unrecognized message domain: \"" + + domain + "\""); + break; + } + + if (!canContinue) { + break; + } + } + } catch (IOException e) { + _log.debug("Caught IOException (" + + e.getMessage() + ") for message [" + msg + "]", e); + } catch (Exception e) { + _log.error("Unexpected exception for message [" + msg + "]", e); + } finally { + _log.debug("Stopping handler"); + + if (!this.stolenSocket) + { + try { + closeClientSocket(); + } catch (IOException e) { + _log.error("Error closing socket: " + e.getMessage()); + } + } + if (streamForwardingSocket) + { + if (this.getStreamSession()!=null) { + try { + this.streamSession.stopForwardingIncoming(); + } catch (SAMException e) { + _log.error("Error while stopping forwarding connections: " + e.getMessage()); + } catch (InterruptedIOException e) { + _log.error("Interrupted while stopping forwarding connections: " + e.getMessage()); + } + } + } + + + + die(); + } + } + + protected void die() { + SessionRecord rec = null ; + + if (session!=null) { + session.close(); + rec = sSessionsHash.get(session.getNick()); + } + if (rec!=null) { + rec.getThreadGroup().interrupt() ; + while (rec.getThreadGroup().activeCount()>0) + try { + Thread.sleep(1000); + } catch ( InterruptedException e) {} + rec.getThreadGroup().destroy(); + sSessionsHash.del(session.getNick()); + } + } + + /* Parse and execute a SESSION message */ + @Override + protected boolean execSessionMessage(String opcode, Properties props) { + + String dest = "BUG!"; + String nick = null ; + boolean ok = false ; + + try{ + if (opcode.equals("CREATE")) { + if ((this.getRawSession()!= null) || (this.getDatagramSession() != null) + || (this.getStreamSession() != null)) { + _log.debug("Trying to create a session, but one still exists"); + return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"Session already exists\"\n"); + } + if (props == null) { + _log.debug("No parameters specified in SESSION CREATE message"); + return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"No parameters for SESSION CREATE\"\n"); + } + + dest = props.getProperty("DESTINATION"); + if (dest == null) { + _log.debug("SESSION DESTINATION parameter not specified"); + return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"DESTINATION not specified\"\n"); + } + props.remove("DESTINATION"); + + + if (dest.equals("TRANSIENT")) { + _log.debug("TRANSIENT destination requested"); + ByteArrayOutputStream priv = new ByteArrayOutputStream(640); + SAMUtils.genRandomKey(priv, null); + + dest = Base64.encode(priv.toByteArray()); + } else { + _log.debug("Custom destination specified [" + dest + "]"); + } + + try { + SAMUtils.checkPrivateDestination(dest); + } catch ( SAMUtils.InvalidDestination e ) { + return writeString("SESSION STATUS RESULT=INVALID_KEY\n"); + } + + nick = props.getProperty("ID"); + if (nick == null) { + _log.debug("SESSION ID parameter not specified"); + return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"ID not specified\"\n"); + } + props.remove("ID"); + + + String style = props.getProperty("STYLE"); + if (style == null) { + _log.debug("SESSION STYLE parameter not specified"); + return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"No SESSION STYLE specified\"\n"); + } + props.remove("STYLE"); + + + + // Record the session in the database sSessionsHash + Properties allProps = new Properties(); + allProps.putAll(i2cpProps); + allProps.putAll(props); + + + try { + sSessionsHash.put( nick, new SessionRecord(dest, allProps, this) ) ; + } catch (SessionsDB.ExistingId e) { + _log.debug("SESSION ID parameter already in use"); + return writeString("SESSION STATUS RESULT=DUPLICATED_ID\n"); + } catch (SessionsDB.ExistingDest e) { + return writeString("SESSION STATUS RESULT=DUPLICATED_DEST\n"); + } + + + // Create the session + + if (style.equals("RAW")) { + DatagramServer.getInstance(i2cpProps); + rawSession = newSAMRawSession(nick); + this.session = rawSession ; + } else if (style.equals("DATAGRAM")) { + DatagramServer.getInstance(i2cpProps); + datagramSession = newSAMDatagramSession(nick); + this.session = datagramSession ; + } else if (style.equals("STREAM")) { + streamSession = newSAMStreamSession(nick); + this.session = streamSession ; + } else { + _log.debug("Unrecognized SESSION STYLE: \"" + style +"\""); + return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"Unrecognized SESSION STYLE\"\n"); + } + ok = true ; + return writeString("SESSION STATUS RESULT=OK DESTINATION=" + + dest + "\n"); + } else { + _log.debug("Unrecognized SESSION message opcode: \"" + + opcode + "\""); + return writeString("SESSION STATUS RESULT=I2P_ERROR MESSAGE=\"Unrecognized opcode\"\n"); + } + } catch (DataFormatException e) { + _log.debug("Invalid destination specified"); + return writeString("SESSION STATUS RESULT=INVALID_KEY DESTINATION=" + dest + " MESSAGE=\"" + e.getMessage() + "\"\n"); + } catch (I2PSessionException e) { + _log.debug("I2P error when instantiating session", e); + return writeString("SESSION STATUS RESULT=I2P_ERROR DESTINATION=" + dest + " MESSAGE=\"" + e.getMessage() + "\"\n"); + } catch (SAMException e) { + _log.info("Funny SAM error", e); + return writeString("SESSION STATUS RESULT=I2P_ERROR DESTINATION=" + dest + " MESSAGE=\"" + e.getMessage() + "\"\n"); + } catch (IOException e) { + _log.error("Unexpected IOException", e); + return writeString("SESSION STATUS RESULT=I2P_ERROR DESTINATION=" + dest + " MESSAGE=\"" + e.getMessage() + "\"\n"); + } finally { + // unregister the session if it has not been created + if ( !ok && nick!=null ) { + sSessionsHash.del(nick) ; + session = null ; + } + } + } + + SAMv3StreamSession newSAMStreamSession(String login ) + throws IOException, DataFormatException, SAMException + { + return new SAMv3StreamSession( login ) ; + } + + SAMv3RawSession newSAMRawSession(String login ) + throws IOException, DataFormatException, SAMException, I2PSessionException + { + return new SAMv3RawSession( login ) ; + } + + SAMv3DatagramSession newSAMDatagramSession(String login ) + throws IOException, DataFormatException, SAMException, I2PSessionException + { + return new SAMv3DatagramSession( login ) ; + } + + /* Parse and execute a STREAM message */ + protected boolean execStreamMessage ( String opcode, Properties props ) + { + String nick = null ; + SessionRecord rec = null ; + + if ( session != null ) + { + _log.error ( "STREAM message received, but this session is a master session" ); + + try { + notifyStreamResult(true, "I2P_ERROR", "master session cannot be used for streams"); + } catch (IOException e) {} + return false; + } + + nick = props.getProperty("ID"); + if (nick == null) { + _log.debug("SESSION ID parameter not specified"); + try { + notifyStreamResult(true, "I2P_ERROR", "ID not specified"); + } catch (IOException e) {} + return false ; + } + props.remove("ID"); + + rec = sSessionsHash.get(nick); + + if ( rec==null ) { + _log.debug("STREAM SESSION ID does not exist"); + try { + notifyStreamResult(true, "INVALID_ID", "STREAM SESSION ID does not exist"); + } catch (IOException e) {} + return false ; + } + + streamSession = rec.getHandler().streamSession ; + + if (streamSession==null) { + _log.debug("specified ID is not a stream session"); + try { + notifyStreamResult(true, "I2P_ERROR", "specified ID is not a STREAM session"); + } catch (IOException e) {} + return false ; + } + + if ( opcode.equals ( "CONNECT" ) ) + { + return execStreamConnect ( props ); + } + else if ( opcode.equals ( "ACCEPT" ) ) + { + return execStreamAccept ( props ); + } + else if ( opcode.equals ( "FORWARD") ) + { + return execStreamForwardIncoming( props ); + } + else + { + _log.debug ( "Unrecognized RAW message opcode: \"" + + opcode + "\"" ); + try { + notifyStreamResult(true, "I2P_ERROR", "Unrecognized RAW message opcode: "+opcode ); + } catch (IOException e) {} + return false; + } + } + + + protected boolean execStreamConnect( Properties props) { + try { + if (props == null) { + notifyStreamResult(true,"I2P_ERROR","No parameters specified in STREAM CONNECT message"); + _log.debug("No parameters specified in STREAM CONNECT message"); + return false; + } + boolean verbose = props.getProperty("SILENT","false").equals("false"); + + String dest = props.getProperty("DESTINATION"); + if (dest == null) { + notifyStreamResult(verbose, "I2P_ERROR", "Destination not specified in RAW SEND message"); + _log.debug("Destination not specified in RAW SEND message"); + return false; + } + props.remove("DESTINATION"); + + try { + streamSession.connect( this, dest, props ); + return true ; + } catch (DataFormatException e) { + _log.debug("Invalid destination in STREAM CONNECT message"); + notifyStreamResult ( verbose, "INVALID_KEY", null ); + } catch (ConnectException e) { + _log.debug("STREAM CONNECT failed: " + e.getMessage()); + notifyStreamResult ( verbose, "CONNECTION_REFUSED", null ); + } catch (NoRouteToHostException e) { + _log.debug("STREAM CONNECT failed: " + e.getMessage()); + notifyStreamResult ( verbose, "CANT_REACH_PEER", null ); + } catch (InterruptedIOException e) { + _log.debug("STREAM CONNECT failed: " + e.getMessage()); + notifyStreamResult ( verbose, "TIMEOUT", null ); + } catch (I2PException e) { + _log.debug("STREAM CONNECT failed: " + e.getMessage()); + notifyStreamResult ( verbose, "I2P_ERROR", e.getMessage() ); + } + } catch (IOException e) { + } + return false ; + } + + protected boolean execStreamForwardIncoming( Properties props ) { + try { + try { + streamForwardingSocket = true ; + streamSession.startForwardingIncoming(props); + notifyStreamResult( true, "OK", null ); + return true ; + } catch (SAMException e) { + _log.debug("Forwarding STREAM connections failed: " + e.getMessage()); + notifyStreamResult ( true, "I2P_ERROR", "Forwarding failed : " + e.getMessage() ); + } + } catch (IOException e) { + } + return false ; + } + + protected boolean execStreamAccept( Properties props ) + { + boolean verbose = props.getProperty( "SILENT", "false").equals("false"); + try { + try { + notifyStreamResult(verbose, "OK", null); + streamSession.accept(this, verbose); + return true ; + } catch (InterruptedIOException e) { + _log.debug("STREAM ACCEPT failed: " + e.getMessage()); + notifyStreamResult( verbose, "TIMEOUT", e.getMessage() ); + } catch (I2PException e) { + _log.debug("STREAM ACCEPT failed: " + e.getMessage()); + notifyStreamResult ( verbose, "I2P_ERROR", e.getMessage() ); + } catch (SAMException e) { + _log.debug("STREAM ACCEPT failed: " + e.getMessage()); + notifyStreamResult ( verbose, "ALREADY_ACCEPTING", null ); + } + } catch (IOException e) { + } + return false ; + } + + + public void notifyStreamResult(boolean verbose, String result, String message) throws IOException + { + if (!verbose) return ; + + String out = "STREAM STATUS RESULT="+result; + if (message!=null) + out = out + " MESSAGE=\"" + message + "\""; + out = out + '\n'; + + if ( !writeString ( out ) ) + { + throw new IOException ( "Error notifying connection to SAM client" ); + } + } + + public void notifyStreamIncomingConnection(Destination d) throws IOException { + if (getStreamSession() == null) { + _log.error("BUG! Received stream connection, but session is null!"); + throw new NullPointerException("BUG! STREAM session is null!"); + } + + if (!writeString(d.toBase64() + "\n")) { + throw new IOException("Error notifying connection to SAM client"); + } + } + + public static void notifyStreamIncomingConnection(SocketChannel client, Destination d) throws IOException { + if (!writeString(d.toBase64() + "\n", client)) { + throw new IOException("Error notifying connection to SAM client"); + } + } + +} + diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java new file mode 100644 index 000000000..3695bf3dd --- /dev/null +++ b/apps/sam/java/src/net/i2p/sam/SAMv3RawSession.java @@ -0,0 +1,90 @@ +/** + * + */ +package net.i2p.sam; + +import java.io.IOException; +import java.io.InterruptedIOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.util.Properties; + +import net.i2p.client.I2PSessionException; +import net.i2p.data.DataFormatException; +import net.i2p.util.Log; + +/** + * @author MKVore + * + */ +public class SAMv3RawSession extends SAMRawSession implements SAMv3Handler.Session, SAMRawReceiver { + + String nick = null ; + SAMv3Handler handler = null ; + SAMv3Handler.DatagramServer server ; + private final static Log _log = new Log ( SAMv3DatagramSession.class ); + SocketAddress clientAddress = null ; + + public String getNick() { return nick; } + + /** + * Build a Raw Datagram Session according to information + * registered with the given nickname + * + * @param nick nickname of the session + * @throws IOException + * @throws DataFormatException + * @throws I2PSessionException + */ + public SAMv3RawSession(String nick) + throws IOException, DataFormatException, I2PSessionException { + + super(SAMv3Handler.sSessionsHash.get(nick).getDest(), + SAMv3Handler.sSessionsHash.get(nick).getProps(), + SAMv3Handler.sSessionsHash.get(nick).getHandler() + ); + this.nick = nick ; + this.recv = this ; + this.server = SAMv3Handler.DatagramServer.getInstance() ; + + SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick); + if ( rec==null ) throw new InterruptedIOException() ; + + this.handler = rec.getHandler(); + + Properties props = rec.getProps(); + + + String portStr = props.getProperty("PORT") ; + if ( portStr==null ) { + _log.debug("receiver port not specified. Current socket will be used."); + } + else { + int port = Integer.parseInt(portStr); + + String host = props.getProperty("HOST"); + if ( host==null ) { + host = rec.getHandler().getClientIP(); + + _log.debug("no host specified. Taken from the client socket : " + host +':'+port); + } + + + this.clientAddress = new InetSocketAddress(host,port); + } + } + + public void receiveRawBytes(byte[] data) throws IOException { + if (this.clientAddress==null) { + this.handler.receiveRawBytes(data); + } else { + ByteBuffer msgBuf = ByteBuffer.allocate(data.length); + msgBuf.put(data); + msgBuf.flip(); + this.server.send(this.clientAddress, msgBuf); + } + } + + public void stopRawReceiving() {} +} diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java new file mode 100644 index 000000000..699058613 --- /dev/null +++ b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java @@ -0,0 +1,408 @@ +package net.i2p.sam; +/* + * free (adj.): unencumbered; not under the control of others + * Written by human in 2004 and released into the public domain + * with no warranty of any kind, either expressed or implied. + * It probably won't make your computer catch on fire, or eat + * your children, but it might. Use at your own risk. + * + */ + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.net.ConnectException; +import java.net.NoRouteToHostException; +import java.util.Properties; + +import net.i2p.I2PException; +import net.i2p.client.I2PClient; +import net.i2p.client.streaming.I2PServerSocket; +import net.i2p.client.streaming.I2PSocket; +import net.i2p.client.streaming.I2PSocketManagerFactory; +import net.i2p.client.streaming.I2PSocketOptions; +import net.i2p.data.Base64; +import net.i2p.data.DataFormatException; +import net.i2p.data.Destination; +import net.i2p.util.I2PAppThread; +import net.i2p.util.Log; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.ByteBuffer ; +import java.nio.channels.SocketChannel; + +/** + * SAMv3 STREAM session class. + * + * @author mkvore + */ + +public class SAMv3StreamSession extends SAMStreamSession implements SAMv3Handler.Session +{ + + private final static Log _log = new Log ( SAMv3StreamSession.class ); + + protected final int BUFFER_SIZE = 1024 ; + + protected Object socketServerLock = new Object(); + protected I2PServerSocket socketServer = null; + + protected String nick ; + + public String getNick() { + return nick ; + } + + /** + * Create a new SAM STREAM session, according to information + * registered with the given nickname + * + * @param login The nickname + * @throws IOException + * @throws DataFormatException + * @throws SAMException + */ + public SAMv3StreamSession(String login) + throws IOException, DataFormatException, SAMException + { + initSAMStreamSession(login); + } + + public static SAMv3Handler.SessionsDB getDB() + { + return SAMv3Handler.sSessionsHash ; + } + + private void initSAMStreamSession(String login) + throws IOException, DataFormatException, SAMException { + + SAMv3Handler.SessionRecord rec = getDB().get(login); + String dest = rec.getDest() ; + ByteArrayInputStream ba_dest = new ByteArrayInputStream(Base64.decode(dest)); + + this.recv = rec.getHandler(); + + _log.debug("SAM STREAM session instantiated"); + + Properties allprops = new Properties(); + allprops.putAll(System.getProperties()); + allprops.putAll(rec.getProps()); + + String i2cpHost = allprops.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1"); + int i2cpPort ; + String port = allprops.getProperty(I2PClient.PROP_TCP_PORT, "7654"); + try { + i2cpPort = Integer.parseInt(port); + } catch (NumberFormatException nfe) { + throw new SAMException("Invalid I2CP port specified [" + port + "]"); + } + + _log.debug("Creating I2PSocketManager..."); + socketMgr = I2PSocketManagerFactory.createManager(ba_dest, + i2cpHost, + i2cpPort, + allprops); + if (socketMgr == null) { + throw new SAMException("Error creating I2PSocketManager towards "+i2cpHost+":"+i2cpPort); + } + + socketMgr.addDisconnectListener(new DisconnectListener()); + this.nick = login ; + } + + /** + * Connect the SAM STREAM session to the specified Destination + * + * @param handler The handler that communicates with the requesting client + * @param dest Base64-encoded Destination to connect to + * @param props Options to be used for connection + * + * @throws DataFormatException if the destination is not valid + * @throws ConnectException if the destination refuses connections + * @throws NoRouteToHostException if the destination can't be reached + * @throws InterruptedIOException if the connection timeouts + * @throws I2PException if there's another I2P-related error + * @throws IOException + */ + public void connect ( SAMv3Handler handler, String dest, Properties props ) + throws I2PException, ConnectException, NoRouteToHostException, + DataFormatException, InterruptedIOException, IOException { + + boolean verbose = (props.getProperty("SILENT", "false").equals("false")); + Destination d = SAMUtils.getDest(dest); + + I2PSocketOptions opts = socketMgr.buildOptions(props); + if (props.getProperty(I2PSocketOptions.PROP_CONNECT_TIMEOUT) == null) + opts.setConnectTimeout(60 * 1000); + + _log.debug("Connecting new I2PSocket..."); + + // blocking connection (SAMv3) + + I2PSocket i2ps = socketMgr.connect(d, opts); + + SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick); + + if ( rec==null ) throw new InterruptedIOException() ; + + handler.notifyStreamResult(verbose, "OK", null) ; + + handler.stealSocket() ; + + ReadableByteChannel fromClient = handler.getClientSocket(); + ReadableByteChannel fromI2P = Channels.newChannel(i2ps.getInputStream()); + WritableByteChannel toClient = handler.getClientSocket(); + WritableByteChannel toI2P = Channels.newChannel(i2ps.getOutputStream()); + + (new Thread(rec.getThreadGroup(), new I2PAppThread(new Pipe(fromClient,toI2P, "SAMPipeClientToI2P"), "SAMPipeClientToI2P"), "SAMPipeClientToI2P")).start(); + (new Thread(rec.getThreadGroup(), new I2PAppThread(new Pipe(fromI2P,toClient, "SAMPipeI2PToClient"), "SAMPipeI2PToClient"), "SAMPipeI2PToClient")).start(); + + } + + /** + * Accept an incoming STREAM + * + * @param handler The handler that communicates with the requesting client + * @param verbose If true, SAM will send the Base64-encoded peer Destination of an + * incoming socket as the first line of data sent to its client + * on the handler socket + * + * @throws DataFormatException if the destination is not valid + * @throws ConnectException if the destination refuses connections + * @throws NoRouteToHostException if the destination can't be reached + * @throws InterruptedIOException if the connection timeouts + * @throws I2PException if there's another I2P-related error + * @throws IOException + */ + public void accept(SAMv3Handler handler, boolean verbose) + throws I2PException, InterruptedIOException, IOException, SAMException { + + synchronized( this.socketServerLock ) + { + if (this.socketServer!=null) { + _log.debug("a socket server is already defined for this destination"); + throw new SAMException("a socket server is already defined for this destination"); + } + this.socketServer = this.socketMgr.getServerSocket(); + } + + I2PSocket i2ps; + i2ps = this.socketServer.accept(); + + synchronized( this.socketServerLock ) + { + this.socketServer = null ; + } + + SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick); + + if ( rec==null || i2ps==null ) throw new InterruptedIOException() ; + + if (verbose) + handler.notifyStreamIncomingConnection(i2ps.getPeerDestination()) ; + + handler.stealSocket() ; + ReadableByteChannel fromClient = handler.getClientSocket(); + ReadableByteChannel fromI2P = Channels.newChannel(i2ps.getInputStream()); + WritableByteChannel toClient = handler.getClientSocket(); + WritableByteChannel toI2P = Channels.newChannel(i2ps.getOutputStream()); + + (new Thread(rec.getThreadGroup(), new I2PAppThread(new Pipe(fromClient,toI2P, "SAMPipeClientToI2P"), "SAMPipeClientToI2P"), "SAMPipeClientToI2P")).start(); + (new Thread(rec.getThreadGroup(), new I2PAppThread(new Pipe(fromI2P,toClient, "SAMPipeI2PToClient"), "SAMPipeI2PToClient"), "SAMPipeI2PToClient")).start(); + } + + + public void startForwardingIncoming( Properties props ) throws SAMException, InterruptedIOException + { + SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick); + boolean verbose = props.getProperty("SILENT", "false").equals("false"); + + if ( rec==null ) throw new InterruptedIOException() ; + + String portStr = props.getProperty("PORT") ; + if ( portStr==null ) { + _log.debug("receiver port not specified"); + throw new SAMException("receiver port not specified"); + } + int port = Integer.parseInt(portStr); + + String host = props.getProperty("HOST"); + if ( host==null ) { + host = rec.getHandler().getClientIP(); + _log.debug("no host specified. Taken from the client socket : " + host +':'+port); + } + + + synchronized( this.socketServerLock ) + { + if (this.socketServer!=null) { + _log.debug("a socket server is already defined for this destination"); + throw new SAMException("a socket server is already defined for this destination"); + } + this.socketServer = this.socketMgr.getServerSocket(); + } + + SocketForwarder forwarder = new SocketForwarder(host, port, this, verbose); + (new Thread(rec.getThreadGroup(), new I2PAppThread(forwarder, "SAMStreamForwarder"), "SAMStreamForwarder")).start(); + } + + public class SocketForwarder extends Thread + { + String host = null ; + int port = 0 ; + SAMv3StreamSession session; + boolean verbose; + + SocketForwarder(String host, int port, SAMv3StreamSession session, boolean verbose) { + this.host = host ; + this.port = port ; + this.session = session ; + this.verbose = verbose ; + } + + public void run() + { + while (session.getSocketServer()!=null) { + + // wait and accept a connection from I2P side + I2PSocket i2ps = null ; + try { + i2ps = session.getSocketServer().accept(); + } catch (Exception e) {} + + if (i2ps==null) { + continue ; + } + + // open a socket towards client + java.net.InetSocketAddress addr = new java.net.InetSocketAddress(host,port); + + SocketChannel clientServerSock = null ; + try { + clientServerSock = SocketChannel.open(addr) ; + } + catch ( IOException e ) { + continue ; + } + if (clientServerSock==null) { + try { + i2ps.close(); + } catch (IOException ee) {} + continue ; + } + + // build pipes between both sockets + try { + if (this.verbose) + SAMv3Handler.notifyStreamIncomingConnection( + clientServerSock, i2ps.getPeerDestination()); + ReadableByteChannel fromClient = clientServerSock ; + ReadableByteChannel fromI2P = Channels.newChannel(i2ps.getInputStream()); + WritableByteChannel toClient = clientServerSock ; + WritableByteChannel toI2P = Channels.newChannel(i2ps.getOutputStream()); + (new I2PAppThread(new Pipe(fromClient,toI2P, "SAMPipeClientToI2P"), "SAMPipeClientToI2P")).start(); + (new I2PAppThread(new Pipe(fromI2P,toClient, "SAMPipeI2PToClient"), "SAMPipeI2PToClient")).start(); + + } catch (IOException e) { + try { + clientServerSock.close(); + } catch (IOException ee) {} + try { + i2ps.close(); + } catch (IOException ee) {} + continue ; + } + } + } + } + public class Pipe extends Thread + { + ReadableByteChannel in ; + WritableByteChannel out ; + ByteBuffer buf ; + + public Pipe(ReadableByteChannel in, WritableByteChannel out, String name) + { + super(name); + this.in = in ; + this.out = out ; + this.buf = ByteBuffer.allocate(BUFFER_SIZE) ; + } + + public void run() + { + try { + while (!Thread.interrupted() && (in.read(buf)>=0 || buf.position() != 0)) { + buf.flip(); + out.write(buf); + buf.compact(); + } + } + catch (IOException e) + { + this.interrupt(); + } + try { + in.close(); + } + catch (IOException e) {} + try { + buf.flip(); + while (buf.hasRemaining()) + out.write(buf); + } + catch (IOException e) {} + try { + out.close(); + } + catch (IOException e) {} + } + } + + public I2PServerSocket getSocketServer() + { + synchronized ( this.socketServerLock ) { + return this.socketServer ; + } + } + /** + * stop Forwarding Incoming connection coming from I2P + * @throws SAMException + * @throws InterruptedIOException + */ + public void stopForwardingIncoming() throws SAMException, InterruptedIOException + { + SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick); + + if ( rec==null ) throw new InterruptedIOException() ; + + I2PServerSocket server = null ; + synchronized( this.socketServerLock ) + { + if (this.socketServer==null) { + _log.debug("no socket server is defined for this destination"); + throw new SAMException("no socket server is defined for this destination"); + } + server = this.socketServer ; + this.socketServer = null ; + _log.debug("nulling socketServer in stopForwardingIncoming. Object " + this ); + } + try { + server.close(); + } catch ( I2PException e) {} + } + + /** + * Close the stream session + */ + @Override + public void close() { + socketMgr.destroySocketManager(); + } + + public boolean sendBytes(String s, byte[] b) throws DataFormatException + { + throw new DataFormatException(null); + } +} diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMEventHandler.java b/apps/sam/java/src/net/i2p/sam/client/SAMEventHandler.java index 7df1a2324..9df867aa5 100644 --- a/apps/sam/java/src/net/i2p/sam/client/SAMEventHandler.java +++ b/apps/sam/java/src/net/i2p/sam/client/SAMEventHandler.java @@ -12,17 +12,17 @@ import net.i2p.util.Log; * */ public class SAMEventHandler extends SAMClientEventListenerImpl { - private I2PAppContext _context; + //private I2PAppContext _context; private Log _log; private Boolean _helloOk; private Object _helloLock = new Object(); private Boolean _sessionCreateOk; private Object _sessionCreateLock = new Object(); private Object _namingReplyLock = new Object(); - private Map _namingReplies = new HashMap(); + private Map _namingReplies = new HashMap(); public SAMEventHandler(I2PAppContext ctx) { - _context = ctx; + //_context = ctx; _log = ctx.logManager().getLog(getClass()); } diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java index 4e9d1133b..80db744a3 100644 --- a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java +++ b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java @@ -31,10 +31,10 @@ public class SAMStreamSend { private OutputStream _samOut; private InputStream _samIn; private SAMReader _reader; - private boolean _dead; + //private boolean _dead; private SAMEventHandler _eventHandler; /** Connection id (Integer) to peer (Flooder) */ - private Map _remotePeers; + private Map _remotePeers; public static void main(String args[]) { if (args.length < 4) { @@ -42,7 +42,7 @@ public class SAMStreamSend { return; } I2PAppContext ctx = new I2PAppContext(); - String files[] = new String[args.length - 3]; + //String files[] = new String[args.length - 3]; SAMStreamSend sender = new SAMStreamSend(ctx, args[0], args[1], args[2], args[3]); sender.startup(); } @@ -50,14 +50,14 @@ public class SAMStreamSend { public SAMStreamSend(I2PAppContext ctx, String samHost, String samPort, String destFile, String dataFile) { _context = ctx; _log = ctx.logManager().getLog(SAMStreamSend.class); - _dead = false; + //_dead = false; _samHost = samHost; _samPort = samPort; _destFile = destFile; _dataFile = dataFile; _conOptions = ""; _eventHandler = new SendEventHandler(_context); - _remotePeers = new HashMap(); + _remotePeers = new HashMap(); } public void startup() { @@ -207,7 +207,6 @@ public class SAMStreamSend { _started = _context.clock().now(); _context.statManager().addRateData("send." + _connectionId + ".started", 1, 0); byte data[] = new byte[1024]; - long value = 0; long lastSend = _context.clock().now(); while (!_closed) { try { diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java index 8d29e3799..406150b36 100644 --- a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java +++ b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java @@ -31,10 +31,10 @@ public class SAMStreamSink { private OutputStream _samOut; private InputStream _samIn; private SAMReader _reader; - private boolean _dead; + //private boolean _dead; private SAMEventHandler _eventHandler; /** Connection id (Integer) to peer (Flooder) */ - private Map _remotePeers; + private Map _remotePeers; public static void main(String args[]) { if (args.length < 4) { @@ -49,14 +49,14 @@ public class SAMStreamSink { public SAMStreamSink(I2PAppContext ctx, String samHost, String samPort, String destFile, String sinkDir) { _context = ctx; _log = ctx.logManager().getLog(SAMStreamSink.class); - _dead = false; + //_dead = false; _samHost = samHost; _samPort = samPort; _destFile = destFile; _sinkDir = sinkDir; _conOptions = ""; _eventHandler = new SinkEventHandler(_context); - _remotePeers = new HashMap(); + _remotePeers = new HashMap(); } public void startup() { @@ -70,7 +70,8 @@ public class SAMStreamSink { String ourDest = handshake(); _log.debug("Handshake complete. we are " + ourDest); if (ourDest != null) { - boolean written = writeDest(ourDest); + //boolean written = + writeDest(ourDest); _log.debug("Dest written"); } } diff --git a/apps/streaming/java/build.xml b/apps/streaming/java/build.xml index a32ca077c..7740a6022 100644 --- a/apps/streaming/java/build.xml +++ b/apps/streaming/java/build.xml @@ -21,6 +21,7 @@ + @@ -28,14 +29,18 @@ srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" destdir="./build/obj" - classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" /> + classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" > + + + classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" > + + diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java index 6b99fdc00..94ec5532c 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java @@ -49,7 +49,7 @@ public class Connection { private boolean _isInbound; private boolean _updatedShareOpts; /** Packet ID (Long) to PacketLocal for sent but unacked packets */ - private Map _outboundPackets; + private final Map _outboundPackets; private PacketQueue _outboundQueue; private ConnectionPacketHandler _handler; private ConnectionOptions _options; @@ -66,7 +66,7 @@ public class Connection { private long _lastCongestionHighestUnacked; private boolean _ackSinceCongestion; /** Notify this on connection (or connection failure) */ - private Object _connectLock; + private final Object _connectLock; /** how many messages have been resent and not yet ACKed? */ private int _activeResends; private ConEvent _connectionEvent; @@ -90,21 +90,22 @@ public class Connection { } public Connection(I2PAppContext ctx, ConnectionManager manager, SchedulerChooser chooser, PacketQueue queue, ConnectionPacketHandler handler, ConnectionOptions opts) { _context = ctx; - _log = ctx.logManager().getLog(Connection.class); - _receiver = new ConnectionDataReceiver(ctx, this); - _inputStream = new MessageInputStream(ctx); - _outputStream = new MessageOutputStream(ctx, _receiver, (opts == null ? Packet.MAX_PAYLOAD_SIZE : opts.getMaxMessageSize())); + _connectionManager = manager; _chooser = chooser; - _outboundPackets = new TreeMap(); _outboundQueue = queue; _handler = handler; + _log = _context.logManager().getLog(Connection.class); + _receiver = new ConnectionDataReceiver(_context, this); + _inputStream = new MessageInputStream(_context); + _outputStream = new MessageOutputStream(_context, _receiver, (opts == null ? Packet.MAX_PAYLOAD_SIZE : opts.getMaxMessageSize())); + _outboundPackets = new TreeMap(); _options = (opts != null ? opts : new ConnectionOptions()); _outputStream.setWriteTimeout((int)_options.getWriteTimeout()); _inputStream.setReadTimeout((int)_options.getReadTimeout()); _lastSendId = -1; _nextSendTime = -1; _ackedPackets = 0; - _createdOn = ctx.clock().now(); + _createdOn = _context.clock().now(); _closeSentOn = -1; _closeReceivedOn = -1; _unackedPacketsReceived = 0; @@ -113,7 +114,6 @@ public class Connection { _lastCongestionSeenAt = MAX_WINDOW_SIZE*2; // lets allow it to grow _lastCongestionTime = -1; _lastCongestionHighestUnacked = -1; - _connectionManager = manager; _resetReceived = false; _connected = true; _disconnectScheduledOn = -1; @@ -126,7 +126,7 @@ public class Connection { _isInbound = false; _updatedShareOpts = false; _connectionEvent = new ConEvent(); - _hardDisconnected = false; + _hardDisconnected = false; _randomWait = _context.random().nextInt(10*1000); // just do this once to reduce usage _context.statManager().createRateStat("stream.con.windowSizeAtCongestion", "How large was our send window when we send a dup?", "Stream", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); _context.statManager().createRateStat("stream.chokeSizeBegin", "How many messages were outstanding when we started to choke?", "Stream", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); @@ -187,12 +187,12 @@ public class Connection { if (_log.shouldLog(Log.DEBUG)) _log.debug("Outbound window is full (" + _outboundPackets.size() + "/" + _options.getWindowSize() + "/" + _activeResends + "), waiting " + timeLeft); - try { _outboundPackets.wait(Math.min(timeLeft,250l)); } catch (InterruptedException ie) {} + try { _outboundPackets.wait(Math.min(timeLeft,250l)); } catch (InterruptedException ie) { if (_log.shouldLog(Log.DEBUG)) _log.debug("InterruptedException while Outbound window is full (" + _outboundPackets.size() + "/" + _activeResends +")"); return false;} } else { if (_log.shouldLog(Log.DEBUG)) _log.debug("Outbound window is full (" + _outboundPackets.size() + "/" + _activeResends + "), waiting indefinitely"); - try { _outboundPackets.wait(250); } catch (InterruptedException ie) {} //10*1000 + try { _outboundPackets.wait(250); } catch (InterruptedException ie) {if (_log.shouldLog(Log.DEBUG)) _log.debug("InterruptedException while Outbound window is full (" + _outboundPackets.size() + "/" + _activeResends + ")"); return false;} //10*1000 } } else { _context.statManager().addRateData("stream.chokeSizeEnd", _outboundPackets.size(), _context.clock().now() - start); @@ -810,7 +810,11 @@ public class Connection { synchronized (_connectLock) { _connectLock.wait(timeLeft); } - } catch (InterruptedException ie) {} + } catch (InterruptedException ie) { + if (_log.shouldLog(Log.DEBUG)) _log.debug("waitForConnect(): InterruptedException"); + _connectionError = "InterruptedException"; + return; + } } } @@ -895,7 +899,7 @@ public class Connection { if (_log.shouldLog(Log.WARN)) _log.warn("Closing connection due to inactivity"); if (_log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("last sent was: ").append(_context.clock().now() - _lastSendTime); buf.append("ms ago, last received was: ").append(_context.clock().now()-_lastReceivedOn); buf.append("ms ago, inactivity timeout is: ").append(_options.getInactivityTimeout()); @@ -930,7 +934,7 @@ public class Connection { @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[Connection "); if (_receiveStreamId > 0) buf.append(Packet.toId(_receiveStreamId)); @@ -1014,6 +1018,7 @@ public class Connection { // _log.debug("firing event on " + _connection, _addedBy); eventOccurred(); } + @Override public String toString() { return "event on " + Connection.this.toString(); } } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java index b96eaea63..382c984d9 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java @@ -2,8 +2,6 @@ package net.i2p.client.streaming; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; -import java.util.ArrayList; -import java.util.List; import net.i2p.I2PAppContext; import net.i2p.util.Log; @@ -18,7 +16,7 @@ import net.i2p.util.SimpleTimer; * * @author zzz modded to use concurrent and bound queue size */ -class ConnectionHandler { +public class ConnectionHandler { private I2PAppContext _context; private Log _log; private ConnectionManager _manager; @@ -41,7 +39,7 @@ class ConnectionHandler { _context = context; _log = context.logManager().getLog(ConnectionHandler.class); _manager = mgr; - _synQueue = new LinkedBlockingQueue(MAX_QUEUE_SIZE); + _synQueue = new LinkedBlockingQueue(MAX_QUEUE_SIZE); _active = false; _acceptTimeout = DEFAULT_ACCEPT_TIMEOUT; } @@ -111,7 +109,7 @@ class ConnectionHandler { // fail all the ones we had queued up while(true) { Packet packet = _synQueue.poll(); // fails immediately if empty - if (packet == null || packet.getOptionalDelay() == PoisonPacket.MAX_DELAY_REQUEST) + if (packet == null || packet.getOptionalDelay() == PoisonPacket.POISON_MAX_DELAY_REQUEST) break; sendReset(packet); } @@ -126,7 +124,7 @@ class ConnectionHandler { if (timeoutMs <= 0) { try { syn = _synQueue.take(); // waits forever - } catch (InterruptedException ie) {} + } catch (InterruptedException ie) { } // { break;} } else { long remaining = expiration - _context.clock().now(); // (dont think this applies anymore for LinkedBlockingQueue) @@ -138,13 +136,13 @@ class ConnectionHandler { break; try { syn = _synQueue.poll(remaining, TimeUnit.MILLISECONDS); // waits the specified time max - } catch (InterruptedException ie) {} + } catch (InterruptedException ie) { } break; } } if (syn != null) { - if (syn.getOptionalDelay() == PoisonPacket.MAX_DELAY_REQUEST) + if (syn.getOptionalDelay() == PoisonPacket.POISON_MAX_DELAY_REQUEST) return null; // deal with forged / invalid syn packets @@ -173,7 +171,9 @@ class ConnectionHandler { // Send it through the packet handler again if (_log.shouldLog(Log.WARN)) _log.warn("Found con for queued non-syn packet: " + packet); - _manager.getPacketHandler().receivePacket(packet); + // false -> don't requeue, fixes a race where a SYN gets dropped + // between here and PacketHandler, causing the packet to loop forever.... + _manager.getPacketHandler().receivePacketDirect(packet, false); } else { // goodbye if (_log.shouldLog(Log.WARN)) @@ -226,14 +226,14 @@ class ConnectionHandler { /** * Simple end-of-queue marker. - * The standard class limits the delay to MAX_DELAY_REQUEST so + * The standard class limits the delay to POISON_MAX_DELAY_REQUEST so * an evil user can't use this to shut us down */ private static class PoisonPacket extends Packet { - public static final int MAX_DELAY_REQUEST = Packet.MAX_DELAY_REQUEST + 1; + public static final int POISON_MAX_DELAY_REQUEST = Packet.MAX_DELAY_REQUEST + 1; public PoisonPacket() { - setOptionalDelay(MAX_DELAY_REQUEST); + setOptionalDelay(POISON_MAX_DELAY_REQUEST); } } } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java index 7826ba2a8..7efc6cc40 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java @@ -34,32 +34,32 @@ public class ConnectionManager { /** Inbound stream ID (Long) to Connection map */ private Map _connectionByInboundId; /** Ping ID (Long) to PingRequest */ - private Map _pendingPings; + private final Map _pendingPings; private boolean _allowIncoming; private int _maxConcurrentStreams; private ConnectionOptions _defaultOptions; private volatile int _numWaiting; - private Object _connectionLock; + private final Object _connectionLock; private long SoTimeout; public ConnectionManager(I2PAppContext context, I2PSession session, int maxConcurrent, ConnectionOptions defaultOptions) { _context = context; - _log = context.logManager().getLog(ConnectionManager.class); + _session = session; + _maxConcurrentStreams = maxConcurrent; + _defaultOptions = defaultOptions; + _log = _context.logManager().getLog(ConnectionManager.class); _connectionByInboundId = new HashMap(32); _pendingPings = new HashMap(4); _connectionLock = new Object(); - _messageHandler = new MessageHandler(context, this); - _packetHandler = new PacketHandler(context, this); - _connectionHandler = new ConnectionHandler(context, this); - _schedulerChooser = new SchedulerChooser(context); - _conPacketHandler = new ConnectionPacketHandler(context); - _tcbShare = new TCBShare(context); - _session = session; - session.setSessionListener(_messageHandler); - _outboundQueue = new PacketQueue(context, session, this); + _messageHandler = new MessageHandler(_context, this); + _packetHandler = new PacketHandler(_context, this); + _connectionHandler = new ConnectionHandler(_context, this); + _schedulerChooser = new SchedulerChooser(_context); + _conPacketHandler = new ConnectionPacketHandler(_context); + _tcbShare = new TCBShare(_context); + _session.setSessionListener(_messageHandler); + _outboundQueue = new PacketQueue(_context, _session, this); _allowIncoming = false; - _maxConcurrentStreams = maxConcurrent; - _defaultOptions = defaultOptions; _numWaiting = 0; /** Socket timeout for accept() */ SoTimeout = -1; @@ -277,11 +277,15 @@ public class ConnectionManager { public MessageHandler getMessageHandler() { return _messageHandler; } public PacketHandler getPacketHandler() { return _packetHandler; } - public ConnectionHandler getConnectionHandler() { return _connectionHandler; } public I2PSession getSession() { return _session; } - public PacketQueue getPacketQueue() { return _outboundQueue; } public void updateOptsFromShare(Connection con) { _tcbShare.updateOptsFromShare(con); } public void updateShareOpts(Connection con) { _tcbShare.updateShareOpts(con); } + // Both of these methods are + // exporting non-public type through public API, this is a potential bug. + public ConnectionHandler getConnectionHandler() { return _connectionHandler; } + public PacketQueue getPacketQueue() { return _outboundQueue; } + /** do we respond to pings that aren't on an existing connection? */ + public boolean answerPings() { return _defaultOptions.getAnswerPings(); } /** * Something b0rked hard, so kill all of our connections without mercy. @@ -345,13 +349,13 @@ public class ConnectionManager { return new HashSet(_connectionByInboundId.values()); } } - public boolean ping(Destination peer, long timeoutMs) { return ping(peer, timeoutMs, true); } public boolean ping(Destination peer, long timeoutMs, boolean blocking) { return ping(peer, timeoutMs, blocking, null, null, null); } + public boolean ping(Destination peer, long timeoutMs, boolean blocking, SessionKey keyToUse, Set tagsToSend, PingNotifier notifier) { Long id = new Long(_context.random().nextLong(Packet.MAX_STREAM_ID-1)+1); PacketLocal packet = new PacketLocal(_context, peer); @@ -390,7 +394,7 @@ public class ConnectionManager { return ok; } - interface PingNotifier { + public interface PingNotifier { public void pingComplete(boolean ok); } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java index 4363e3f49..13e18baff 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java @@ -9,13 +9,13 @@ import java.util.Properties; public class ConnectionOptions extends I2PSocketOptionsImpl { private int _connectDelay; private boolean _fullySigned; + private boolean _answerPings; private volatile int _windowSize; private int _receiveWindow; private int _profile; private int _rtt; private int _rttDev; private int _rto; - private int _trend[]; private int _resendDelay; private int _sendAckDelay; private int _maxMessageSize; @@ -52,13 +52,19 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { public static final String PROP_MAX_WINDOW_SIZE = "i2p.streaming.maxWindowSize"; public static final String PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR = "i2p.streaming.congestionAvoidanceGrowthRateFactor"; public static final String PROP_SLOW_START_GROWTH_RATE_FACTOR = "i2p.streaming.slowStartGrowthRateFactor"; + public static final String PROP_ANSWER_PINGS = "i2p.streaming.answerPings"; private static final int TREND_COUNT = 3; static final int INITIAL_WINDOW_SIZE = 6; static final int DEFAULT_MAX_SENDS = 8; public static final int DEFAULT_INITIAL_RTT = 8*1000; static final int MIN_WINDOW_SIZE = 1; - + private static final boolean DEFAULT_ANSWER_PINGS = true; + + // Syncronization fix, but doing it this way causes NPE... + // private final int _trend[] = new int[TREND_COUNT]; + private int _trend[]; + /** * OK, here is the calculation on the message size to fit in a single * tunnel message without fragmentation. @@ -196,6 +202,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { setSlowStartGrowthRateFactor(opts.getSlowStartGrowthRateFactor()); setWriteTimeout(opts.getWriteTimeout()); setReadTimeout(opts.getReadTimeout()); + setAnswerPings(opts.getAnswerPings()); } } @@ -203,7 +210,6 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { protected void init(Properties opts) { super.init(opts); _trend = new int[TREND_COUNT]; - setMaxWindowSize(getInt(opts, PROP_MAX_WINDOW_SIZE, Connection.MAX_WINDOW_SIZE)); setConnectDelay(getInt(opts, PROP_CONNECT_DELAY, -1)); setProfile(getInt(opts, PROP_PROFILE, PROFILE_BULK)); @@ -220,8 +226,8 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { setInboundBufferSize(getMaxMessageSize() * (Connection.MAX_WINDOW_SIZE + 2)); setCongestionAvoidanceGrowthRateFactor(getInt(opts, PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR, 1)); setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, 1)); - setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT)); + setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS)); } @Override @@ -259,9 +265,10 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { setCongestionAvoidanceGrowthRateFactor(getInt(opts, PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR, 2)); if (opts.contains(PROP_SLOW_START_GROWTH_RATE_FACTOR)) setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, 2)); - if (opts.containsKey(PROP_CONNECT_TIMEOUT)) setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT)); + if (opts.containsKey(PROP_ANSWER_PINGS)) + setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS)); } /** @@ -281,11 +288,22 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { * or can we deal with signatures on the SYN and FIN packets * only? * + * There is no property name defined for this, so it's safe to + * say this is unused and always false. + * * @return if we want signatures on all packets. */ public boolean getRequireFullySigned() { return _fullySigned; } public void setRequireFullySigned(boolean sign) { _fullySigned = sign; } + /** + * Do we respond to a ping? + * + * @return if we do + */ + public boolean getAnswerPings() { return _answerPings; } + public void setAnswerPings(boolean yes) { _answerPings = yes; } + /** * How many messages will we send before waiting for an ACK? * @@ -474,7 +492,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("conDelay=").append(_connectDelay); buf.append(" maxSize=").append(_maxMessageSize); buf.append(" rtt=").append(_rtt); @@ -491,6 +509,13 @@ public class ConnectionOptions extends I2PSocketOptionsImpl { return buf.toString(); } + private static boolean getBool(Properties opts, String name, boolean defaultVal) { + if (opts == null) return defaultVal; + String val = opts.getProperty(name); + if (val == null) return defaultVal; + return Boolean.valueOf(val).booleanValue(); + } + public static void main(String args[]) { Properties p = new Properties(); diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java index 157e48793..b904243b1 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java @@ -230,8 +230,8 @@ public class I2PSocketManagerFull implements I2PSocketManager { * */ public void destroySocketManager() { - _connectionManager.disconnectAllHard(); _connectionManager.setAllowIncomingConnections(false); + _connectionManager.disconnectAllHard(); // should we destroy the _session too? // yes, since the old lib did (and SAM wants it to, and i dont know why not) if ( (_session != null) && (!_session.isClosed()) ) { diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java index 75adf6e59..98165cf7d 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java @@ -18,7 +18,7 @@ public class MessageHandler implements I2PSessionListener { private ConnectionManager _manager; private I2PAppContext _context; private Log _log; - private List _listeners; + private final List _listeners; public MessageHandler(I2PAppContext ctx, ConnectionManager mgr) { _manager = mgr; @@ -73,8 +73,8 @@ public class MessageHandler implements I2PSessionListener { * @param session that has been terminated */ public void disconnected(I2PSession session) { - if (_log.shouldLog(Log.ERROR)) - _log.error("I2PSession disconnected"); + if (_log.shouldLog(Log.WARN)) + _log.warn("I2PSession disconnected"); _manager.disconnectAllHard(); List listeners = null; diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java index 77a5014cf..ad4795c07 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java @@ -55,7 +55,7 @@ public class MessageInputStream extends InputStream { private byte[] _oneByte = new byte[1]; - private Object _dataLock; + private final Object _dataLock; public MessageInputStream(I2PAppContext ctx) { _context = ctx; @@ -174,7 +174,7 @@ public class MessageInputStream extends InputStream { public void closeReceived() { synchronized (_dataLock) { if (_log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Close received, ready bytes: "); long available = 0; for (int i = 0; i < _readyDataBlocks.size(); i++) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java index 4a810d565..ab7c9374a 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java @@ -20,7 +20,7 @@ public class MessageOutputStream extends OutputStream { private Log _log; private byte _buf[]; private int _valid; - private Object _dataLock; + private final Object _dataLock; private DataReceiver _dataReceiver; private IOException _streamError; private boolean _closed; @@ -319,6 +319,7 @@ public class MessageOutputStream extends OutputStream { throwAnyError(); } + @Override public void close() throws IOException { if (_closed) { synchronized (_dataLock) { _dataLock.notifyAll(); } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Packet.java b/apps/streaming/java/src/net/i2p/client/streaming/Packet.java index 8fc0f02fa..2a6ae59ad 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/Packet.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/Packet.java @@ -598,12 +598,12 @@ public class Packet { @Override public String toString() { - StringBuffer str = formatAsString(); + StringBuilder str = formatAsString(); return str.toString(); } - protected StringBuffer formatAsString() { - StringBuffer buf = new StringBuffer(64); + protected StringBuilder formatAsString() { + StringBuilder buf = new StringBuilder(64); buf.append(toId(_sendStreamId)); //buf.append("<-->"); buf.append(toId(_receiveStreamId)).append(": #").append(_sequenceNum); @@ -629,7 +629,7 @@ public class Packet { } private final String toFlagString() { - StringBuffer buf = new StringBuffer(32); + StringBuilder buf = new StringBuilder(32); if (isFlagSet(FLAG_CLOSE)) buf.append(" CLOSE"); if (isFlagSet(FLAG_DELAY_REQUESTED)) buf.append(" DELAY ").append(_optionDelay); if (isFlagSet(FLAG_ECHO)) buf.append(" ECHO"); diff --git a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java index 1f2b35902..19e62db0c 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java @@ -9,7 +9,6 @@ import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.data.DataHelper; import net.i2p.util.Log; -import net.i2p.util.SimpleTimer; /** * receive a packet and dispatch it correctly to the connection specified, @@ -90,10 +89,10 @@ public class PacketHandler { void receivePacket(Packet packet) { //boolean ok = choke(packet); //if (ok) - receivePacketDirect(packet); + receivePacketDirect(packet, true); } - private void receivePacketDirect(Packet packet) { + void receivePacketDirect(Packet packet, boolean queueIfNoConn) { //if (_log.shouldLog(Log.DEBUG)) // _log.debug("packet received: " + packet); @@ -105,7 +104,7 @@ public class PacketHandler { if (_log.shouldLog(Log.INFO)) displayPacket(packet, "RECV", "wsize " + con.getOptions().getWindowSize() + " rto " + con.getOptions().getRTO()); } else { - receiveUnknownCon(packet, sendId); + receiveUnknownCon(packet, sendId, queueIfNoConn); displayPacket(packet, "UNKN", null); } } @@ -113,7 +112,7 @@ public class PacketHandler { private static final SimpleDateFormat _fmt = new SimpleDateFormat("HH:mm:ss.SSS"); void displayPacket(Packet packet, String prefix, String suffix) { if (!_log.shouldLog(Log.INFO)) return; - StringBuffer buf = new StringBuffer(256); + StringBuilder buf = new StringBuilder(256); synchronized (_fmt) { buf.append(_fmt.format(new Date())); } @@ -130,7 +129,10 @@ public class PacketHandler { private void receiveKnownCon(Connection con, Packet packet) { if (packet.isFlagSet(Packet.FLAG_ECHO)) { if (packet.getSendStreamId() > 0) { - receivePing(packet); + if (con.getOptions().getAnswerPings()) + receivePing(packet); + else if (_log.shouldLog(Log.WARN)) + _log.warn("Dropping Echo packet on existing con: " + packet); } else if (packet.getReceiveStreamId() > 0) { receivePong(packet); } else { @@ -199,7 +201,7 @@ public class PacketHandler { // someone is sending us a packet on the wrong stream if (_log.shouldLog(Log.ERROR)) { Set cons = _manager.listConnections(); - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append("Received a packet on the wrong stream: "); buf.append(packet); buf.append(" connection: "); @@ -228,10 +230,13 @@ public class PacketHandler { _manager.getPacketQueue().enqueue(reply); } - private void receiveUnknownCon(Packet packet, long sendId) { + private void receiveUnknownCon(Packet packet, long sendId, boolean queueIfNoConn) { if (packet.isFlagSet(Packet.FLAG_ECHO)) { if (packet.getSendStreamId() > 0) { - receivePing(packet); + if (_manager.answerPings()) + receivePing(packet); + else if (_log.shouldLog(Log.WARN)) + _log.warn("Dropping Echo packet on unknown con: " + packet); } else if (packet.getReceiveStreamId() > 0) { receivePong(packet); } else { @@ -262,7 +267,7 @@ public class PacketHandler { if (packet.isFlagSet(Packet.FLAG_SYNCHRONIZE)) { _manager.getConnectionHandler().receiveNewSyn(packet); - } else { + } else if (queueIfNoConn) { // We can get here on the 2nd+ packet if the 1st (SYN) packet // is still on the _synQueue in the ConnectionHandler, and // ConnectionManager.receiveConnection() hasn't run yet to put @@ -276,7 +281,7 @@ public class PacketHandler { _log.warn("Packet belongs to no other cons, putting on the syn queue: " + packet); } if (_log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); Set cons = _manager.listConnections(); for (Iterator iter = cons.iterator(); iter.hasNext(); ) { Connection con = (Connection)iter.next(); @@ -287,6 +292,10 @@ public class PacketHandler { } //packet.releasePayload(); _manager.getConnectionHandler().receiveNewSyn(packet); + } else { + // don't queue again (infinite loop!) + sendReset(packet); + packet.releasePayload(); } } } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java b/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java index cbb89e79e..9ed29b50f 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java @@ -133,8 +133,8 @@ public class PacketLocal extends Packet implements MessageOutputStream.WriteStat public void setResendPacketEvent(SimpleTimer2.TimedEvent evt) { _resendEvent = evt; } @Override - public StringBuffer formatAsString() { - StringBuffer buf = super.formatAsString(); + public StringBuilder formatAsString() { + StringBuilder buf = super.formatAsString(); Connection con = _connection; if (con != null) @@ -213,7 +213,7 @@ public class PacketLocal extends Packet implements MessageOutputStream.WriteStat timeRemaining = 10*1000; wait(timeRemaining); } - } catch (InterruptedException ie) {} + } catch (InterruptedException ie) { }//{ break; } } if (!writeSuccessful()) releasePayload(); diff --git a/apps/streaming/java/src/net/i2p/client/streaming/PacketQueue.java b/apps/streaming/java/src/net/i2p/client/streaming/PacketQueue.java index a56e7753d..db4adb27c 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/PacketQueue.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/PacketQueue.java @@ -18,7 +18,7 @@ import net.i2p.util.Log; * mode=bestEffort doesnt block in the SDK. * */ -class PacketQueue { +public class PacketQueue { private I2PAppContext _context; private Log _log; private I2PSession _session; @@ -89,9 +89,17 @@ class PacketQueue { // so if we retransmit it will use a new tunnel/lease combo expires = rpe.getNextSendTime() - 500; if (expires > 0) - sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, expires); + // I2PSessionImpl2 + //sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, expires); + // I2PSessionMuxedImpl + sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, expires, + I2PSession.PROTO_STREAMING, I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED); else - sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent); + // I2PSessionImpl2 + //sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, 0); + // I2PSessionMuxedImpl + sent = _session.sendMessage(packet.getTo(), buf, 0, size, keyUsed, tagsSent, + I2PSession.PROTO_STREAMING, I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED); end = _context.clock().now(); if ( (end-begin > 1000) && (_log.shouldLog(Log.WARN)) ) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java b/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java index 3ed8327dd..be62f1766 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java @@ -10,7 +10,7 @@ import net.i2p.util.Log; * Examine a connection's state and pick the right scheduler for it. * */ -class SchedulerChooser { +public class SchedulerChooser { private I2PAppContext _context; private Log _log; private TaskScheduler _nullScheduler; @@ -55,7 +55,7 @@ class SchedulerChooser { } public void eventOccurred(Connection con) { - _log.log(Log.CRIT, "Yell at jrandom: Event occurred on " + con, new Exception("source")); + _log.log(Log.ERROR, "Yell at jrandom: Event occurred on " + con, new Exception("source")); } public boolean accept(Connection con) { return true; } }; diff --git a/apps/streaming/java/src/net/i2p/client/streaming/TaskScheduler.java b/apps/streaming/java/src/net/i2p/client/streaming/TaskScheduler.java index 8657a2053..c998c8425 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/TaskScheduler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/TaskScheduler.java @@ -5,7 +5,7 @@ package net.i2p.client.streaming; * selected based upon its current state. * */ -interface TaskScheduler { +public interface TaskScheduler { /** * An event has occurred (timeout, message sent, or message received), * so schedule what to do next based on our current state. diff --git a/apps/susidns/src/build.xml b/apps/susidns/src/build.xml index d3f5f1662..35fbeb28c 100644 --- a/apps/susidns/src/build.xml +++ b/apps/susidns/src/build.xml @@ -22,19 +22,22 @@ + + classpathref="cp" destdir="${bin}" srcdir="${src}" includes="**/*.java" > + + - + - + @@ -44,7 +47,8 @@ + destdir="${bin}" srcdir="${tmp}" includes="**/*.java" classpathref="cp"> + @@ -81,6 +85,7 @@ + diff --git a/apps/susidns/src/css.css b/apps/susidns/src/css.css index 74f0b6605..0ee2432d6 100644 --- a/apps/susidns/src/css.css +++ b/apps/susidns/src/css.css @@ -1,10 +1,16 @@ +body { + font-family:"Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + background-color: #eef; + color:#001; +} + p { - font-family:Verdana,Tahoma,Arial,Helvetica; color:black; line-height:12pt; margin-left:5mm; margin-right:5mm; font-size:10pt; + text-align: justify; } span.addrhlpr { @@ -12,7 +18,7 @@ span.addrhlpr { } h3 { - font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; font-size:12pt; letter-spacing:2pt; @@ -20,22 +26,19 @@ h3 { font-weight:bold; } -body { - background-color: white; - color:black; -} - a { color:#327BBF; text-decoration:none; + font-weight: bold; } a:hover { text-decoration:underline; + font-weight: bold; } th { - font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; line-height:12pt; margin-left:5mm; @@ -44,7 +47,7 @@ th { } td { - font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; line-height:12pt; margin-left:5mm; @@ -54,7 +57,7 @@ td { } li { - font-family:Verdana,Tahoma,Arial,Helvetica; + color:black; line-height:12pt; margin-left:5mm; @@ -91,4 +94,31 @@ p.messages { p.footer { font-size:7pt; + text-align: center; +} + +.illustrate { + margin: 10px; + padding: 10px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #001; + font-size: 10pt; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + background: #fff; +} + +.page { + background-color: #fff; + color:#001; + margin: 20px; + padding: 10px 20px 20px 20px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #001; + font-size: 10pt !important; + line-height: 160% !important; + -moz-box-shadow: inset 0px 0px 1px 0px #002; } \ No newline at end of file diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java index 214e7e292..a5dcf86cf 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java @@ -24,6 +24,7 @@ package i2p.susi.dns; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -37,11 +38,13 @@ import java.util.Properties; public class AddressbookBean { private String book, action, serial, lastSerial, filter, search, hostname, destination; + private int beginIndex, endIndex; private Properties properties, addressbook; private int trClass; private LinkedList deletionMarks; private static Comparator sorter; - + private static final int DISPLAY_SIZE=100; + static { sorter = new AddressByNameSorter(); } @@ -74,6 +77,8 @@ public class AddressbookBean { properties = new Properties(); deletionMarks = new LinkedList(); + beginIndex = 0; + endIndex = DISPLAY_SIZE - 1; } private long configLastLoaded = 0; private static final String PRIVATE_BOOK = "private_addressbook"; @@ -106,7 +111,12 @@ public class AddressbookBean { loadConfig(); String filename = properties.getProperty( getBook() + "_addressbook" ); - return ConfigBean.addressbookPrefix + filename; + // clean up the ../ with getCanonicalPath() + File path = new File(ConfigBean.addressbookPrefix, filename); + try { + return path.getCanonicalPath(); + } catch (IOException ioe) {} + return filename; } private Object[] entries; public Object[] getEntries() @@ -174,17 +184,45 @@ public class AddressbookBean } list.addLast( new AddressBean( name, destination ) ); } - // Format a message about filtered addressbook size, and the number of displayed entries - if( filter != null && filter.length() > 0 ) - message = "Filtered l"; - else - message = "L"; - message += "ist contains " + list.size() + " entries"; - if (list.size() > 300) message += ", displaying the first 300."; else message += "."; - Object array[] = list.toArray(); Arrays.sort( array, sorter ); entries = array; + + // Format a message about filtered addressbook size, and the number of displayed entries + // addressbook.jsp catches the case where the whole book is empty. + String filterArg = ""; + if( search != null && search.length() > 0 ) { + message = "Search "; + } + if( filter != null && filter.length() > 0 ) { + if( search != null && search.length() > 0 ) + message += "within "; + message += "Filtered list "; + filterArg = "&filter=" + filter; + } + if (entries.length == 0) { + message += "- no matches"; + } else if (getBeginInt() == 0 && getEndInt() == entries.length - 1) { + if (message.length() == 0) + message = "Addressbook "; + message += "contains " + entries.length + " entries"; + } else { + if (getBeginInt() > 0) { + int newBegin = Math.max(0, getBeginInt() - DISPLAY_SIZE); + int newEnd = Math.max(0, getBeginInt() - 1); + message += "" + newBegin + + '-' + newEnd + " | "; + } + message += "Showing " + getBegin() + '-' + getEnd() + " of " + entries.length; + if (getEndInt() < entries.length - 1) { + int newBegin = Math.min(entries.length - 1, getEndInt() + 1); + int newEnd = Math.min(entries.length, getEndInt() + DISPLAY_SIZE); + message += " | " + newBegin + + '-' + newEnd + ""; + } + } } catch (Exception e) { Debug.debug( e.getClass().getName() + ": " + e.getMessage() ); @@ -236,7 +274,7 @@ public class AddressbookBean } } else { - message += "Invalid nonce. Are you being spoofed?"; + message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."; } } @@ -302,4 +340,26 @@ public class AddressbookBean public void setHostname(String hostname) { this.hostname = hostname; } + private int getBeginInt() { + return Math.max(0, Math.min(entries.length - 1, beginIndex)); + } + public String getBegin() { + return "" + getBeginInt(); + } + public void setBegin(String s) { + try { + beginIndex = Integer.parseInt(s); + } catch (NumberFormatException nfe) {} + } + private int getEndInt() { + return Math.max(0, Math.max(getBeginInt(), Math.min(entries.length - 1, endIndex))); + } + public String getEnd() { + return "" + getEndInt(); + } + public void setEnd(String s) { + try { + endIndex = Integer.parseInt(s); + } catch (NumberFormatException nfe) {} + } } diff --git a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java index 85a4ffe6d..7dad7a250 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java @@ -33,12 +33,16 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.Serializable; +import net.i2p.I2PAppContext; + public class ConfigBean implements Serializable { /* * as this is not provided as constant in addressbook, we define it here */ - public static final String addressbookPrefix = "addressbook/"; + public static final String addressbookPrefix = + (new File(I2PAppContext.getGlobalContext().getRouterDir(), "addressbook")).getAbsolutePath() + + File.separatorChar; public static final String configFileName = addressbookPrefix + "config.txt"; private String action, config; @@ -79,7 +83,7 @@ public class ConfigBean implements Serializable { { File file = new File( configFileName ); if( file != null && file.isFile() ) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); BufferedReader br = null; try { br = new BufferedReader( new FileReader( file ) ); @@ -142,7 +146,7 @@ public class ConfigBean implements Serializable { } } else { - message = "Invalid nonce. Are you being spoofed?"; + message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."; } } if( message.length() > 0 ) diff --git a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java index 5bcfa6d12..56a42208b 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java @@ -86,7 +86,7 @@ public class SubscriptionsBean { File file = new File( getFileName() ); if( file != null && file.isFile() ) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); BufferedReader br = null; try { br = new BufferedReader( new FileReader( file ) ); @@ -136,7 +136,7 @@ public class SubscriptionsBean } } else { - message = "Invalid nonce. Are you being spoofed?"; + message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit."; } } if( message.length() > 0 ) diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp index 05a012936..419c10225 100644 --- a/apps/susidns/src/jsp/addressbook.jsp +++ b/apps/susidns/src/jsp/addressbook.jsp @@ -39,23 +39,23 @@ - +
- +
- +

${book.book} addressbook at ${book.fileName}

@@ -64,42 +64,46 @@ ${book.loadBookMessages} +
-

Filter: a -b -c -d -e -f -g -h -i -j -k -l -m -n -o -p -q -r -s -t -u -v -w -x -y -z -0-9 -all

+

Filter: +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +0-9 +all

Current filter: ${book.filter} -(clear filter)

+(clear filter)

+ +
@@ -109,9 +113,12 @@ + + + @@ -127,8 +134,8 @@ - - + + @@ -136,7 +143,7 @@ - +
Name Destination
${addr.name} - (addrhlpr)
@@ -160,15 +167,18 @@

Add new destination:

-Hostname: Destination:
+Hostname: +Destination:
+

- +
+
diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp index 6bb924073..2772f9d19 100644 --- a/apps/susidns/src/jsp/config.jsp +++ b/apps/susidns/src/jsp/config.jsp @@ -35,9 +35,10 @@ +
+

+

${cfg.fileName}

@@ -90,9 +91,10 @@ Use the private addressbook for private destinations, these are not published.
  • last_modified - file containing the modification timestamp for each fetched subscription URL (no need to change)
  • log - file to log activity to (change to /dev/null if you like)
  • -
    +

    + diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp index 6a2596818..debd97c13 100644 --- a/apps/susidns/src/jsp/index.jsp +++ b/apps/susidns/src/jsp/index.jsp @@ -33,11 +33,11 @@ - +
    - +
    - +

    Huh? what addressbook?

    @@ -74,11 +74,12 @@ The router also uses a private addressbook (privatehosts.txt, not shown in the p Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others. The private addressbook can also be used for aliases of hosts in your other addressbooks.

    -

    addressbook working scheme

    -
    - +

    addressbook working scheme

    +
    +
    + diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp index af44537e5..944e4cc49 100644 --- a/apps/susidns/src/jsp/subscriptions.jsp +++ b/apps/susidns/src/jsp/subscriptions.jsp @@ -35,9 +35,10 @@ +
    +

    +

    ${subs.fileName}

    @@ -71,9 +72,10 @@ regularly (once per hour) checks this list for new eepsites. Those URLs simply c file of other people. The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently. So it is a good idea to add additional subscriptions to sites that have the latest addresses.

    - +
    + diff --git a/apps/susimail/build.xml b/apps/susimail/build.xml index abf2a88cf..fb4371614 100644 --- a/apps/susimail/build.xml +++ b/apps/susimail/build.xml @@ -5,14 +5,17 @@ + + + diff --git a/apps/susimail/src/css.css b/apps/susimail/src/css.css index 59b6e0c46..380fa7975 100644 --- a/apps/susimail/src/css.css +++ b/apps/susimail/src/css.css @@ -1,10 +1,12 @@ body { - background-color:white; + background-color: #eef; + color:#001; + font-family:"Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; } li { - font-family:Verdana,Tahoma,Arial,Helvetica; - color:black; + + color:#001; line-height:12pt; font-size:10pt; margin-left:5mm; @@ -12,8 +14,7 @@ li { } p { - font-family:Verdana,Tahoma,Arial,Helvetica; - color:black; + color:#001; line-height:12pt; margin-left:5mm; margin-right:5mm; @@ -47,14 +48,15 @@ span.coloured { p.footer { margin-left:10mm; margin-right:10mm; - font-size:8pt; - line-height:10pt; + font-size:8pt; + line-height:10pt; } p.mailbody { - font-family:Courier-Fixed; + font: 10pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; margin-left:1cm; margin-right:1cm; + text-align: left; } a { @@ -67,8 +69,8 @@ a:hover { } td { - font-family:Verdana,Tahoma,Arial,Helvetica; - color:black; + + color:#001; line-height:12pt; margin-left:5mm; margin-right:5mm; @@ -90,7 +92,41 @@ table.noborder { } pre { - font-family:Courier-Fixed; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; margin-left:1cm; margin-right:1cm; +} + +.page { + background-color: #fff; + color:#001; + margin: 20px; + padding: 0 20px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #001; + font-size: 10pt !important; + line-height: 160% !important; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + text-align: center; +} + +table { + text-align: justify; + width: 100%; +} + +th { + font-size: 10pt; + font-weight: bold; +} + +form { + line-height: 160% +} + +.mailhead { + font-size: 9pt; + font-weight: bold; } \ No newline at end of file diff --git a/apps/susimail/src/src/i2p/susi/util/Config.java b/apps/susimail/src/src/i2p/susi/util/Config.java index 219ce71f3..723c56b99 100644 --- a/apps/susimail/src/src/i2p/susi/util/Config.java +++ b/apps/susimail/src/src/i2p/susi/util/Config.java @@ -25,10 +25,13 @@ package i2p.susi.util; import i2p.susi.debug.Debug; +import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; +import net.i2p.I2PAppContext; + /** * @author susi */ @@ -81,7 +84,8 @@ public class Config { } FileInputStream fis = null; try { - fis = new FileInputStream( "susimail.config" ); + File cfg = new File(I2PAppContext.getGlobalContext().getConfigDir(), "susimail.config"); + fis = new FileInputStream(cfg); config.load( fis ); } catch (Exception e) { Debug.debug( Debug.DEBUG, "Could not open susimail.config, reason: " + e.getMessage() ); diff --git a/apps/susimail/src/src/i2p/susi/webmail/Mail.java b/apps/susimail/src/src/i2p/susi/webmail/Mail.java index a60f9b93c..80f6d67bf 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/Mail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/Mail.java @@ -142,7 +142,7 @@ public class Mail { } return ok; } - public static void appendRecipients( StringBuffer buf, ArrayList recipients, String prefix ) + public static void appendRecipients( StringBuilder buf, ArrayList recipients, String prefix ) { for( Iterator it = recipients.iterator(); it.hasNext(); ) { buf.append( prefix ); diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java index a80fdc591..e871dfe81 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java @@ -76,7 +76,7 @@ public class WebMail extends HttpServlet private static final int BUFSIZE = 4096; - private static final String DEFAULT_HOST = "localhost"; + private static final String DEFAULT_HOST = "127.0.0.1"; private static final int DEFAULT_POP3PORT = 7660; private static final int DEFAULT_SMTPPORT = 7659; @@ -444,7 +444,7 @@ public class WebMail extends HttpServlet boolean showBody = false; boolean prepareAttachment = false; String reason = ""; - StringBuffer body = null; + StringBuilder body = null; String ident = quoteHTML( ( mailPart.description != null ? mailPart.description + ", " : "" ) + @@ -485,7 +485,7 @@ public class WebMail extends HttpServlet try { ReadBuffer decoded = e.decode( mailPart.buffer.content, mailPart.beginBody, mailPart.end - mailPart.beginBody ); BufferedReader reader = new BufferedReader( new InputStreamReader( new ByteArrayInputStream( decoded.content, decoded.offset, decoded.length ), charset ) ); - body = new StringBuffer(); + body = new StringBuilder(); String line; while( ( line = reader.readLine() ) != null ) { body.append( quoteHTML( line ) ); @@ -503,7 +503,7 @@ public class WebMail extends HttpServlet } } if( html ) - out.println( "" ); + out.println( "" ); if( reason != null && reason.length() > 0 ) { if( html ) out.println( "

    "); @@ -782,7 +782,7 @@ public class WebMail extends HttpServlet /* * extract additional recipients */ - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); String pad = ""; if( mail.to != null ) { for( int i = 0; i < mail.to.length; i++ ) { @@ -1271,7 +1271,7 @@ public class WebMail extends HttpServlet * write header */ out.println( "\nsusimail v0." + version + " - " + subtitle + - "\n\n\n\n

    \"Susimail\"
     

    \n
    " ); + "\n\n\n\n

    \"Susimail\"
     

    \n" ); if( sessionObject.error != null && sessionObject.error.length() > 0 ) { out.println( "

    " + sessionObject.error + "

    " ); @@ -1294,7 +1294,7 @@ public class WebMail extends HttpServlet else if( sessionObject.state == STATE_NEW ) showCompose( out, sessionObject, request ); - out.println( "\n

    susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " © 2004-2005 susi\n"); + out.println( "


    susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " © 2004-2005 susi

    \n"); out.flush(); } } @@ -1429,7 +1429,7 @@ public class WebMail extends HttpServlet } if( ok ) { - StringBuffer body = new StringBuffer(); + StringBuilder body = new StringBuilder(); body.append( "From: " + from + "\r\n" ); Mail.appendRecipients( body, toList, "To: " ); Mail.appendRecipients( body, ccList, "To: " ); @@ -1539,26 +1539,26 @@ public class WebMail extends HttpServlet sessionObject.body = null; out.println( "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "" ); + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "" ); if( sessionObject.attachments != null && sessionObject.attachments.size() > 0 ) { boolean wroteHeader = false; for( Iterator it = sessionObject.attachments.iterator(); it.hasNext(); ) { if( !wroteHeader ) { - out.println( "" ); + out.println( "" ); wroteHeader = true; } Attachment attachment = (Attachment)it.next(); - out.println( ""); + out.println( ""); } } out.println( "

    From:
    To:
    Cc:
    Bcc:
    Subject:
     Bcc to self
    " + - "

    New Attachment:

    From:
    To:
    Cc:
    Bcc:
    Subject:
     Bcc to self
    " + + "

    New Attachment:
    Attachments:
    Attachments:
     " + attachment.getFileName() + "
     " + attachment.getFileName() + "
    " ); @@ -1576,11 +1576,11 @@ public class WebMail extends HttpServlet String smtp = Config.getProperty( CONFIG_PORTS_SMTP, "" + DEFAULT_SMTPPORT ); out.println( "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + "\n" + "
    User
    Pass
    Host
    POP3-Port
    SMTP-Port
    User
    Pass
    Host
    POP3-Port
    SMTP-Port
    Create Account " + button( LOGIN, "Login" ) + "
    "); } @@ -1632,7 +1632,7 @@ public class WebMail extends HttpServlet ", markAll=" + sessionObject.markAll + ", invert=" + sessionObject.invert + ", clear=" + sessionObject.clear ); - out.println( "" + ( RELEASE ? "" : "" + i ) + "" + link + mail.shortSender + " " + link + mail.shortSubject + " " + mail.formattedDate + " " + mail.size + " Bytes" ); bg = 1 - bg; i++; @@ -1686,21 +1686,21 @@ public class WebMail extends HttpServlet button( LOGOUT, "Logout" ) ); if( mail != null ) { out.println( "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "" ); + "\n" + + "\n" + + "\n" + + "\n" + + "" ); if( mail.body != null ) { showPart( out, mail.part, 0, SHOW_HTML ); } else { - out.println( "" ); + out.println( "" ); } } else { - out.println( "" ); + out.println( "" ); } - out.println( "\n

    From:" + quoteHTML( mail.formattedSender ) + "
    Date:" + mail.quotedDate + "
    Subject:" + quoteHTML( mail.formattedSubject ) + "


    From:" + quoteHTML( mail.formattedSender ) + "
    Date:" + mail.quotedDate + "
    Subject:" + quoteHTML( mail.formattedSubject ) + "

    Could not fetch mail body.

    Could not fetch mail body.

    Could not fetch mail.

    Could not fetch mail.


    " ); + out.println( "
    \n" ); } } diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java index f9d47152b..b6c8ffaf5 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java +++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java @@ -70,7 +70,7 @@ public class Base64 implements Encoding { */ private String encode( InputStream in ) throws IOException, EncodingException { - StringBuffer strBuf = new StringBuffer(); + StringBuilder strBuf = new StringBuilder(); int buf[] = new int[3]; int out[] = new int[4]; diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java index 9eca318fb..96dab5295 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java +++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java @@ -55,7 +55,7 @@ public class HeaderLine implements Encoding { private static final int BUFSIZE = 2; private String encode(InputStream in) throws IOException { - StringBuffer out = new StringBuffer(); + StringBuilder out = new StringBuilder(); int l = 0, buffered = 0, tmp[] = new int[BUFSIZE]; boolean quoting = false; boolean quote = false; diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java index f42d3ecea..5a98c6a05 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java +++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java @@ -69,7 +69,7 @@ public class QuotedPrintable implements Encoding { */ private static int BUFSIZE = 2; private String encode( InputStream in ) throws EncodingException, IOException { - StringBuffer out = new StringBuffer(); + StringBuilder out = new StringBuilder(); int l = 0; int read = 0, buffered = 0, tmp[] = new int[BUFSIZE]; while( true ) { diff --git a/apps/systray/java/build.xml b/apps/systray/java/build.xml index 19db56d5c..1597f20b3 100644 --- a/apps/systray/java/build.xml +++ b/apps/systray/java/build.xml @@ -5,6 +5,7 @@ + @@ -16,7 +17,9 @@ target="1.5" destdir="./build/obj" includes="**/*.java" - classpath="./lib/systray4j.jar:../../../core/java/build/i2p.jar" /> + classpath="./lib/systray4j.jar:../../../core/java/build/i2p.jar" > + +
    diff --git a/apps/systray/java/src/net/i2p/apps/systray/ConfigFile.java b/apps/systray/java/src/net/i2p/apps/systray/ConfigFile.java index 952ecba82..642bea630 100644 --- a/apps/systray/java/src/net/i2p/apps/systray/ConfigFile.java +++ b/apps/systray/java/src/net/i2p/apps/systray/ConfigFile.java @@ -17,6 +17,10 @@ import java.util.Properties; /** * Simple config file handler. * + * Warning - browser needs double quotes and double backslashes on Windows + * e.g. + * browser="C:\\Program Files\\Mozilla Firefox\\firefox.exe" + * * @author hypercubus */ public class ConfigFile { @@ -60,11 +64,10 @@ public class ConfigFile { _properties.load(fileInputStream); } catch (Exception e) { rv = false; - } - try { - fileInputStream.close(); - } catch (IOException e) { - // No worries. + } finally { + if (fileInputStream != null) { + try { fileInputStream.close(); } catch (IOException e) {} + } } return rv; } @@ -78,11 +81,10 @@ public class ConfigFile { _properties.store(fileOutputStream, null); } catch (Exception e) { rv = false; - } - try { - fileOutputStream.close(); - } catch (IOException e) { - // No worries. + } finally { + if (fileOutputStream != null) { + try { fileOutputStream.close(); } catch (IOException e) {} + } } return rv; } diff --git a/apps/systray/java/src/net/i2p/apps/systray/SysTray.java b/apps/systray/java/src/net/i2p/apps/systray/SysTray.java index 4a635fd08..f7e649942 100644 --- a/apps/systray/java/src/net/i2p/apps/systray/SysTray.java +++ b/apps/systray/java/src/net/i2p/apps/systray/SysTray.java @@ -10,9 +10,12 @@ package net.i2p.apps.systray; import java.awt.Frame; +import java.io.File; +import net.i2p.I2PAppContext; import net.i2p.util.SimpleScheduler; import net.i2p.util.SimpleTimer; + import snoozesoft.systray4j.SysTrayMenu; import snoozesoft.systray4j.SysTrayMenuEvent; import snoozesoft.systray4j.SysTrayMenuIcon; @@ -36,7 +39,8 @@ public class SysTray implements SysTrayMenuListener { private static UrlLauncher _urlLauncher = new UrlLauncher(); static { - if (!_configFile.init("systray.config")) { + File config = new File(I2PAppContext.getGlobalContext().getConfigDir(), "systray.config"); + if (!_configFile.init(config.getAbsolutePath())) { _configFile.setProperty("browser", "default"); _configFile.setProperty("port", "7657"); } @@ -132,7 +136,7 @@ public class SysTray implements SysTrayMenuListener { public void iconLeftClicked(SysTrayMenuEvent e) {} public void iconLeftDoubleClicked(SysTrayMenuEvent e) { - openRouterConsole("http://localhost:" + _portString + "/index.jsp"); + openRouterConsole("http://127.0.0.1:" + _portString + "/index.jsp"); } public void menuItemSelected(SysTrayMenuEvent e) { @@ -153,7 +157,7 @@ public class SysTray implements SysTrayMenuListener { if (!(browser = promptForBrowser("Select browser")).equals("nullnull")) setBrowser(browser); } else if (e.getActionCommand().equals("openconsole")) { - openRouterConsole("http://localhost:" + _portString + "/index.jsp"); + openRouterConsole("http://127.0.0.1:" + _portString + "/index.jsp"); } } diff --git a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java index 5487f5faf..93d9d36bb 100644 --- a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java +++ b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java @@ -12,11 +12,15 @@ package net.i2p.apps.systray; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; +import java.net.InetSocketAddress; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; +import java.net.Socket; +import java.net.SocketAddress; import java.net.URL; +import net.i2p.I2PAppContext; import net.i2p.util.ShellCommand; /** @@ -33,6 +37,56 @@ public class UrlLauncher { ShellCommand _shellCommand = new ShellCommand(); + private static final int WAIT_TIME = 5*1000; + private static final int MAX_WAIT_TIME = 5*60*1000; + private static final int MAX_TRIES = 99; + + /** + * Prevent bad user experience by waiting for the server to be there + * before launching the browser. + * @return success + */ + public boolean waitForServer(String urlString) { + URL url; + try { + url = new URL(urlString); + } catch (MalformedURLException e) { + return false; + } + String host = url.getHost(); + int port = url.getPort(); + if (port <= 0) { + port = url.getDefaultPort(); + if (port <= 0) + return false; + } + SocketAddress sa; + try { + sa = new InetSocketAddress(host, port); + } catch (IllegalArgumentException iae) { + return false; + } + long done = System.currentTimeMillis() + MAX_WAIT_TIME; + for (int i = 0; i < MAX_TRIES; i++) { + try { + Socket test = new Socket(); + // this will usually fail right away if it's going to fail since it's local + test.connect(sa, WAIT_TIME); + // it worked + try { + test.close(); + } catch (IOException ioe) {} + return true; + } catch (Exception e) {} + if (System.currentTimeMillis() > done) + break; + try { + Thread.sleep(WAIT_TIME); + } catch (InterruptedException ie) {} + } + return false; + } + /** * Discovers the operating system the installer is running under and tries * to launch the given URL using the default browser for that platform; if @@ -49,6 +103,7 @@ public class UrlLauncher { String osName = System.getProperty("os.name"); + waitForServer(url); if (validateUrlFormat(url)) { if (osName.toLowerCase().indexOf("mac") > -1) { if (osName.toLowerCase().startsWith("mac os x")) { @@ -68,10 +123,11 @@ public class UrlLauncher { String browserString = "\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" -nohome"; BufferedReader bufferedReader = null; - _shellCommand.executeSilentAndWait("regedit /E browser.reg \"HKEY_CLASSES_ROOT\\http\\shell\\open\\command\""); + File foo = new File(I2PAppContext.getGlobalContext().getTempDir(), "browser.reg"); + _shellCommand.executeSilentAndWait("regedit /E \"" + foo.getAbsolutePath() + "\" \"HKEY_CLASSES_ROOT\\http\\shell\\open\\command\""); try { - bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("browser.reg"), "UTF-16")); + bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(foo), "UTF-16")); for (String line; (line = bufferedReader.readLine()) != null; ) { if (line.startsWith("@=")) { // we should really use the whole line and replace %1 with the url @@ -86,7 +142,7 @@ public class UrlLauncher { } catch (IOException e) { // No worries. } - new File("browser.reg").delete(); + foo.delete(); } catch (Exception e) { // Defaults to IE. } finally { @@ -101,6 +157,20 @@ public class UrlLauncher { // fall through } + // This debian script tries everything in $BROWSER, then gnome-www-browser and x-www-browser + // if X is running and www-browser otherwise. Those point to the user's preferred + // browser using the update-alternatives system. + if (_shellCommand.executeSilentAndWaitTimed("sensible-browser " + url, 5)) + return true; + + // Try x-www-browser directly + if (_shellCommand.executeSilentAndWaitTimed("x-www-browser " + url, 5)) + return true; + + // puppy linux + if (_shellCommand.executeSilentAndWaitTimed("defaultbrowser " + url, 5)) + return true; + if (_shellCommand.executeSilentAndWaitTimed("opera -newpage " + url, 5)) return true; @@ -119,6 +189,10 @@ public class UrlLauncher { if (_shellCommand.executeSilentAndWaitTimed("galeon " + url, 5)) return true; + // Text Mode Browsers only below here + if (_shellCommand.executeSilentAndWaitTimed("www-browser " + url, 5)) + return true; + if (_shellCommand.executeSilentAndWaitTimed("links " + url, 5)) return true; @@ -141,6 +215,7 @@ public class UrlLauncher { */ public boolean openUrl(String url, String browser) throws Exception { + waitForServer(url); if (validateUrlFormat(url)) if (_shellCommand.executeSilentAndWaitTimed(browser + " " + url, 5)) return true; @@ -163,7 +238,7 @@ public class UrlLauncher { if (args.length > 0) launcher.openUrl(args[0]); else - launcher.openUrl("http://localhost:7657/index.jsp"); + launcher.openUrl("http://127.0.0.1:7657/index.jsp"); } catch (Exception e) {} } } diff --git a/build.xml b/build.xml index a9f58ef20..c77cfe0ac 100644 --- a/build.xml +++ b/build.xml @@ -1,6 +1,13 @@ + + + + + @@ -9,6 +16,9 @@ + + + @@ -17,6 +27,10 @@ + + + + @@ -25,7 +39,10 @@ + @@ -60,7 +77,6 @@ - @@ -91,7 +107,7 @@ - + @@ -189,16 +205,13 @@ - - - + + - - - + @@ -230,7 +243,7 @@ - + @@ -238,6 +251,7 @@ + @@ -267,17 +281,12 @@ - + - - - - - @@ -286,11 +295,6 @@ - - - - - @@ -301,30 +305,84 @@ - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + + + - - + + - - + + + + + + + + + @@ -335,42 +393,37 @@ - + - - - - - - - - - + - - - + - - + + + + + + + + - @@ -378,15 +431,19 @@ + + + - + + - + - + @@ -462,7 +519,7 @@ - + @@ -486,4 +543,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/checklist.txt b/checklist.txt index b649bef59..e65134b7c 100644 --- a/checklist.txt +++ b/checklist.txt @@ -12,48 +12,51 @@ Change revision in: installer/install.xml news.xml router/java/src/net/i2p/router/RouterVersion.java + (change to BUILD = 0 and EXTRA = "") core/java/src/net/i2p/CoreVersion.java Review the complete diff from the last release: - mtn diff -r t:i2p-0.6.(xx-1) > out.diff + mtn diff -r t:i2p-0.7.(xx-1) > out.diff vi out.diff +Verify that no untrusted revisions were inadvertently +blessed by a trusted party: + mtn log --brief --no-graph --to t:i2p-0.7.(xx-1) | cut -d ' ' -f 2- | sort + Build and tag: ant pkg mtn ci - mtn tag h: i2p-0.6.xx + mtn tag h: i2p-0.7.xx Sync with mtn.i2p2.i2p Create a signed update file with: export I2P=~/i2p - java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate sign i2pupdate.zip i2pupdate.sud /path/to/private.key 0.6.xx + java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate sign i2pupdate.zip i2pupdate.sud /path/to/private.key 0.7.xx Verify signed update file with: java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate showversion i2pupdate.sud java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate verifysig i2pupdate.sud Make the source tarball: - Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p i2p-0.6.xx + Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p i2p-0.7.xx Double-check trust list - tar cjf i2psource-0.6.xx.tar.bz2 --exclude i2p-0.6.xx/_MTN i2p-0.6.xx - mv i2p-0.6.xx.tar.bz2 i2p.i2p + tar cjf i2psource-0.7.xx.tar.bz2 --exclude i2p-0.7.xx/_MTN i2p-0.7.xx + mv i2p-0.7.xx.tar.bz2 i2p.i2p Until the build script gets this ability, you need to rename some files: - mv i2pinstall.exe i2pinstall-0.6.xx.exe - mv i2p.tar.bz2 i2pheadless-0.6.xx.tar.bz2 - mv i2pupdate.zip i2pupdate-0.6.xx.zip + mv i2pinstall.exe i2pinstall-0.7.xx.exe + mv i2pupdate.zip i2pupdate-0.7.xx.zip you probably don't need to rename i2pupdate.sud Generate hashes: - sha1sum i2p*0.6.xx.* - sha1sum i2pupdate.sud + sha256sum i2p*0.7.xx.* + sha256sum i2pupdate.sud now GPG-sign an announcement with the hashes Generate PGP signatures: - gpg -b i2pinstall-0.6.xx.exe - gpg -b i2pheadless-0.6.xx.tar.bz2 - gpg -b i2psource-0.6.xx.tar.bz2 - gpg -b i2pupdate-0.6.xx.zip + gpg -b i2pinstall-0.7.xx.exe + gpg -b i2psource-0.7.xx.tar.bz2 + gpg -b i2pupdate-0.7.xx.zip gpg -b i2pupdate.sud Distribute files to download locations and to www.i2p2.i2p @@ -62,14 +65,12 @@ Website files to change: Sync with mtn.i2p2.i2p announcements.html announcements_de.html - download.html (change SHA1s) - download_de.html (change SHA1s) + download.html (change SHA256s) + download_de.html (change SHA256s) index.html index_de.html hosts.txt (copy from mtn) release-x.y.z.html (new) Sync with mtn.i2p2.i2p -Copy news.xml to subscription location - -Announce on #i2p, forum.i2p, Syndie, freshmeat +Announce on #i2p, forum.i2p diff --git a/core/c/jbigi/build-all.sh b/core/c/jbigi/build-all.sh index 65456ee50..861a1e0a4 100755 --- a/core/c/jbigi/build-all.sh +++ b/core/c/jbigi/build-all.sh @@ -12,7 +12,7 @@ FreeBSD*) exit;; esac -VER=4.2.2 +VER=4.2.4 echo "Extracting GMP Version $VER ..." tar -xjf gmp-$VER.tar.bz2 echo "Building..." @@ -21,7 +21,8 @@ mkdir lib mkdir lib/net mkdir lib/net/i2p mkdir lib/net/i2p/util -for x in none pentium pentiummmx pentium2 pentium3 pentium4 k6 k62 k63 athlon + +for x in none pentium pentiummmx pentium2 pentium3 pentium4 k6 k62 k63 athlon geode pentiumm core2 do mkdir bin/$x cd bin/$x diff --git a/core/c/jbigi/build.sh b/core/c/jbigi/build.sh index 39969b13c..7ef900070 100755 --- a/core/c/jbigi/build.sh +++ b/core/c/jbigi/build.sh @@ -15,7 +15,7 @@ mkdir -p lib/ mkdir -p bin/local -VER=4.2.2 +VER=4.2.4 if [ "$1" != "dynamic" -a ! -d gmp-$VER ] then diff --git a/core/c/jbigi/build_jbigi.sh b/core/c/jbigi/build_jbigi.sh index 859eda329..8ff3219b8 100755 --- a/core/c/jbigi/build_jbigi.sh +++ b/core/c/jbigi/build_jbigi.sh @@ -1,6 +1,7 @@ #!/bin/sh # When executed in Mingw: Produces an jbigi.dll -# When executed in Linux: Produces an libjbigi.so +# When executed in Linux/FreeBSD: Produces an libjbigi.so +# Darwin produces libjbigi.jnilib, right? CC="gcc" @@ -32,7 +33,8 @@ esac #To link dynamically to GMP (use libgmp.so or gmp.lib), uncomment the first line below #To link statically to GMP, uncomment the second line below -if test $1 = "dynamic" +# Bug!!! Quote *BOTH* or neither! --Sponge +if test "$1" = "dynamic" then echo "Building jbigi lib that is dynamically linked to GMP" LIBPATH="-L.libs" diff --git a/core/c/jbigi/mbuild-all.sh b/core/c/jbigi/mbuild-all.sh new file mode 100755 index 000000000..a97139dfc --- /dev/null +++ b/core/c/jbigi/mbuild-all.sh @@ -0,0 +1,140 @@ +#/bin/bash + +# TO-DO: Darwin. + +# Note: You will have to add the CPU ID for the platform in the CPU ID code +# for a new CPU. Just adding them here won't let I2P use the code! + +# +# If you know of other platforms i2p on linux works on, +# please add them here. +# Do NOT add any X86 platforms, do that below in the x86 platform list. +# +MISC_LINUX_PLATFORMS="hppa2.0 alphaev56 armv5tel mips64el itanium itanium2 ultrasparc2 ultrasparc2i alphaev6 powerpc970 powerpc7455 powerpc7447 atom" + +# +# If you know of other platforms i2p on FREEBSD works on, +# please add them here. +# Do NOT add any X86 platforms, do that below in the x86 platform list. +# +MISC_FREEBSD_PLATFORMS="atom alphaev56 ultrasparc2i" + +# +# MINGW/Windows?? +# +MISC_MINGW_PLATFORMS="" + +# +# Are there any other X86 platforms that work on i2p? Add them here. +# +# Oddly athlon64 builds.... I wonder what others can :-) +# +X86_PLATFORMS="pentium pentiummmx pentium2 pentium3 pentium4 k6 k62 k63 athlon pentiumm core2 athlon64 geode" + + +# +# You should not need to edit anything below this comment. +# + +MINGW_PLATFORMS="${X86_PLATFORMS} ${MISC_MINGW_PLATFORMS}" +LINUX_PLATFORMS="${X86_PLATFORMS} ${MISC_LINUX_PLATFORMS}" +FREEBSD_PLATFORMS="${X86_PLATFORMS} ${MISC_FREEBSD_PLATFORMS}" + +VER=$(echo gmp-*.tar.bz2 | sed -re "s/(.*-)(.*)(.*.tar.bz2)$/\2/" | tail --lines=1) +if [ "$VER" == "" ] ; then + echo "ERROR! Can't find gmp source tarball." + exit 1 +fi + + +case `uname -sr` in +MINGW*) + PLATFORM_LIST="${MINGW_PLATFORMS}" + NAME="jbigi" + TYPE="dll" + TARGET="-windows-" + echo "Building windows .dlls for all architectures";; +Linux*) + PLATFORM_LIST="${LINUX_PLATFORMS}" + NAME="libjbigi" + TYPE="so" + TARGET="-linux-" + echo "Building linux .sos for all architectures";; +FreeBSD*) + PLATFORM_LIST="${FREEBSD_PLATFORMS}" + NAME="libjbigi" + TYPE="so" + TARGET="-freebsd-" + echo "Building freebsd .sos for all architectures";; +*) + echo "Unsupported build environment" + exit;; +esac + +function make_static { + echo "Attempting .${4} creation for ${3}${5}${2}" + ../../mbuild_jbigi.sh static || return 1 + cp ${3}.${4} ../../lib/net/i2p/util/${3}${5}${2}.${4} + return 0 +} + +function make_file { + # Nonfatal bail out on Failed build. + echo "Attempting build for ${3}${5}${2}" + make && return 0 + cd .. + rm -R "$2" + echo -e "\n\nFAILED! ${3}${5}${2} not made.\a" + sleep 10 + return 1 +} + +function configure_file { + echo -e "\n\n\nAttempting configure for ${3}${5}${2}\n\n\n" + sleep 10 + # Nonfatal bail out on unsupported platform. + ../../gmp-${1}/configure --build=${2} && return 0 + cd .. + rm -R "$2" + echo -e "\n\nSorry, ${3}${5}${2} is not supported on your build environment.\a" + sleep 10 + return 1 +} + +function build_file { + configure_file "$1" "$2" "$3" "$4" "$5" && make_file "$1" "$2" "$3" "$4" "$5" && make_static "$1" "$2" "$3" "$4" "$5" && return 0 + echo -e "\n\n\nError building static!\n\n\a" + sleep 10 + return 1 +} + +echo "Extracting GMP Version $VER ..." +tar -xf gmp-$VER.tar.bz2 || ( echo "Error in tarball file!" ; exit 1 ) + +if [ ! -d bin ]; then + mkdir bin +fi +if [ ! -d lib/net/i2p/util ]; then + mkdir -p lib/net/i2p/util +fi + +# Don't touch this one. +NO_PLATFORM=none + +for x in $NO_PLATFORM $PLATFORM_LIST +do + ( + if [ ! -d bin/$x ]; then + mkdir bin/$x + cd bin/$x + else + cd bin/$x + rm -Rf * + fi + + build_file "$VER" "$x" "$NAME" "$TYPE" "$TARGET" + ) +done + +echo "Success!" +exit 0 diff --git a/core/c/jbigi/mbuild_jbigi.sh b/core/c/jbigi/mbuild_jbigi.sh new file mode 100755 index 000000000..1e262a603 --- /dev/null +++ b/core/c/jbigi/mbuild_jbigi.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# When executed in Mingw: Produces an jbigi.dll +# When executed in Linux/FreeBSD: Produces an libjbigi.so +# What does Darwin produce? libjbigi.jnilib? +CC="gcc" + +case `uname -sr` in +MINGW*) + JAVA_HOME="c:/software/j2sdk1.4.2_05" + COMPILEFLAGS="-Wall" + INCLUDES="-I. -I../../jbigi/include -I$JAVA_HOME/include/win32/ -I$JAVA_HOME/include/" + LINKFLAGS="-shared -Wl,--kill-at" + LIBFILE="jbigi.dll";; +CYGWIN*) + JAVA_HOME="c:/software/j2sdk1.4.2_05" + COMPILEFLAGS="-Wall -mno-cygwin" + INCLUDES="-I. -I../../jbigi/include -I$JAVA_HOME/include/win32/ -I$JAVA_HOME/include/" + LINKFLAGS="-shared -Wl,--kill-at" + LIBFILE="jbigi.dll";; +Darwin*) + JAVA_HOME="/Library/Java/Home" + COMPILEFLAGS="-Wall" + INCLUDES="-I. -I../../jbigi/include -I$JAVA_HOME/include" + LINKFLAGS="-dynamiclib -framework JavaVM" + LIBFILE="libjbigi.jnilib";; +*) + COMPILEFLAGS="-fPIC -Wall" + INCLUDES="-I. -I../../jbigi/include -I$JAVA_HOME/include -I$JAVA_HOME/include/linux" + LINKFLAGS="-shared -Wl,-soname,libjbigi.so" + LIBFILE="libjbigi.so";; +esac + +if [ "$1" = "dynamic" ] ; then + echo "Building a jbigi lib that is dynamically linked to GMP" + LIBPATH="-L.libs" + INCLUDELIBS="-lgmp" +else + echo "Building a jbigi lib that is statically linked to GMP" + STATICLIBS=".libs/libgmp.a" +fi + +echo "Compiling C code..." +rm -f jbigi.o $LIBFILE +$CC -c $COMPILEFLAGS $INCLUDES ../../jbigi/src/jbigi.c || exit 1 +$CC $LINKFLAGS $INCLUDES $INCLUDELIBS -o $LIBFILE jbigi.o $STATICLIBS || exit 1 + +exit 0 diff --git a/core/c/mbuild.sh b/core/c/mbuild.sh new file mode 100755 index 000000000..4591d5b7c --- /dev/null +++ b/core/c/mbuild.sh @@ -0,0 +1,28 @@ +#/bin/bash + +JBIGI=../../../installer/lib/jbigi/jbigi.jar + +if [ -f jbigi.jarx ] ; then +JBIGI=../jbigi.jar +fi + +(cd jcpuid ; sh build.sh ; cd ..) +(cd jbigi ; sh mbuild-all.sh ; cd ..) + +mkdir t + +( + cd t + jar xf ../../../installer/lib/jbigi/jbigi.jar +) + +cp jbigi/lib/net/i2p/util/* t/ +cp jcpuid/lib/freenet/support/CPUInformation/* t/ + +( + cd t + jar cf ../jbigi.jar . +) + +rm -R t +echo "jbigi.jar Refreshed." diff --git a/core/java/build.xml b/core/java/build.xml index 28adbf9df..a52dcb635 100644 --- a/core/java/build.xml +++ b/core/java/build.xml @@ -15,15 +15,21 @@ destdir="./build/obj" > + + - + + + - + + + diff --git a/core/java/nbproject/project.xml b/core/java/nbproject/project.xml new file mode 100644 index 000000000..f992a41da --- /dev/null +++ b/core/java/nbproject/project.xml @@ -0,0 +1,91 @@ + + + org.netbeans.modules.ant.freeform + + + i2p_sdk + + + + i2p_sdk + + + + + java + src + UTF-8 + + + + java + test + UTF-8 + + + + . + UTF-8 + + + + + build + + + clean + + + javadoc + + + test + + + clean + build + + + + folder + build/obj + build + + + + + + src + + + + test + + + build.xml + + + + + + + + + + + + + + src + build/obj + build/javadoc + 1.5 + + + test + + 1.5 + + + + diff --git a/core/java/src/com/nettgryppa/security/HashCash.java b/core/java/src/com/nettgryppa/security/HashCash.java index 7d4e16e92..6cee4c935 100644 --- a/core/java/src/com/nettgryppa/security/HashCash.java +++ b/core/java/src/com/nettgryppa/security/HashCash.java @@ -323,7 +323,7 @@ private static long bytesToLong(byte[] b) { if(null == extensions || extensions.isEmpty()) return ""; - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); List tempList; boolean first = true; diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java index 1d5c84882..378791ccf 100644 --- a/core/java/src/freenet/support/CPUInformation/CPUID.java +++ b/core/java/src/freenet/support/CPUInformation/CPUID.java @@ -9,6 +9,9 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; +import net.i2p.I2PAppContext; +import net.i2p.util.FileUtil; + /** * @author Iakin * A class for retrieveing details about the CPU using the CPUID assembly instruction. @@ -71,7 +74,7 @@ public class CPUID { private static String getCPUVendorID() { CPUIDResult c = doCPUID(0); - StringBuffer sb= new StringBuffer(13); + StringBuilder sb= new StringBuilder(13); sb.append((char)( c.EBX & 0xFF)); sb.append((char)((c.EBX >> 8) & 0xFF)); sb.append((char)((c.EBX >> 16) & 0xFF)); @@ -482,8 +485,11 @@ public class CPUID { * *

    This is a pretty ugly hack, using the general technique illustrated by the * onion FEC libraries. It works by pulling the resource, writing out the - * byte stream to a temporary file, loading the native library from that file, - * then deleting the file.

    + * byte stream to a temporary file, loading the native library from that file. + * We then attempt to copy the file from the temporary dir to the base install dir, + * so we don't have to do this next time - but we don't complain if it fails, + * so we transparently support read-only base dirs. + *

    * * @return true if it was loaded successfully, else false * @@ -501,11 +507,13 @@ public class CPUID { File outFile = null; FileOutputStream fos = null; + String filename = libPrefix + "jcpuid" + libSuffix; try { InputStream libStream = resource.openStream(); - outFile = new File(libPrefix + "jcpuid" + libSuffix); + outFile = new File(I2PAppContext.getGlobalContext().getTempDir(), filename); fos = new FileOutputStream(outFile); - byte buf[] = new byte[4096*1024]; + // wtf this was 4096*1024 which is really excessive for a roughly 4KB file + byte buf[] = new byte[4096]; while (true) { int read = libStream.read(buf); if (read < 0) break; @@ -514,7 +522,6 @@ public class CPUID { fos.close(); fos = null; System.load(outFile.getAbsolutePath());//System.load requires an absolute path to the lib - return true; } catch (UnsatisfiedLinkError ule) { if (_doLog) { System.err.println("ERROR: The resource " + resourceName @@ -533,6 +540,10 @@ public class CPUID { try { fos.close(); } catch (IOException ioe) {} } } + // copy to install dir, ignore failure + File newFile = new File(I2PAppContext.getGlobalContext().getBaseDir(), filename); + FileUtil.copy(outFile.getAbsolutePath(), newFile.getAbsolutePath(), false, true); + return true; } private static final String getResourceName() diff --git a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java index 417d0fc72..504b87d76 100644 --- a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java +++ b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java @@ -12,10 +12,11 @@ import net.i2p.util.Log; * has been eaten) */ public class AsyncFortunaStandalone extends FortunaStandalone implements Runnable { - private static final int BUFFERS = 16; + private static final int DEFAULT_BUFFERS = 16; private static final int BUFSIZE = 256*1024; - private final byte asyncBuffers[][] = new byte[BUFFERS][BUFSIZE]; - private final int status[] = new int[BUFFERS]; + private int _bufferCount; + private final byte asyncBuffers[][]; + private final int status[]; private int nextBuf = 0; private I2PAppContext _context; private Log _log; @@ -27,7 +28,10 @@ public class AsyncFortunaStandalone extends FortunaStandalone implements Runnabl public AsyncFortunaStandalone(I2PAppContext context) { super(); - for (int i = 0; i < BUFFERS; i++) + _bufferCount = context.getProperty("router.prng.buffers", DEFAULT_BUFFERS); + asyncBuffers = new byte[_bufferCount][BUFSIZE]; + status = new int[_bufferCount]; + for (int i = 0; i < _bufferCount; i++) status[i] = STATUS_NEED_FILL; _context = context; context.statManager().createRateStat("prng.bufferWaitTime", "", "Encryption", new long[] { 60*1000, 10*60*1000, 60*60*1000 } ); @@ -80,11 +84,11 @@ public class AsyncFortunaStandalone extends FortunaStandalone implements Runnabl status[nextBuf] = STATUS_LIVE; int prev=nextBuf-1; if (prev<0) - prev = BUFFERS-1; + prev = _bufferCount-1; if (status[prev] == STATUS_LIVE) status[prev] = STATUS_NEED_FILL; nextBuf++; - if (nextBuf >= BUFFERS) + if (nextBuf >= _bufferCount) nextBuf = 0; asyncBuffers.notify(); } @@ -95,7 +99,7 @@ public class AsyncFortunaStandalone extends FortunaStandalone implements Runnabl int toFill = -1; try { synchronized (asyncBuffers) { - for (int i = 0; i < BUFFERS; i++) { + for (int i = 0; i < _bufferCount; i++) { if (status[i] == STATUS_NEED_FILL) { status[i] = STATUS_FILLING; toFill = i; diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index c24542b00..78790b91a 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -14,8 +14,9 @@ package net.i2p; * */ public class CoreVersion { - public final static String ID = "$Revision: 1.72 $ $Date: 2008-08-24 12:00:00 $"; - public final static String VERSION = "0.7"; + /** deprecated */ + public final static String ID = "Monotone"; + public final static String VERSION = "0.7.6"; public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java index 6b3b0fd5b..025378d8c 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -1,5 +1,6 @@ package net.i2p; +import java.io.File; import java.util.HashSet; import java.util.Properties; import java.util.Set; @@ -17,12 +18,14 @@ import net.i2p.crypto.ElGamalEngine; import net.i2p.crypto.HMAC256Generator; import net.i2p.crypto.HMACGenerator; import net.i2p.crypto.KeyGenerator; -import net.i2p.crypto.PersistentSessionKeyManager; import net.i2p.crypto.SHA256Generator; import net.i2p.crypto.SessionKeyManager; +import net.i2p.crypto.TransientSessionKeyManager; import net.i2p.data.RoutingKeyGenerator; import net.i2p.stat.StatManager; import net.i2p.util.Clock; +import net.i2p.util.ConcurrentHashSet; +import net.i2p.util.FileUtil; import net.i2p.util.FortunaRandomSource; import net.i2p.util.KeyRing; import net.i2p.util.LogManager; @@ -94,6 +97,14 @@ public class I2PAppContext { private volatile boolean _randomInitialized; private volatile boolean _keyGeneratorInitialized; protected volatile boolean _keyRingInitialized; // used in RouterContext + private Set _shutdownTasks; + private File _baseDir; + private File _configDir; + private File _routerDir; + private File _pidDir; + private File _logDir; + private File _appDir; + private File _tmpDir; /** @@ -152,8 +163,146 @@ public class I2PAppContext { _elGamalAESEngineInitialized = false; _logManagerInitialized = false; _keyRingInitialized = false; + _shutdownTasks = new ConcurrentHashSet(0); + initializeDirs(); } + /** + * Directories. These are all set at instantiation and will not be changed by + * subsequent property changes. + * All properties, if set, should be absolute paths. + * + * Name Property Method Files + * ----- -------- ----- ----- + * Base i2p.dir.base getBaseDir() lib/, webapps/, docs/, geoip/, licenses/, ... + * Temp i2p.dir.temp getTempDir() Temporary files + * Config i2p.dir.config getConfigDir() *.config, hosts.txt, addressbook/, ... + * PID i2p.dir.pid getPIDDir() router.ping + * + * (the following all default to the same as Config) + * + * Router i2p.dir.router getRouterDir() netDb/, peerProfiles/, router.*, keyBackup/, ... + * Log i2p.dir.log getLogDir() logs/ + * App i2p.dir.app getAppDir() eepsite/, ... + * + * Note that we can't control where the wrapper puts its files. + * + * The app dir is where all data files should be. Apps should always read and write files here, + * using a constructor such as: + * + * String path = mypath; + * File f = new File(path); + * if (!f.isAbsolute()) + * f = new File(_context.geAppDir(), path); + * + * and never attempt to access files in the CWD using + * + * File f = new File("foo"); + * + * An app should assume the CWD is not writable. + * + * Here in I2PAppContext, all the dirs default to CWD. + * However these will be different in RouterContext, as Router.java will set + * the properties in the RouterContext constructor. + * + * Apps should never need to access the base dir, which is the location of the base I2P install. + * However this is provided for the router's use, and for backward compatibility should an app + * need to look there as well. + * + * All dirs except the base are created if they don't exist, but the creation will fail silently. + */ + private void initializeDirs() { + String s = getProperty("i2p.dir.base", System.getProperty("user.dir")); + _baseDir = new File(s); + // config defaults to base + s = getProperty("i2p.dir.config"); + if (s != null) { + _configDir = new File(s); + if (!_configDir.exists()) + _configDir.mkdir(); + } else { + _configDir = _baseDir; + } + // router defaults to config + s = getProperty("i2p.dir.router"); + if (s != null) { + _routerDir = new File(s); + if (!_routerDir.exists()) + _routerDir.mkdir(); + } else { + _routerDir = _configDir; + } + // pid defaults to system temp directory + s = getProperty("i2p.dir.pid", System.getProperty("java.io.tmpdir")); + _pidDir = new File(s); + if (!_pidDir.exists()) + _pidDir.mkdir(); + // these all default to router + s = getProperty("i2p.dir.log"); + if (s != null) { + _logDir = new File(s); + if (!_logDir.exists()) + _logDir.mkdir(); + } else { + _logDir = _routerDir; + } + s = getProperty("i2p.dir.app"); + if (s != null) { + _appDir = new File(s); + if (!_appDir.exists()) + _appDir.mkdir(); + } else { + _appDir = _routerDir; + } + /****** + System.err.println("Base directory: " + _baseDir.getAbsolutePath()); + System.err.println("Config directory: " + _configDir.getAbsolutePath()); + System.err.println("Router directory: " + _routerDir.getAbsolutePath()); + System.err.println("App directory: " + _appDir.getAbsolutePath()); + System.err.println("Log directory: " + _logDir.getAbsolutePath()); + System.err.println("PID directory: " + _pidDir.getAbsolutePath()); + System.err.println("Temp directory: " + getTempDir().getAbsolutePath()); + ******/ + } + + public File getBaseDir() { return _baseDir; } + public File getConfigDir() { return _configDir; } + public File getRouterDir() { return _routerDir; } + public File getPIDDir() { return _pidDir; } + public File getLogDir() { return _logDir; } + public File getAppDir() { return _appDir; } + public File getTempDir() { + // fixme don't synchronize every time + synchronized (this) { + if (_tmpDir == null) { + String d = getProperty("i2p.dir.temp", System.getProperty("java.io.tmpdir")); + // our random() probably isn't warmed up yet + String f = "i2p-" + Math.abs((new java.util.Random()).nextInt()) + ".tmp"; + _tmpDir = new File(d, f); + if (_tmpDir.exists()) { + // good or bad ? + } else if (_tmpDir.mkdir()) { + _tmpDir.deleteOnExit(); + } else { + System.err.println("Could not create temp dir " + _tmpDir.getAbsolutePath()); + _tmpDir = new File(_routerDir, "tmp"); + _tmpDir.mkdir(); + } + } + } + return _tmpDir; + } + + /** don't rely on deleteOnExit() */ + public void deleteTempDir() { + synchronized (this) { + if (_tmpDir != null) { + FileUtil.rmdir(_tmpDir, false); + _tmpDir = null; + } + } + } + /** * Access the configuration attributes of this context, using properties * provided during the context construction, or falling back on @@ -253,7 +402,8 @@ public class I2PAppContext { private void initializeSessionKeyManager() { synchronized (this) { if (_sessionKeyManager == null) - _sessionKeyManager = new PersistentSessionKeyManager(this); + //_sessionKeyManager = new PersistentSessionKeyManager(this); + _sessionKeyManager = new TransientSessionKeyManager(this); _sessionKeyManagerInitialized = true; } } @@ -557,4 +707,13 @@ public class I2PAppContext { _randomInitialized = true; } } + + public void addShutdownTask(Runnable task) { + _shutdownTasks.add(task); + } + + public Set getShutdownTasks() { + return new HashSet(_shutdownTasks); + } + } diff --git a/core/java/src/net/i2p/client/BWLimitsMessageHandler.java b/core/java/src/net/i2p/client/BWLimitsMessageHandler.java new file mode 100644 index 000000000..b47eaa6c8 --- /dev/null +++ b/core/java/src/net/i2p/client/BWLimitsMessageHandler.java @@ -0,0 +1,25 @@ +package net.i2p.client; + +/* + * Released into the public domain + * with no warranty of any kind, either expressed or implied. + */ + +import net.i2p.I2PAppContext; +import net.i2p.data.i2cp.I2CPMessage; +import net.i2p.data.i2cp.BandwidthLimitsMessage; + +/** + * Handle I2CP BW replies from the router + */ +class BWLimitsMessageHandler extends HandlerImpl { + public BWLimitsMessageHandler(I2PAppContext ctx) { + super(ctx, BandwidthLimitsMessage.MESSAGE_TYPE); + } + + public void handleMessage(I2CPMessage message, I2PSessionImpl session) { + _log.debug("Handle message " + message); + BandwidthLimitsMessage msg = (BandwidthLimitsMessage) message; + ((I2PSimpleSession)session).bwReceived(msg.getLimits()); + } +} diff --git a/core/java/src/net/i2p/client/I2PClientImpl.java b/core/java/src/net/i2p/client/I2PClientImpl.java index 4783458a3..5b1b44867 100644 --- a/core/java/src/net/i2p/client/I2PClientImpl.java +++ b/core/java/src/net/i2p/client/I2PClientImpl.java @@ -77,6 +77,6 @@ class I2PClientImpl implements I2PClient { * */ public I2PSession createSession(I2PAppContext context, InputStream destKeyStream, Properties options) throws I2PSessionException { - return new I2PSessionImpl2(context, destKeyStream, options); // thread safe + return new I2PSessionMuxedImpl(context, destKeyStream, options); // thread safe and muxed } } diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java index d8c64f222..1998dad55 100644 --- a/core/java/src/net/i2p/client/I2PSession.java +++ b/core/java/src/net/i2p/client/I2PSession.java @@ -40,6 +40,8 @@ public interface I2PSession { */ public boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException; public boolean sendMessage(Destination dest, byte[] payload, int offset, int size) throws I2PSessionException; + /** See I2PSessionMuxedImpl for details */ + public boolean sendMessage(Destination dest, byte[] payload, int proto, int fromport, int toport) throws I2PSessionException; /** * Like sendMessage above, except the key used and the tags sent are exposed to the @@ -71,6 +73,12 @@ public interface I2PSession { public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire) throws I2PSessionException; + /** See I2PSessionMuxedImpl for details */ + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + int proto, int fromport, int toport) throws I2PSessionException; + /** See I2PSessionMuxedImpl for details */ + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + int proto, int fromport, int toport) throws I2PSessionException; /** Receive a message that the router has notified the client about, returning * the payload. @@ -134,4 +142,23 @@ public interface I2PSession { * */ public Destination lookupDest(Hash h) throws I2PSessionException; + + /** + * Get the current bandwidth limits + */ + public int[] bandwidthLimits() throws I2PSessionException; + + /** See I2PSessionMuxedImpl for details */ + public void addSessionListener(I2PSessionListener lsnr, int proto, int port); + /** See I2PSessionMuxedImpl for details */ + public void addMuxedSessionListener(I2PSessionMuxedListener l, int proto, int port); + /** See I2PSessionMuxedImpl for details */ + public void removeListener(int proto, int port); + + public static final int PORT_ANY = 0; + public static final int PORT_UNSPECIFIED = 0; + public static final int PROTO_ANY = 0; + public static final int PROTO_UNSPECIFIED = 0; + public static final int PROTO_STREAMING = 6; + public static final int PROTO_DATAGRAM = 17; } diff --git a/core/java/src/net/i2p/client/I2PSessionDemultiplexer.java b/core/java/src/net/i2p/client/I2PSessionDemultiplexer.java new file mode 100644 index 000000000..9a1ff42e3 --- /dev/null +++ b/core/java/src/net/i2p/client/I2PSessionDemultiplexer.java @@ -0,0 +1,135 @@ +package net.i2p.client; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; + +import net.i2p.I2PAppContext; +import net.i2p.util.Log; + +/* + * public domain + */ + +/** + * Implement multiplexing with a 1-byte 'protocol' and a two-byte 'port'. + * Listeners register with either addListener() or addMuxedListener(), + * depending on whether they want to hear about the + * protocol, from port, and to port for every received message. + * + * This only calls one listener, not all that apply. + * + * @author zzz + */ +public class I2PSessionDemultiplexer implements I2PSessionMuxedListener { + private Log _log; + private Map _listeners; + + public I2PSessionDemultiplexer(I2PAppContext ctx) { + _log = ctx.logManager().getLog(I2PSessionDemultiplexer.class); + _listeners = new ConcurrentHashMap(); + } + + /** unused */ + public void messageAvailable(I2PSession session, int msgId, long size) {} + + public void messageAvailable(I2PSession session, int msgId, long size, int proto, int fromport, int toport ) { + I2PSessionMuxedListener l = findListener(proto, toport); + if (l != null) + l.messageAvailable(session, msgId, size, proto, fromport, toport); + else { + // no listener, throw it out + _log.error("No listener found for proto: " + proto + " port: " + toport + "msg id: " + msgId + + " from pool of " + _listeners.size() + " listeners"); + try { + session.receiveMessage(msgId); + } catch (I2PSessionException ise) {} + } + } + + public void reportAbuse(I2PSession session, int severity) { + for (I2PSessionMuxedListener l : _listeners.values()) + l.reportAbuse(session, severity); + } + + public void disconnected(I2PSession session) { + for (I2PSessionMuxedListener l : _listeners.values()) + l.disconnected(session); + } + + public void errorOccurred(I2PSession session, String message, Throwable error) { + for (I2PSessionMuxedListener l : _listeners.values()) + l.errorOccurred(session, message, error); + } + + /** + * For those that don't need to hear about the protocol and ports + * in messageAvailable() + * (Streaming lib) + */ + public void addListener(I2PSessionListener l, int proto, int port) { + _listeners.put(key(proto, port), new NoPortsListener(l)); + } + + /** + * For those that do care + * UDP perhaps + */ + public void addMuxedListener(I2PSessionMuxedListener l, int proto, int port) { + _listeners.put(key(proto, port), l); + } + + public void removeListener(int proto, int port) { + _listeners.remove(key(proto, port)); + } + + /** find the one listener that most specifically matches the request */ + private I2PSessionMuxedListener findListener(int proto, int port) { + I2PSessionMuxedListener rv = getListener(proto, port); + if (rv != null) return rv; + if (port != I2PSession.PORT_ANY) { // try any port + rv = getListener(proto, I2PSession.PORT_ANY); + if (rv != null) return rv; + } + if (proto != I2PSession.PROTO_ANY) { // try any protocol + rv = getListener(I2PSession.PROTO_ANY, port); + if (rv != null) return rv; + } + if (proto != I2PSession.PROTO_ANY && port != I2PSession.PORT_ANY) { // try default + rv = getListener(I2PSession.PROTO_ANY, I2PSession.PORT_ANY); + } + return rv; + } + + private I2PSessionMuxedListener getListener(int proto, int port) { + return _listeners.get(key(proto, port)); + } + + private Integer key(int proto, int port) { + return Integer.valueOf(((port << 8) & 0xffff00) | proto); + } + + /** for those that don't care about proto and ports */ + private static class NoPortsListener implements I2PSessionMuxedListener { + private I2PSessionListener _l; + + public NoPortsListener(I2PSessionListener l) { + _l = l; + } + + public void messageAvailable(I2PSession session, int msgId, long size) { + throw new IllegalArgumentException("no"); + } + public void messageAvailable(I2PSession session, int msgId, long size, int proto, int fromport, int toport) { + _l.messageAvailable(session, msgId, size); + } + public void reportAbuse(I2PSession session, int severity) { + _l.reportAbuse(session, severity); + } + public void disconnected(I2PSession session) { + _l.disconnected(session); + } + public void errorOccurred(I2PSession session, String message, Throwable error) { + _l.errorOccurred(session, message, error); + } + } +} diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java index 00da88aa2..5be6d2a6b 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl.java +++ b/core/java/src/net/i2p/client/I2PSessionImpl.java @@ -16,7 +16,6 @@ import java.net.Socket; import java.net.UnknownHostException; import java.util.concurrent.ConcurrentHashMap; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -77,12 +76,12 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa protected OutputStream _out; /** who we send events to */ - private I2PSessionListener _sessionListener; + protected I2PSessionListener _sessionListener; /** class that generates new messages */ protected I2CPMessageProducer _producer; /** map of Long --> MessagePayloadMessage */ - private Map _availableMessages; + protected Map _availableMessages; protected I2PClientMessageHandlerMap _handlerMap; @@ -90,7 +89,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa protected I2PAppContext _context; /** monitor for waiting until a lease set has been granted */ - private Object _leaseSetWait = new Object(); + private final Object _leaseSetWait = new Object(); /** whether the session connection has already been closed (or not yet opened) */ protected boolean _closed; @@ -101,8 +100,13 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa /** have we received the current date from the router yet? */ private boolean _dateReceived; /** lock that we wait upon, that the SetDateMessageHandler notifies */ - private Object _dateReceivedLock = new Object(); - + private final Object _dateReceivedLock = new Object(); + + /** whether the session connection is in the process of being opened */ + protected boolean _opening; + + /** monitor for waiting until opened */ + private final Object _openingWait = new Object(); /** * thread that we tell when new messages are available who then tells us * to fetch them. The point of this is so that the fetch doesn't block the @@ -137,6 +141,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa _log = context.logManager().getLog(I2PSessionImpl.class); _handlerMap = new I2PClientMessageHandlerMap(context); _closed = true; + _opening = false; _closing = false; _producer = new I2CPMessageProducer(context); _availabilityNotifier = new AvailabilityNotifier(); @@ -162,7 +167,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa protected void loadConfig(Properties options) { _options = new Properties(); _options.putAll(filter(options)); - _hostname = _options.getProperty(I2PClient.PROP_TCP_HOST, "localhost"); + _hostname = _options.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1"); String portNum = _options.getProperty(I2PClient.PROP_TCP_PORT, LISTEN_PORT + ""); try { _portNum = Integer.parseInt(portNum); @@ -213,6 +218,17 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa return _leaseSet; } + void setOpening(boolean ls) { + _opening = ls; + synchronized (_openingWait) { + _openingWait.notifyAll(); + } + } + + boolean getOpening() { + return _opening; + } + /** * Load up the destKeyFile for our Destination, PrivateKey, and SigningPrivateKey * @@ -236,6 +252,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa * not reachable */ public void connect() throws I2PSessionException { + setOpening(true); _closed = false; _availabilityNotifier.stopNotifying(); I2PThread notifier = new I2PThread(_availabilityNotifier); @@ -253,6 +270,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa try { if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "connect begin to " + _hostname + ":" + _portNum); _socket = new Socket(_hostname, _portNum); + // _socket.setSoTimeout(1000000); // Uhmmm we could really-really use a real timeout, and handle it. _out = _socket.getOutputStream(); synchronized (_out) { _out.write(I2PClient.PROTOCOL_BYTE); @@ -294,11 +312,14 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa + (connected - startConnect) + "ms - ready to participate in the network!"); startIdleMonitor(); + setOpening(false); } catch (UnknownHostException uhe) { _closed = true; + setOpening(false); throw new I2PSessionException(getPrefix() + "Invalid session configuration", uhe); } catch (IOException ioe) { _closed = true; + setOpening(false); throw new I2PSessionException(getPrefix() + "Problem connecting to " + _hostname + " on port " + _portNum, ioe); } } @@ -366,14 +387,14 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa } SimpleScheduler.getInstance().addEvent(new VerifyUsage(mid), 30*1000); } - private class VerifyUsage implements SimpleTimer.TimedEvent { + protected class VerifyUsage implements SimpleTimer.TimedEvent { private Long _msgId; public VerifyUsage(Long id) { _msgId = id; } public void timeReached() { MessagePayloadMessage removed = _availableMessages.remove(_msgId); if (removed != null && !isClosed()) - _log.log(Log.CRIT, "Message NOT removed! id=" + _msgId + ": " + removed); + _log.error("Message NOT removed! id=" + _msgId + ": " + removed); } } @@ -547,13 +568,28 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa } /** - * Tear down the session, and do NOT reconnect + * Tear down the session, and do NOT reconnect. + * + * Blocks if session has not been fully started. */ public void destroySession() { destroySession(true); } + /** + * Tear down the session, and do NOT reconnect. + * + * Blocks if session has not been fully started. + */ public void destroySession(boolean sendDisconnect) { + while (_opening) { + synchronized (_openingWait) { + try { + _openingWait.wait(1000); + } catch (InterruptedException ie) { // nop + } + } + } if (_closed) return; if (_log.shouldLog(Log.INFO)) _log.info(getPrefix() + "Destroy the session", new Exception("DestroySession()")); @@ -656,6 +692,10 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa return null; } + public int[] bandwidthLimits() throws I2PSessionException { + return null; + } + protected void updateActivity() { _lastActivity = _context.clock().now(); if (_isReduced) { diff --git a/core/java/src/net/i2p/client/I2PSessionImpl2.java b/core/java/src/net/i2p/client/I2PSessionImpl2.java index 56ef88974..9abce4b72 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl2.java +++ b/core/java/src/net/i2p/client/I2PSessionImpl2.java @@ -93,7 +93,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * set to false. */ private static final int DONT_COMPRESS_SIZE = 66; - private boolean shouldCompress(int size) { + protected boolean shouldCompress(int size) { if (size <= DONT_COMPRESS_SIZE) return false; String p = getOptions().getProperty("i2cp.gzip"); @@ -102,12 +102,35 @@ class I2PSessionImpl2 extends I2PSessionImpl { return SHOULD_COMPRESS; } + public void addSessionListener(I2PSessionListener lsnr, int proto, int port) { + throw new IllegalArgumentException("Use MuxedImpl"); + } + public void addMuxedSessionListener(I2PSessionMuxedListener l, int proto, int port) { + throw new IllegalArgumentException("Use MuxedImpl"); + } + public void removeListener(int proto, int port) { + throw new IllegalArgumentException("Use MuxedImpl"); + } + public boolean sendMessage(Destination dest, byte[] payload, int proto, int fromport, int toport) throws I2PSessionException { + throw new IllegalArgumentException("Use MuxedImpl"); + } + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + int proto, int fromport, int toport) throws I2PSessionException { + throw new IllegalArgumentException("Use MuxedImpl"); + } + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + int proto, int fromport, int toport) throws I2PSessionException { + throw new IllegalArgumentException("Use MuxedImpl"); + } + @Override public boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException { return sendMessage(dest, payload, 0, payload.length); } public boolean sendMessage(Destination dest, byte[] payload, int offset, int size) throws I2PSessionException { - return sendMessage(dest, payload, offset, size, new SessionKey(), new HashSet(64), 0); + // we don't do end-to-end crypto any more + //return sendMessage(dest, payload, offset, size, new SessionKey(), new HashSet(64), 0); + return sendMessage(dest, payload, offset, size, null, null, 0); } @Override @@ -173,7 +196,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { private static final int NUM_TAGS = 50; - private boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires) + protected boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { SessionKey key = null; SessionKey newKey = null; diff --git a/core/java/src/net/i2p/client/I2PSessionListener.java b/core/java/src/net/i2p/client/I2PSessionListener.java index 4c78c6527..740ebeeab 100644 --- a/core/java/src/net/i2p/client/I2PSessionListener.java +++ b/core/java/src/net/i2p/client/I2PSessionListener.java @@ -20,7 +20,7 @@ public interface I2PSessionListener { * size # of bytes. * @param session session to notify * @param msgId message number available - * @param size size of the message + * @param size size of the message - why it's a long and not an int is a mystery */ void messageAvailable(I2PSession session, int msgId, long size); @@ -42,4 +42,4 @@ public interface I2PSessionListener { * */ void errorOccurred(I2PSession session, String message, Throwable error); -} \ No newline at end of file +} diff --git a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java b/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java new file mode 100644 index 000000000..58b5cae9f --- /dev/null +++ b/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java @@ -0,0 +1,342 @@ +package net.i2p.client; + +/* + * public domain + */ + +import java.io.InputStream; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.Properties; +import java.util.Set; + +import java.util.concurrent.atomic.AtomicBoolean; +import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; +import net.i2p.data.Destination; +import net.i2p.data.SessionKey; +import net.i2p.data.i2cp.MessagePayloadMessage; +import net.i2p.util.Log; +import net.i2p.util.SimpleScheduler; + +/** + * I2PSession with protocol and ports + * + * Streaming lib has been modified to send I2PSession.PROTO_STREAMING but + * still receives all. It sends with fromPort and toPort = 0, and receives on all ports. + * + * No datagram apps have been modified yet. + + * Therefore the compatibility situation is as follows: + * + * Compatibility: + * old streaming -> new streaming: sends proto anything, rcvs proto anything + * new streaming -> old streaming: sends PROTO_STREAMING, ignores rcvd proto + * old datagram -> new datagram: sends proto anything, rcvs proto anything + * new datagram -> old datagram: sends PROTO_DATAGRAM, ignores rcvd proto + * In all the above cases, streaming and datagram receive traffic for the other + * protocol, same as before. + * + * old datagram -> new muxed: doesn't work because the old sends proto 0 but the udp side + * of the mux registers with PROTO_DATAGRAM, so the datagrams + * go to the streaming side, same as before. + * old streaming -> new muxed: works + * + * Typical Usage: + * Streaming + datagrams: + * I2PSocketManager sockMgr = getSocketManager(); + * I2PSession session = sockMgr.getSession(); + * session.addMuxedSessionListener(myI2PSessionMuxedListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); + * * or * + * session.addSessionListener(myI2PSessionListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); + * session.sendMessage(dest, payload, I2PSession.PROTO_DATAGRAM, fromPort, toPort); + * + * Datagrams only, with multiple ports: + * I2PClient client = I2PClientFactory.createClient(); + * ... + * I2PSession session = client.createSession(...); + * session.addMuxedSessionListener(myI2PSessionMuxedListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); + * * or * + * session.addSessionListener(myI2PSessionListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); + * session.sendMessage(dest, payload, I2PSession.PROTO_DATAGRAM, fromPort, toPort); + * + * Multiple streaming ports: + * Needs some streaming lib hacking + * + * @author zzz + */ +class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession { + private I2PSessionDemultiplexer _demultiplexer; + + public I2PSessionMuxedImpl(I2PAppContext ctx, InputStream destKeyStream, Properties options) throws I2PSessionException { + super(ctx, destKeyStream, options); + // also stored in _sessionListener but we keep it in _demultipexer + // as well so we don't have to keep casting + _demultiplexer = new I2PSessionDemultiplexer(ctx); + super.setSessionListener(_demultiplexer); + // discards the one in super(), sorry about that... (no it wasn't started yet) + _availabilityNotifier = new MuxedAvailabilityNotifier(); + } + + /** listen on all protocols and ports */ + @Override + public void setSessionListener(I2PSessionListener lsnr) { + _demultiplexer.addListener(lsnr, PROTO_ANY, PORT_ANY); + } + + /** + * Listen on specified protocol and port. + * + * An existing listener with the same proto and port is replaced. + * Only the listener with the best match is called back for each message. + * + * @param proto 1-254 or PROTO_ANY for all; recommended: + * I2PSession.PROTO_STREAMING + * I2PSession.PROTO_DATAGRAM + * 255 disallowed + * @param port 1-65535 or PORT_ANY for all + */ + @Override + public void addSessionListener(I2PSessionListener lsnr, int proto, int port) { + _demultiplexer.addListener(lsnr, proto, port); + } + + /** + * Listen on specified protocol and port, and receive notification + * of proto, fromPort, and toPort for every message. + * @param proto 1-254 or 0 for all; 255 disallowed + * @param port 1-65535 or 0 for all + */ + @Override + public void addMuxedSessionListener(I2PSessionMuxedListener l, int proto, int port) { + _demultiplexer.addMuxedListener(l, proto, port); + } + + /** removes the specified listener (only) */ + @Override + public void removeListener(int proto, int port) { + _demultiplexer.removeListener(proto, port); + } + + @Override + public boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException { + return sendMessage(dest, payload, 0, payload.length, null, null, + 0, PROTO_UNSPECIFIED, PORT_UNSPECIFIED, PORT_UNSPECIFIED); + } + + @Override + public boolean sendMessage(Destination dest, byte[] payload, int proto, int fromport, int toport) throws I2PSessionException { + return sendMessage(dest, payload, 0, payload.length, null, null, 0, proto, fromport, toport); + } + + @Override + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, + SessionKey keyUsed, Set tagsSent, long expires) + throws I2PSessionException { + return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, PROTO_UNSPECIFIED, PORT_UNSPECIFIED, PORT_UNSPECIFIED); + } + + @Override + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + int proto, int fromport, int toport) throws I2PSessionException { + return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, proto, fromport, toport); + } + + /** + * @param proto 1-254 or 0 for unset; recommended: + * I2PSession.PROTO_UNSPECIFIED + * I2PSession.PROTO_STREAMING + * I2PSession.PROTO_DATAGRAM + * 255 disallowed + * @param fromPort 1-65535 or 0 for unset + * @param toPort 1-65535 or 0 for unset + */ + @Override + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, + SessionKey keyUsed, Set tagsSent, long expires, + int proto, int fromPort, int toPort) + throws I2PSessionException { + if (isClosed()) throw new I2PSessionException("Already closed"); + updateActivity(); + + boolean sc = shouldCompress(size); + if (sc) + payload = DataHelper.compress(payload, offset, size); + else + payload = DataHelper.compress(payload, offset, size, DataHelper.NO_COMPRESSION); + + setProto(payload, proto); + setFromPort(payload, fromPort); + setToPort(payload, toPort); + + _context.statManager().addRateData("i2cp.tx.msgCompressed", payload.length, 0); + _context.statManager().addRateData("i2cp.tx.msgExpanded", size, 0); + return sendBestEffort(dest, payload, keyUsed, tagsSent, expires); + } + + /** + * Receive a payload message and let the app know its available + */ + @Override + public void addNewMessage(MessagePayloadMessage msg) { + Long mid = new Long(msg.getMessageId()); + _availableMessages.put(mid, msg); + long id = msg.getMessageId(); + byte data[] = msg.getPayload().getUnencryptedData(); + if ((data == null) || (data.length <= 0)) { + if (_log.shouldLog(Log.CRIT)) + _log.log(Log.CRIT, getPrefix() + "addNewMessage of a message with no unencrypted data", + new Exception("Empty message")); + return; + } + int size = data.length; + if (size < 10) { + _log.error(getPrefix() + "length too short for gzip header: " + size); + return; + } + ((MuxedAvailabilityNotifier)_availabilityNotifier).available(id, size, getProto(msg), + getFromPort(msg), getToPort(msg)); + SimpleScheduler.getInstance().addEvent(new VerifyUsage(mid), 30*1000); + } + + protected class MuxedAvailabilityNotifier extends AvailabilityNotifier { + private LinkedBlockingQueue _msgs; + private volatile boolean _alive = false; + private static final int POISON_SIZE = -99999; + private final AtomicBoolean stopping = new AtomicBoolean(false); + + public MuxedAvailabilityNotifier() { + _msgs = new LinkedBlockingQueue(); + } + + @Override + public void stopNotifying() { + boolean again = true; + synchronized (stopping) { + if( !stopping.getAndSet(true)) { + if (_alive == true) { + // System.out.println("I2PSessionMuxedImpl.stopNotifying()"); + _msgs.clear(); + while(again) { + try { + _msgs.put(new MsgData(0, POISON_SIZE, 0, 0, 0)); + again = false; + // System.out.println("I2PSessionMuxedImpl.stopNotifying() success."); + } catch (InterruptedException ie) { + continue; + } + } + } + _alive = false; + stopping.set(false); + } + // stopping.notifyAll(); + } + } + /** unused */ + @Override + public void available(long msgId, int size) { throw new IllegalArgumentException("no"); } + + public void available(long msgId, int size, int proto, int fromPort, int toPort) { + try { + _msgs.put(new MsgData((int)(msgId & 0xffffffff), size, proto, fromPort, toPort)); + } catch (InterruptedException ie) {} + } + + @Override + public void run() { + MsgData msg; + _alive=true; + while (_alive) { + try { + msg = _msgs.take(); + } catch (InterruptedException ie) { + _log.debug("I2PSessionMuxedImpl.run() InterruptedException " + String.valueOf(_msgs.size()) + " Messages, Alive " + _alive); + continue; + } + if (msg.size == POISON_SIZE) { + // System.out.println("I2PSessionMuxedImpl.run() POISONED"); + break; + } + try { + _demultiplexer.messageAvailable(I2PSessionMuxedImpl.this, + msg.id, msg.size, msg.proto, msg.fromPort, msg.toPort); + } catch (Exception e) { + _log.error("Error notifying app of message availability"); + } + } + } + } + + /** let's keep this simple */ + private static class MsgData { + public int id, size, proto, fromPort, toPort; + public MsgData(int i, int s, int p, int f, int t) { + id = i; + size = s; + proto = p; + fromPort = f; + toPort = t; + } + } + + /** + * No, we couldn't put any protocol byte in front of everything and + * keep backward compatibility. But there are several bytes that + * are unused AND unchecked in the gzip header in releases <= 0.7. + * So let's use 5 of them for a protocol and two 2-byte ports. + * + * Following are all the methods to hide the + * protocol, fromPort, and toPort in the gzip header + * + * The fields used are all ignored on receive in ResettableGzipInputStream + * + * See also ResettableGzipOutputStream. + * Ref: RFC 1952 + * + */ + + /** OS byte in gzip header */ + private static final int PROTO_BYTE = 9; + + /** Upper two bytes of MTIME in gzip header */ + private static final int FROMPORT_BYTES = 4; + + /** Lower two bytes of MTIME in gzip header */ + private static final int TOPORT_BYTES = 6; + + /** Non-muxed sets the OS byte to 0xff */ + private static int getProto(MessagePayloadMessage msg) { + int rv = getByte(msg, PROTO_BYTE) & 0xff; + return rv == 0xff ? PROTO_UNSPECIFIED : rv; + } + + /** Non-muxed sets the MTIME bytes to 0 */ + private static int getFromPort(MessagePayloadMessage msg) { + return (((getByte(msg, FROMPORT_BYTES) & 0xff) << 8) | + (getByte(msg, FROMPORT_BYTES + 1) & 0xff)); + } + + /** Non-muxed sets the MTIME bytes to 0 */ + private static int getToPort(MessagePayloadMessage msg) { + return (((getByte(msg, TOPORT_BYTES) & 0xff) << 8) | + (getByte(msg, TOPORT_BYTES + 1) & 0xff)); + } + + private static int getByte(MessagePayloadMessage msg, int i) { + return msg.getPayload().getUnencryptedData()[i] & 0xff; + } + + private static void setProto(byte[] payload, int p) { + payload[PROTO_BYTE] = (byte) (p & 0xff); + } + + private static void setFromPort(byte[] payload, int p) { + payload[FROMPORT_BYTES] = (byte) ((p >> 8) & 0xff); + payload[FROMPORT_BYTES + 1] = (byte) (p & 0xff); + } + + private static void setToPort(byte[] payload, int p) { + payload[TOPORT_BYTES] = (byte) ((p >> 8) & 0xff); + payload[TOPORT_BYTES + 1] = (byte) (p & 0xff); + } +} diff --git a/core/java/src/net/i2p/client/I2PSessionMuxedListener.java b/core/java/src/net/i2p/client/I2PSessionMuxedListener.java new file mode 100644 index 000000000..118dc75ca --- /dev/null +++ b/core/java/src/net/i2p/client/I2PSessionMuxedListener.java @@ -0,0 +1,62 @@ +package net.i2p.client; + +/* + * public domain + */ + +/** + * Define a means for the router to asynchronously notify the client that a + * new message is available or the router is under attack. + * + * @author zzz extends I2PSessionListener + */ +public interface I2PSessionMuxedListener extends I2PSessionListener { + + /** + * Will be called only if you register via + * setSessionListener() or addSessionListener(). + * And if you are doing that, just use I2PSessionListener. + * + * If you register via addSessionListener(), + * this will be called only for the proto(s) and toport(s) you register for. + * + * @param session session to notify + * @param msgId message number available + * @param size size of the message - why it's a long and not an int is a mystery + */ + void messageAvailable(I2PSession session, int msgId, long size); + + /** + * Instruct the client that the given session has received a message + * + * Will be called only if you register via addMuxedSessionListener(). + * Will be called only for the proto(s) and toport(s) you register for. + * + * @param session session to notify + * @param msgId message number available + * @param size size of the message - why it's a long and not an int is a mystery + * @param proto 1-254 or 0 for unspecified + * @param fromport 1-65535 or 0 for unspecified + * @param toport 1-65535 or 0 for unspecified + */ + void messageAvailable(I2PSession session, int msgId, long size, int proto, int fromport, int toport); + + /** Instruct the client that the session specified seems to be under attack + * and that the client may wish to move its destination to another router. + * @param session session to report abuse to + * @param severity how bad the abuse is + */ + void reportAbuse(I2PSession session, int severity); + + /** + * Notify the client that the session has been terminated + * + */ + void disconnected(I2PSession session); + + /** + * Notify the client that some error occurred + * + */ + void errorOccurred(I2PSession session, String message, Throwable error); +} diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/I2PSimpleSession.java index fcfafe767..b417bd7f7 100644 --- a/core/java/src/net/i2p/client/I2PSimpleSession.java +++ b/core/java/src/net/i2p/client/I2PSimpleSession.java @@ -17,25 +17,32 @@ import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.Hash; +import net.i2p.data.i2cp.BandwidthLimitsMessage; import net.i2p.data.i2cp.DestLookupMessage; import net.i2p.data.i2cp.DestReplyMessage; +import net.i2p.data.i2cp.GetBandwidthLimitsMessage; import net.i2p.data.i2cp.I2CPMessageReader; import net.i2p.util.I2PThread; import net.i2p.util.Log; /** - * Create a new session for doing naming queries only. Do not create a Destination. + * Create a new session for doing naming and bandwidth queries only. Do not create a Destination. * Don't create a producer. Do not send/receive messages to other Destinations. * Cannot handle multiple simultaneous queries atm. * Could be expanded to ask the router other things. + * + * @author zzz */ class I2PSimpleSession extends I2PSessionImpl2 { private boolean _destReceived; private Object _destReceivedLock; private Destination _destination; + private boolean _bwReceived; + private Object _bwReceivedLock; + private int[] _bwLimits; /** - * Create a new session for doing naming queries only. Do not create a destination. + * Create a new session for doing naming and bandwidth queries only. Do not create a destination. * * @throws I2PSessionException if there is a problem */ @@ -94,6 +101,14 @@ class I2PSimpleSession extends I2PSessionImpl2 { } } + void bwReceived(int[] i) { + _bwReceived = true; + _bwLimits = i; + synchronized (_bwReceivedLock) { + _bwReceivedLock.notifyAll(); + } + } + public Destination lookupDest(Hash h) throws I2PSessionException { if (_closed) return null; @@ -110,14 +125,31 @@ class I2PSimpleSession extends I2PSessionImpl2 { return _destination; } + public int[] bandwidthLimits() throws I2PSessionException { + if (_closed) + return null; + _bwReceivedLock = new Object(); + sendMessage(new GetBandwidthLimitsMessage()); + for (int i = 0; i < 5 && !_bwReceived; i++) { + try { + synchronized (_bwReceivedLock) { + _bwReceivedLock.wait(1000); + } + } catch (InterruptedException ie) {} + } + _bwReceived = false; + return _bwLimits; + } + /** * Only map message handlers that we will use */ class SimpleMessageHandlerMap extends I2PClientMessageHandlerMap { public SimpleMessageHandlerMap(I2PAppContext context) { - int highest = DestReplyMessage.MESSAGE_TYPE; + int highest = Math.max(DestReplyMessage.MESSAGE_TYPE, BandwidthLimitsMessage.MESSAGE_TYPE); _handlers = new I2CPMessageHandler[highest+1]; _handlers[DestReplyMessage.MESSAGE_TYPE] = new DestReplyMessageHandler(context); + _handlers[BandwidthLimitsMessage.MESSAGE_TYPE] = new BWLimitsMessageHandler(context); } } } diff --git a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java index 7a8bd200e..e662f6572 100644 --- a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java +++ b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java @@ -79,7 +79,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { leaseSet.setEncryptionKey(li.getPublicKey()); leaseSet.setSigningKey(li.getSigningPublicKey()); - boolean encrypt = Boolean.valueOf(session.getOptions().getProperty("i2cp.encryptLeaseset")).booleanValue(); + boolean encrypt = Boolean.valueOf(session.getOptions().getProperty("i2cp.encryptLeaseSet")).booleanValue(); String sk = session.getOptions().getProperty("i2cp.leaseSetKey"); if (encrypt && sk != null) { SessionKey key = new SessionKey(); diff --git a/core/java/src/net/i2p/client/naming/HostsTxtNamingService.java b/core/java/src/net/i2p/client/naming/HostsTxtNamingService.java index 9fa227f81..f89d56d09 100644 --- a/core/java/src/net/i2p/client/naming/HostsTxtNamingService.java +++ b/core/java/src/net/i2p/client/naming/HostsTxtNamingService.java @@ -16,8 +16,10 @@ import java.util.Set; import java.util.StringTokenizer; import net.i2p.I2PAppContext; +import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.Destination; +import net.i2p.data.Hash; import net.i2p.util.Log; /** @@ -87,7 +89,7 @@ public class HostsTxtNamingService extends NamingService { String hostsfile = (String)filenames.get(i); Properties hosts = new Properties(); try { - File f = new File(hostsfile); + File f = new File(_context.getRouterDir(), hostsfile); if ( (f.exists()) && (f.canRead()) ) { DataHelper.loadProps(hosts, f, true); @@ -117,7 +119,7 @@ public class HostsTxtNamingService extends NamingService { String hostsfile = (String)filenames.get(i); Properties hosts = new Properties(); try { - File f = new File(hostsfile); + File f = new File(_context.getRouterDir(), hostsfile); if ( (f.exists()) && (f.canRead()) ) { DataHelper.loadProps(hosts, f, true); Set keyset = hosts.keySet(); @@ -135,4 +137,34 @@ public class HostsTxtNamingService extends NamingService { } return null; } + + @Override + public String reverseLookup(Hash h) { + List filenames = getFilenames(); + for (int i = 0; i < filenames.size(); i++) { + String hostsfile = (String)filenames.get(i); + Properties hosts = new Properties(); + try { + File f = new File(_context.getRouterDir(), hostsfile); + if ( (f.exists()) && (f.canRead()) ) { + DataHelper.loadProps(hosts, f, true); + Set keyset = hosts.keySet(); + Iterator iter = keyset.iterator(); + while (iter.hasNext()) { + String host = (String)iter.next(); + String key = hosts.getProperty(host); + try { + Destination destkey = new Destination(); + destkey.fromBase64(key); + if (h.equals(destkey.calculateHash())) + return host; + } catch (DataFormatException dfe) {} + } + } + } catch (Exception ioe) { + _log.error("Error loading hosts file " + hostsfile, ioe); + } + } + return null; + } } diff --git a/core/java/src/net/i2p/client/naming/NamingService.java b/core/java/src/net/i2p/client/naming/NamingService.java index 5b61b1bcf..ee02ec911 100644 --- a/core/java/src/net/i2p/client/naming/NamingService.java +++ b/core/java/src/net/i2p/client/naming/NamingService.java @@ -16,6 +16,7 @@ import java.util.Map; import net.i2p.I2PAppContext; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; +import net.i2p.data.Hash; import net.i2p.util.Log; /** @@ -61,6 +62,7 @@ public abstract class NamingService { * null if no reverse lookup is possible. */ public abstract String reverseLookup(Destination dest); + public String reverseLookup(Hash h) { return null; }; /** * Check if host name is valid Base64 encoded dest and return this diff --git a/core/java/src/net/i2p/client/naming/PetName.java b/core/java/src/net/i2p/client/naming/PetName.java index 128fb9811..38d27b608 100644 --- a/core/java/src/net/i2p/client/naming/PetName.java +++ b/core/java/src/net/i2p/client/naming/PetName.java @@ -124,7 +124,7 @@ public class PetName { @Override public String toString() { - StringBuffer buf = new StringBuffer(256); + StringBuilder buf = new StringBuilder(256); if (_name != null) buf.append(_name.trim()); buf.append(':'); if (_network != null) buf.append(_network.trim()); diff --git a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java index 1d67918f7..3e191faaa 100644 --- a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java +++ b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java @@ -58,12 +58,19 @@ public class ElGamalAESEngine { new long[] { 60 * 60 * 1000l, 24 * 60 * 60 * 1000l}); } + /** + * Decrypt the message using the given private key using tags from the given key manager. + */ + public byte[] decrypt(byte data[], PrivateKey targetPrivateKey) throws DataFormatException { + return decrypt(data, targetPrivateKey, _context.sessionKeyManager()); + } + /** * Decrypt the message using the given private key. This works according to the * ElGamal+AES algorithm in the data structure spec. * */ - public byte[] decrypt(byte data[], PrivateKey targetPrivateKey) throws DataFormatException { + public byte[] decrypt(byte data[], PrivateKey targetPrivateKey, SessionKeyManager keyManager) throws DataFormatException { if (data == null) { if (_log.shouldLog(Log.ERROR)) _log.error("Null data being decrypted?"); return null; @@ -76,7 +83,7 @@ public class ElGamalAESEngine { byte tag[] = new byte[32]; System.arraycopy(data, 0, tag, 0, tag.length); SessionTag st = new SessionTag(tag); - SessionKey key = _context.sessionKeyManager().consumeTag(st); + SessionKey key = keyManager.consumeTag(st); SessionKey foundKey = new SessionKey(); foundKey.setData(null); SessionKey usedKey = new SessionKey(); @@ -124,11 +131,11 @@ public class ElGamalAESEngine { if (foundKey.getData() != null) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Found key: " + foundKey.toBase64() + " tags: " + foundTags + " wasExisting? " + wasExisting); - _context.sessionKeyManager().tagsReceived(foundKey, foundTags); + keyManager.tagsReceived(foundKey, foundTags); } else { if (_log.shouldLog(Log.DEBUG)) _log.debug("Used key: " + usedKey.toBase64() + " tags: " + foundTags + " wasExisting? " + wasExisting); - _context.sessionKeyManager().tagsReceived(usedKey, foundTags); + keyManager.tagsReceived(usedKey, foundTags); } } return decrypted; diff --git a/core/java/src/net/i2p/crypto/ElGamalEngine.java b/core/java/src/net/i2p/crypto/ElGamalEngine.java index 8733e26cf..ae82613c7 100644 --- a/core/java/src/net/i2p/crypto/ElGamalEngine.java +++ b/core/java/src/net/i2p/crypto/ElGamalEngine.java @@ -130,7 +130,7 @@ public class ElGamalEngine { System.arraycopy(dbytes, 0, out, (dbytes.length < 257 ? 514 - dbytes.length : 257), (dbytes.length > 257 ? 257 : dbytes.length)); /* - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); buf.append("Timing\n"); buf.append("0-1: ").append(t1 - t0).append('\n'); buf.append("1-2: ").append(t2 - t1).append('\n'); diff --git a/core/java/src/net/i2p/crypto/HMAC256Generator.java b/core/java/src/net/i2p/crypto/HMAC256Generator.java index 2fcaa7b5e..0335d1e7e 100644 --- a/core/java/src/net/i2p/crypto/HMAC256Generator.java +++ b/core/java/src/net/i2p/crypto/HMAC256Generator.java @@ -7,7 +7,8 @@ import net.i2p.data.Hash; import net.i2p.data.SessionKey; import org.bouncycastle.crypto.Digest; -import org.bouncycastle.crypto.macs.HMac; +import org.bouncycastle.crypto.Mac; +import org.bouncycastle.crypto.macs.I2PHMac; /** * Calculate the HMAC-SHA256 of a key+message. All the good stuff occurs @@ -19,15 +20,15 @@ public class HMAC256Generator extends HMACGenerator { public HMAC256Generator(I2PAppContext context) { super(context); } @Override - protected HMac acquire() { + protected I2PHMac acquire() { synchronized (_available) { if (_available.size() > 0) - return (HMac)_available.remove(0); + return (I2PHMac)_available.remove(0); } // the HMAC is hardcoded to use SHA256 digest size // for backwards compatability. next time we have a backwards // incompatible change, we should update this by removing ", 32" - return new HMac(new Sha256ForMAC()); + return new I2PHMac(new Sha256ForMAC()); } private class Sha256ForMAC extends Sha256Standalone implements Digest { diff --git a/core/java/src/net/i2p/crypto/HMACGenerator.java b/core/java/src/net/i2p/crypto/HMACGenerator.java index 8388590a2..b549c8855 100644 --- a/core/java/src/net/i2p/crypto/HMACGenerator.java +++ b/core/java/src/net/i2p/crypto/HMACGenerator.java @@ -10,7 +10,8 @@ import net.i2p.data.Hash; import net.i2p.data.SessionKey; import org.bouncycastle.crypto.digests.MD5Digest; -import org.bouncycastle.crypto.macs.HMac; +import org.bouncycastle.crypto.Mac; +import org.bouncycastle.crypto.macs.I2PHMac; /** * Calculate the HMAC-MD5 of a key+message. All the good stuff occurs @@ -49,7 +50,7 @@ public class HMACGenerator { if ((key == null) || (key.getData() == null) || (data == null)) throw new NullPointerException("Null arguments for HMAC"); - HMac mac = acquire(); + I2PHMac mac = acquire(); mac.init(key.getData()); mac.update(data, offset, length); //byte rv[] = new byte[Hash.HASH_LENGTH]; @@ -73,7 +74,7 @@ public class HMACGenerator { if ((key == null) || (key.getData() == null) || (curData == null)) throw new NullPointerException("Null arguments for HMAC"); - HMac mac = acquire(); + I2PHMac mac = acquire(); mac.init(key.getData()); mac.update(curData, curOffset, curLength); byte rv[] = acquireTmp(); @@ -86,17 +87,17 @@ public class HMACGenerator { return eq; } - protected HMac acquire() { + protected I2PHMac acquire() { synchronized (_available) { if (_available.size() > 0) - return (HMac)_available.remove(0); + return (I2PHMac)_available.remove(0); } // the HMAC is hardcoded to use SHA256 digest size // for backwards compatability. next time we have a backwards // incompatible change, we should update this by removing ", 32" - return new HMac(new MD5Digest(), 32); + return new I2PHMac(new MD5Digest(), 32); } - private void release(HMac mac) { + private void release(Mac mac) { synchronized (_available) { if (_available.size() < 64) _available.add(mac); @@ -122,4 +123,4 @@ public class HMACGenerator { _availableTmp.add((Object)tmp); } } -} \ No newline at end of file +} diff --git a/core/java/src/net/i2p/crypto/PersistentSessionKeyManager.java b/core/java/src/net/i2p/crypto/PersistentSessionKeyManager.java deleted file mode 100644 index 811e6e412..000000000 --- a/core/java/src/net/i2p/crypto/PersistentSessionKeyManager.java +++ /dev/null @@ -1,190 +0,0 @@ -package net.i2p.crypto; - -/* - * free (adj.): unencumbered; not under the control of others - * Written by jrandom in 2003 and released into the public domain - * with no warranty of any kind, either expressed or implied. - * It probably won't make your computer catch on fire, or eat - * your children, but it might. Use at your own risk. - * - */ - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import net.i2p.I2PAppContext; -import net.i2p.data.DataFormatException; -import net.i2p.data.DataHelper; -import net.i2p.data.PublicKey; -import net.i2p.data.SessionKey; -import net.i2p.data.SessionTag; -import net.i2p.util.Log; - -/** - * Expose the functionality to allow people to write out and read in the - * session key and session tag information via streams. This implementation - * does not write anywhere except where its told. - * - */ -public class PersistentSessionKeyManager extends TransientSessionKeyManager { - private Log _log; - private Object _yk = YKGenerator.class; - - - /** - * The session key manager should only be constructed and accessed through the - * application context. This constructor should only be used by the - * appropriate application context itself. - * - */ - public PersistentSessionKeyManager(I2PAppContext context) { - super(context); - _log = context.logManager().getLog(PersistentSessionKeyManager.class); - } - private PersistentSessionKeyManager() { - this(null); - } - /** - * Write the session key data to the given stream - * - */ - public void saveState(OutputStream out) throws IOException, DataFormatException { - if (true) return; - - Set tagSets = getInboundTagSets(); - Set sessions = getOutboundSessions(); - if (_log.shouldLog(Log.INFO)) - _log.info("Saving state with " + tagSets.size() + " inbound tagSets and " - + sessions.size() + " outbound sessions"); - - DataHelper.writeLong(out, 4, tagSets.size()); - for (Iterator iter = tagSets.iterator(); iter.hasNext();) { - TagSet ts = (TagSet) iter.next(); - writeTagSet(out, ts); - } - DataHelper.writeLong(out, 4, sessions.size()); - for (Iterator iter = sessions.iterator(); iter.hasNext();) { - OutboundSession sess = (OutboundSession) iter.next(); - writeOutboundSession(out, sess); - } - } - - /** - * Load the session key data from the given stream - * - */ - public void loadState(InputStream in) throws IOException, DataFormatException { - int inboundSets = (int) DataHelper.readLong(in, 4); - Set tagSets = new HashSet(inboundSets); - for (int i = 0; i < inboundSets; i++) { - TagSet ts = readTagSet(in); - tagSets.add(ts); - } - int outboundSessions = (int) DataHelper.readLong(in, 4); - Set sessions = new HashSet(outboundSessions); - for (int i = 0; i < outboundSessions; i++) { - OutboundSession sess = readOutboundSession(in); - sessions.add(sess); - } - - if (_log.shouldLog(Log.INFO)) - _log.info("Loading state with " + tagSets.size() + " inbound tagSets and " - + sessions.size() + " outbound sessions"); - setData(tagSets, sessions); - } - - private void writeOutboundSession(OutputStream out, OutboundSession sess) throws IOException, DataFormatException { - sess.getTarget().writeBytes(out); - sess.getCurrentKey().writeBytes(out); - DataHelper.writeDate(out, new Date(sess.getEstablishedDate())); - DataHelper.writeDate(out, new Date(sess.getLastUsedDate())); - List sets = sess.getTagSets(); - DataHelper.writeLong(out, 2, sets.size()); - for (Iterator iter = sets.iterator(); iter.hasNext();) { - TagSet set = (TagSet) iter.next(); - writeTagSet(out, set); - } - } - - private void writeTagSet(OutputStream out, TagSet ts) throws IOException, DataFormatException { - ts.getAssociatedKey().writeBytes(out); - DataHelper.writeDate(out, new Date(ts.getDate())); - DataHelper.writeLong(out, 2, ts.getTags().size()); - for (Iterator iter = ts.getTags().iterator(); iter.hasNext();) { - SessionTag tag = (SessionTag) iter.next(); - out.write(tag.getData()); - } - } - - private OutboundSession readOutboundSession(InputStream in) throws IOException, DataFormatException { - PublicKey key = new PublicKey(); - key.readBytes(in); - SessionKey skey = new SessionKey(); - skey.readBytes(in); - Date established = DataHelper.readDate(in); - Date lastUsed = DataHelper.readDate(in); - int tagSets = (int) DataHelper.readLong(in, 2); - ArrayList sets = new ArrayList(tagSets); - for (int i = 0; i < tagSets; i++) { - TagSet ts = readTagSet(in); - sets.add(ts); - } - - return new OutboundSession(key, skey, established.getTime(), lastUsed.getTime(), sets); - } - - private TagSet readTagSet(InputStream in) throws IOException, DataFormatException { - SessionKey key = new SessionKey(); - key.readBytes(in); - Date date = DataHelper.readDate(in); - int numTags = (int) DataHelper.readLong(in, 2); - Set tags = new HashSet(numTags); - for (int i = 0; i < numTags; i++) { - SessionTag tag = new SessionTag(); - byte val[] = new byte[SessionTag.BYTE_LENGTH]; - int read = DataHelper.read(in, val); - if (read != SessionTag.BYTE_LENGTH) - throw new IOException("Unable to fully read a session tag [" + read + " not " + SessionTag.BYTE_LENGTH - + ")"); - tag.setData(val); - tags.add(tag); - } - TagSet ts = new TagSet(tags, key, _context.clock().now()); - ts.setDate(date.getTime()); - return ts; - } - - public static void main(String args[]) { - I2PAppContext ctx = new I2PAppContext(); - Log log = ctx.logManager().getLog(PersistentSessionKeyManager.class); - PersistentSessionKeyManager mgr = (PersistentSessionKeyManager)ctx.sessionKeyManager(); - try { - mgr.loadState(new FileInputStream("sessionKeys.dat")); - String state = mgr.renderStatusHTML(); - FileOutputStream fos = new FileOutputStream("sessionKeysBeforeExpire.html"); - fos.write(state.getBytes()); - fos.close(); - int expired = mgr.aggressiveExpire(); - log.error("Expired: " + expired); - String stateAfter = mgr.renderStatusHTML(); - FileOutputStream fos2 = new FileOutputStream("sessionKeysAfterExpire.html"); - fos2.write(stateAfter.getBytes()); - fos2.close(); - } catch (Throwable t) { - log.error("Error loading/storing sessionKeys", t); - } - try { - Thread.sleep(3000); - } catch (Throwable t) { // nop - } - } -} \ No newline at end of file diff --git a/core/java/src/net/i2p/crypto/SessionKeyManager.java b/core/java/src/net/i2p/crypto/SessionKeyManager.java index 5b609347b..b1547864c 100644 --- a/core/java/src/net/i2p/crypto/SessionKeyManager.java +++ b/core/java/src/net/i2p/crypto/SessionKeyManager.java @@ -93,7 +93,7 @@ public class SessionKeyManager { * method after receiving an ack to a message delivering them) * */ - public void tagsDelivered(PublicKey target, SessionKey key, Set sessionTags) { // nop + public void tagsDelivered(PublicKey target, SessionKey key, Set sessionTags) { // nop } /** @@ -109,7 +109,7 @@ public class SessionKeyManager { * Accept the given tags and associate them with the given key for decryption * */ - public void tagsReceived(SessionKey key, Set sessionTags) { // nop + public void tagsReceived(SessionKey key, Set sessionTags) { // nop } /** @@ -130,4 +130,4 @@ public class SessionKeyManager { */ public void shutdown() { // nop } -} \ No newline at end of file +} diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java index 0d71677a9..15c149168 100644 --- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java +++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java @@ -33,13 +33,14 @@ import net.i2p.util.SimpleTimer; * out to disk so this should not be considered secure in that sense. * */ -class TransientSessionKeyManager extends SessionKeyManager { +public class TransientSessionKeyManager extends SessionKeyManager { private Log _log; /** Map allowing us to go from the targeted PublicKey to the OutboundSession used */ - private Map _outboundSessions; + private Map _outboundSessions; /** Map allowing us to go from a SessionTag to the containing TagSet */ - private Map _inboundTagSets; + private Map _inboundTagSets; protected I2PAppContext _context; + private volatile boolean _alive; /** * Let session tags sit around for 10 minutes before expiring them. We can now have such a large @@ -55,6 +56,10 @@ class TransientSessionKeyManager extends SessionKeyManager { * */ public final static long SESSION_LIFETIME_MAX_MS = SESSION_TAG_DURATION_MS + 5 * 60 * 1000; + /** + * a few MB? how about 16MB! + * This is the max size of _inboundTagSets. + */ public final static int MAX_INBOUND_SESSION_TAGS = 500 * 1000; // this will consume at most a few MB /** @@ -67,46 +72,61 @@ class TransientSessionKeyManager extends SessionKeyManager { super(context); _log = context.logManager().getLog(TransientSessionKeyManager.class); _context = context; - _outboundSessions = new HashMap(1024); + _outboundSessions = new HashMap(64); _inboundTagSets = new HashMap(1024); context.statManager().createRateStat("crypto.sessionTagsExpired", "How many tags/sessions are expired?", "Encryption", new long[] { 10*60*1000, 60*60*1000, 3*60*60*1000 }); context.statManager().createRateStat("crypto.sessionTagsRemaining", "How many tags/sessions are remaining after a cleanup?", "Encryption", new long[] { 10*60*1000, 60*60*1000, 3*60*60*1000 }); - SimpleScheduler.getInstance().addPeriodicEvent(new CleanupEvent(), 60*1000); + _alive = true; + SimpleScheduler.getInstance().addEvent(new CleanupEvent(), 60*1000); } private TransientSessionKeyManager() { this(null); } + public void shutdown() { + _alive = false; + synchronized (_inboundTagSets) { + _inboundTagSets.clear(); + } + synchronized (_outboundSessions) { + _outboundSessions.clear(); + } + } + private class CleanupEvent implements SimpleTimer.TimedEvent { public void timeReached() { + if (!_alive) + return; long beforeExpire = _context.clock().now(); int expired = aggressiveExpire(); long expireTime = _context.clock().now() - beforeExpire; _context.statManager().addRateData("crypto.sessionTagsExpired", expired, expireTime); + SimpleScheduler.getInstance().addEvent(this, 60*1000); } } + /** TagSet */ - protected Set getInboundTagSets() { + protected Set getInboundTagSets() { synchronized (_inboundTagSets) { return new HashSet(_inboundTagSets.values()); } } /** OutboundSession */ - protected Set getOutboundSessions() { + protected Set getOutboundSessions() { synchronized (_outboundSessions) { return new HashSet(_outboundSessions.values()); } } - protected void setData(Set inboundTagSets, Set outboundSessions) { + protected void setData(Set inboundTagSets, Set outboundSessions) { if (_log.shouldLog(Log.INFO)) _log.info("Loading " + inboundTagSets.size() + " inbound tag sets, and " + outboundSessions.size() + " outbound sessions"); - Map tagSets = new HashMap(inboundTagSets.size()); - for (Iterator iter = inboundTagSets.iterator(); iter.hasNext();) { - TagSet ts = (TagSet) iter.next(); - for (Iterator tsIter = ts.getTags().iterator(); tsIter.hasNext();) { - SessionTag tag = (SessionTag) tsIter.next(); + Map tagSets = new HashMap(inboundTagSets.size()); + for (Iterator iter = inboundTagSets.iterator(); iter.hasNext();) { + TagSet ts = iter.next(); + for (Iterator tsIter = ts.getTags().iterator(); tsIter.hasNext();) { + SessionTag tag = tsIter.next(); tagSets.put(tag, ts); } } @@ -114,9 +134,9 @@ class TransientSessionKeyManager extends SessionKeyManager { _inboundTagSets.clear(); _inboundTagSets.putAll(tagSets); } - Map sessions = new HashMap(outboundSessions.size()); - for (Iterator iter = outboundSessions.iterator(); iter.hasNext();) { - OutboundSession sess = (OutboundSession) iter.next(); + Map sessions = new HashMap(outboundSessions.size()); + for (Iterator iter = outboundSessions.iterator(); iter.hasNext();) { + OutboundSession sess = iter.next(); sessions.put(sess.getTarget(), sess); } synchronized (_outboundSessions) { @@ -151,6 +171,7 @@ class TransientSessionKeyManager extends SessionKeyManager { * Associate a new session key with the specified target. Metrics to determine * when to expire that key begin with this call. * + * Unused except in tests? */ @Override public void createSession(PublicKey target, SessionKey key) { @@ -159,6 +180,18 @@ class TransientSessionKeyManager extends SessionKeyManager { addSession(sess); } + /** + * Same as above but for internal use, returns OutboundSession so we don't have + * to do a subsequent getSession() + * + */ + private OutboundSession createAndReturnSession(PublicKey target, SessionKey key) { + OutboundSession sess = new OutboundSession(target); + sess.setCurrentKey(key); + addSession(sess); + return sess; + } + /** * Retrieve the next available session tag for identifying the use of the given * key when communicating with the target. If this returns null, no tags are @@ -232,10 +265,8 @@ class TransientSessionKeyManager extends SessionKeyManager { _log.debug("Tags delivered: " + sessionTags.size() + " for key: " + key.toBase64() + ": " + sessionTags); } OutboundSession sess = getSession(target); - if (sess == null) { - createSession(target, key); - sess = getSession(target); - } + if (sess == null) + sess = createAndReturnSession(target, key); sess.setCurrentKey(key); TagSet set = new TagSet(sessionTags, key, _context.clock().now()); sess.addTags(set); @@ -257,13 +288,13 @@ class TransientSessionKeyManager extends SessionKeyManager { * */ @Override - public void tagsReceived(SessionKey key, Set sessionTags) { + public void tagsReceived(SessionKey key, Set sessionTags) { int overage = 0; TagSet tagSet = new TagSet(sessionTags, key, _context.clock().now()); TagSet old = null; SessionTag dupTag = null; - for (Iterator iter = sessionTags.iterator(); iter.hasNext();) { - SessionTag tag = (SessionTag) iter.next(); + for (Iterator iter = sessionTags.iterator(); iter.hasNext();) { + SessionTag tag = iter.next(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Receiving tag " + tag + " for key " + key.toBase64() + " / " + key.toString() + ": tagSet: " + tagSet); synchronized (_inboundTagSets) { @@ -284,12 +315,12 @@ class TransientSessionKeyManager extends SessionKeyManager { if (old != null) { // drop both old and tagSet tags synchronized (_inboundTagSets) { - for (Iterator iter = old.getTags().iterator(); iter.hasNext(); ) { - SessionTag tag = (SessionTag)iter.next(); + for (Iterator iter = old.getTags().iterator(); iter.hasNext(); ) { + SessionTag tag = iter.next(); _inboundTagSets.remove(tag); } - for (Iterator iter = sessionTags.iterator(); iter.hasNext(); ) { - SessionTag tag = (SessionTag)iter.next(); + for (Iterator iter = sessionTags.iterator(); iter.hasNext(); ) { + SessionTag tag = iter.next(); _inboundTagSets.remove(tag); } } @@ -325,10 +356,11 @@ class TransientSessionKeyManager extends SessionKeyManager { int recent = 0; int tags = 0; int toRemove = overage * 2; - List removed = new ArrayList(toRemove); + _log.log(Log.CRIT, "TOO MANY SESSION TAGS! Starting cleanup, overage = " + overage); + List removed = new ArrayList(toRemove); synchronized (_inboundTagSets) { - for (Iterator iter = _inboundTagSets.values().iterator(); iter.hasNext(); ) { - TagSet set = (TagSet)iter.next(); + for (Iterator iter = _inboundTagSets.values().iterator(); iter.hasNext(); ) { + TagSet set = iter.next(); int size = set.getTags().size(); if (size > 1000) absurd++; @@ -344,8 +376,8 @@ class TransientSessionKeyManager extends SessionKeyManager { } for (int i = 0; i < removed.size(); i++) { TagSet cur = (TagSet)removed.get(i); - for (Iterator iter = cur.getTags().iterator(); iter.hasNext(); ) { - SessionTag tag = (SessionTag)iter.next(); + for (Iterator iter = cur.getTags().iterator(); iter.hasNext(); ) { + SessionTag tag = iter.next(); _inboundTagSets.remove(tag); tags++; } @@ -420,17 +452,17 @@ class TransientSessionKeyManager extends SessionKeyManager { int removed = 0; int remaining = 0; long now = _context.clock().now(); - StringBuffer buf = null; - StringBuffer bufSummary = null; + StringBuilder buf = null; + StringBuilder bufSummary = null; if (_log.shouldLog(Log.DEBUG)) { - buf = new StringBuffer(128); + buf = new StringBuilder(128); buf.append("Expiring inbound: "); - bufSummary = new StringBuffer(1024); + bufSummary = new StringBuilder(1024); } synchronized (_inboundTagSets) { - for (Iterator iter = _inboundTagSets.keySet().iterator(); iter.hasNext();) { - SessionTag tag = (SessionTag) iter.next(); - TagSet ts = (TagSet) _inboundTagSets.get(tag); + for (Iterator iter = _inboundTagSets.keySet().iterator(); iter.hasNext();) { + SessionTag tag = iter.next(); + TagSet ts = _inboundTagSets.get(tag); long age = now - ts.getDate(); if (age > SESSION_LIFETIME_MAX_MS) { //if (ts.getDate() < now - SESSION_LIFETIME_MAX_MS) { @@ -454,9 +486,9 @@ class TransientSessionKeyManager extends SessionKeyManager { //_log.warn("Expiring tags: [" + tagsToDrop + "]"); synchronized (_outboundSessions) { - for (Iterator iter = _outboundSessions.keySet().iterator(); iter.hasNext();) { - PublicKey key = (PublicKey) iter.next(); - OutboundSession sess = (OutboundSession) _outboundSessions.get(key); + for (Iterator iter = _outboundSessions.keySet().iterator(); iter.hasNext();) { + PublicKey key = iter.next(); + OutboundSession sess = _outboundSessions.get(key); removed += sess.expireTags(); if (sess.availableTags() <= 0) { iter.remove(); @@ -468,25 +500,25 @@ class TransientSessionKeyManager extends SessionKeyManager { } public String renderStatusHTML() { - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); buf.append("

    Inbound sessions

    "); - buf.append(""); - Set inbound = getInboundTagSets(); - Map inboundSets = new HashMap(inbound.size()); - for (Iterator iter = inbound.iterator(); iter.hasNext();) { - TagSet ts = (TagSet) iter.next(); + buf.append("
    "); + Set inbound = getInboundTagSets(); + Map> inboundSets = new HashMap(inbound.size()); + for (Iterator iter = inbound.iterator(); iter.hasNext();) { + TagSet ts = iter.next(); if (!inboundSets.containsKey(ts.getAssociatedKey())) inboundSets.put(ts.getAssociatedKey(), new HashSet()); - Set sets = (Set) inboundSets.get(ts.getAssociatedKey()); + Set sets = inboundSets.get(ts.getAssociatedKey()); sets.add(ts); } - for (Iterator iter = inboundSets.keySet().iterator(); iter.hasNext();) { - SessionKey skey = (SessionKey) iter.next(); - Set sets = (Set) inboundSets.get(skey); + for (Iterator iter = inboundSets.keySet().iterator(); iter.hasNext();) { + SessionKey skey = iter.next(); + Set sets = inboundSets.get(skey); buf.append(""); buf.append(""); buf.append("
    Session key: ").append(skey.toBase64()).append("# Sets: ").append(sets.size()).append("
      "); - for (Iterator siter = sets.iterator(); siter.hasNext();) { - TagSet ts = (TagSet) siter.next(); + for (Iterator siter = sets.iterator(); siter.hasNext();) { + TagSet ts = siter.next(); buf.append("
    • Received on: ").append(new Date(ts.getDate())).append(" with ") .append(ts.getTags().size()).append(" tags remaining
    • "); } @@ -496,18 +528,18 @@ class TransientSessionKeyManager extends SessionKeyManager { buf.append("

      Outbound sessions

      "); - buf.append(""); - Set outbound = getOutboundSessions(); - for (Iterator iter = outbound.iterator(); iter.hasNext();) { - OutboundSession sess = (OutboundSession) iter.next(); + buf.append("
      "); + Set outbound = getOutboundSessions(); + for (Iterator iter = outbound.iterator(); iter.hasNext();) { + OutboundSession sess = iter.next(); buf.append(""); buf.append(""); buf.append("
      Target key: ").append(sess.getTarget().toString()).append("
      "); buf.append("Established: ").append(new Date(sess.getEstablishedDate())).append("
      "); buf.append("Last Used: ").append(new Date(sess.getLastUsedDate())).append("
      "); buf.append("# Sets: ").append(sess.getTagSets().size()).append("
      Session key: ").append(sess.getCurrentKey().toBase64()).append("
        "); - for (Iterator siter = sess.getTagSets().iterator(); siter.hasNext();) { - TagSet ts = (TagSet) siter.next(); + for (Iterator siter = sess.getTagSets().iterator(); siter.hasNext();) { + TagSet ts = siter.next(); buf.append("
      • Sent on: ").append(new Date(ts.getDate())).append(" with ").append( ts.getTags() .size()) @@ -525,13 +557,13 @@ class TransientSessionKeyManager extends SessionKeyManager { private SessionKey _currentKey; private long _established; private long _lastUsed; - private List _tagSets; + private List _tagSets; public OutboundSession(PublicKey target) { this(target, null, _context.clock().now(), _context.clock().now(), new ArrayList()); } - OutboundSession(PublicKey target, SessionKey curKey, long established, long lastUsed, List tagSets) { + OutboundSession(PublicKey target, SessionKey curKey, long established, long lastUsed, List tagSets) { _target = target; _currentKey = curKey; _established = established; @@ -540,7 +572,7 @@ class TransientSessionKeyManager extends SessionKeyManager { } /** list of TagSet objects */ - List getTagSets() { + List getTagSets() { synchronized (_tagSets) { return new ArrayList(_tagSets); } @@ -559,7 +591,7 @@ class TransientSessionKeyManager extends SessionKeyManager { if (_currentKey != null) { if (!_currentKey.equals(key)) { int dropped = 0; - List sets = _tagSets; + List sets = _tagSets; _tagSets = new ArrayList(); for (int i = 0; i < sets.size(); i++) { TagSet set = (TagSet) sets.get(i); @@ -641,8 +673,8 @@ class TransientSessionKeyManager extends SessionKeyManager { public long getLastExpirationDate() { long last = 0; synchronized (_tagSets) { - for (Iterator iter = _tagSets.iterator(); iter.hasNext();) { - TagSet set = (TagSet) iter.next(); + for (Iterator iter = _tagSets.iterator(); iter.hasNext();) { + TagSet set = iter.next(); if ( (set.getDate() > last) && (set.getTags().size() > 0) ) last = set.getDate(); } @@ -662,12 +694,12 @@ class TransientSessionKeyManager extends SessionKeyManager { } static class TagSet { - private Set _sessionTags; + private Set _sessionTags; private SessionKey _key; private long _date; private Exception _createdBy; - public TagSet(Set tags, SessionKey key, long date) { + public TagSet(Set tags, SessionKey key, long date) { if (key == null) throw new IllegalArgumentException("Missing key"); if (tags == null) throw new IllegalArgumentException("Missing tags"); _sessionTags = tags; @@ -691,7 +723,7 @@ class TransientSessionKeyManager extends SessionKeyManager { } /** tags still available */ - public Set getTags() { + public Set getTags() { return _sessionTags; } diff --git a/core/java/src/net/i2p/crypto/TrustedUpdate.java b/core/java/src/net/i2p/crypto/TrustedUpdate.java index dfd055382..102442156 100644 --- a/core/java/src/net/i2p/crypto/TrustedUpdate.java +++ b/core/java/src/net/i2p/crypto/TrustedUpdate.java @@ -1,6 +1,7 @@ package net.i2p.crypto; import java.io.ByteArrayInputStream; +import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -108,6 +109,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= private Log _log; private ArrayList _trustedKeys; + private String _newVersion; /** * Constructs a new TrustedUpdate with the default global @@ -127,6 +129,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= _context = context; _log = _context.logManager().getLog(TrustedUpdate.class); _trustedKeys = new ArrayList(); + _newVersion = null; String propertyTrustedKeys = context.getProperty(PROP_TRUSTED_KEYS); @@ -139,7 +142,6 @@ D8usM7Dxp5yrDrCYZ5AIijc= } else { _trustedKeys.add(DEFAULT_TRUSTED_KEY); _trustedKeys.add(DEFAULT_TRUSTED_KEY2); - _trustedKeys.add(DEFAULT_TRUSTED_KEY3); } if (_log.shouldLog(Log.DEBUG)) _log.debug("TrustedUpdate created, trusting " + _trustedKeys.size() + " keys."); @@ -253,16 +255,16 @@ D8usM7Dxp5yrDrCYZ5AIijc= } private static final String sanitize(String versionString) { - StringBuffer versionStringBuffer = new StringBuffer(versionString); + StringBuilder versionStringBuilder = new StringBuilder(versionString); - for (int i = 0; i < versionStringBuffer.length(); i++) { - if (VALID_VERSION_CHARS.indexOf(versionStringBuffer.charAt(i)) == -1) { - versionStringBuffer.deleteCharAt(i); + for (int i = 0; i < versionStringBuilder.length(); i++) { + if (VALID_VERSION_CHARS.indexOf(versionStringBuilder.charAt(i)) == -1) { + versionStringBuilder.deleteCharAt(i); i--; } } - return versionStringBuffer.toString(); + return versionStringBuilder.toString(); } private static final void showUsageCLI() { @@ -274,7 +276,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= } private static final void showVersionCLI(String signedFile) { - String versionString = new TrustedUpdate().getVersionString(signedFile); + String versionString = new TrustedUpdate().getVersionString(new File(signedFile)); if (versionString == "") System.out.println("No version string found in file '" + signedFile + "'"); @@ -292,7 +294,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= } private static final void verifySigCLI(String signedFile) { - boolean isValidSignature = new TrustedUpdate().verify(signedFile); + boolean isValidSignature = new TrustedUpdate().verify(new File(signedFile)); if (isValidSignature) System.out.println("Signature VALID"); @@ -301,7 +303,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= } private static final void verifyUpdateCLI(String signedFile) { - boolean isUpdate = new TrustedUpdate().isUpdatedVersion(CoreVersion.VERSION, signedFile); + boolean isUpdate = new TrustedUpdate().isUpdatedVersion(CoreVersion.VERSION, new File(signedFile)); if (isUpdate) System.out.println("File version is newer than current version."); @@ -326,7 +328,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= * delimited by CR LF line breaks. */ public String getTrustedKeysString() { - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); for (int i = 0; i < _trustedKeys.size(); i++) { // If something already buffered, first add line break. if (buf.length() > 0) buf.append("\r\n"); @@ -345,7 +347,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= * @return The version string read, or an empty string if no version string * is present. */ - public String getVersionString(String signedFile) { + public String getVersionString(File signedFile) { FileInputStream fileInputStream = null; try { @@ -379,6 +381,11 @@ D8usM7Dxp5yrDrCYZ5AIijc= } } + /** version in the .sud file, valid only after calling migrateVerified() */ + public String newVersion() { + return _newVersion; + } + /** * Verifies that the version of the given signed update file is newer than * currentVersion. @@ -389,11 +396,9 @@ D8usM7Dxp5yrDrCYZ5AIijc= * @return true if the signed update file's version is newer * than the current version, otherwise false. */ - public boolean isUpdatedVersion(String currentVersion, String signedFile) { - if (needsUpdate(currentVersion, getVersionString(signedFile))) - return true; - else - return false; + public boolean isUpdatedVersion(String currentVersion, File signedFile) { + _newVersion = getVersionString(signedFile); + return needsUpdate(currentVersion, _newVersion); } /** @@ -408,7 +413,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= * @return null if the signature and version were valid and the * data was moved, and an error String otherwise. */ - public String migrateVerified(String currentVersion, String signedFile, String outputFile) { + public String migrateVerified(String currentVersion, File signedFile, File outputFile) { if (!isUpdatedVersion(currentVersion, signedFile)) return "Downloaded version is not greater than current version"; @@ -601,7 +606,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= * @return true if the file has a valid signature, otherwise * false. */ - public boolean verify(String signedFile) { + public boolean verify(File signedFile) { for (int i = 0; i < _trustedKeys.size(); i++) { SigningPublicKey signingPublicKey = new SigningPublicKey(); @@ -657,7 +662,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= } } - return verify(signedFile, signingPublicKey); + return verify(new File(signedFile), signingPublicKey); } /** @@ -671,7 +676,7 @@ D8usM7Dxp5yrDrCYZ5AIijc= * @return true if the file has a valid signature, otherwise * false. */ - public boolean verify(String signedFile, SigningPublicKey signingPublicKey) { + public boolean verify(File signedFile, SigningPublicKey signingPublicKey) { FileInputStream fileInputStream = null; try { diff --git a/core/java/src/net/i2p/data/Address.java b/core/java/src/net/i2p/data/Address.java index 205c448ff..3a69a232f 100644 --- a/core/java/src/net/i2p/data/Address.java +++ b/core/java/src/net/i2p/data/Address.java @@ -73,7 +73,7 @@ public class Address extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[Address: "); buf.append("\n\tHostname: ").append(getHostname()); buf.append("\n\tDestination: ").append(getDestination()); diff --git a/core/java/src/net/i2p/data/Base32.java b/core/java/src/net/i2p/data/Base32.java index b2cc2d548..adb7e9196 100644 --- a/core/java/src/net/i2p/data/Base32.java +++ b/core/java/src/net/i2p/data/Base32.java @@ -137,7 +137,7 @@ public class Base32 { } public static String encode(byte[] source) { - StringBuffer buf = new StringBuffer((source.length + 7) * 8 / 5); + StringBuilder buf = new StringBuilder((source.length + 7) * 8 / 5); encodeBytes(source, buf); return buf.toString(); } @@ -149,7 +149,7 @@ public class Base32 { * * @param source The data to convert */ - private static void encodeBytes(byte[] source, StringBuffer out) { + private static void encodeBytes(byte[] source, StringBuilder out) { int usedbits = 0; for (int i = 0; i < source.length; ) { int fivebits; diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java index 58ec48d24..2b9fe85e6 100644 --- a/core/java/src/net/i2p/data/Base64.java +++ b/core/java/src/net/i2p/data/Base64.java @@ -330,7 +330,7 @@ public class Base64 { } // end switch } // end encode3to4 - private static void encode3to4(byte[] source, int srcOffset, int numSigBytes, StringBuffer buf, byte alpha[]) { + private static void encode3to4(byte[] source, int srcOffset, int numSigBytes, StringBuilder buf, byte alpha[]) { // 1 2 3 // 01234567890123456789012345678901 Bit position // --------000000001111111122222222 Array position from threeBytes @@ -394,7 +394,7 @@ public class Base64 { private static String safeEncode(byte[] source, int off, int len, boolean useStandardAlphabet) { if (len + off > source.length) throw new ArrayIndexOutOfBoundsException("Trying to encode too much! source.len=" + source.length + " off=" + off + " len=" + len); - StringBuffer buf = new StringBuffer(len * 4 / 3); + StringBuilder buf = new StringBuilder(len * 4 / 3); if (useStandardAlphabet) encodeBytes(source, off, len, false, buf, ALPHABET); else @@ -446,7 +446,7 @@ public class Base64 { ******/ private static String encodeBytes(byte[] source, int off, int len, boolean breakLines) { - StringBuffer buf = new StringBuffer( (len*4)/3 ); + StringBuilder buf = new StringBuilder( (len*4)/3 ); encodeBytes(source, off, len, breakLines, buf, ALPHABET); return buf.toString(); } @@ -460,7 +460,7 @@ public class Base64 { * @param breakLines Break lines at 80 characters or less. * @since 1.4 */ - private static void encodeBytes(byte[] source, int off, int len, boolean breakLines, StringBuffer out, byte alpha[]) { + private static void encodeBytes(byte[] source, int off, int len, boolean breakLines, StringBuilder out, byte alpha[]) { //int len43 = len * 4 / 3; //byte[] outBuff = new byte[(len43) // Main 4:3 // + ((len % 3) > 0 ? 4 : 0) // Account for padding diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java index 0d89fcdd8..9dcc431e5 100644 --- a/core/java/src/net/i2p/data/Certificate.java +++ b/core/java/src/net/i2p/data/Certificate.java @@ -149,7 +149,7 @@ public class Certificate extends DataStructureImpl { } @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[Certificate: type: "); if (getCertificateType() == CERTIFICATE_TYPE_NULL) buf.append("Null certificate"); diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 53e32a347..ef0b89fc2 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -196,7 +196,7 @@ public class DataHelper { * */ public static String toString(Properties options) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (options != null) { for (Iterator iter = options.keySet().iterator(); iter.hasNext();) { String key = (String) iter.next(); @@ -212,6 +212,11 @@ public class DataHelper { /** * A more efficient Properties.load * + * Some of the other differences: + * - This does not process or drop backslashes + * - '#' or ';' starts a comment line, but '!' does not + * - Leading whitespace is not trimmed + * - '=' is the only key-termination character (not ':' or whitespace) */ public static void loadProps(Properties props, File file) throws IOException { loadProps(props, file, false); @@ -273,7 +278,7 @@ public class DataHelper { * */ public static String toString(Collection col) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (col != null) { for (Iterator iter = col.iterator(); iter.hasNext();) { Object o = iter.next(); @@ -296,17 +301,17 @@ public class DataHelper { public static String toString(byte buf[], int len) { if (buf == null) buf = EMPTY_BUFFER; - StringBuffer out = new StringBuffer(); + StringBuilder out = new StringBuilder(); if (len > buf.length) { for (int i = 0; i < len - buf.length; i++) out.append("00"); } for (int i = 0; i < buf.length && i < len; i++) { - StringBuffer temp = new StringBuffer(Integer.toHexString(buf[i])); + StringBuilder temp = new StringBuilder(Integer.toHexString(buf[i])); while (temp.length() < 2) { temp.insert(0, '0'); } - temp = new StringBuffer(temp.substring(temp.length() - 2)); + temp = new StringBuilder(temp.substring(temp.length() - 2)); out.append(temp.toString()); } return out.toString(); @@ -775,19 +780,27 @@ public class DataHelper { /** * Read a newline delimited line from the stream, returning the line (without * the newline), or null if EOF reached before the newline was found + * Warning - strips \n but not \r */ public static String readLine(InputStream in) throws IOException { return readLine(in, (Sha256Standalone)null); } - /** update the hash along the way */ + + /** + * update the hash along the way + * Warning - strips \n but not \r + */ public static String readLine(InputStream in, Sha256Standalone hash) throws IOException { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); boolean ok = readLine(in, buf, hash); if (ok) return buf.toString(); else return null; } + /** * Read in a line, placing it into the buffer (excluding the newline). + * Warning - strips \n but not \r + * @deprecated use StringBuilder version * * @return true if the line was read, false if eof was reached before a * newline was found @@ -795,7 +808,12 @@ public class DataHelper { public static boolean readLine(InputStream in, StringBuffer buf) throws IOException { return readLine(in, buf, null); } - /** update the hash along the way */ + + /** + * update the hash along the way + * Warning - strips \n but not \r + * @deprecated use StringBuilder version + */ public static boolean readLine(InputStream in, StringBuffer buf, Sha256Standalone hash) throws IOException { int c = -1; while ( (c = in.read()) != -1) { @@ -810,6 +828,32 @@ public class DataHelper { return true; } + /** + * Read in a line, placing it into the buffer (excluding the newline). + * Warning - strips \n but not \r + * + * @return true if the line was read, false if eof was reached before a + * newline was found + */ + public static boolean readLine(InputStream in, StringBuilder buf) throws IOException { + return readLine(in, buf, null); + } + + /** + * update the hash along the way + * Warning - strips \n but not \r + */ + public static boolean readLine(InputStream in, StringBuilder buf, Sha256Standalone hash) throws IOException { + int c = -1; + while ( (c = in.read()) != -1) { + if (hash != null) hash.update((byte)c); + if (c == '\n') + break; + buf.append((char)c); + } + return c != -1; + } + public static void write(OutputStream out, byte data[], Sha256Standalone hash) throws IOException { hash.update(data); out.write(data); @@ -832,7 +876,7 @@ public class DataHelper { public static String formatDuration(long ms) { if (ms < 5 * 1000) { return ms + "ms"; - } else if (ms < 5 * 60 * 1000) { + } else if (ms < 3 * 60 * 1000) { return (ms / 1000) + "s"; } else if (ms < 120 * 60 * 1000) { return (ms / (60 * 1000)) + "m"; diff --git a/core/java/src/net/i2p/data/Destination.java b/core/java/src/net/i2p/data/Destination.java index 791dc1209..5946056b3 100644 --- a/core/java/src/net/i2p/data/Destination.java +++ b/core/java/src/net/i2p/data/Destination.java @@ -145,7 +145,7 @@ public class Destination extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[Destination: "); buf.append("\n\tHash: ").append(calculateHash().toBase64()); buf.append("\n\tPublic Key: ").append(getPublicKey()); diff --git a/core/java/src/net/i2p/data/Hash.java b/core/java/src/net/i2p/data/Hash.java index e986b2b5d..c04bc62c4 100644 --- a/core/java/src/net/i2p/data/Hash.java +++ b/core/java/src/net/i2p/data/Hash.java @@ -104,7 +104,7 @@ public class Hash extends DataStructureImpl { } if (_log.shouldLog(Log.DEBUG)) { // explicit buffer, since the compiler can't guess how long it'll be - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("miss [").append(cached).append("] from "); buf.append(DataHelper.toHexString(getData())).append(" to "); buf.append(DataHelper.toHexString(key.getData())); @@ -113,7 +113,7 @@ public class Hash extends DataStructureImpl { } else { if (_log.shouldLog(Log.DEBUG)) { // explicit buffer, since the compiler can't guess how long it'll be - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("hit from "); buf.append(DataHelper.toHexString(getData())).append(" to "); buf.append(DataHelper.toHexString(key.getData())); @@ -155,7 +155,7 @@ public class Hash extends DataStructureImpl { @Override public String toString() { if (_stringified == null) { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[Hash: "); if (_data == null) { buf.append("null hash"); diff --git a/core/java/src/net/i2p/data/Lease.java b/core/java/src/net/i2p/data/Lease.java index 5f7b3159e..eb22d64cf 100644 --- a/core/java/src/net/i2p/data/Lease.java +++ b/core/java/src/net/i2p/data/Lease.java @@ -147,7 +147,7 @@ public class Lease extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[Lease: "); buf.append("\n\tEnd Date: ").append(getEndDate()); buf.append("\n\tGateway: ").append(getGateway()); diff --git a/core/java/src/net/i2p/data/LeaseSet.java b/core/java/src/net/i2p/data/LeaseSet.java index 8a05dd956..3dcbf97a6 100644 --- a/core/java/src/net/i2p/data/LeaseSet.java +++ b/core/java/src/net/i2p/data/LeaseSet.java @@ -67,7 +67,7 @@ public class LeaseSet extends DataStructureImpl { private boolean _checked; /** This seems like plenty */ - private final static int MAX_LEASES = 6; + public final static int MAX_LEASES = 6; public LeaseSet() { setDestination(null); @@ -355,7 +355,7 @@ public class LeaseSet extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[LeaseSet: "); buf.append("\n\tDestination: ").append(getDestination()); buf.append("\n\tEncryptionKey: ").append(getEncryptionKey()); diff --git a/core/java/src/net/i2p/data/Payload.java b/core/java/src/net/i2p/data/Payload.java index 2c730a236..5f3af7c16 100644 --- a/core/java/src/net/i2p/data/Payload.java +++ b/core/java/src/net/i2p/data/Payload.java @@ -108,7 +108,7 @@ public class Payload extends DataStructureImpl { @Override public String toString() { if (true) return "[Payload]"; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[Payload: "); if (getUnencryptedData() != null) buf.append("\n\tData: ").append(DataHelper.toString(getUnencryptedData(), 16)); diff --git a/core/java/src/net/i2p/data/PrivateKey.java b/core/java/src/net/i2p/data/PrivateKey.java index e6c06dfd2..7ea047314 100644 --- a/core/java/src/net/i2p/data/PrivateKey.java +++ b/core/java/src/net/i2p/data/PrivateKey.java @@ -77,7 +77,7 @@ public class PrivateKey extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[PrivateKey: "); if (_data == null) { buf.append("null key"); diff --git a/core/java/src/net/i2p/data/PrivateKeyFile.java b/core/java/src/net/i2p/data/PrivateKeyFile.java index d9e52aecc..7ba7f1b6a 100644 --- a/core/java/src/net/i2p/data/PrivateKeyFile.java +++ b/core/java/src/net/i2p/data/PrivateKeyFile.java @@ -109,6 +109,10 @@ public class PrivateKeyFile { this(new File(file), I2PClientFactory.createClient()); } + public PrivateKeyFile(File file) { + this(file, I2PClientFactory.createClient()); + } + public PrivateKeyFile(File file, I2PClient client) { this.file = file; this.client = client; @@ -259,9 +263,9 @@ public class PrivateKeyFile { } public String toString() { - StringBuffer s = new StringBuffer(128); + StringBuilder s = new StringBuilder(128); s.append("Dest: "); - s.append(this.dest.toBase64()); + s.append(this.dest != null ? this.dest.toBase64() : "null"); s.append("\nContains: "); s.append(this.dest); s.append("\nPrivate Key: "); diff --git a/core/java/src/net/i2p/data/PublicKey.java b/core/java/src/net/i2p/data/PublicKey.java index aaf25b04a..d653ea9a4 100644 --- a/core/java/src/net/i2p/data/PublicKey.java +++ b/core/java/src/net/i2p/data/PublicKey.java @@ -79,7 +79,7 @@ public class PublicKey extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[PublicKey: "); if (_data == null) { buf.append("null key"); diff --git a/core/java/src/net/i2p/data/RouterAddress.java b/core/java/src/net/i2p/data/RouterAddress.java index f87e2b4ce..393bf9621 100644 --- a/core/java/src/net/i2p/data/RouterAddress.java +++ b/core/java/src/net/i2p/data/RouterAddress.java @@ -138,7 +138,7 @@ public class RouterAddress extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[RouterAddress: "); buf.append("\n\tTransportStyle: ").append(getTransportStyle()); buf.append("\n\tCost: ").append(getCost()); diff --git a/core/java/src/net/i2p/data/RouterIdentity.java b/core/java/src/net/i2p/data/RouterIdentity.java index c1ad540ef..d7375b290 100644 --- a/core/java/src/net/i2p/data/RouterIdentity.java +++ b/core/java/src/net/i2p/data/RouterIdentity.java @@ -109,7 +109,7 @@ public class RouterIdentity extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[RouterIdentity: "); buf.append("\n\tHash: ").append(getHash().toBase64()); buf.append("\n\tCertificate: ").append(getCertificate()); diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java index 191c72019..e22c033e1 100644 --- a/core/java/src/net/i2p/data/RouterInfo.java +++ b/core/java/src/net/i2p/data/RouterInfo.java @@ -382,7 +382,7 @@ public class RouterInfo extends DataStructureImpl { } else if ((idx = caps.indexOf(cap)) == -1) { return; } else { - StringBuffer buf = new StringBuffer(caps); + StringBuilder buf = new StringBuilder(caps); while ( (idx = buf.indexOf(""+cap)) != -1) buf.deleteCharAt(idx); _options.setProperty(PROP_CAPABILITIES, buf.toString()); @@ -555,7 +555,7 @@ public class RouterInfo extends DataStructureImpl { @Override public String toString() { if (_stringified != null) return _stringified; - StringBuffer buf = new StringBuffer(5*1024); + StringBuilder buf = new StringBuilder(5*1024); buf.append("[RouterInfo: "); buf.append("\n\tIdentity: ").append(getIdentity()); buf.append("\n\tSignature: ").append(getSignature()); diff --git a/core/java/src/net/i2p/data/SessionKey.java b/core/java/src/net/i2p/data/SessionKey.java index a59632592..b89bee505 100644 --- a/core/java/src/net/i2p/data/SessionKey.java +++ b/core/java/src/net/i2p/data/SessionKey.java @@ -84,7 +84,7 @@ public class SessionKey extends DataStructureImpl { @Override public String toString() { if (true) return super.toString(); - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[SessionKey: "); if (_data == null) { buf.append("null key"); diff --git a/core/java/src/net/i2p/data/Signature.java b/core/java/src/net/i2p/data/Signature.java index 4ab11b947..41a56aacd 100644 --- a/core/java/src/net/i2p/data/Signature.java +++ b/core/java/src/net/i2p/data/Signature.java @@ -69,7 +69,7 @@ public class Signature extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[Signature: "); if (_data == null) { buf.append("null signature"); diff --git a/core/java/src/net/i2p/data/SigningPrivateKey.java b/core/java/src/net/i2p/data/SigningPrivateKey.java index 5f4d64ec0..4a1a99ccb 100644 --- a/core/java/src/net/i2p/data/SigningPrivateKey.java +++ b/core/java/src/net/i2p/data/SigningPrivateKey.java @@ -75,7 +75,7 @@ public class SigningPrivateKey extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[SigningPrivateKey: "); if (_data == null) { buf.append("null key"); diff --git a/core/java/src/net/i2p/data/SigningPublicKey.java b/core/java/src/net/i2p/data/SigningPublicKey.java index 148fc242e..09097593f 100644 --- a/core/java/src/net/i2p/data/SigningPublicKey.java +++ b/core/java/src/net/i2p/data/SigningPublicKey.java @@ -74,7 +74,7 @@ public class SigningPublicKey extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("[SigningPublicKey: "); if (_data == null) { buf.append("null key"); diff --git a/core/java/src/net/i2p/data/VerifiedDestination.java b/core/java/src/net/i2p/data/VerifiedDestination.java index 888d6a211..19fd1079e 100644 --- a/core/java/src/net/i2p/data/VerifiedDestination.java +++ b/core/java/src/net/i2p/data/VerifiedDestination.java @@ -155,7 +155,7 @@ public class VerifiedDestination extends Destination { @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(super.toString()); buf.append("\n\tVerified Certificate? ").append(verifyCert(true)); return buf.toString(); diff --git a/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java b/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java new file mode 100644 index 000000000..888242d6b --- /dev/null +++ b/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java @@ -0,0 +1,101 @@ +package net.i2p.data.i2cp; + +/* + * public domain + * + */ + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import net.i2p.data.DataFormatException; +import net.i2p.data.DataHelper; +import net.i2p.util.Log; + +/** + * Tell the other side the limits + * + * @author zzz + */ +public class BandwidthLimitsMessage extends I2CPMessageImpl { + private final static Log _log = new Log(BandwidthLimitsMessage.class); + public final static int MESSAGE_TYPE = 23; + private static final int LIMITS = 16; + private int[] data; + + public BandwidthLimitsMessage() { + super(); + data = new int[LIMITS]; + } + + /** + * Let's define it this way. + * Leave some extra. This is only local and rarely sent so we don't care about waste. + * + * 0) Client inbound limit (KBps) + * 1) Client outbound limit (KBps) + * 2) Router inbound limit (KBps) + * 3) Router inbound burst limit (KBps) + * 4) Router outbound limit (KBps) + * 5) Router outbound burst limit (KBps) + * 6) Router burst time (seconds) + * 7-15) undefined + */ + public BandwidthLimitsMessage(int in, int out) { + this(); + data[0] = in; + data[1] = out; + } + + public int[] getLimits() { + return data; + } + + @Override + protected void doReadMessage(InputStream in, int size) throws I2CPMessageException, IOException { + try { + for (int i = 0; i < LIMITS; i++) { + data[i] = (int) DataHelper.readLong(in, 4); + } + } catch (DataFormatException dfe) { + throw new I2CPMessageException("Unable to load the message data", dfe); + } + } + + @Override + protected byte[] doWriteMessage() throws I2CPMessageException, IOException { + ByteArrayOutputStream os = new ByteArrayOutputStream(64); + try { + for (int i = 0; i < LIMITS; i++) { + DataHelper.writeLong(os, 4, data[i]); + } + } catch (DataFormatException dfe) { + throw new I2CPMessageException("Error writing out the message data", dfe); + } + return os.toByteArray(); + } + + public int getType() { + return MESSAGE_TYPE; + } + + @Override + public boolean equals(Object object) { + if ((object != null) && (object instanceof BandwidthLimitsMessage)) { + BandwidthLimitsMessage msg = (BandwidthLimitsMessage) object; + return DataHelper.eq(data, msg.getLimits()); + } + return false; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("[BandwidthLimitsMessage"); + buf.append("\n\tIn: ").append(data[0]); + buf.append("\n\tOut: ").append(data[1]); + buf.append("]"); + return buf.toString(); + } +} diff --git a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java index f31aaa3aa..5b22929e9 100644 --- a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java +++ b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java @@ -128,7 +128,7 @@ public class CreateLeaseSetMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[CreateLeaseSetMessage: "); buf.append("\n\tLeaseSet: ").append(getLeaseSet()); buf.append("\n\tSigningPrivateKey: ").append(getSigningPrivateKey()); diff --git a/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java b/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java index fa47ce57f..909238625 100644 --- a/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java +++ b/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java @@ -84,7 +84,7 @@ public class CreateSessionMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[CreateSessionMessage: "); buf.append("\n\tConfig: ").append(getSessionConfig()); buf.append("]"); diff --git a/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java b/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java index 13135a2a4..09b405d6e 100644 --- a/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java +++ b/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java @@ -67,7 +67,7 @@ public class DestLookupMessage extends I2CPMessageImpl { } public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DestLookupMessage: "); buf.append("\n\tHash: ").append(_hash); buf.append("]"); diff --git a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java index 1ed601dc2..fbbb93c3d 100644 --- a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java +++ b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java @@ -69,7 +69,7 @@ public class DestReplyMessage extends I2CPMessageImpl { } public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DestReplyMessage: "); buf.append("\n\tDestination: ").append(_dest); buf.append("]"); diff --git a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java index a6f43dc7b..2c932c2b8 100644 --- a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java +++ b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java @@ -80,7 +80,7 @@ public class DestroySessionMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DestroySessionMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("]"); diff --git a/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java b/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java index 3ccd5263a..cdfa638cc 100644 --- a/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java +++ b/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java @@ -76,7 +76,7 @@ public class DisconnectMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DisconnectMessage: "); buf.append("\n\tReason: ").append(getReason()); buf.append("]"); diff --git a/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java b/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java new file mode 100644 index 000000000..67ad71dec --- /dev/null +++ b/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java @@ -0,0 +1,56 @@ +package net.i2p.data.i2cp; + +/* + * public domain + * + */ + +import java.io.IOException; +import java.io.InputStream; + +import net.i2p.util.Log; + +/** + * Request the router tells us the current bw limits + * + * @author zzz + */ +public class GetBandwidthLimitsMessage extends I2CPMessageImpl { + private final static Log _log = new Log(GetBandwidthLimitsMessage.class); + public final static int MESSAGE_TYPE = 8; + + public GetBandwidthLimitsMessage() { + super(); + } + + @Override + protected void doReadMessage(InputStream in, int size) throws I2CPMessageException, IOException { + // noop + } + + @Override + protected byte[] doWriteMessage() throws I2CPMessageException, IOException { + byte rv[] = new byte[0]; + return rv; + } + + public int getType() { + return MESSAGE_TYPE; + } + + @Override + public boolean equals(Object object) { + if ((object != null) && (object instanceof GetBandwidthLimitsMessage)) { + return true; + } + + return false; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("[GetBandwidthLimitsMessage]"); + return buf.toString(); + } +} diff --git a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java index 003ab534d..a928f1f68 100644 --- a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java +++ b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java @@ -52,7 +52,7 @@ public class GetDateMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[GetDateMessage]"); return buf.toString(); } diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java index 61d865053..04da546f7 100644 --- a/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java +++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java @@ -94,6 +94,10 @@ public class I2CPMessageHandler { return new DestLookupMessage(); case DestReplyMessage.MESSAGE_TYPE: return new DestReplyMessage(); + case GetBandwidthLimitsMessage.MESSAGE_TYPE: + return new GetBandwidthLimitsMessage(); + case BandwidthLimitsMessage.MESSAGE_TYPE: + return new BandwidthLimitsMessage(); default: throw new I2CPMessageException("The type " + type + " is an unknown I2CP message"); } diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java index 13b01a67a..461c4b08a 100644 --- a/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java +++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java @@ -115,8 +115,8 @@ public class I2CPMessageReader { } private class I2CPMessageReaderRunner implements Runnable { - private boolean _doRun; - private boolean _stayAlive; + private volatile boolean _doRun; + private volatile boolean _stayAlive; public I2CPMessageReaderRunner() { _doRun = true; @@ -143,7 +143,6 @@ public class I2CPMessageReader { _log.error("Error closing the stream", ioe); } } - _stream = null; } public void run() { @@ -178,11 +177,15 @@ public class I2CPMessageReader { // pause .5 secs when we're paused try { Thread.sleep(500); - } catch (InterruptedException ie) { // nop + } catch (InterruptedException ie) { + // we should break away here. + _log.warn("Breaking away stream", ie); + _listener.disconnected(I2CPMessageReader.this); + cancelRunner(); } } } - // boom bye bye bad bwoy + _stream = null; } } } diff --git a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java index 5dc4a5d71..3301b90d2 100644 --- a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java +++ b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java @@ -123,7 +123,7 @@ public class MessagePayloadMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[MessagePayloadMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tMessageId: ").append(getMessageId()); diff --git a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java index 998069041..912b38b20 100644 --- a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java +++ b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java @@ -168,7 +168,7 @@ public class MessageStatusMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[MessageStatusMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tNonce: ").append(getNonce()); diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java index 29320c82a..b942a7173 100644 --- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java @@ -102,7 +102,7 @@ public class ReceiveMessageBeginMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[ReceiveMessageBeginMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tMessageId: ").append(getMessageId()); diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java index dcdae6e14..f17298d0a 100644 --- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java @@ -86,7 +86,7 @@ public class ReceiveMessageEndMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[ReceiveMessageEndMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tMessageId: ").append(getMessageId()); diff --git a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java index 7165f6d32..4e3eede84 100644 --- a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java @@ -93,7 +93,7 @@ public class ReconfigureSessionMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[ReconfigureSessionMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tSessionConfig: ").append(getSessionConfig()); diff --git a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java index 0800359f2..2499610b6 100644 --- a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java @@ -123,7 +123,7 @@ public class ReportAbuseMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[ReportAbuseMessage: "); buf.append("\n\tSessionID: ").append(getSessionId()); buf.append("\n\tSeverity: ").append(getSeverity()); diff --git a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java index b5fca013d..f5a0557aa 100644 --- a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java +++ b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java @@ -143,7 +143,7 @@ public class RequestLeaseSetMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[RequestLeaseMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tTunnels:"); diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java index d15c1979c..fabd6e354 100644 --- a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java @@ -104,7 +104,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[SendMessageMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tNonce: ").append(getNonce()); diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java index 2b9973c0e..a9bb5fb58 100644 --- a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java @@ -149,7 +149,7 @@ public class SendMessageMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[SendMessageMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tNonce: ").append(getNonce()); diff --git a/core/java/src/net/i2p/data/i2cp/SessionConfig.java b/core/java/src/net/i2p/data/i2cp/SessionConfig.java index d16ffe126..89d56c736 100644 --- a/core/java/src/net/i2p/data/i2cp/SessionConfig.java +++ b/core/java/src/net/i2p/data/i2cp/SessionConfig.java @@ -218,7 +218,7 @@ public class SessionConfig extends DataStructureImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer("[SessionConfig: "); + StringBuilder buf = new StringBuilder("[SessionConfig: "); buf.append("\n\tDestination: ").append(getDestination()); buf.append("\n\tSignature: ").append(getSignature()); buf.append("\n\tCreation Date: ").append(getCreationDate()); diff --git a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java index cf989c908..051bad504 100644 --- a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java @@ -96,7 +96,7 @@ public class SessionStatusMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[SessionStatusMessage: "); buf.append("\n\tSessionId: ").append(getSessionId()); buf.append("\n\tStatus: ").append(getStatus()); diff --git a/core/java/src/net/i2p/data/i2cp/SetDateMessage.java b/core/java/src/net/i2p/data/i2cp/SetDateMessage.java index 605b0a928..174dea6d6 100644 --- a/core/java/src/net/i2p/data/i2cp/SetDateMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SetDateMessage.java @@ -79,7 +79,7 @@ public class SetDateMessage extends I2CPMessageImpl { @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[SetDateMessage"); buf.append("\n\tDate: ").append(getDate()); buf.append("]"); diff --git a/core/java/src/net/i2p/stat/BufferedStatLog.java b/core/java/src/net/i2p/stat/BufferedStatLog.java index 7fed2d090..ca016622f 100644 --- a/core/java/src/net/i2p/stat/BufferedStatLog.java +++ b/core/java/src/net/i2p/stat/BufferedStatLog.java @@ -1,6 +1,7 @@ package net.i2p.stat; import java.io.BufferedWriter; +import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; @@ -109,6 +110,9 @@ public class BufferedStatLog implements StatLog { String filename = _context.getProperty(StatManager.PROP_STAT_FILE); if (filename == null) filename = StatManager.DEFAULT_STAT_FILE; + File foo = new File(filename); + if (!foo.isAbsolute()) + filename = (new File(_context.getRouterDir(), filename)).getAbsolutePath(); if ( (_outFile != null) && (_outFile.equals(filename)) ) { // noop } else { diff --git a/core/java/src/net/i2p/stat/PersistenceHelper.java b/core/java/src/net/i2p/stat/PersistenceHelper.java index 813268899..d8c1312d4 100644 --- a/core/java/src/net/i2p/stat/PersistenceHelper.java +++ b/core/java/src/net/i2p/stat/PersistenceHelper.java @@ -9,13 +9,13 @@ class PersistenceHelper { private final static Log _log = new Log(PersistenceHelper.class); private final static String NL = System.getProperty("line.separator"); - public final static void add(StringBuffer buf, String prefix, String name, String description, double value) { + public final static void add(StringBuilder buf, String prefix, String name, String description, double value) { buf.append("# ").append(prefix).append(name).append(NL); buf.append("# ").append(description).append(NL); buf.append(prefix).append(name).append('=').append(value).append(NL).append(NL); } - public final static void add(StringBuffer buf, String prefix, String name, String description, long value) { + public final static void add(StringBuilder buf, String prefix, String name, String description, long value) { buf.append("# ").append(prefix).append(name).append(NL); buf.append("# ").append(description).append(NL); buf.append(prefix).append(name).append('=').append(value).append(NL).append(NL); diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java index d4164c2b5..03dc696a5 100644 --- a/core/java/src/net/i2p/stat/Rate.java +++ b/core/java/src/net/i2p/stat/Rate.java @@ -363,7 +363,7 @@ public class Rate { return 0.0D; } - public void store(String prefix, StringBuffer buf) throws IOException { + public void store(String prefix, StringBuilder buf) throws IOException { PersistenceHelper.add(buf, prefix, ".period", "Number of milliseconds in the period", _period); PersistenceHelper.add(buf, prefix, ".creationDate", "When was this rate created? (milliseconds since the epoch, GMT)", _creationDate); @@ -454,7 +454,7 @@ public class Rate { @Override public String toString() { - StringBuffer buf = new StringBuffer(2048); + StringBuilder buf = new StringBuilder(2048); buf.append("\n\t total value: ").append(getLastTotalValue()); buf.append("\n\t highest total value: ").append(getExtremeTotalValue()); buf.append("\n\t lifetime total value: ").append(getLifetimeTotalValue()); @@ -494,7 +494,7 @@ public class Rate { rate.addData(i * 100, 20); } rate.coalesce(); - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); try { rate.store("rate.test", buf); byte data[] = buf.toString().getBytes(); diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java index 329706040..b021d59f4 100644 --- a/core/java/src/net/i2p/stat/RateStat.java +++ b/core/java/src/net/i2p/stat/RateStat.java @@ -93,7 +93,7 @@ public class RateStat { @Override public String toString() { - StringBuffer buf = new StringBuffer(4096); + StringBuilder buf = new StringBuilder(4096); buf.append(getGroupName()).append('.').append(getName()).append(": ").append(getDescription()).append('\n'); long periods[] = getPeriods(); Arrays.sort(periods); @@ -121,7 +121,7 @@ public class RateStat { } public void store(OutputStream out, String prefix) throws IOException { - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); buf.append(NL); buf.append("################################################################################").append(NL); buf.append("# Rate: ").append(_groupName).append(": ").append(_statName).append(NL); @@ -134,7 +134,6 @@ public class RateStat { buf.append("# Period : ").append(DataHelper.formatDuration(_rates[i].getPeriod())).append(" for rate ") .append(_groupName).append(" - ").append(_statName).append(NL); buf.append(NL); - out.write(buf.toString().getBytes()); String curPrefix = prefix + "." + DataHelper.formatDuration(_rates[i].getPeriod()); _rates[i].store(curPrefix, buf); out.write(buf.toString().getBytes()); diff --git a/core/java/src/net/i2p/stat/SimpleStatDumper.java b/core/java/src/net/i2p/stat/SimpleStatDumper.java index 2a7d4ae78..eb48e5fce 100644 --- a/core/java/src/net/i2p/stat/SimpleStatDumper.java +++ b/core/java/src/net/i2p/stat/SimpleStatDumper.java @@ -14,13 +14,13 @@ public class SimpleStatDumper { public static void dumpStats(I2PAppContext context, int logLevel) { if (!_log.shouldLog(logLevel)) return; - StringBuffer buf = new StringBuffer(4 * 1024); + StringBuilder buf = new StringBuilder(4 * 1024); dumpFrequencies(context, buf); dumpRates(context, buf); _log.log(logLevel, buf.toString()); } - private static void dumpFrequencies(I2PAppContext ctx, StringBuffer buf) { + private static void dumpFrequencies(I2PAppContext ctx, StringBuilder buf) { Set frequencies = new TreeSet(ctx.statManager().getFrequencyNames()); for (Iterator iter = frequencies.iterator(); iter.hasNext();) { String name = (String) iter.next(); @@ -40,7 +40,7 @@ public class SimpleStatDumper { } } - private static void dumpRates(I2PAppContext ctx, StringBuffer buf) { + private static void dumpRates(I2PAppContext ctx, StringBuilder buf) { Set rates = new TreeSet(ctx.statManager().getRateNames()); for (Iterator iter = rates.iterator(); iter.hasNext();) { String name = (String) iter.next(); @@ -59,7 +59,7 @@ public class SimpleStatDumper { } } - static void dumpRate(Rate curRate, StringBuffer buf) { + static void dumpRate(Rate curRate, StringBuilder buf) { buf.append(curRate.toString()); } } \ No newline at end of file diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java index 4c5c69c79..e21f174d0 100644 --- a/core/java/src/net/i2p/stat/StatManager.java +++ b/core/java/src/net/i2p/stat/StatManager.java @@ -1,5 +1,6 @@ package net.i2p.stat; +import java.text.Collator; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -53,7 +54,7 @@ public class StatManager { "tunnel.buildRatio.*,tunnel.corruptMessage,tunnel.dropLoad*," + "tunnel.decryptRequestTime,tunnel.fragmentedDropped,tunnel.participatingMessageCount,"+ "tunnel.participatingTunnels,tunnel.testFailedTime,tunnel.testSuccessTime," + - "tunnel.participatingBandwidth,udp.sendPacketSize,udp.packetsRetransmitted" ; + "tunnel.participatingBandwidth,udp.sendPacketSize,udp.packetsRetransmitted,udp.sendException" ; /** * The stat manager should only be constructed and accessed through the @@ -178,7 +179,7 @@ public class StatManager { /** Group name (String) to a Set of stat names, ordered alphabetically */ public Map getStatsByGroup() { - Map groups = new TreeMap(); + Map groups = new TreeMap(Collator.getInstance()); for (Iterator iter = _frequencyStats.values().iterator(); iter.hasNext();) { FrequencyStat stat = (FrequencyStat) iter.next(); if (!groups.containsKey(stat.getGroupName())) groups.put(stat.getGroupName(), new TreeSet()); diff --git a/core/java/src/net/i2p/time/Timestamper.java b/core/java/src/net/i2p/time/Timestamper.java index 6758ab466..4692c8d53 100644 --- a/core/java/src/net/i2p/time/Timestamper.java +++ b/core/java/src/net/i2p/time/Timestamper.java @@ -2,6 +2,7 @@ package net.i2p.time; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.StringTokenizer; import net.i2p.I2PAppContext; @@ -17,17 +18,20 @@ import net.i2p.util.Log; public class Timestamper implements Runnable { private I2PAppContext _context; private Log _log; - private List _servers; - private List _listeners; + private List _servers; + private List _priorityServers; + private List _listeners; private int _queryFrequency; private int _concurringServers; private volatile boolean _disabled; private boolean _daemon; private boolean _initialized; + private boolean _wellSynced; + private static final int MIN_QUERY_FREQUENCY = 5*60*1000; private static final int DEFAULT_QUERY_FREQUENCY = 5*60*1000; - private static final String DEFAULT_SERVER_LIST = "0.pool.ntp.org, 1.pool.ntp.org, 2.pool.ntp.org"; - private static final boolean DEFAULT_DISABLED = true; + private static final String DEFAULT_SERVER_LIST = "0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org"; + private static final String DEFAULT_DISABLED = "true"; /** how many times do we have to query if we are changing the clock? */ private static final int DEFAULT_CONCURRING_SERVERS = 3; @@ -35,6 +39,7 @@ public class Timestamper implements Runnable { public static final String PROP_SERVER_LIST = "time.sntpServerList"; public static final String PROP_DISABLED = "time.disabled"; public static final String PROP_CONCURRING_SERVERS = "time.concurringServers"; + public static final String PROP_IP_COUNTRY = "i2np.lastCountry"; /** if different SNTP servers differ by more than 10s, someone is b0rked */ private static final int MAX_VARIANCE = 10*1000; @@ -47,10 +52,20 @@ public class Timestamper implements Runnable { this(ctx, lsnr, true); } public Timestamper(I2PAppContext ctx, UpdateListener lsnr, boolean daemon) { + // Don't bother starting a thread if we are disabled. + // This means we no longer check every 5 minutes to see if we got enabled, + // so the property must be set at startup. + // We still need to be instantiated since the router calls clock().getTimestamper().waitForInitialization() + String disabled = ctx.getProperty(PROP_DISABLED, DEFAULT_DISABLED); + if (Boolean.valueOf(disabled).booleanValue()) { + _initialized = true; + return; + } _context = ctx; _daemon = daemon; _initialized = false; - _servers = new ArrayList(1); + _wellSynced = false; + _servers = new ArrayList(3); _listeners = new ArrayList(1); if (lsnr != null) _listeners.add(lsnr); @@ -115,36 +130,47 @@ public class Timestamper implements Runnable { _log = _context.logManager().getLog(Timestamper.class); if (_log.shouldLog(Log.INFO)) _log.info("Starting timestamper"); - - if (_log.shouldLog(Log.INFO)) - _log.info("Starting up timestamper"); boolean lastFailed = false; try { while (true) { updateConfig(); if (!_disabled) { - String serverList[] = null; - synchronized (_servers) { - serverList = new String[_servers.size()]; - for (int i = 0; i < serverList.length; i++) - serverList[i] = (String)_servers.get(i); + // first the servers for our country, if we know what country we're in... + if (_priorityServers != null) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Querying servers " + _priorityServers); + try { + lastFailed = !queryTime(_priorityServers.toArray(new String[_priorityServers.size()])); + } catch (IllegalArgumentException iae) { + if ( (!lastFailed) && (_log.shouldLog(Log.WARN)) ) + _log.warn("Unable to reach country-specific NTP servers"); + lastFailed = true; + } } - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Querying servers " + _servers); - try { - lastFailed = !queryTime(serverList); - } catch (IllegalArgumentException iae) { - if ( (!lastFailed) && (_log.shouldLog(Log.ERROR)) ) - _log.error("Unable to reach any of the NTP servers - network disconnected?"); - lastFailed = true; + // ... and then the global list, if that failed + if (_priorityServers == null || lastFailed) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Querying servers " + _servers); + try { + lastFailed = !queryTime(_servers.toArray(new String[_servers.size()])); + } catch (IllegalArgumentException iae) { + if ( (!lastFailed) && (_log.shouldLog(Log.ERROR)) ) + _log.error("Unable to reach any of the NTP servers - network disconnected?"); + lastFailed = true; + } } } _initialized = true; synchronized (this) { notifyAll(); } - long sleepTime = _context.random().nextInt(_queryFrequency) + _queryFrequency; - if (lastFailed) + long sleepTime; + if (lastFailed) { sleepTime = 30*1000; + } else { + sleepTime = _context.random().nextInt(_queryFrequency) + _queryFrequency; + if (_wellSynced) + sleepTime *= 3; + } try { Thread.sleep(sleepTime); } catch (InterruptedException ie) {} } } catch (Throwable t) { @@ -160,6 +186,7 @@ public class Timestamper implements Runnable { long found[] = new long[_concurringServers]; long now = -1; long expectedDelta = 0; + _wellSynced = false; for (int i = 0; i < _concurringServers; i++) { try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} now = NtpClient.currentTime(serverList); @@ -169,6 +196,8 @@ public class Timestamper implements Runnable { if (Math.abs(delta) < MAX_VARIANCE) { if (_log.shouldLog(Log.INFO)) _log.info("a single SNTP query was within the tolerance (" + delta + "ms)"); + // If less than a half second on the first try, we're in good shape + _wellSynced = Math.abs(delta) < 500; break; } else { // outside the tolerance, lets iterate across the concurring queries @@ -177,7 +206,7 @@ public class Timestamper implements Runnable { } else { if (Math.abs(delta - expectedDelta) > MAX_VARIANCE) { if (_log.shouldLog(Log.ERROR)) { - StringBuffer err = new StringBuffer(96); + StringBuilder err = new StringBuilder(96); err.append("SNTP client variance exceeded at query ").append(i); err.append(". expected = "); err.append(expectedDelta); @@ -194,7 +223,7 @@ public class Timestamper implements Runnable { } stampTime(now); if (_log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("Deltas: "); for (int i = 0; i < found.length; i++) buf.append(found[i]).append(' '); @@ -224,56 +253,41 @@ public class Timestamper implements Runnable { */ private void updateConfig() { String serverList = _context.getProperty(PROP_SERVER_LIST); - if ( (serverList == null) || (serverList.trim().length() <= 0) ) + if ( (serverList == null) || (serverList.trim().length() <= 0) ) { serverList = DEFAULT_SERVER_LIST; - synchronized (_servers) { - _servers.clear(); - StringTokenizer tok = new StringTokenizer(serverList, ","); - while (tok.hasMoreTokens()) { - String val = (String)tok.nextToken(); - val = val.trim(); - if (val.length() > 0) - _servers.add(val); + String country = _context.getProperty(PROP_IP_COUNTRY); + if (country == null) { + country = Locale.getDefault().getCountry(); + if (country != null) + country = country.toLowerCase(); } - } - - String freq = _context.getProperty(PROP_QUERY_FREQUENCY); - if ( (freq == null) || (freq.trim().length() <= 0) ) - freq = DEFAULT_QUERY_FREQUENCY + ""; - try { - int ms = Integer.parseInt(freq); - if (ms > 60*1000) { - _queryFrequency = ms; + if (country != null && country.length() > 0) { + _priorityServers = new ArrayList(3); + for (int i = 0; i < 3; i++) + _priorityServers.add(i + "." + country + ".pool.ntp.org"); } else { - if ( (_log != null) && (_log.shouldLog(Log.ERROR)) ) - _log.error("Query frequency once every " + ms + "ms is too fast!"); - _queryFrequency = DEFAULT_QUERY_FREQUENCY; + _priorityServers = null; } - } catch (NumberFormatException nfe) { - if ( (_log != null) && (_log.shouldLog(Log.WARN)) ) - _log.warn("Invalid query frequency [" + freq + "], falling back on " + DEFAULT_QUERY_FREQUENCY); - _queryFrequency = DEFAULT_QUERY_FREQUENCY; + } else { + _priorityServers = null; + } + _servers.clear(); + StringTokenizer tok = new StringTokenizer(serverList, ", "); + while (tok.hasMoreTokens()) { + String val = (String)tok.nextToken(); + val = val.trim(); + if (val.length() > 0) + _servers.add(val); } - String disabled = _context.getProperty(PROP_DISABLED); - if (disabled == null) - disabled = DEFAULT_DISABLED + ""; + _queryFrequency = Math.max(MIN_QUERY_FREQUENCY, + _context.getProperty(PROP_QUERY_FREQUENCY, DEFAULT_QUERY_FREQUENCY)); + + String disabled = _context.getProperty(PROP_DISABLED, DEFAULT_DISABLED); _disabled = Boolean.valueOf(disabled).booleanValue(); - String concurring = _context.getProperty(PROP_CONCURRING_SERVERS); - if (concurring == null) { - _concurringServers = DEFAULT_CONCURRING_SERVERS; - } else { - try { - int servers = Integer.parseInt(concurring); - if ( (servers > 0) && (servers < 5) ) - _concurringServers = servers; - else - _concurringServers = DEFAULT_CONCURRING_SERVERS; - } catch (NumberFormatException nfe) { - _concurringServers = DEFAULT_CONCURRING_SERVERS; - } - } + _concurringServers = Math.min(4, Math.max(1, + _context.getProperty(PROP_CONCURRING_SERVERS, DEFAULT_CONCURRING_SERVERS))); } public static void main(String args[]) { @@ -297,4 +311,4 @@ public class Timestamper implements Runnable { */ public void setNow(long now); } -} \ No newline at end of file +} diff --git a/core/java/src/net/i2p/util/BufferedRandomSource.java b/core/java/src/net/i2p/util/BufferedRandomSource.java index dc975671a..c6ecd2740 100644 --- a/core/java/src/net/i2p/util/BufferedRandomSource.java +++ b/core/java/src/net/i2p/util/BufferedRandomSource.java @@ -218,7 +218,7 @@ public class BufferedRandomSource extends RandomSource { System.out.println("Data: " + data.length + "/" + compressed.length + ": " + toString(data)); } private static final String toString(byte data[]) { - StringBuffer buf = new StringBuffer(data.length * 9); + StringBuilder buf = new StringBuilder(data.length * 9); for (int i = 0; i < data.length; i++) { for (int j = 0; j < 8; j++) { if ((data[i] & (1 << j)) != 0) diff --git a/core/java/src/net/i2p/util/ConvertToHash.java b/core/java/src/net/i2p/util/ConvertToHash.java new file mode 100644 index 000000000..28da87d21 --- /dev/null +++ b/core/java/src/net/i2p/util/ConvertToHash.java @@ -0,0 +1,79 @@ +package net.i2p.util; + +import net.i2p.I2PAppContext; +import net.i2p.data.Base32; +import net.i2p.data.DataFormatException; +import net.i2p.data.Destination; +import net.i2p.data.Hash; + +/** + * Convert any kind of destination String to a hash + * Supported: + * Base64 dest + * Base64 dest.i2p + * Base64 Hash + * Base32 Hash + * Base32 desthash.b32.i2p + * example.i2p + * + * @author zzz + */ +public class ConvertToHash { + + /** + * Convert any kind of destination String to a hash + * + * @return null on failure + */ + public static Hash getHash(String peer) { + if (peer == null) + return null; + Hash h = new Hash(); + String peerLC = peer.toLowerCase(); + // b64 hash + if (peer.length() == 44 && !peerLC.endsWith(".i2p")) { + try { + h.fromBase64(peer); + } catch (DataFormatException dfe) {} + } + // b64 dest.i2p + if (h.getData() == null && peer.length() >= 520 && peerLC.endsWith(".i2p")) { + try { + Destination d = new Destination(); + d.fromBase64(peer.substring(0, peer.length() - 4)); + h = d.calculateHash(); + } catch (DataFormatException dfe) {} + } + // b64 dest + if (h.getData() == null && peer.length() >= 516 && !peerLC.endsWith(".i2p")) { + try { + Destination d = new Destination(); + d.fromBase64(peer); + h = d.calculateHash(); + } catch (DataFormatException dfe) {} + } + // b32 hash.b32.i2p + // do this here rather than in naming service so it will work + // even if the leaseset is not found + if (h.getData() == null && peer.length() == 60 && peerLC.endsWith(".b32.i2p")) { + byte[] b = Base32.decode(peer.substring(0, 52)); + if (b != null && b.length == Hash.HASH_LENGTH) + h.setData(b); + } + // b32 hash + if (h.getData() == null && peer.length() == 52 && !peerLC.endsWith(".i2p")) { + byte[] b = Base32.decode(peer); + if (b != null && b.length == Hash.HASH_LENGTH) + h.setData(b); + } + // example.i2p + if (h.getData() == null) { + Destination d = I2PAppContext.getGlobalContext().namingService().lookup(peer); + if (d != null) + h = d.calculateHash(); + } + if (h.getData() == null) + return null; + return h; + } +} diff --git a/core/java/src/net/i2p/util/DecayingBloomFilter.java b/core/java/src/net/i2p/util/DecayingBloomFilter.java index 164c8e453..95da0a03b 100644 --- a/core/java/src/net/i2p/util/DecayingBloomFilter.java +++ b/core/java/src/net/i2p/util/DecayingBloomFilter.java @@ -30,6 +30,7 @@ public class DecayingBloomFilter { private boolean _keepDecaying; private DecayEvent _decayEvent; + private static final int DEFAULT_M = 23; private static final boolean ALWAYS_MISS = false; /** @@ -44,8 +45,12 @@ public class DecayingBloomFilter { _context = context; _log = context.logManager().getLog(DecayingBloomFilter.class); _entryBytes = entryBytes; - _current = new BloomSHA1(23, 11); //new BloomSHA1(23, 11); - _previous = new BloomSHA1(23, 11); //new BloomSHA1(23, 11); + // this is instantiated in four different places, they may have different + // requirements, but for now use this as a gross method of memory reduction. + // m == 23 => 1MB each BloomSHA1 (4 pairs = 8MB total) + int m = context.getProperty("router.decayingBloomFilterM", DEFAULT_M); + _current = new BloomSHA1(m, 11); //new BloomSHA1(23, 11); + _previous = new BloomSHA1(m, 11); //new BloomSHA1(23, 11); _durationMs = durationMs; int numExtenders = (32+ (entryBytes-1))/entryBytes - 1; if (numExtenders < 0) diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java index 4abdc6fd4..9f2c373dc 100644 --- a/core/java/src/net/i2p/util/EepGet.java +++ b/core/java/src/net/i2p/util/EepGet.java @@ -18,53 +18,55 @@ import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; /** - * EepGet [-p localhost:4444] + * EepGet [-p 127.0.0.1:4444] * [-n #retries] * [-o outputFile] * [-m markSize lineLen] * url + * + * Bug: a malformed url http://example.i2p (no trailing '/') fails cryptically */ public class EepGet { private I2PAppContext _context; - private Log _log; - private boolean _shouldProxy; + protected Log _log; + protected boolean _shouldProxy; private String _proxyHost; private int _proxyPort; - private int _numRetries; + protected int _numRetries; private long _minSize; // minimum and maximum acceptable response size, -1 signifies unlimited, private long _maxSize; // applied both against whole responses and chunks private String _outputFile; private OutputStream _outputStream; /** url we were asked to fetch */ - private String _url; + protected String _url; /** the URL we actually fetch from (may differ from the _url in case of redirect) */ - private String _actualURL; + protected String _actualURL; private String _postData; private boolean _allowCaching; - private List _listeners; + protected List _listeners; private boolean _keepFetching; private Socket _proxy; private OutputStream _proxyOut; private InputStream _proxyIn; - private OutputStream _out; + protected OutputStream _out; private long _alreadyTransferred; private long _bytesTransferred; - private long _bytesRemaining; - private int _currentAttempt; + protected long _bytesRemaining; + protected int _currentAttempt; private String _etag; private String _lastModified; private boolean _encodingChunked; private boolean _notModified; private String _contentType; - private boolean _transferFailed; - private boolean _headersRead; - private boolean _aborted; + protected boolean _transferFailed; + protected boolean _headersRead; + protected boolean _aborted; private long _fetchHeaderTimeout; private long _fetchEndTime; - private long _fetchInactivityTimeout; - private int _redirects; - private String _redirectLocation; + protected long _fetchInactivityTimeout; + protected int _redirects; + protected String _redirectLocation; public EepGet(I2PAppContext ctx, String proxyHost, int proxyPort, int numRetries, String outputFile, String url) { this(ctx, true, proxyHost, proxyPort, numRetries, outputFile, url); @@ -123,11 +125,11 @@ public class EepGet { } /** - * EepGet [-p localhost:4444] [-n #retries] [-e etag] [-o outputFile] [-m markSize lineLen] url + * EepGet [-p 127.0.0.1:4444] [-n #retries] [-e etag] [-o outputFile] [-m markSize lineLen] url * */ public static void main(String args[]) { - String proxyHost = "localhost"; + String proxyHost = "127.0.0.1"; int proxyPort = 4444; int numRetries = 5; int markSize = 1024; @@ -159,6 +161,9 @@ public class EepGet { markSize = Integer.parseInt(args[i+1]); lineLen = Integer.parseInt(args[i+2]); i += 2; + } else if (args[i].startsWith("-")) { + usage(); + return; } else { url = args[i]; } @@ -204,15 +209,15 @@ public class EepGet { "01234567890.,_=@#:"; private static String sanitize(String name) { name = name.replace('/', '_'); - StringBuffer buf = new StringBuffer(name); + StringBuilder buf = new StringBuilder(name); for (int i = 0; i < name.length(); i++) if (_safeChars.indexOf(buf.charAt(i)) == -1) buf.setCharAt(i, '_'); return buf.toString(); } - private static void usage() { - System.err.println("EepGet [-p localhost:4444] [-n #retries] [-o outputFile] [-m markSize lineLen] [-t timeout] url"); + protected static void usage() { + System.err.println("EepGet [-p 127.0.0.1:4444] [-n #retries] [-o outputFile] [-m markSize lineLen] [-t timeout] url"); } public static interface StatusListener { @@ -289,7 +294,7 @@ public class EepGet { long now = _context.clock().now(); long timeToSend = now - _lastComplete; if (timeToSend > 0) { - StringBuffer buf = new StringBuffer(50); + StringBuilder buf = new StringBuilder(50); buf.append(" "); if ( bytesRemaining > 0 ) { double pct = ((double)_written + _previousWritten) / @@ -350,7 +355,7 @@ public class EepGet { if (_etag != null) System.out.println("== ETag: " + _etag); if (transferred > 0) { - StringBuffer buf = new StringBuffer(50); + StringBuilder buf = new StringBuilder(50); buf.append("== Transfer rate: "); double kbps = (1000.0d*(double)(transferred)/((double)timeToSend*1024.0d)); synchronized (_kbps) { @@ -378,7 +383,7 @@ public class EepGet { long timeToSend = _context.clock().now() - _startedOn; System.out.println("== Transfer time: " + DataHelper.formatDuration(timeToSend)); double kbps = (timeToSend > 0 ? (1000.0d*(double)(bytesTransferred)/((double)timeToSend*1024.0d)) : 0); - StringBuffer buf = new StringBuffer(50); + StringBuilder buf = new StringBuilder(50); buf.append("== Transfer rate: "); synchronized (_kbps) { buf.append(_kbps.format(kbps)); @@ -477,7 +482,7 @@ public class EepGet { } /** return true if the URL was completely retrieved */ - private void doFetch(SocketTimeout timeout) throws IOException { + protected void doFetch(SocketTimeout timeout) throws IOException { _headersRead = false; _aborted = false; try { @@ -622,9 +627,9 @@ public class EepGet { } } - private void readHeaders() throws IOException { + protected void readHeaders() throws IOException { String key = null; - StringBuffer buf = new StringBuffer(32); + StringBuilder buf = new StringBuilder(32); boolean read = DataHelper.readLine(_proxyIn, buf); if (!read) throw new IOException("Unable to read the first line"); @@ -735,7 +740,7 @@ public class EepGet { } private long readChunkLength() throws IOException { - StringBuffer buf = new StringBuffer(8); + StringBuilder buf = new StringBuilder(8); int nl = 0; while (true) { int cur = _proxyIn.read(); @@ -841,7 +846,7 @@ public class EepGet { private static final byte NL = '\n'; private boolean isNL(byte b) { return (b == NL); } - private void sendRequest(SocketTimeout timeout) throws IOException { + protected void sendRequest(SocketTimeout timeout) throws IOException { if (_outputStream != null) { // We are reading into a stream supplied by a caller, // for which we cannot easily determine how much we've written. @@ -889,8 +894,8 @@ public class EepGet { _log.debug("Request flushed"); } - private String getRequest() throws IOException { - StringBuffer buf = new StringBuffer(512); + protected String getRequest() throws IOException { + StringBuilder buf = new StringBuilder(512); boolean post = false; if ( (_postData != null) && (_postData.length() > 0) ) post = true; @@ -919,7 +924,8 @@ public class EepGet { buf.append("-\r\n"); } buf.append("Accept-Encoding: \r\n"); - buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); + if (_shouldProxy) + buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); if (!_allowCaching) { buf.append("Cache-control: no-cache\r\n"); buf.append("Pragma: no-cache\r\n"); @@ -959,5 +965,4 @@ public class EepGet { public String getContentType() { return _contentType; } - } diff --git a/core/java/src/net/i2p/util/EepHead.java b/core/java/src/net/i2p/util/EepHead.java new file mode 100644 index 000000000..5127ed93b --- /dev/null +++ b/core/java/src/net/i2p/util/EepHead.java @@ -0,0 +1,204 @@ +package net.i2p.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; + +import net.i2p.I2PAppContext; + +/** + * This is a quick hack to get a working EepHead, primarily for the following usage: + * + * EepHead foo = new EepHead(...); + * if (foo.fetch()) { + * String lastmod = foo.getLastModified(); + * if (lastmod != null) { + * parse the string... + * ... + * } + * } + * + * Other use cases (command line, listeners, etc...) lightly- or un-tested. + * + * Writing from scratch rather than extending EepGet would maybe have been less bloated memory-wise. + * This way gets us redirect handling, among other benefits. + * + * @author zzz + */ +public class EepHead extends EepGet { + /** EepGet needs either a non-null file or a stream... shouldn't actually be written to... */ + static final OutputStream _dummyStream = new ByteArrayOutputStream(0); + + public EepHead(I2PAppContext ctx, String proxyHost, int proxyPort, int numRetries, String url) { + // we're using this constructor: + // public EepGet(I2PAppContext ctx, boolean shouldProxy, String proxyHost, int proxyPort, int numRetries, long minSize, long maxSize, String outputFile, OutputStream outputStream, String url, boolean allowCaching, String etag, String postData) { + super(ctx, true, proxyHost, proxyPort, numRetries, -1, -1, null, _dummyStream, url, true, null, null); + } + + /** + * EepHead [-p 127.0.0.1:4444] [-n #retries] url + * + * This doesn't really do much since it doesn't register a listener. + * EepGet doesn't have a method to store and return all the headers, so just print + * out the ones we have methods for. + * Turn on logging to use it for a decent test. + */ + public static void main(String args[]) { + String proxyHost = "127.0.0.1"; + int proxyPort = 4444; + int numRetries = 0; + int inactivityTimeout = 60*1000; + String url = null; + try { + for (int i = 0; i < args.length; i++) { + if (args[i].equals("-p")) { + proxyHost = args[i+1].substring(0, args[i+1].indexOf(':')); + String port = args[i+1].substring(args[i+1].indexOf(':')+1); + proxyPort = Integer.parseInt(port); + i++; + } else if (args[i].equals("-n")) { + numRetries = Integer.parseInt(args[i+1]); + i++; + } else if (args[i].equals("-t")) { + inactivityTimeout = 1000 * Integer.parseInt(args[i+1]); + i++; + } else if (args[i].startsWith("-")) { + usage(); + return; + } else { + url = args[i]; + } + } + } catch (Exception e) { + e.printStackTrace(); + usage(); + return; + } + + if (url == null) { + usage(); + return; + } + + EepHead get = new EepHead(I2PAppContext.getGlobalContext(), proxyHost, proxyPort, numRetries, url); + if (get.fetch(45*1000, -1, inactivityTimeout)) { + System.err.println("Content-Type: " + get.getContentType()); + System.err.println("Content-Length: " + get.getContentLength()); + System.err.println("Last-Modified: " + get.getLastModified()); + System.err.println("Etag: " + get.getETag()); + } else { + System.err.println("Failed " + url); + } + } + + protected static void usage() { + System.err.println("EepHead [-p 127.0.0.1:4444] [-n #retries] [-t timeout] url"); + } + + /** return true if the URL was completely retrieved */ + @Override + protected void doFetch(SocketTimeout timeout) throws IOException { + _headersRead = false; + _aborted = false; + try { + readHeaders(); + } finally { + _headersRead = true; + } + if (_aborted) + throw new IOException("Timed out reading the HTTP headers"); + + timeout.resetTimer(); + if (_fetchInactivityTimeout > 0) + timeout.setInactivityTimeout(_fetchInactivityTimeout); + else + timeout.setInactivityTimeout(60*1000); + + if (_redirectLocation != null) { + try { + URL oldURL = new URL(_actualURL); + String query = oldURL.getQuery(); + if (query == null) query = ""; + if (_redirectLocation.startsWith("http://")) { + if ( (_redirectLocation.indexOf('?') < 0) && (query.length() > 0) ) + _actualURL = _redirectLocation + "?" + query; + else + _actualURL = _redirectLocation; + } else { + URL url = new URL(_actualURL); + if (_redirectLocation.startsWith("/")) + _actualURL = "http://" + url.getHost() + ":" + url.getPort() + _redirectLocation; + else + _actualURL = "http://" + url.getHost() + ":" + url.getPort() + "/" + _redirectLocation; + if ( (_actualURL.indexOf('?') < 0) && (query.length() > 0) ) + _actualURL = _actualURL + "?" + query; + } + } catch (MalformedURLException mue) { + throw new IOException("Redirected from an invalid URL"); + } + _redirects++; + if (_redirects > 5) + throw new IOException("Too many redirects: to " + _redirectLocation); + if (_log.shouldLog(Log.INFO)) _log.info("Redirecting to " + _redirectLocation); + sendRequest(timeout); + doFetch(timeout); + return; + } + + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Headers read completely"); + + if (_out != null) + _out.close(); + _out = null; + + if (_aborted) + throw new IOException("Timed out reading the HTTP data"); + + timeout.cancel(); + + if (_transferFailed) { + // 404, etc - transferFailed is called after all attempts fail, by fetch() above + for (int i = 0; i < _listeners.size(); i++) + ((StatusListener)_listeners.get(i)).attemptFailed(_url, 0, 0, _currentAttempt, _numRetries, new Exception("Attempt failed")); + } else { + for (int i = 0; i < _listeners.size(); i++) + ((StatusListener)_listeners.get(i)).transferComplete( + 0, 0, 0, _url, "dummy", false); + } + } + + @Override + protected String getRequest() throws IOException { + StringBuilder buf = new StringBuilder(512); + URL url = new URL(_actualURL); + String proto = url.getProtocol(); + String host = url.getHost(); + int port = url.getPort(); + String path = url.getPath(); + String query = url.getQuery(); + if (query != null) + path = path + "?" + query; + if (!path.startsWith("/")) + path = "/" + path; + if ( (port == 80) || (port == 443) || (port <= 0) ) path = proto + "://" + host + path; + else path = proto + "://" + host + ":" + port + path; + if (_log.shouldLog(Log.DEBUG)) _log.debug("Requesting " + path); + buf.append("HEAD ").append(_actualURL).append(" HTTP/1.1\r\n"); + buf.append("Host: ").append(url.getHost()).append("\r\n"); + buf.append("Accept-Encoding: \r\n"); + if (_shouldProxy) + buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); + buf.append("Connection: close\r\n\r\n"); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Request: [" + buf.toString() + "]"); + return buf.toString(); + } + + /** We don't decrement the variable (unlike in EepGet), so this is valid */ + public long getContentLength() { + return _bytesRemaining; + } +} diff --git a/core/java/src/net/i2p/util/EepPost.java b/core/java/src/net/i2p/util/EepPost.java index 50929f3cf..615361e20 100644 --- a/core/java/src/net/i2p/util/EepPost.java +++ b/core/java/src/net/i2p/util/EepPost.java @@ -184,7 +184,7 @@ public class EepPost { } private String getHeader(boolean isProxy, String path, String host, int port, String separator, long length) { - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append("POST "); if (isProxy) { buf.append("http://").append(host); @@ -212,7 +212,7 @@ public class EepPost { return "------------------------" + new java.util.Random().nextLong(); byte separator[] = new byte[32]; // 2^-128 chance of this being a problem I2PAppContext.getGlobalContext().random().nextBytes(separator); - StringBuffer sep = new StringBuffer(48); + StringBuilder sep = new StringBuilder(48); for (int i = 0; i < separator.length; i++) sep.append((char)((int)'a' + (int)(separator[i]&0x0F))).append((char)((int)'a' + (int)((separator[i] >>> 4) & 0x0F))); return sep.toString(); diff --git a/core/java/src/net/i2p/util/FileUtil.java b/core/java/src/net/i2p/util/FileUtil.java index 677c50086..38073fd60 100644 --- a/core/java/src/net/i2p/util/FileUtil.java +++ b/core/java/src/net/i2p/util/FileUtil.java @@ -18,6 +18,12 @@ import java.util.zip.ZipFile; /** * General helper methods for messing with files * + * These are static methods that do NOT convert arguments + * to absolute paths for a particular context and directtory. + * + * Callers should ALWAYS provide absolute paths as arguments, + * and should NEVER assume files are in the current working directory. + * */ public class FileUtil { /** @@ -70,9 +76,10 @@ public class FileUtil { } public static boolean extractZip(File zipfile, File targetDir) { + ZipFile zip = null; try { byte buf[] = new byte[16*1024]; - ZipFile zip = new ZipFile(zipfile); + zip = new ZipFile(zipfile); Enumeration entries = zip.entries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry)entries.nextElement(); @@ -118,13 +125,16 @@ public class FileUtil { } } } - zip.close(); return true; } catch (IOException ioe) { System.err.println("ERROR: Unable to extract the zip file"); ioe.printStackTrace(); return false; - } + } finally { + if (zip != null) { + try { zip.close(); } catch (IOException ioe) {} + } + } } /** @@ -142,7 +152,7 @@ public class FileUtil { FileInputStream fis = null; try { fis = new FileInputStream(f); - BufferedReader in = new BufferedReader(new InputStreamReader(fis)); + BufferedReader in = new BufferedReader(new InputStreamReader(fis, "UTF-8")); List lines = new ArrayList(maxNumLines > 0 ? maxNumLines : 64); String line = null; while ( (line = in.readLine()) != null) { @@ -154,7 +164,7 @@ public class FileUtil { lines.remove(0); } } - StringBuffer buf = new StringBuffer(lines.size() * 80); + StringBuilder buf = new StringBuilder(lines.size() * 80); for (int i = 0; i < lines.size(); i++) buf.append((String)lines.get(i)).append('\n'); return buf.toString(); @@ -195,9 +205,18 @@ public class FileUtil { } } - - /** return true if it was copied successfully */ + /** + * @return true if it was copied successfully + */ public static boolean copy(String source, String dest, boolean overwriteExisting) { + return copy(source, dest, overwriteExisting, false); + } + + /** + * @param quiet don't log fails to wrapper log if true + * @return true if it was copied successfully + */ + public static boolean copy(String source, String dest, boolean overwriteExisting, boolean quiet) { File src = new File(source); File dst = new File(dest); @@ -220,7 +239,8 @@ public class FileUtil { out.close(); return true; } catch (IOException ioe) { - ioe.printStackTrace(); + if (!quiet) + ioe.printStackTrace(); return false; } } diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index 1f957515c..054e79a22 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -67,8 +67,8 @@ public class LogManager { /** when was the config file last read (or -1 if never) */ private long _configLastRead; - /** filename of the config file */ - private String _location; + /** the config file */ + private File _locationFile; /** Ordered list of LogRecord elements that have not been written out yet */ private List _records; /** List of explicit overrides of log levels (LogLimit objects) */ @@ -115,11 +115,11 @@ public class LogManager { _logs = new HashMap(128); _defaultLimit = Log.ERROR; _configLastRead = 0; - _location = context.getProperty(CONFIG_LOCATION_PROP, CONFIG_LOCATION_DEFAULT); _context = context; _log = getLog(LogManager.class); + String location = context.getProperty(CONFIG_LOCATION_PROP, CONFIG_LOCATION_DEFAULT); + setConfig(location); _consoleBuffer = new LogConsoleBuffer(context); - loadConfig(); _writer = new LogWriter(this); Thread t = new I2PThread(_writer); t.setName("LogWriter"); @@ -196,11 +196,16 @@ public class LogManager { } public void setConfig(String filename) { - _log.debug("Config filename set to " + filename); - _location = filename; + _locationFile = new File(filename); + if (!_locationFile.isAbsolute()) + _locationFile = new File(_context.getConfigDir(), filename); loadConfig(); } + public String currentFile() { + return _writer.currentFile(); + } + /** * Used by Log to add records to the queue * @@ -232,20 +237,12 @@ public class LogManager { loadConfig(); } - /// - /// - - // - // - // - private void loadConfig() { - File cfgFile = new File(_location); + File cfgFile = _locationFile; if (!cfgFile.exists()) { if (!_alreadyNoticedMissingConfig) { if (_log.shouldLog(Log.WARN)) - _log.warn("Log file " + _location + " does not exist"); - //System.err.println("Log file " + _location + " does not exist"); + _log.warn("Log file " + _locationFile.getAbsolutePath() + " does not exist"); _alreadyNoticedMissingConfig = true; } parseConfig(new Properties()); @@ -262,9 +259,6 @@ public class LogManager { return; } - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Loading config from " + _location); - Properties p = new Properties(); FileInputStream fis = null; try { @@ -272,7 +266,7 @@ public class LogManager { p.load(fis); _configLastRead = _context.clock().now(); } catch (IOException ioe) { - System.err.println("Error loading logger config from " + new File(_location).getAbsolutePath()); + System.err.println("Error loading logger config from " + cfgFile.getAbsolutePath()); } finally { if (fis != null) try { fis.close(); @@ -540,7 +534,7 @@ public class LogManager { String config = createConfig(); FileOutputStream fos = null; try { - fos = new FileOutputStream(_location); + fos = new FileOutputStream(_locationFile); fos.write(config.getBytes()); return true; } catch (IOException ioe) { @@ -552,7 +546,7 @@ public class LogManager { } private String createConfig() { - StringBuffer buf = new StringBuffer(8*1024); + StringBuilder buf = new StringBuilder(8*1024); buf.append(PROP_FORMAT).append('=').append(new String(_format)).append('\n'); buf.append(PROP_DATEFORMAT).append('=').append(_dateFormatPattern).append('\n'); buf.append(PROP_DISPLAYONSCREEN).append('=').append((_displayOnScreen ? "TRUE" : "FALSE")).append('\n'); diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java index f280e7bf9..72d6ef9ee 100644 --- a/core/java/src/net/i2p/util/LogRecordFormatter.java +++ b/core/java/src/net/i2p/util/LogRecordFormatter.java @@ -30,7 +30,7 @@ class LogRecordFormatter { int size = 128 + rec.getMessage().length(); if (rec.getThrowable() != null) size += 512; - StringBuffer buf = new StringBuffer(size); + StringBuilder buf = new StringBuilder(size); char format[] = manager.getFormat(); for (int i = 0; i < format.length; ++i) { switch (format[i]) { @@ -93,7 +93,7 @@ class LogRecordFormatter { } private static String toString(String str, int size) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (str == null) str = ""; if (str.length() > size) str = str.substring(str.length() - size); buf.append(str); diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java index 29fcff7cc..ed94081c6 100644 --- a/core/java/src/net/i2p/util/LogWriter.java +++ b/core/java/src/net/i2p/util/LogWriter.java @@ -15,6 +15,8 @@ import java.io.IOException; import java.io.OutputStream; import java.util.List; +import net.i2p.I2PAppContext; + /** * Log writer thread that pulls log records from the LogManager, writes them to * the current logfile, and rotates the logs as necessary. This also periodically @@ -22,6 +24,7 @@ import java.util.List; * */ class LogWriter implements Runnable { + /** every 10 seconds? why? Just have the gui force a reread after a change?? */ private final static long CONFIG_READ_ITERVAL = 10 * 1000; private long _lastReadConfig = 0; private long _numBytesInCurrentFile = 0; @@ -38,6 +41,7 @@ class LogWriter implements Runnable { public LogWriter(LogManager manager) { _manager = manager; + _lastReadConfig = Clock.getInstance().now(); } public void stopWriting() { @@ -89,7 +93,10 @@ class LogWriter implements Runnable { } } - + public String currentFile() { + return _currentFile != null ? _currentFile.getAbsolutePath() : "uninitialized"; + } + private void rereadConfig() { long now = Clock.getInstance().now(); if (now - _lastReadConfig > CONFIG_READ_ITERVAL) { @@ -168,15 +175,21 @@ class LogWriter implements Runnable { * */ private File getNextFile(String pattern) { - File f = null; + File f = new File(pattern); + File base = null; + if (!f.isAbsolute()) + base = I2PAppContext.getGlobalContext().getLogDir(); if ( (pattern.indexOf('#') < 0) && (pattern.indexOf('@') <= 0) ) { - return new File(pattern); + if (base != null) + return new File(base, pattern); + else + return f; } int max = _manager.getRotationLimit(); if (_rotationNum == -1) { - return getFirstFile(pattern, max); + return getFirstFile(base, pattern, max); } // we're in rotation, just go to the next @@ -190,9 +203,13 @@ class LogWriter implements Runnable { * Retrieve the first file, updating the rotation number accordingly * */ - private File getFirstFile(String pattern, int max) { + private File getFirstFile(File base, String pattern, int max) { for (int i = 0; i < max; i++) { - File f = new File(replace(pattern, i)); + File f; + if (base != null) + f = new File(base, replace(pattern, i)); + else + f = new File(replace(pattern, i)); if (!f.exists()) { _rotationNum = i; return f; @@ -202,7 +219,11 @@ class LogWriter implements Runnable { // all exist, pick the oldest to replace File oldest = null; for (int i = 0; i < max; i++) { - File f = new File(replace(pattern, i)); + File f; + if (base != null) + f = new File(base, replace(pattern, i)); + else + f = new File(replace(pattern, i)); if (oldest == null) { oldest = f; } else { @@ -217,7 +238,7 @@ class LogWriter implements Runnable { private static final String replace(String pattern, int num) { char c[] = pattern.toCharArray(); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < c.length; i++) { if ( (c[i] != '#') && (c[i] != '@') ) buf.append(c[i]); diff --git a/core/java/src/net/i2p/util/NativeBigInteger.java b/core/java/src/net/i2p/util/NativeBigInteger.java index 7a64e24e4..44101afd9 100644 --- a/core/java/src/net/i2p/util/NativeBigInteger.java +++ b/core/java/src/net/i2p/util/NativeBigInteger.java @@ -23,6 +23,10 @@ import freenet.support.CPUInformation.CPUInfo; import freenet.support.CPUInformation.IntelCPUInfo; import freenet.support.CPUInformation.UnknownCPUException; +import net.i2p.I2PAppContext; +import net.i2p.util.FileUtil; +import net.i2p.util.Log; + /** *

        BigInteger that takes advantage of the jbigi library for the modPow operation, * which accounts for a massive segment of the processing cost of asymmetric @@ -85,10 +89,15 @@ import freenet.support.CPUInformation.UnknownCPUException; public class NativeBigInteger extends BigInteger { /** did we load the native lib correctly? */ private static boolean _nativeOk = false; + private static String _loadStatus = "uninitialized"; + private static String _cpuModel = "uninitialized"; /** * do we want to dump some basic success/failure info to stderr during * initialization? this would otherwise use the Log component, but this makes * it easier for other systems to reuse this class + * + * Well, we really want to use Log so if you are one of those "other systems" + * then comment out the I2PAppContext usage below. */ private static final boolean _doLog = System.getProperty("jbigi.dontLog") == null; @@ -134,6 +143,9 @@ public class NativeBigInteger extends BigInteger { try { CPUInfo c = CPUID.getInfo(); + try { + _cpuModel = c.getCPUModelString(); + } catch (UnknownCPUException e) {} if (c.IsC3Compatible()) return JBIGI_OPTIMIZATION_VIAC3; if (c instanceof AMDCPUInfo) { @@ -250,6 +262,20 @@ public class NativeBigInteger extends BigInteger { return _nativeOk; } + public static String loadStatus() { + return _loadStatus; + } + + public static String cpuType() { + if (sCPUType != null) + return sCPUType; + return "unrecognized"; + } + + public static String cpuModel() { + return _cpuModel; + } + /** *

        Compare the BigInteger.modPow/doubleValue vs the NativeBigInteger.modPow/doubleValue of some * really big (2Kbit) numbers 100 different times and benchmark the @@ -401,38 +427,32 @@ public class NativeBigInteger extends BigInteger { boolean loaded = loadGeneric("jbigi"); if (loaded) { _nativeOk = true; - if (_doLog) - System.err.println("INFO: Locally optimized native BigInteger loaded from the library path"); + info("Locally optimized native BigInteger library loaded from the library path"); } else { loaded = loadFromResource("jbigi"); if (loaded) { _nativeOk = true; - if (_doLog) - System.err.println("INFO: Locally optimized native BigInteger loaded from resource"); + info("Locally optimized native BigInteger library loaded from resource"); } else { loaded = loadFromResource(true); if (loaded) { _nativeOk = true; - if (_doLog) - System.err.println("INFO: Optimized native BigInteger library '"+getResourceName(true)+"' loaded from resource"); + info("Optimized native BigInteger library '"+getResourceName(true)+"' loaded from resource"); } else { loaded = loadGeneric(true); if (loaded) { _nativeOk = true; - if (_doLog) - System.err.println("INFO: Optimized native BigInteger library '"+getMiddleName(true)+"' loaded from somewhere in the path"); + info("Optimized native BigInteger library '"+getMiddleName(true)+"' loaded from somewhere in the path"); } else { loaded = loadFromResource(false); if (loaded) { _nativeOk = true; - if (_doLog) - System.err.println("INFO: Non-optimized native BigInteger library '"+getResourceName(false)+"' loaded from resource"); + info("Non-optimized native BigInteger library '"+getResourceName(false)+"' loaded from resource"); } else { loaded = loadGeneric(false); if (loaded) { _nativeOk = true; - if (_doLog) - System.err.println("INFO: Non-optimized native BigInteger library '"+getMiddleName(false)+"' loaded from somewhere in the path"); + info("Non-optimized native BigInteger library '"+getMiddleName(false)+"' loaded from somewhere in the path"); } else { _nativeOk = false; } @@ -442,16 +462,29 @@ public class NativeBigInteger extends BigInteger { } } } - if (_doLog && !_nativeOk) - System.err.println("INFO: Native BigInteger library jbigi not loaded - using pure java"); + if (!_nativeOk) { + warn("Native BigInteger library jbigi not loaded - using pure Java - " + + "poor performance may result - see http://www.i2p2.i2p/jbigi.html for help"); + } }catch(Exception e){ - if (_doLog) { - System.err.println("INFO: Native BigInteger library jbigi not loaded, reason: '"+e.getMessage()+"' - using pure java"); - e.printStackTrace(); - } + warn("Native BigInteger library jbigi not loaded, reason: '"+e.getMessage()+"' - using pure java"); } } + private static void info(String s) { + if(_doLog) + System.err.println("INFO: " + s); + I2PAppContext.getGlobalContext().logManager().getLog(NativeBigInteger.class).info(s); + _loadStatus = s; + } + + private static void warn(String s) { + if(_doLog) + System.err.println("WARNING: " + s); + I2PAppContext.getGlobalContext().logManager().getLog(NativeBigInteger.class).warn(s); + _loadStatus = s; + } + /** *

        Try loading it from an explictly build jbigi.dll / libjbigi.so first, before * looking into a jbigi.jar for any other libraries.

        @@ -484,8 +517,11 @@ public class NativeBigInteger extends BigInteger { * *

        This is a pretty ugly hack, using the general technique illustrated by the * onion FEC libraries. It works by pulling the resource, writing out the - * byte stream to a temporary file, loading the native library from that file, - * then deleting the file.

        + * byte stream to a temporary file, loading the native library from that file. + * We then attempt to copy the file from the temporary dir to the base install dir, + * so we don't have to do this next time - but we don't complain if it fails, + * so we transparently support read-only base dirs. + *

        * * @return true if it was loaded successfully, else false * @@ -506,11 +542,13 @@ public class NativeBigInteger extends BigInteger { File outFile = null; FileOutputStream fos = null; + String filename = _libPrefix + "jbigi" + _libSuffix; try { InputStream libStream = resource.openStream(); - outFile = new File(_libPrefix + "jbigi" + _libSuffix); + outFile = new File(I2PAppContext.getGlobalContext().getTempDir(), filename); fos = new FileOutputStream(outFile); - byte buf[] = new byte[4096*1024]; + // wtf this was 4096*1024 which is really excessive for a roughly 50KB file + byte buf[] = new byte[4096]; while (true) { int read = libStream.read(buf); if (read < 0) break; @@ -519,7 +557,6 @@ public class NativeBigInteger extends BigInteger { fos.close(); fos = null; System.load(outFile.getAbsolutePath()); //System.load requires an absolute path to the lib - return true; } catch (UnsatisfiedLinkError ule) { if (_doLog) { System.err.println("ERROR: The resource " + resourceName @@ -538,6 +575,10 @@ public class NativeBigInteger extends BigInteger { try { fos.close(); } catch (IOException ioe) {} } } + // copy to install dir, ignore failure + File newFile = new File(I2PAppContext.getGlobalContext().getBaseDir(), filename); + FileUtil.copy(outFile.getAbsolutePath(), newFile.getAbsolutePath(), false, true); + return true; } private static final String getResourceName(boolean optimized) { diff --git a/core/java/src/net/i2p/util/ObjectCounter.java b/core/java/src/net/i2p/util/ObjectCounter.java new file mode 100644 index 000000000..19c92ae66 --- /dev/null +++ b/core/java/src/net/i2p/util/ObjectCounter.java @@ -0,0 +1,42 @@ +package net.i2p.util; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Count things. + * + * @author zzz + */ +public class ObjectCounter { + private ConcurrentHashMap _map; + public ObjectCounter() { + _map = new ConcurrentHashMap(); + } + /** + * Add one. + * Not perfectly concurrent, new AtomicInteger(1) would be better, + * at the cost of some object churn. + */ + public void increment(K h) { + Integer i = _map.putIfAbsent(h, Integer.valueOf(1)); + if (i != null) + _map.put(h, Integer.valueOf(i.intValue() + 1)); + } + /** + * @return current count + */ + public int count(K h) { + Integer i = _map.get(h); + if (i != null) + return i.intValue(); + return 0; + } + /** + * @return set of objects with counts > 0 + */ + public Set objects() { + return _map.keySet(); + } +} + diff --git a/core/java/src/net/i2p/util/RandomSource.java b/core/java/src/net/i2p/util/RandomSource.java index 550b37b8d..c6ac80a65 100644 --- a/core/java/src/net/i2p/util/RandomSource.java +++ b/core/java/src/net/i2p/util/RandomSource.java @@ -142,7 +142,7 @@ public class RandomSource extends SecureRandom implements EntropyHarvester { private static final String SEEDFILE = "prngseed.rnd"; public static final void writeSeed(byte buf[]) { - File f = new File(SEEDFILE); + File f = new File(I2PAppContext.getGlobalContext().getConfigDir(), SEEDFILE); FileOutputStream fos = null; try { fos = new FileOutputStream(f); @@ -164,7 +164,7 @@ public class RandomSource extends SecureRandom implements EntropyHarvester { } private static final boolean seedFromFile(String filename, byte buf[]) { - File f = new File(filename); + File f = new File(I2PAppContext.getGlobalContext().getConfigDir(), filename); if (f.exists()) { FileInputStream fis = null; try { diff --git a/core/java/src/net/i2p/util/ShellCommand.java b/core/java/src/net/i2p/util/ShellCommand.java index 36f0dfd21..80bdc32f6 100644 --- a/core/java/src/net/i2p/util/ShellCommand.java +++ b/core/java/src/net/i2p/util/ShellCommand.java @@ -34,6 +34,7 @@ public class ShellCommand { private static final boolean NO_WAIT_FOR_EXIT_STATUS = false; private boolean _commandSuccessful; + private boolean _commandCompleted; private CommandThread _commandThread; private InputStream _errorStream; private InputStream _inputStream; @@ -43,6 +44,8 @@ public class ShellCommand { /** * Executes a shell command in its own thread. + * Use caution when repeatedly calling execute methods with the same object + * as there are some globals here... * * @author hypercubus */ @@ -57,11 +60,16 @@ public class ShellCommand { this.caller = caller; this.shellCommand = shellCommand; this.consumeOutput = consumeOutput; + _commandSuccessful = false; + _commandCompleted = false; } @Override public void run() { + // FIXME these will corrupt the globals if the command times out and the caller + // makes another request with the same object. _commandSuccessful = execute(shellCommand, consumeOutput, WAIT_FOR_EXIT_STATUS); + _commandCompleted = true; if (_isTimerRunning) { synchronized(caller) { caller.notifyAll(); // In case the caller is still in the wait() state. @@ -248,7 +256,8 @@ public class ShellCommand { _isTimerRunning = true; wait(seconds * 1000); _isTimerRunning = false; - return true; + if (!_commandCompleted) + return true; } } catch (InterruptedException e) { @@ -317,7 +326,8 @@ public class ShellCommand { _isTimerRunning = true; wait(seconds * 1000); _isTimerRunning = false; - return true; + if (!_commandCompleted) + return true; } } catch (InterruptedException e) { diff --git a/core/java/src/net/i2p/util/SimpleScheduler.java b/core/java/src/net/i2p/util/SimpleScheduler.java index becf10099..ee7d36e99 100644 --- a/core/java/src/net/i2p/util/SimpleScheduler.java +++ b/core/java/src/net/i2p/util/SimpleScheduler.java @@ -1,7 +1,6 @@ package net.i2p.util; import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ThreadFactory; @@ -43,6 +42,7 @@ public class SimpleScheduler { _name = name; _count = 0; _executor = new ScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory()); + _executor.prestartAllCoreThreads(); } /** @@ -91,6 +91,11 @@ public class SimpleScheduler { public Thread newThread(Runnable r) { Thread rv = Executors.defaultThreadFactory().newThread(r); rv.setName(_name + ' ' + (++_count) + '/' + THREADS); +// Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates! +// String name = rv.getThreadGroup().getName(); +// if(!name.equals("main")) { +// (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace(); +// } rv.setDaemon(true); return rv; } @@ -144,9 +149,11 @@ public class SimpleScheduler { _timeoutMs = timeoutMs; _scheduled = initialDelay + System.currentTimeMillis(); } + @Override public void schedule() { _executor.scheduleWithFixedDelay(this, _initialDelay, _timeoutMs, TimeUnit.MILLISECONDS); } + @Override public void run() { super.run(); _scheduled = _timeoutMs + System.currentTimeMillis(); diff --git a/core/java/src/net/i2p/util/SimpleTimer.java b/core/java/src/net/i2p/util/SimpleTimer.java index 87aa7b4e5..bb0a2e67e 100644 --- a/core/java/src/net/i2p/util/SimpleTimer.java +++ b/core/java/src/net/i2p/util/SimpleTimer.java @@ -233,7 +233,7 @@ public class SimpleTimer { } else { _occurredTime = now; if (_occurredEventCount > 2500) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Too many simpleTimerJobs (").append(_occurredEventCount); buf.append(") in a second!"); _log.log(Log.WARN, buf.toString()); diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index 6239ed42f..b2af33cf2 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -5,7 +5,6 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ThreadFactory; -import java.util.Map; import net.i2p.I2PAppContext; @@ -42,6 +41,7 @@ public class SimpleTimer2 { _name = name; _count = 0; _executor = new CustomScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory()); + _executor.prestartAllCoreThreads(); } /** @@ -56,6 +56,7 @@ public class SimpleTimer2 { super(threads, factory); } + @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if (t != null) // shoudn't happen, caught in RunnableEvent.run() @@ -67,6 +68,11 @@ public class SimpleTimer2 { public Thread newThread(Runnable r) { Thread rv = Executors.defaultThreadFactory().newThread(r); rv.setName(_name + ' ' + (++_count) + '/' + THREADS); +// Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates! +// String name = rv.getThreadGroup().getName(); +// if(!name.equals("main")) { +// (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace(); +// } rv.setDaemon(true); return rv; } @@ -232,6 +238,7 @@ public class SimpleTimer2 { public abstract void timeReached(); } + @Override public String toString() { return _name; } diff --git a/core/java/src/net/i2p/util/SocketTimeout.java b/core/java/src/net/i2p/util/SocketTimeout.java index 65238dd0d..3813ec6e8 100644 --- a/core/java/src/net/i2p/util/SocketTimeout.java +++ b/core/java/src/net/i2p/util/SocketTimeout.java @@ -58,7 +58,7 @@ public class SocketTimeout implements SimpleTimer.TimedEvent { private static String ts(long when) { synchronized (_fmt) { return _fmt.format(new Date(when)); } } @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("started on "); buf.append(ts(_startTime)); buf.append("idle for "); diff --git a/core/java/src/org/bouncycastle/crypto/macs/HMac.java b/core/java/src/org/bouncycastle/crypto/macs/I2PHMac.java similarity index 95% rename from core/java/src/org/bouncycastle/crypto/macs/HMac.java rename to core/java/src/org/bouncycastle/crypto/macs/I2PHMac.java index 7176c8aca..a566e8a79 100644 --- a/core/java/src/org/bouncycastle/crypto/macs/HMac.java +++ b/core/java/src/org/bouncycastle/crypto/macs/I2PHMac.java @@ -42,8 +42,12 @@ import org.bouncycastle.crypto.Mac; * a frequently used buffer (called on doFinal). changes released into the public * domain in 2005. * + * This is renamed from HMac because the constructor HMac(digest, sz) does not exist + * in the standard bouncycastle library, thus it conflicts in JVMs that contain the + * standard library (Android). + * */ -public class HMac +public class I2PHMac implements Mac { private final static int BLOCK_LENGTH = 64; @@ -56,12 +60,12 @@ implements Mac private byte[] inputPad = new byte[BLOCK_LENGTH]; private byte[] outputPad = new byte[BLOCK_LENGTH]; - public HMac( + public I2PHMac( Digest digest) { this(digest, digest.getDigestSize()); } - public HMac( + public I2PHMac( Digest digest, int sz) { this.digest = digest; diff --git a/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java b/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java index 05b515bd2..6da1f0f60 100644 --- a/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java +++ b/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java @@ -212,7 +212,7 @@ public class BloomSHA1 { } // DEBUG METHODS public static String keyToString(byte[] key) { - StringBuffer sb = new StringBuffer().append(key[0]); + StringBuilder sb = new StringBuilder().append(key[0]); for (int i = 1; i < key.length; i++) { sb.append(".").append(Integer.toString(key[i], 16)); } @@ -220,14 +220,14 @@ public class BloomSHA1 { } /** convert 64-bit integer to hex String */ public static String ltoh (long i) { - StringBuffer sb = new StringBuffer().append("#") + StringBuilder sb = new StringBuilder().append("#") .append(Long.toString(i, 16)); return sb.toString(); } /** convert 32-bit integer to String */ public static String itoh (int i) { - StringBuffer sb = new StringBuffer().append("#") + StringBuilder sb = new StringBuilder().append("#") .append(Integer.toString(i, 16)); return sb.toString(); } diff --git a/core/java/test/net/i2p/crypto/HMACSHA256Bench.java b/core/java/test/net/i2p/crypto/HMACSHA256Bench.java index 762821f15..00474e0e4 100644 --- a/core/java/test/net/i2p/crypto/HMACSHA256Bench.java +++ b/core/java/test/net/i2p/crypto/HMACSHA256Bench.java @@ -70,12 +70,12 @@ public class HMACSHA256Bench { long maxLong1 = 0; byte[] smess = new String("abc").getBytes(); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int x = 0; x < 2*1024; x++) { buf.append("a"); } byte[] mmess = buf.toString().getBytes(); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes(); - buf = new StringBuffer(); + buf = new StringBuilder(); for (int x = 0; x < 10000; x++) { buf.append("a"); } diff --git a/core/java/test/net/i2p/crypto/SHA1HashTest.java b/core/java/test/net/i2p/crypto/SHA1HashTest.java index 140f784eb..b83883821 100644 --- a/core/java/test/net/i2p/crypto/SHA1HashTest.java +++ b/core/java/test/net/i2p/crypto/SHA1HashTest.java @@ -133,7 +133,7 @@ public class SHA1HashTest extends TestCase{ } private final String toHex(final byte[] bytes) { - StringBuffer buf = new StringBuffer(bytes.length * 2); + StringBuilder buf = new StringBuilder(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { if ((i & 3) == 0 && i != 0) buf.append(' '); diff --git a/core/java/src/net/i2p/crypto/SHA1Test.java b/core/java/test/net/i2p/crypto/SHA1Test.java similarity index 99% rename from core/java/src/net/i2p/crypto/SHA1Test.java rename to core/java/test/net/i2p/crypto/SHA1Test.java index de1bf1b81..2c532c5cd 100644 --- a/core/java/src/net/i2p/crypto/SHA1Test.java +++ b/core/java/test/net/i2p/crypto/SHA1Test.java @@ -179,7 +179,7 @@ public class SHA1Test { } private static final String toHex(final byte[] bytes) { - StringBuffer buf = new StringBuffer(bytes.length * 2); + StringBuilder buf = new StringBuilder(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { if ((i & 3) == 0 && i != 0) buf.append(' '); diff --git a/core/java/test/net/i2p/crypto/SHA256Bench.java b/core/java/test/net/i2p/crypto/SHA256Bench.java index dc5f14163..0988fde34 100644 --- a/core/java/test/net/i2p/crypto/SHA256Bench.java +++ b/core/java/test/net/i2p/crypto/SHA256Bench.java @@ -57,12 +57,12 @@ public class SHA256Bench { long maxLong1 = 0; byte[] smess = new String("abc").getBytes(); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int x = 0; x < 10*1024; x++) { buf.append("a"); } byte[] mmess = buf.toString().getBytes(); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes(); - buf = new StringBuffer(); + buf = new StringBuilder(); for (int x = 0; x < 1000000; x++) { buf.append("a"); } diff --git a/core/java/test/net/i2p/stat/RateTest.java b/core/java/test/net/i2p/stat/RateTest.java index fd565054a..471e7bb8f 100644 --- a/core/java/test/net/i2p/stat/RateTest.java +++ b/core/java/test/net/i2p/stat/RateTest.java @@ -13,7 +13,7 @@ public class RateTest extends TestCase { rate.addData(i * 100, 20); } rate.coalesce(); - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); rate.store("rate.test", buf); byte data[] = buf.toString().getBytes(); diff --git a/core/java/src/net/i2p/stat/SizeTest.java b/core/java/test/net/i2p/stat/SizeTest.java similarity index 100% rename from core/java/src/net/i2p/stat/SizeTest.java rename to core/java/test/net/i2p/stat/SizeTest.java diff --git a/history.txt b/history.txt index 62c4430e9..990e710eb 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,1207 @@ +2009-08-11 zzz + * Android: + - Merge in the branch + - Build instructions in the android/ dir + - Rename HMac to I2PHMac to avoid android lib conflicts + - Configurable number of PRNG buffers in AsyncFortunaStandalone + (router.prng.buffers=16) to control memory use - these + are 256KB each. + - Configurable size of the DecayingBloomFilters + (router.decayingBloomFilterM=23) to control memory use - there + are 4 pairs of these (8 total), each 2**(M-3) bytes, + or 8MB total for M=23. + - There's at least two unsolved fatal problems: + 1) Most of the routerinfo signature verifications fail, + including our own + 2) It randomly dies after a while + * Console: + - Rename the shitlist and the blocklist + - Try to reduce servlet problems on iframe + - Select server or client icon for local dests + * EepHead: New + * Move StatsGenerator from router to routerconsole + * Move the unused AdminManager from router to the apps directory + * NetDb stats: Hide part. tunnel total events, effective next release + * Router: Comment out dead oldconsole code + * Updater: + - Add new unsigned update option, triggered by + last-modified date, using the new EepHead. + Buttons still are not hidden after download complete. + - Make the .sud updater use the temp dir when proxied + - Several cleanups + +2009-08-11 dr|z3d + * Extensive sidepanel overhaul + - Ensure all sidepanel headings link to pertinent pages + - First stage of enhanced Local Destinations sub-panel presentation + - Move Configuration, Help, and I2PTunnel manager links to headings + - Add tooltips to all linked content; table content next in line + +2009-08-07 dr|z3d + * summarynoframe.jsp + - Main content now tabulated for better presentation + - Headings now more prominent + - Pruning where necessary of text strings + * Console themes (light/dark/classic) + - Ensure functionality with new sidepanel layout + - Custom hacks for IE/classic + - Enhanced form/button presentation + +2009-08-07 zzz + * build.xml: + - Try to automate the release process + - Take jetty back out of the updater after 4 releases + * Console: + - Add a custom error page + - Don't count ourselves in known peers + - Hide update button when shutting down + - Increase skew warning threshold to 3s (was 100ms) + - Remove UTC time from summary bar + - Truncate long dest names + - Try to reduce servlet problems on index page + * Core: + - Catch unzip fd leaks on error + - Move 2 test classes out of the lib + * Eepsite: + - Quote the jetty.xml path in clients.config, + and adjust the migration function, to fix the + eepsite-won't-start bug on windows + * HTTP Proxy: + - Restore the localhost error message + - Catch 127.0.0.1:xxxx addresses too + * I2PTunnel: + - Move the privkey files from the app dir to the + config dir, in preparation for splitting the two + dirs by default + * Ministreaming: + - Make getInt() static + - Move the big TestSwarm class out of the lib + * NetDb stats: Post-release cleanup + * PersistentKeyRing: Fix broken storage of keys in config file + * Router: Move the WorkingDir class from i2p.jar to router.jar + * Streaming: New option i2p.streaming.answerPings (default true) + * Timestamper: Don't start thread if not enabled + * Wrapper: + - Extend timeout to 20s (was 5s) + - Shorten ping interval to 5m (was 10m) + +2009-08-03 dr|z3d + * Extensive update to the Classic theme; custom css hacks for IE. + +2009-08-02 dr|z3d + * Better support for Internet Explorer/classic theme. + * Incremental improvements to classic theme. + * More UI tweaks and fiddles. + * Fixes for I2PSnark UI; more to come. + +2009-07-31 dr|z3d + * Resolve anomalous buttons and text fields in console ui. + * Enhance presentation of data in /peers.jsp. + * Fix themes issue with horizontal width of radio/checkbox icons. + * Other cosmetic UI enhancements. + +* 2009-07-31 0.7.6 released + +2009-07-31 zzz + * Update versions, package release + * Fix snark.css link + * Revert graph antialias enable + * Remove
        from iframe head + * Fix tunnels.jsp HTML + * Prevent linux-only installer screen from displaying on windows + +2009-07-28 zzz + * Add new reseed URL (thanks eche|on!) + +2009-07-27 zzz + * Add flag dimensions to speed up profiles.jsp rendering + * Catch i2psnark create torrent with no data entered error + http://forum.i2p/viewtopic.php?t=3763 + * Fix typos in proxy error files + +2009-07-26 zzz + * Add wrapper.config and i2prouter comments for 'portable' + * Recognize same base and config dir in WorkingDir + * Reformat XInfoPanel in installer for clarity + +2009-07-25 dr|z3d + * Enhance the layout of /graphs.jsp + * Fix some of the irks in I2PSnark UI. + * Ongoing tweaks and fiddles to the themes' css. Not finished by any means! + +2009-07-24 zzz + * Eepsite: Add Deutsch index page and css (thanks sperrbezirk!) + * Router: Support i2p.dir.base and i2p.dir.config passed in via properties + * Throttle: Decrease default max tunnels to 2500 + +2009-07-23 dr|z3d + * Include additional tile graphics and I2PSnark header logo in /console/images/ + * Tidy up some layout irks; add some last minute 0.7.6 pre-release sparkle! + * Ongoing overhaul of the I2PSnark UI. + +2009-07-23 sponge + * Add bob.i2p and sponge.i2p keys to hosts.txt + +2009-07-23 sponge + * Fix jdk 1.6izm in BOB as per zzz + +2009-07-22 dr|z3d + * More work on the I2PSnark UI. + * Start of improvements to tunnel table data. + * Ongoing theme enhancements. + +2009-07-21 dr|z3d + * First stage of overhaul of webapps ui. + susidns, susimail & i2psnark now lightly themed. + * Proxy error messages now themed as per chosen theme. + * Modest tweaks to the classic theme, et al. + +2009-07-21 zzz + * configclients.jsp: Close anchor + * Console: Drop top-level css, unused now + * Eepsite: Add default robots.txt (thanks v1v4) + * GeoIP: Add license info + * HTTP Proxy: Additional proxy.i2p restrictions + * ServiceManager: Drop, unused + +2009-07-20 zzz + * BuildHandler: Increase threshold for dropping instead + of rejecting to 81% (was 75%) + * Console: Hide configui.jsp from IE, disable selection + * GeoIP: Fix minor bugs (thanks Arsene) + * graphs.jsp: Reduce refresh time to eliminate double iframe load + * HTTP Proxy: Fix proxy.i2p "home page" (thanks dr|z3d) + * I2PSnark: Remove Postman tracker + * Peer Profiles: + - Reduce max age for display to 2h (was 3h) + - Drop unused Persist classes + - Dynamically adjust expire time to control memory use + - Increase reorganize time to 45s (was 30s) to reduce CPU use + and lock contention + - Remove some stat rates + - Delay start of PeerTestJob + * Stats: Increase coalesce time to 50s (was 20s) to reduce CPU use + * summarynoframe.jsp: Cleanup + * Transports: Reduce the number of Rates + +2009-07-16 zzz + * HTTP Proxy: Themes for error pages + +2009-07-16 sponge + * ministreaming: + - small pedantic fix + * streaming: + - Fix a deadly race condition. + - Some small pedantic fixes. + * core: + - Fix a deadly race condition. + * BOB: + - Fixed some races that occured from fixing races in streaming and core. + - Some badly needed code refactoring to depend less on the database. + +2009-07-15 zzz + * Console: + - Make light the default theme + - Convert readme_zh.html from GB2312 to UTF-8 + * Installer: Don't launch the router from the postinstall.sh script + on linux anymore; add a panel to the installer to provide launch instructions. + +2009-07-15 sponge + * Slackware SlackBuild fixes. + +2009-07-14 dr|z3d + * Increment to 0.7.5-10 + * Tidy up layout of readme.* files. + * Work on console css to make it more Opera/webkit friendly. + * Other cosmetic tweaks. + +2009-07-13 zzz + * Build: Add readme*.html files to the udpater + * Build Handler: Don't reject for conn limits if class O, + under the assumption that they are already talking + to most of the routers, so there's no reason to reject. This may drive them + to their conn. limits, but it's hopefully a temporary solution to the + tunnel build congestion. As the net grows this will have to be revisited. + * Throttle: Increase default max tunnels to 3000, + to give us more capacity during congestion + * Tunnels: Change the default variance from 1 to 0. + Under the one-packet-enough theory, and the fact that most + tunnels in a x+1 pool are of length x, variable lengths + don't really help that much. Also, a default of 1 led + to all sorts of problems with iMule/SAM, who was not + setting the variance properties. + This will affect exploratory tunnels for new users, + and those that have never saved a change on configtunnels.jsp, + and iMule users 1.4.5 and earlier. + +2009-07-12 zzz + * Add configui.jsp + * orange flash remove take 2 + +2009-07-11 zzz + * netdb.jsp: Fix bad tag causing orange mouseovers + +2009-07-11 dr|z3d + * More enhancements to the router console, consolidation of the + light and dark themes. + - Apply new themes with routerconsole.theme=light/dark/classic + added to advanced config. + +2009-07-11 zzz + * Build Handler: Drop rather than reject requests when near + conn limits and the next hop is not connected, to reduce + connection congestion + * Console: Force IE to the classic theme + * I2PSnark: + - Bring back details links for Postman2 B64 torrents + * I2PTunnel: + - Make reduce-on-idle the default for all the shared clients + for new installs (15m) + * Profile Organizer: + - Allow NTCP-only peers in inbound tunnels + * Transports: + - Move from a single connection limit threshold (80%) to + two (75% and 87%), and only start rejecting tunnels + at the higher threshold, to increase build success + - Move some limit methods from the transports to TransportImpl + - Add limit methods with a threshold argument + - Increase default SSU conn limits a little more + +2009-07-07 dr|z3d + * Introducing 2 new console themes (light & dark), in addition + to changes to the console navigation; navbar now resides in + the sidepanel and other stuff besides. More to follow! + +2009-07-06 zzz + * Console: Fix small textareas on Opera + * EepGet: Don't send X-Accept-Encoding for non-proxied fetches + * HTTP Proxy: Limit proxy.i2p to /themes/ directory + * I2PSnark: + - Change postman2 announce URL to use hostname rather than B64 + - Shorten torrent name to fit better on one line + * I2PTunnel: + - Add edit text + - Fix broken favicon + * Move almost all uses of StringBuffer to StringBuilder, + for efficiency (thanks Arsene for the suggestion) + * Reseed: + - Fix console status messages broken by global replace + - Remove tino, add b.netdb.i2p2.de + * SSUDemo: Move to the router/java/test directory + * Startup: Log clients.config problems + * Transport: Implement NTCP auto-transition from an + address to no address, so that inbound NTCP is disabled + after SSU detects a firewall. When UPnP was apparently successful + but the router is still firewalled (due to an additional + software firewall or a bad UPnP indication, for example) + the router will now remove the NTCP address. + +2009-07-05 sponge + * Added X-I2P-DestB64 and X-I2P-DestB32 http headers + +2009-06-29 zzz + * Big directory rework: + Eliminate all uses of the current working directory, and + set up multiple directories specified by absolute paths for various uses. + + Add a WorkingDir class to create a user config directory and + migrate certain files to it for new installs. + The directory will be $HOME/.i2p on linux and %APPDATA%\I2P on Windows, + or as specified in the system property -Di2p.dir.config=/path/to/i2pdir + All files except for the base install and temp files will be + in the config directory by default. + Temp files will be in a i2p-xxxxx subdirectory of the system temp directory + specified by the system property java.io.tmpdir. + + Convert all file opens in the code to be relative to a specific directory, + as specified in the context. Code and applications should never open + files relative to the current working directory (e.g. new File("foo")). + All files should be accessed in the appropriate context directory, + e.g. new File(_context.getAppDir(), "foo"). + + The router.config file location may be specified as a system property on the + java command line with -Drouter.configLocation=/path/to/router.config + All directories may be specified as properties in the router.config file. + + There will be no migration from an existing installation + unless the system property -Di2p.dir.migrate=true is set. + If there is no migration, it will continue to use $I2P for all files, + except for temporary and PID files. + + The following linux scripts are now customized with the install path at, + installation, and may be moved to /usr/local/bin and run from any + working directory: + eepget, i2prouter, runplain.sh + + For new installs, the i2p base directory ($I2P) may be read-only + if updates are disabled. The only time i2p should write to the base directory + is to unzip the update file. Updates are downloaded to the config dir. If, upon + restart, the base dir is not writable, it will log a message and continue. + + Additional information, copied from I2PAppContext: + + # Directories. These are all set at instantiation and will not be changed by + # subsequent property changes. + # All properties, if set, should be absolute paths. + # + # Name Property Method Files + # ----- -------- ----- ----- + # Base i2p.dir.base getBaseDir() lib/, webapps/, docs/, geoip/, licenses/, ... + # Temp i2p.dir.temp getTempDir() Temporary files + # PID i2p.dir.pid getPIDDir() router.ping + # Config i2p.dir.config getConfigDir() *.config, hosts.txt, addressbook/, ... + # + # (the following all default to the same as Config) + # + # Router i2p.dir.router getRouterDir() netDb/, peerProfiles/, router.*, keyBackup/, ... + # Log i2p.dir.log getLogDir() logs/ + # App i2p.dir.app getAppDir() eepsite/, ... + + * Note that the router can't control where the wrapper actually puts its files. + + All these will be set appropriately in a Router Context. + In an I2P App Context, all except Temp and PID will be the current working directory. + + Related changes: + i2prouter: + - Don't cd to script location, no longer required + jbigi, cpuid: + - Extract files from jar to temp dir, load from that dir, then + copy to the base dir if we have permissions (and failing silently + if we don't), so we have optimized libs and no complaints + when we have a read-only base dir. + logs.jsp: + - Get wrapper log location from a property too + - Display log file locations + RouterLaunch: + - If no wrapper, put wrapper.log in system temp dir + unless specified with -Dwrapper.logfile=/path/to/wrapper.log + or it already exists in CWD (for backward compatibility) + - Append rather than replace wrapper.log + - Pass wrapper log location to router as a property, so that logs.jsp can find it + runplain.sh: + - Add path substitution to runplain.sh on install + - Pass I2P base dir to the router as a property + Systray: + - Fix NPE if no config file + wrapper.config: + - Put wrapper.log in system temp dir for new installs + - Pass I2P base dir to the router as a property + +2009-06-29 zzz + * HTTP Proxy: + - Add simple web server for "proxy.i2p" to serve + images and CSS for the error pages + - Take CSS out of the error pages; use internal server + for CSS, image, and favicon + * i2psnark build: + - Move FetchAndAdd to static inner class + - Fix standalone build to include i2psnark.jar since classes + aren't in the .war anymore + - Have standalone jetty use I2PAppContext temp directory + - Replace launch-i2psnark.jar with launch-i2psnark script, + since RunStandalone is in i2p.jar + - Clean up jetty-i2psnark.xml, turn off jetty logging + - Remove standalone build from the pkg target in the main build.xml + * Jbigi, CPUID: + - Reduce memory demand on startup from 4MB to 4KB each + * NetDb: Fix an NPE on early shutdown + * Reseeding / NetDb: + - Move reseeding from the routerconsole app to + the router, so that we can bootstrap an embedded router lacking a routerconsole + (iMule or android for example), without additional modifications. + This allows better integration between the reseeding function + and the netDb. + - Call reseed from PersistentDataStore, not from the + routerconsole init, and start seeding as soon as the netdb has read + the netDb/ directory, not when the console starts. + - Wake up the netdb reader as soon as reseeding is done, + rather than waiting up to 60s. + - Don't display the reseed button on the console until the + netdb initialization is done. + * RouterConsoleRunner: + - Catch a class not found error better + +2009-06-29 zzz + * Console: Convert table headers to
      to prep for CSS changes + * Console CSS: Move css file, make a classic theme to prep for CSS changes + * Console: Move favicon.ico and i2plogo.png out of the .war + so that the HTTP proxy can use them directly; + proxy error pages must be updated next + * NetDb stats: Normalize tunnel build stats for increased anonymity, + effective in 0.7.6 + +2009-06-30 sponge + * General cleanup on streaming and ministreaming. + This fixes some compile warnings, and prepares for a larger fix. + There is no code-flow changes, just lint. One warning remains as I am + unsure exactly how to solve the problem yet. + +* 2009-06-29 0.7.5 released + +2009-06-29 Complication + * Update versions, package release + * Remove the last reference to my eepsite as a "news.xml" source, + and likewise stop my public key from being included + among valid release signing keys. + +2009-06-25 sponge + * Summary frame layout change so it makes sense. + +2009-06-23 zzz + * Browser Launch: Add sensible-browser, x-www-browser, defaultbrowser, and + www-browser in an attempt to launch the user's preferred browser + * configupdate.jsp: Cleanup + * Installer: Include console.css!!! + * NTCP: Try again to prevent two Event Pumpers + * Update: Increase max retries + * UPnP: Catch AIOOBE reported by tuna + +2009-06-21 zzz + * Browser Launch: Wait until the routerconsole is up before launching the browser + * Installer: Fix wrapper.config parsing on windows + * netdb.jsp: Add country chart at bottom, clean up version chart + * News Fetcher: + - Change default news URL, use it instead of the old one even if + the old one is saved in the configuration, to assist in the transition + * ReseedHandler: + - check for upper case HREF to be compatible with apache indexes + * Statistics Manager: post-0.7.4 cleanup + * Transport: Treat 5.0.0.0/8 (Hamachi) as local + +2009-06-17 Mathiasdm + * desktopgui: + - Added client and server tunnel view + (saving does not work yet) + +2009-06-17 zzz + * PeerSelector: + - Limit exploratory tunnels to connected peers when over + half the connection limit (was 80%) + - Have the high capacity tier fall back to a new connected tier + before moving on to the not failing tier + so that tunnel build success doesn't collapse and drive + connections to the limit + * PeerTestJob: + - Limit to connected peers + +2009-06-12 zzz + * Console: + - Move the console css from default.css in the .war to docs/themes/console/console.css, + and support console themes in the main console with routerconsole.theme=foo + - Remove unused NoticeHelper + + * Installer: + Upgrade to izpack 4.3.0 and add a short script to fix Vista install problems. + (previous izpack was 3.7.2 from 2005-04-22) + + izpack 4.3.0 from : + http://dist.codehaus.org/izpack/releases/4.3.0/IzPack-install-4.3.0.jar + SHA1 f06da6b26ac2c68fed64ab38980352989b8d8841 + (no signatures or sha1sums found on website, and the jar is unsigned) + License: Apache 2.0 + + upack izpack: + java -jar IzPack-install-4.3.0.jar + or + java -jar IzPack-install-4.3.0.jar -console + + get the standalone-compiler.jar from the installation lib/ directory: + SHA1 6d2b4a5657bfb864a333b1c4b1c0f8223aa57d80 + (no signatures or sha1sums found on website, and the jar is unsigned) + + This fixes the bug with the install windows centered in all the + workspaces, not the current workspace. And who knows what other + bugs in the last 4 years. + + To fix Vista (and presumably Windows 7) permissiom problems, + add a run-privileged flag for those, and run the new fixperms.bat + which calls icacls to add the privileges to the install directory. + + Add support for 6 more language packs found in the new release. + Change from ISO3 codes to native language names. + + Disable creation of the i2p.tar.bz2 file in build.xml + (distributed as i2pheadless-0.7.x.tar.bz2), as izpack 4.3.0 now + supports headless installation with java -jar i2pinstall.exe -console. + Update INSTALL.txt and INSTALL-headless.txt accordingly. + + - Add install and temp path substitution to wrapper.config and + i2prouter on install + + - Change the wrapper.config classpath to one line: lib/*.jar + This means we lose control of classpath load order, so move the windows installer + jars copy.jar, delete.jar, and exec.jar to a new installer/ directory so + these jars won't be in the classpath or potentially conflict, since + copy.jar and delete.jar include FileUtil.class, and we don't want to have + to remember to add them to the updater if we ever change FileUtil.class. + Delete the installer/ directory in postinstall.sh since it is windows-only. + + * Watchdog: Only try to dump threads if there is a wrapper + and we aren't on windows + +* 2009-06-12 0.7.4 released + +2009-06-12 Complication + * Update versions, package release + +2009-06-09 zzz + * NTCP: Fix startup race NPE (thanks postman!) + +2009-06-08 sponge + * Last commit for this cycle. All debugging except for WARN removed. + I can use the visit command to debug now anyway. + +2009-06-08 sponge + * Removed BOB debugging as-per zzz + +2009-06-08 sponge + * Fixed NPE and some other goofups in BOB. + * BOB bump version + +2009-06-07 zzz + * Build file: + - Add updaterWithJettyFixesAndGeoIP, use it in pkg for one release + - Cleanups + * Console: + - netdb.jsp cleanup + - tunnels.jsp cleanup + * ExploratoryPeerSelector: + - Limit to connected peers when near connection limit + * Timestamper: + - Use locale country if geoip unavailable + * Transport: + - Lower min NTCP idle time to 3m (was 5m) + - Increase SSU conn limit by 33% + * UPnP: Fix deprecation warning + * Watchdog: + - Defang him again + +2009-06-06 sponge + * Added BOB's license to licenses + * Janitorial javadoc fixes *sigh* + * bump to -13 + +2009-06-05 sponge + * Merge and bump to -12 + +2009-06-05 sponge + * BOB now cleans up tunnels, although they can take up to 5 minutes to + disapear. This is due to the fact that the streaming lib doesn't + actually remove the connections properly and kill them off when the + manager is destroyed. I'm not certain if this is a bug, or a feature, + but it sure is annoying, and you have to wait for the connections to + time out. What should happen is the streaming lib should cause an IO + error to the pending read or write. + +2009-06-05 zzz + * Build file: + - Add license info for launch4j includes + * Console: + - 16x11 transparent flags for ch and np, thanks anonim! + +2009-06-04 zzz + * Console: + - Update geoip file to June 3 version + - Hide some controls if no wrapper on configservice.jsp + * I2PTunnel: + - Fix bug where delayed-open and close-on-idle tunnels would + use a different tunnel pool instead of building their own + - Add standby indication to web page + * NetDb: + - Try to talk directly to a floodfill if we don't know enough, + to help integrate more quickly + - Change a no-floodfill error to a warn + * NetDb Stats: + - Average TX and RX bw stats for additional anonymity, + effective in next release + * Reseed: + - Limit to 200 pulled randomly from the full fetched list + * Transport: + - Increase default bw for new installs to 96/40 + (was 64/32). This is as high as we can go upstream + without making the default class M. + * Watchdog: + - Allow disabling by property again + - Logging tweaks + +2009-05-30 zzz + * Console: + - config.jsp now cause graceful restart + - More peers.jsp and profiles.jsp cleanup + - tunnels.jsp improvements + - Use CSS for form messages + - Goodbye nonce spoof messages (sorry jr) + - config.jsp: Comment out unused burst config code + - Don't forget Serbia! + - configadvanced.jsp cleanup + * LoadTestManager: Delete, unused + * Peer Selector: Make strict order opaque to hash value + * SendGarlicMessageJob: Delete, unused + * Session Keys: + - Don't instantiate unused SessionKeyPersistenceHelper + - Use TransientSessionKeyManager instead of PersistentSessionKeyManager + - Add generics to TransientSessionKeyManager to help understand it + - Change initial session map size to 64 (was 1024) + - Prepare for per-destination SessionKeyManagers in ElGamalAESEngine + - More stubs for per-destination managers in the client manager + * Transports: + - Adjust bids when near conn capacity + * UDP: + - Remove unused stats and test code + - Only save IP when it changes + * UPnP: + - Prevent NPE after ParserException + - Tweak to help startup problems? + - Retry port forward if it fails + - Make peers.jsp display faster + - Lengthen POST timeout + - More comments + +2009-05-29 sponge + * added big fat start/stop lock into BOB + * added zap command to shut down BOB... now we need a way to start it + after it stops. :-) + +2009-05-27 Mathiasdm + * Increase sendProcessingTime some more, add a property to configure. + Configure with 'router.defaultProcessingTimeThrottle'. + +2009-05-27 Mathiasdm + * Increased sendProcessingTime limits and added testSuccessTime + to avoid unwanted throttling + +2009-05-26 Mathiasdm + * Throttling extension by looking at sendProcessingTime + +2009-05-26 zzz + * Console: + - configlogging.jsp cleanup + - Flags tweak + * NetDb: + - Don't send our own hash in the don't-include list when exploring + - Remove any pending write when removing a RouterInfo + - Cleanup to use routerHash() + * Streaming: Hopefuly fix infinite loop in the SYN queue handler + +2009-05-25 zzz + * GeoIP: + - Save our own location in the config + - Check whole netDb at startup (last try didn't work) + * NTCP: + - Increase routerinfo send frequency to every 90m (was 9h) + - Don't send 3 floodfill infos at startup or with routerinfo + * Profile Organizer: Increase min fast peers based on + number of local destinations + * Timestamper: + - Use GeoIP to query a closer ntp source if available + - Lengthen query time if well-synced + - Cleanup + +2009-05-24 mkvore + * SAM: logging some exceptions at INFO level instead of ERROR + +2009-05-24 zzz + * Connection limits / throttle: + - Better limits when no inbound TCP + (limit inbound and outbound separately) + - Don't offer to SSU introduce when near connection limit + * Console: + - Move flags from icons/ to docs/icons + - peers.jsp cleanup + - Add readme_zh.html + * GeoIP: + - Check netDb SSU IP too + - Check whole netDb at startup + * NTCP: Log who is sending us big messages + * UPnP: Move logging from wrapper log to router log + +2009-05-23 Mathiasdm + * Router netDB: + - Added flags to the netDB page + +2009-05-22 Mathiasdm + * desktopgui: + - Updating works in general config + - Switched to Swingworker threads for improved responsiveness + +2009-05-21 zzz + * Router Watchdog: + - Log memory stats + - Dump threads on linux + - Restart after 20 minutes (give the dog his teeth back) + +2009-05-21 zzz + * DataStore: + - Adjust interface to have persistent and non-persistent methods, + to prepare for partial storage in RAM + * ExpireRoutersJob: + - Rewrite, not enabled yet + * I2Punnel: + - Increase eepsite default to 3+0 for new installs + * PersistentDataStore: + - Cleanup, simplify, and concurrentify + - Tweak stats + - Remove write limit + - Flush to disk on shutdown + - Don't write out what we just read in + * Router and console: + - Bundle geoIP files and flags in new installs, + spiff up tunnels.jsp and profiles.jsp. + Existing installs can get files with 'ant updaterWIthGeoIP' + or in the console docs bundle 'ant consoleDocs' + - Use flags for shitlist and peers.jsp too + - Tweak tunnels.jsp to show class letters + - Hide in-progress details on tunnels.jsp + - Add a little color to confignav + - Remove 'no skew' message + - More message tweaks if no wrapper + * TunnelManager: + - Remove now-unused isInUse() + * UPnP: + - Fix up port binding, add some logging on bind fails + - Force IPv4 only for binds + +2009-05-20 Mathiasdm + * General configuration enabled by default + * General configuration speed tab works completely + +2009-05-17 zzz + * Merge i2p.i2p.zzz.upnp branch + * Major changes: + - Detect IP with UPnP + - Open firewall ports with UPnP + - Detect IP by checking local interface addresses + - Enable TCP auto-IP and auto-port by default, if UDP status is "OK" + - Network configuration page rework + * Other stuff: + - Remove unused verifyupdate.jsp + * Details of the UPnP and related Transport changes: + - Add UDP Port configuration to config.jsp + - Don't restart router when configs change on config.jsp; + simply rebuild router info. + - Clean up some port config code in UDP + - Implement UPnP enable/disable + - Start to rework inbound configuration + - Tweak UPnP warning messages + - Start of callbacks from UPnP to transports + - Tell UDP local addresses at startup + - NTCP Port must now be either auto or configured; + now defaults to auto; and configured now trumps auto. + Port configuration now does not affect whether inbound + NTCP is enabled - the host configuration alone can do that. + - i2np.ntcp.autoip=true redefined to enable inbound only if + SSU reachability is OK. i2np.ntcp.autoip=always for the old behavior. + autoip default is now "true". + i2np.ntcp.hostname=xxx now trumps i2np.tcp.autoip. + - SSU always tells NTCP when status changes. + - Implement config save of new IP address options + - Implement local address and UPnP configuration of UDP address + - Limit received port to 1024 minimum + - Simplify bw form + - Add config link to UPnP status + - Make short timeouts for UPnP HTTP POST so we don't hang when + the UPnP device goes away + - Fix a bug in UPnP HTTP Server timeout + - Make short timeouts for the XML parser so we don't hang when + the UPnP device goes away - same as for HTTP POST + - Stuff the port mapping requester into a thread so it doesn't + delay everything for several seconds + - Handle UPnP devices that return IP = 0.0.0.0 + - Better HTML output when no IP found + - Tweak logging + - Set Disposer thread name + - Keep the control point running after we find an IGD, + so that we get notifications of it leaving or + coming back or replaced. + - Detect UPnP start failure + - Sort local addresses + - Store last IP for future laptop mode + - Subscribe to service, doesn't seem to do anything though, + need to test it more + - Change UPnP listener port defaults, allow configuration option + - Don't notify for non-changed options on config.jsp + - Simplify config.jsp some more + - No longer use i2np.udp.forceIntroducers + - Tweak UDP port qualification + - Fix allowing low ports again + - Add option to completely disable NTCP, for those behind nasty firewalls + - Use SSU reachability rather than global reachability for determining NTCP reachability, + since we are now reporting NTCP reachability too + - Tweak the config sub-navbar + - Don't start UPnP if we have a public interface address + - Fix setting IP to a local interface address + - Work on the configuration help some more + - Rework UDP peers.jsp table a little + - Don't let UDP bid on messages that are too long + - Clean up the max fragments code in UDP + +2009-05-17 zzz + * Build files: + - Remove unneeded ant.jar from package (900KB) + - Fail on Jsp compile errors + * FloodfillVerifyJob: Don't consider an older search result as verified + * logs.jsp: Add link to config + * NetDb: Lower the routerinfo expiration again + * SusiDNS: + - Reduce displayed entries from 300 to 100 + - Add ability to go forward or back + - Make textareas bigger + - Clean up file names + - Clarify messages about filter and search + +* 2009-05-16 0.7.3 released + +2009-05-16 Complication + * Update versions, package release + +2009-05-12 sponge + * BOB clean up, change println's to _log.warn, bump BOB version + * I2PSessionMuxedImpl.java changes as per zzz, and they test OK for me. + +2009-05-12 mkvore + * SAM: fix: warnings when generating javadoc + +2009-05-11 zzz + * Connect client: Fix NPE when used with advanced i2ptunnel features + * Context: Don't instantiate unused AdminManager + * logs.jsp: Put critical log at the top + * NetDb: Don't accept stores of our own LeaseSets or RouterInfo + +2009-05-11 mkvore + * SAM: fix: removed ERROR level logging when a client disconnects + +2009-05-09 sponge + * merge + +2009-05-09 sponge + * fixed OOM on lock (woops! my bad!) + +2009-05-08 Mathiasdm + * desktopgui: moved files to stop polluting the namespace + (everything now in net.i2p.desktopgui) + * desktopgui: some variable renaming in general configuration + +2009-05-07 mkvore + * SAM: version 3 added + * SAM: blocking case corrected on simultaneous client connection (v.1-3) + +2009-05-07 zzz + * Add nibble.i2p to proxy list and hosts.txt + +2009-05-07 zzz + * Addressbook: Name the thread + * Console: + - More IE button fixes, try harder to not refresh the iframe after shutdown + - Disable idle options for streamr client, it will never be + idle because it pings the server + * Floodfill Monitor: Slow down the volunteers + * Throttle: Throttle at 90% so we throttle before we WRED + +2009-05-06 Mathiasdm + * Improvements to popup menu rightclick action + * Added general configuration options (still not available by default) + * General fixes + * Added ant build options (irc says eche|on would like that ;)) + +2009-05-06 sponge + * Hopefully the last fixes for BOB. + * Fixes to prevent race in client-side I2CP and Notifier. + +2009-05-03 sponge + * More hopeful fixes for BOB. + * Added new Robert ID to snark + +2009-05-01 zzz + * Build files: + - Fix up susidns build file so it will work with gcj + - Add consoleDocs target + * Client: Fix race NPE (thanks sponge) + * Console: fix ERR-UDP Disabled and Inbound TCP host/port not set + * I2CP: Fix race NPE + * I2PTunnel: + - Try to fix locking to prevent duplicate destinations when using + the new option new-dest-on-resume. Still not right for shared clients + but should be better for non-shared. + * Router console: + - Add jbigi and cpu info to logs.jsp + * Session key manager: + - Log before a hang maybe + * URL Launcher: + - Launcher on linux was stopping after trying opera, whether it succeeded or failed. + Now it keeps going to try firefox, etc. as designed. + - Extend default delay from 5s to 15s so it will reliably start + +2009-04-27 sponge + * more BOB fixes, complete with warnings when things go wrong, and + success messages when things turn around and go right. Terminates + early so that applications wait no more than 10 seconds or so. + * Reversed a few earlier patches that caused some odd behavior. + * Changed some core println()'s to debugging messages. + +2009-04-27 zzz + * Build files: + - New updaterWithJettyFixes target, build it for pkg + - Pass compiler args down from top build.xml + * GarlicMessageBuilder: Reduce bundled tags to 40 (was 100) + * i2psnark: Add Postman2 tracker + * I2PTunnel: Allow spaces in dest and proxy lists + * NetDb: + - Adjust RouterInfo expiration down to control memory usage + - Display LeaseSets and RouterInfos on separate console pages + * NTCP: + - Correct the meanings of the i2np.ntcp.autoip and i2np.ntcp.autoport + advanced config. If you have one of these set but not the other, you + will have to adjust your configuration on config.jsp. + * RouterConsole: iframe tweaks + * StatisticsManager: Cleanup + * Streaming: Don't let jrandom yell so loud + * Tunnel Pool: Don't self-destruct if more than 6 IB tunnels configured + +2009-04-25 sponge + * I2PSessionMuxedImpl atomic fixes + * BOB fixes. This should be the final bug wack. Good Luck to everybody! + +2009-04-23 zzz + * Blocklist: cleanup + * eepget: handle -h, --help, bad options, etc. + (http://forum.i2p/viewtopic.php?p=16261#16261) + * Fragmenter: don't re-throw the corrupt fragment IllegalStateException, + to limit the damage - root cause still not found + * i2psnark: (http://forum.i2p/viewtopic.php?t=3317) + - Change file limit to 512 (was 256) + - Change size limit to 10GB (was 5GB) + - Change request size to 16KB (was 32KB) + - Change pipeline to 5 (was 3) + * logs.jsp: Move version info to the top + * Jetty: Fix temp dir name handling on windows, which was + causing susidns not to start + (http://forum.i2p/viewtopic.php?t=3364) + * NTCP: Prevent IllegalStateException + * PeerProfile: + - Replace a hot lock with concurrent RW lock + - Rewrite ugly IP Restriction code + - Also use transport IP in restriction code + * RouterConsole: Make summary bar a refreshing iframe + * Transport: Start the previously unused CleanupUnreachable + +2009-04-21 sponge + * Code janitor work, basic corrections involving @Override, and + appling final where it is important. Also fixed some equals methods + and commented places that need fixing. + +2009-04-18 Complication + * Fix typo in "news.xml", no build number increase. + +* 2009-04-18 0.7.2 released + +2009-04-18 Complication + * Update versions, package release + +2009-04-17 sponge + * fixed setIP, just be sure to distclean before building :-) + * more lint taken care of as well. + +2009-04-17 sponge + * setIP wants to be a static method in the class, but it produces + warnings about it being static from other code. + +2009-04-17 sponge + * Catch NPE in NTCP. + This possibly augments fix 2009-04-11 welterde below. + * Various LINT on NTCP sources, and removal of space-wasting + spaces at end of lines in sources touched. + +2009-04-13 Mathiasdm + * Bugfix on tray icon updating + * Some more work on the general configuration menu + (currently not added to the tray icon menu yet, needs more work) + * Tweaked the desktopgui logo + +2009-04-13 Mathiasdm + * Added I2P version and GUI version to desktopgui + * Tweaks to the tray icon menu + * Some starting work on a GUI general configuration menu + * Bugfix allowing spaces in directory structure + +2009-04-13 welterde + * small fix in the eepproxy + +2009-04-11 welterde + * fixed NPE in NTCP transport + +2009-04-11 sponge + * i2ptunnel janitorial work and fixes on most locks. + Some locks still need work, and are marked with LINT in the comment. + Just grep for "LINT" to see where the remaining places are. + +2009-04-10 sponge + * More BOB threadgroup fixes, plus debug dump when things go wrong. + * Fixes to streaminglib, I2CP, which are related to the TG problem. + * JavaDocs fixups. + +2009-04-08 sponge + * More hopeful fixups to the infamous orpahned tunnel problem. *Sigh* + +2009-04-08 zzz + * IPV6/localhost: + - Enable IPv6 stack in the JVM, hopefully won't break anything + - Patch Jetty to support binding to IPv6 addresses + - Allow multiple bind addresses for the router console + in the clients.config file; for new installs the + default is now "127.0.0.1,::1" + - Change most instances of "localhost" to "127.0.0.1" + throughout the code + * Router: + - Move some classes to private static inner + +2009-04-07 sponge + * BOB prevent jvac from optimizing out thread-group code from -10 + +2009-04-07 zzz + * NTCP: Prevent occasional NPE introduced in -4 + * streamr: Synchronize DatagramMaker + +2009-04-07 sponge + * SimpleTimer2, SimpleScheduler fixed so that the threads all run from + The main threadgroup, not in the current possible child threadgroup. + So long as any SimpleTimer2/SimpleScheduler is started *BEFORE* any + child threadgroups, the constructors are threadgroup safe. What would + be super cool is if they were to be all jailed within thier very own + threadgroup too, but, I2P isn't up to the task of this yet. + * Fixes to BOB to ensure the above is true. + +2009-04-06 sponge + * Debugging to make SimpleTimer2 and SimpleScheduler easier to debug. + * Fix for the config files in the GUI from mathiasdm + +2009-04-04 sponge + * Hopeful fixups to the infamous orpahned tunnel problem. + * BOB now 0.0.5 + +2009-04-04 zzz + * NTCP: Don't bid on messages too big to handle + +2009-04-03 zzz + * Console: + - Fix bug with IE buttons not working, + because it sends the label instead of the value + - Display version of downloaded update + * Update: + - Change default to "Download and verify" + - Change news fetch default to 24h (was 12h) + +2009-04-03 sponge + * Fix broken dependencies for BOB.jar + * Router build version incremented to 5. + +2009-04-02 zzz + * Profiles: + - Remove unused calculators and RateStats: + CapacityCalculator, StrictSpeedCalculator, IsFailingCalculator; + sendFailureSize, processSuccessRate, processfailureRate, commErrorRate, + tunnelTestResponseTimeSlow + - Reduced number of Rates in these RateStats: + sendSuccessSize, receiveSize, rejectRate, failRate + - ~5KB/profile savings total + - Deflate speed calculation once an hour instead of once a day, + to improve fast tier selection + - Remove dup comment in persisted files + * StatisticsManager - effective in 0.7.2: + - Spoof uptime to 90m for all + - Change tunnel stats from 10m to 60m + * Transport: + - Maintain a router hash -> IP map in transport, + to support additional IP checks (unused for now) + - Catch error on pre-2.6 kernels + - Some concurrent conversion + - Fix an HTML error on peers.jsp + +2009-04-01 zzz + * I2PTunnel: Fix tunnel close + http://forum.i2p/viewtopic.php?t=3231 + +2009-03-30 zzz + * I2CP: + - Implement BandwidthLimitsMessage + - Have i2psnark use new message, remove + build dependency on router + * Peer Selection: + - Limit peers to a max % of all tunnels with + router.maxTunnelPercentage=nn, default 33 + - Add chart to tunnels.jsp to see results + +* 2009-03-29 0.7.1 released + +2009-03-29 Complication + * Update versions, package release + +2009-03-27 zzz + * Add readme_fr.html + * License splash update + * Catch rare TunnelGatewayMessage AIOOB, root cause unknown + +2009-03-24 zzz + * I2PTunnel: + - Add some warnings about new features + - Fix encrypted leasesets broken in about -4 + - Suppress log error on manual stop + - Fix NPE on close of a tunnel not open yet + * Transport: + - Increase default bw to 64/32, burst 80/40 + * Tunnels: Change some fragmentation errors to warns + +2009-03-16 zzz + * help.jsp: Add some + * I2PTunnel: Cleanup + * I2PTunnelHTTPClient: Fix NPE on delayed open + * I2PTunnelHTTPServer: Maybe catch an NPE + * SOCKS: Allow .onion addresses for onioncat testing + * Tunnel: Catch a rare AIOOB + +2009-03-09 zzz + * Client: + - Clean up retry code + - Bring I2CP listen error to the summary bar + http://forum.i2p/viewtopic.php?t=3133 + * I2PSnark: Remove the http from the add torrent box + * I2PTunnel: + - Add persistent key option for standard and IRC clients + - Add delay-open option for clients + - Get regenerate-dest-on-reconnect working + - Add default key file name + - Add link to addressbook + - I2PSink: Send protocol byte + * OCMOSJ: + - Change from 5% reply requests to at least + once per minute, in hopes of reducing IRC drops + - More clean up of the cache cleaning + * Routerconsole: Don't OOM configpeer.jsp on huge blocklists + +2009-02-26 zzz + * I2CP Client: Add support for muxing + * I2PTunnel: + - Add new IRCServer tunnel type + - Add SOCKS 4/4a support + - Catch OOMs in HTTPServer + - Name the IRCClient filter threads + - Port Streamr to I2PTunnel + - The beginnings of SOCKS UDP support + * Naming: Add reverse lookup by hash + * OCMOSJ: Clean up the cache cleaning + * Router: Move addShutdownTask from Router to I2PAppContext + so that apps can register more easily + * Routerconsole: + - Thread hard shutdown and restart requests from the routerconsole, + and add a delay even if no tunnels, to allow time for a UI response + - Sort the summary bar destinations + - Move dest-to-hash converter to new helper class so we can + use it in i2ptunnel + +2009-02-22 sponge + * BOB: Orphan tunnel issue fix, bump BOB version + * bump to Build 6 + 2009-02-16 zzz * Streaming lib: Plug timer leak, don't send keepalives after close, don't disconnect hard after close diff --git a/hosts.txt b/hosts.txt index 95ca28af6..731c9e1a5 100644 --- a/hosts.txt +++ b/hosts.txt @@ -313,3 +313,7 @@ tracker.mastertracker.i2p=VzXD~stRKbL3MOmeTn1iaCQ0CFyTmuFHiKYyo0Rd~dFPZFCYH-22rT codevoid.i2p=tV-4GJjgYIoCDTTJ91nfDbhSnT8B2o3v-TUfHtiAAjJJdroCAEDbmJWFPUQJEEispvrjNe~fP7VAYkk9fAhSrmdBLtEGB3NUESdiZEPsDtKJBdxijPGb1erZF2Z6eYHoK-t5g7MWWTsgLz~4xn211Jpfa-T4pqL2tcjsa7ixsaMpHF8NXFrITdyxSJRPz8OnHYgDR~ULFyzroi255MpiSUBzGcUZEiQSFLHLhjT5D5tP~gfJirFnfgOHvzWBK9L7y91qY~gYvM2eDcxMxq4Ac1gw0JeahkzAk3j6Spco3LHW3bJvELopf1QmLFu3nfPaegH1Hejt9AhXEH~FV-~M9F1BePipcIYlm7nKyre3aVPLYDZSCvkUx~8nnD3HEpMijD8fdfqSFPU7aZQe19a7rZJUbX~a4M3rBDO-C4uAid6Uznb1tLu2XR1GVVITGHaLwmumImXjlU~1nEnluBQB6iBQPZ9xJccArlYgWSooR9gpyN93PwTPsPe5cPkxCFuxAAAA echelon.i2p=w6zK9m4fqSfvJck9EGIR1wRIbWsEQ2DkjZ-VI57ESFqLqbTIA1cD5nOfSSbpELqPyhjifdrNiBNAsSdyil3C0a2B7CGtwUcTS2dCG0tKf2nAbvpsbcCK17nI4Xbu5KqZU0y3hJ~l7rcJqQBR0nfV5cU30ZDrpQV6VL875cihGlnmwLFq6qSzNcEb88Nw6wFG~FIgB2PJ6A3jJyuTnLrdiMvwqgD6nSyeOylOgBCsNxXh8-drrhASjladfNrwjlGRCZTiQ~H92HIyOwiabDiG3TUugMaFWs87yuXnZ~ni9jgjoAMFo8xV8Od2BiRgCxkZoMU07FhgUjew9qtXNa04wkexf3gx77nVPhqE0GHqCuwHwmBVf92RdYEys76u~akaOMq5UhayDpCBCaHiYLkKDNqmh47tfMCwxf6z8VIcR4zv25QfJDIWPs~RA~9U7m4raytiAs5PvYZBn4B3SqOL8XdkL9sDT54sQXbsYCJr3olu6ieMtNWlmos0uohYXNUyAAAA crstrack.i2p=b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA +tracker2.postman.i2p=lnQ6yoBTxQuQU8EQ1FlF395ITIQF-HGJxUeFvzETLFnoczNjQvKDbtSB7aHhn853zjVXrJBgwlB9sO57KakBDaJ50lUZgVPhjlI19TgJ-CxyHhHSCeKx5JzURdEW-ucdONMynr-b2zwhsx8VQCJwCEkARvt21YkOyQDaB9IdV8aTAmP~PUJQxRwceaTMn96FcVenwdXqleE16fI8CVFOV18jbJKrhTOYpTtcZKV4l1wNYBDwKgwPx5c0kcrRzFyw5~bjuAKO~GJ5dR7BQsL7AwBoQUS4k1lwoYrG1kOIBeDD3XF8BWb6K3GOOoyjc1umYKpur3G~FxBuqtHAsDRICkEbKUqJ9mPYQlTSujhNxiRIW-oLwMtvayCFci99oX8MvazPS7~97x0Gsm-onEK1Td9nBdmq30OqDxpRtXBimbzkLbR1IKObbg9HvrKs3L-kSyGwTUmHG9rSQSoZEvFMA-S0EXO~o4g21q1oikmxPMhkeVwQ22VHB0-LZJfmLr4SAAAA +nibble.i2p=V2XQ31BQWcwLcBNz2ywb4xy0Q1GMjdziQyjKql-lGdYPOX7w9g3j8IkA1jfW6YYwNi5QZc0JurjrSNH1yx6Y1goI8SB1l-yWdzst73fGWo6B1UtL45XrfXPg5k34RpktCNa4KoeIsUnGnxHQESSj5hw389hvexKXlkAHXQg9eUfbBYyzZc~~Kt4YdYX4cfMpXXjg443kyEiwKisOaRuiEN-YjqZ8pJTyAQsOKNg8hL3e15XFNPfAAkCSsALPAqj0~HZDwCZDeV0Cp4iaCGjw8tsNQ7xBeSjnhOeMoZKtrPAbbK4vNh7OIcakcVu16ykfEf-FcqbPQQe9rjilMy8V-BcjhggjUcZmtWj9qE7RMfUFpbAIfNHgWXTl5yR5V~brqxxuBxHQWn4oyB5NpY02dBkvvxXwdk~XFzXlSz~uEZKVswvI8rUHR4a2N3YDss5iQ~uscvKwNvsTZiDUaN66~CacZLYU9BtDBNnAxClz9LSu5b9CiunKeacbH6l5qrPpAAAA +bob.i2p=5uAI6ENnNP8acDkAtYqBjLa-gFqM~uERNZdJBKtRwUvDkuXvIM66pYfYL3-ugTmoR-SIveDl4u3~soprUO2EYErMzroAmd9pfl0L2vYBWFUQfImkiqFhiGebMzy2zT-~00p5mzHtbg59MCvD1TwsFxU3M0Ftig~ErN0ezFYQ9DKOfOTN-As2QBXZo5vhhzpvrUNuG~MLa2aw7ubImX45EQYqmkmIf5bHCM4skSww24fBrVuMgM3lI6hYjcI65K4-U2t65QOM9RseHW3X4qZ3g8SBzC-4YWWxJH4G0Clp4nA0s9wUqyQHEfUKfJUipjH5OiX46UfNJGU6ccgJnl6zmW6QaW~ppzoHtF7Lp19ZLxrmTglm~GN41NXGkMIj-xSFmF3wz-kwfm-6VhcDaYe8Td1hghGxHPqFJVyC66oSwTB7oP9XO7HuBACr-9O2TmrJbYSw6FCtQkgWctqRffJVB0Ecq7qeCbsMliBe1xLsWVV1dcDnYzzGvNxo3RakoqamAAAA +sponge.i2p=VG4Bd~q1RA3BdoF3z5fSR7p0xe1CTVgDMWVGyFchA9Wm2iXUkIR35G45XE31Uc9~IOt-ktNLL2~TYQZ13Vl8udosngDn8RJG1NtVASH4khsbgkkoFLWd6UuvuOjQKBFKjaEPJgxOzh0kxolRPPNHhFuuAGzNLKvz~LI2MTf0P6nwmRg1lBoRIUpSVocEHY4X306nT2VtY07FixbJcPCU~EeRin24yNoiZop-C3Wi1SGwJJK-NS7mnkNzd8ngDJXDJtR-wLP1vNyyBY6NySgqPiIhENHoVeXd5krlR42HORCxEDb4jhoqlbyJq-PrhTJ5HdH4-~gEq09B~~NIHzy7X02XgmBXhTYRtl6HbLMXs6SI5fq9OFgVp5YZWYUklJjMDI7jOrGrEZGSHhnJK9kT6D3CqVIM0cYEhe4ttmTegbZvC~J6DrRTIAX422qRQJBPsTUnv4iFyuJE-8SodP6ikTjRH21Qx73SxqOvmrOiu7Bsp0lvVDa84aoaYLdiGv87AAAA diff --git a/initialNews.xml b/initialNews.xml index 6a9c4b4ca..1572c2ad4 100644 --- a/initialNews.xml +++ b/initialNews.xml @@ -1,7 +1,6 @@ - - -

      Congratulations on getting I2P installed!

      + + +

      Congratulations on getting I2P installed!

      • Welcome to I2P! @@ -24,10 +23,8 @@ please check out our Point your IRC client to localhost:6668 and say hi to us on #i2p.
      - - - -

      Gratulation zur erfolgreichen Installation von I2P!

      +
      +

      Gratulation zur erfolgreichen Installation von I2P!

      • Willkommen bei I2P! diff --git a/installer/install.xml b/installer/install.xml index 8c7ff1bf4..1988e5e2a 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -4,21 +4,78 @@ i2p - 0.7 + 0.7.6 http://www.i2p2.de/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -28,6 +85,7 @@ + @@ -37,6 +95,9 @@ + + + @@ -44,32 +105,53 @@ Base installation files + + + + + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + diff --git a/installer/lib/izpack/standalone-compiler.jar b/installer/lib/izpack/standalone-compiler.jar index becb95134..4911632cb 100644 Binary files a/installer/lib/izpack/standalone-compiler.jar and b/installer/lib/izpack/standalone-compiler.jar differ diff --git a/installer/lib/launch4j/build.xml b/installer/lib/launch4j/build.xml index 42c77a225..767e7c592 100644 --- a/installer/lib/launch4j/build.xml +++ b/installer/lib/launch4j/build.xml @@ -7,6 +7,7 @@ + @@ -23,6 +24,8 @@ + + diff --git a/installer/resources/ahelper-conflict-header.ht b/installer/resources/ahelper-conflict-header.ht index 3b80e582f..41ae9ac47 100644 --- a/installer/resources/ahelper-conflict-header.ht +++ b/installer/resources/ahelper-conflict-header.ht @@ -4,45 +4,25 @@ Cache-control: no-cache Connection: close Proxy-Connection: close - -Destination key conflict - - - - - -
        -The addresshelper link you followed specifies a different destination key -than a host entry in your host database. -Someone could be trying to impersonate another eepsite, -or people have given two eepsites identical names. -

        -You can resolve the conflict by considering which key you trust, -and either discarding the addresshelper link, -discarding the host entry from your host database, -or naming one of them differently. -

        + +I2P Warning: Destination key conflict + + + + +

        +
        +

        Warning: Destination Key Conflict

        +The addresshelper link you followed specifies a different destination key +than a host entry in your host database. +Someone could be trying to impersonate another eepsite, +or people have given two eepsites identical names. +

        +You can resolve the conflict by considering which key you trust, +and either discarding the addresshelper link, +discarding the host entry from your host database, +or naming one of them differently. +

        diff --git a/installer/resources/blocklist.txt b/installer/resources/blocklist.txt index 8a1614e7f..1eedb0232 100644 --- a/installer/resources/blocklist.txt +++ b/installer/resources/blocklist.txt @@ -10,7 +10,7 @@ # A more reasonable list: http://www.bluetack.co.uk/config/level1.zip # # You may also wish to add the bogons from http://www.cymru.com/Documents/bogon-list.html , -# but you will have top update your blocklist manually as IP ranges are assigned. +# but you will have to update your blocklist manually as IP ranges are assigned. # You must update this list yourself, it is not overwritten by the update process. # # * Acceptable formats (IPV4 only): diff --git a/installer/resources/clients.config b/installer/resources/clients.config index 5245e3bfc..daa698908 100644 --- a/installer/resources/clients.config +++ b/installer/resources/clients.config @@ -1,39 +1,39 @@ # fire up the web console -clientApp.0.args=7657 127.0.0.1 ./webapps/ +clientApp.0.args=7657 ::1,127.0.0.1 ./webapps/ clientApp.0.main=net.i2p.router.web.RouterConsoleRunner -clientApp.0.name=webConsole +clientApp.0.name=Web console clientApp.0.onBoot=true clientApp.0.startOnLoad=true # SAM bridge clientApp.1.main=net.i2p.sam.SAMBridge -clientApp.1.name=SAMBridge -clientApp.1.args=sam.keys 127.0.0.1 7656 i2cp.tcp.host=localhost i2cp.tcp.port=7654 +clientApp.1.name=SAM application bridge +clientApp.1.args=sam.keys 127.0.0.1 7656 i2cp.tcp.host=127.0.0.1 i2cp.tcp.port=7654 clientApp.1.startOnLoad=false # poke the i2ptunnels defined in i2ptunnel.config clientApp.2.main=net.i2p.i2ptunnel.TunnelControllerGroup -clientApp.2.name=Tunnels +clientApp.2.name=Application tunnels clientApp.2.args=i2ptunnel.config clientApp.2.startOnLoad=true # run our own eepsite with a seperate jetty instance clientApp.3.main=org.mortbay.jetty.Server -clientApp.3.name=eepsite -clientApp.3.args=eepsite/jetty.xml +clientApp.3.name=My eepsite web server +clientApp.3.args="eepsite/jetty.xml" clientApp.3.delay=30 clientApp.3.startOnLoad=true # load a browser pointing at the web console whenever we start up clientApp.4.main=net.i2p.apps.systray.UrlLauncher -clientApp.4.name=consoleBrowser -clientApp.4.args=http://localhost:7657/index.jsp -clientApp.4.delay=5 +clientApp.4.name=Browser launch at startup +clientApp.4.args=http://127.0.0.1:7657/index.jsp +clientApp.4.delay=15 clientApp.4.startOnLoad=true # BOB bridge clientApp.5.args= clientApp.5.delay=10 clientApp.5.main=net.i2p.BOB.BOB -clientApp.5.name=BOB +clientApp.5.name=BOB application bridge clientApp.5.startOnLoad=false diff --git a/installer/resources/countries.txt b/installer/resources/countries.txt new file mode 100644 index 000000000..c1ea54d83 --- /dev/null +++ b/installer/resources/countries.txt @@ -0,0 +1,237 @@ +AD,ANDORRA +AE,UNITED ARAB EMIRATES +AF,AFGHANISTAN +AG,ANTIGUA AND BARBUDA +AI,ANGUILLA +AL,ALBANIA +AM,ARMENIA +AN,NETHERLANDS ANTILLES +AO,ANGOLA +AQ,ANTARCTICA +AR,ARGENTINA +AS,AMERICAN SAMOA +AT,AUSTRIA +AU,AUSTRALIA +AW,ARUBA +AX, +AZ,AZERBAIJAN +BA,BOSNIA AND HERZEGOVINA +BB,BARBADOS +BD,BANGLADESH +BE,BELGIUM +BF,BURKINA FASO +BG,BULGARIA +BH,BAHRAIN +BI,BURUNDI +BJ,BENIN +BM,BERMUDA +BN,BRUNEI DARUSSALAM +BO,BOLIVIA +BR,BRAZIL +BS,BAHAMAS +BT,BHUTAN +BV,BOUVET ISLAND +BW,BOTSWANA +BY,BELARUS +BZ,BELIZE +CA,CANADA +CD,THE DEMOCRATIC REPUBLIC OF THE CONGO +CF,CENTRAL AFRICAN REPUBLIC +CG,CONGO +CH,SWITZERLAND +CI,COTE D'IVOIRE +CK,COOK ISLANDS +CL,CHILE +CM,CAMEROON +CN,CHINA +CO,COLOMBIA +CR,COSTA RICA +CS,SERBIA AND MONTENEGRO +CU,CUBA +CV,CAPE VERDE +CY,CYPRUS +CZ,CZECH REPUBLIC +DE,GERMANY +DJ,DJIBOUTI +DK,DENMARK +DM,DOMINICA +DO,DOMINICAN REPUBLIC +DZ,ALGERIA +EC,ECUADOR +EE,ESTONIA +EG,EGYPT +ER,ERITREA +ES,SPAIN +ET,ETHIOPIA +FI,FINLAND +FJ,FIJI +FK,FALKLAND ISLANDS (MALVINAS) +FM,FEDERATED STATES OF MICRONESIA +FO,FAROE ISLANDS +FR,FRANCE +GA,GABON +GB,UNITED KINGDOM +GD,GRENADA +GE,GEORGIA +GF,FRENCH GUIANA +GH,GHANA +GI,GIBRALTAR +GL,GREENLAND +GM,GAMBIA +GN,GUINEA +GP,GUADELOUPE +GQ,EQUATORIAL GUINEA +GR,GREECE +GS,SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS +GT,GUATEMALA +GU,GUAM +GW,GUINEA-BISSAU +GY,GUYANA +HK,HONG KONG +HN,HONDURAS +HR,CROATIA +HT,HAITI +HU,HUNGARY +ID,INDONESIA +IE,IRELAND +IL,ISRAEL +IM, +IN,INDIA +IO,BRITISH INDIAN OCEAN TERRITORY +IQ,IRAQ +IR,ISLAMIC REPUBLIC OF IRAN +IS,ICELAND +IT,ITALY +JE, +JM,JAMAICA +JO,JORDAN +JP,JAPAN +KE,KENYA +KG,KYRGYZSTAN +KH,CAMBODIA +KI,KIRIBATI +KM,COMOROS +KN,SAINT KITTS AND NEVIS +KR,REPUBLIC OF KOREA +KW,KUWAIT +KY,CAYMAN ISLANDS +KZ,KAZAKHSTAN +LA,LAO PEOPLE'S DEMOCRATIC REPUBLIC +LB,LEBANON +LC,SAINT LUCIA +LI,LIECHTENSTEIN +LK,SRI LANKA +LR,LIBERIA +LS,LESOTHO +LT,LITHUANIA +LU,LUXEMBOURG +LV,LATVIA +LY,LIBYAN ARAB JAMAHIRIYA +MA,MOROCCO +MC,MONACO +MD,REPUBLIC OF MOLDOVA +ME, +MF, +MG,MADAGASCAR +MH,MARSHALL ISLANDS +MK,THE FORMER YUGOSLAV REPUBLIC OF MACEDONIA +ML,MALI +MM,MYANMAR +MN,MONGOLIA +MO,MACAO +MP,NORTHERN MARIANA ISLANDS +MQ,MARTINIQUE +MR,MAURITANIA +MS,MONTSERRAT +MT,MALTA +MU,MAURITIUS +MV,MALDIVES +MW,MALAWI +MX,MEXICO +MY,MALAYSIA +MZ,MOZAMBIQUE +NA,NAMIBIA +NC,NEW CALEDONIA +NE,NIGER +NF,NORFOLK ISLAND +NG,NIGERIA +NI,NICARAGUA +NL,NETHERLANDS +NO,NORWAY +NP,NEPAL +NR,NAURU +NU,NIUE +NZ,NEW ZEALAND +OM,OMAN +PA,PANAMA +PE,PERU +PF,FRENCH POLYNESIA +PG,PAPUA NEW GUINEA +PH,PHILIPPINES +PK,PAKISTAN +PL,POLAND +PM,SAINT PIERRE AND MIQUELON +PR,PUERTO RICO +PS,PALESTINIAN TERRITORY +PT,PORTUGAL +PW,PALAU +PY,PARAGUAY +QA,QATAR +RE,REUNION +RO,ROMANIA +RS,SERBIA +RU,RUSSIAN FEDERATION +RW,RWANDA +SA,SAUDI ARABIA +SB,SOLOMON ISLANDS +SC,SEYCHELLES +SD,SUDAN +SE,SWEDEN +SG,SINGAPORE +SI,SLOVENIA +SK,SLOVAKIA +SL,SIERRA LEONE +SM,SAN MARINO +SN,SENEGAL +SO,SOMALIA +SR,SURINAME +ST,SAO TOME AND PRINCIPE +SV,EL SALVADOR +SY,SYRIAN ARAB REPUBLIC +SZ,SWAZILAND +TC,TURKS AND CAICOS ISLANDS +TD,CHAD +TF,FRENCH SOUTHERN TERRITORIES +TG,TOGO +TH,THAILAND +TJ,TAJIKISTAN +TK,TOKELAU +TL,TIMOR-LESTE +TM,TURKMENISTAN +TN,TUNISIA +TO,TONGA +TR,TURKEY +TT,TRINIDAD AND TOBAGO +TV,TUVALU +TW,TAIWAN +TZ,UNITED REPUBLIC OF TANZANIA +UA,UKRAINE +UG,UGANDA +UM,UNITED STATES MINOR OUTLYING ISLANDS +US,UNITED STATES +UY,URUGUAY +UZ,UZBEKISTAN +VA,HOLY SEE (VATICAN CITY STATE) +VC,SAINT VINCENT AND THE GRENADINES +VE,VENEZUELA +VG,VIRGIN ISLANDS +VI,VIRGIN ISLANDS +VN,VIET NAM +VU,VANUATU +WF,WALLIS AND FUTUNA +WS,SAMOA +YE,YEMEN +YT,MAYOTTE +ZA,SOUTH AFRICA +ZM,ZAMBIA +ZW,ZIMBABWE diff --git a/installer/resources/dnf-header.ht b/installer/resources/dnf-header.ht index 1d4f6ff7f..d3adc8261 100644 --- a/installer/resources/dnf-header.ht +++ b/installer/resources/dnf-header.ht @@ -5,40 +5,20 @@ Connection: close Proxy-Connection: close -Eepsite not reachable - - +I2P Warning: Eepsite not reachable + +

        +

        Warning: Eepsite Unreachable

        The eepsite was not reachable. The eepsite is offline, there is network congestion, or your router is not yet well-integrated with peers. You may want to retry. -

        Could not find the following destination:

        +
        Could not find the following destination:

        diff --git a/installer/resources/dnfb-header.ht b/installer/resources/dnfb-header.ht index 39e56000e..ec17ebfa3 100644 --- a/installer/resources/dnfb-header.ht +++ b/installer/resources/dnfb-header.ht @@ -5,41 +5,21 @@ Connection: close Proxy-Connection: close -Invalid eepsite destination - - +I2P Warning: Invalid eepsite destination + +
        +

        Warning: Invalid Destination

        The eepsite destination specified was not valid, or was otherwise unreachable. Perhaps you pasted in the wrong BASE64 string or the link you are following is bad. The I2P host could also be offline. You may want to retry. -

        Could not find the following destination:

        +
        Could not find the following destination:

        diff --git a/installer/resources/dnfh-header.ht b/installer/resources/dnfh-header.ht index ff6195ca9..b387727af 100644 --- a/installer/resources/dnfh-header.ht +++ b/installer/resources/dnfh-header.ht @@ -5,43 +5,23 @@ Connection: close Proxy-Connection: close -Eepsite unknown - - +I2P Warning: Eepsite unknown + +
        +

        Warning: Eepsite Not Found in Addressbook

        The eepsite was not found in your router's addressbook. Check the link or find a BASE64 address. If you have the BASE64 address, paste it into your userhosts.txt using -SusiDNS, -use a BASE64 address helper, or use a jump service link below. +SusiDNS, +use a BASE64 address helper, or use a jump service link below.

        Seeing this page often? See the FAQ -for help in adding some subscriptions -to your addressbook. -

        Could not find the following destination:

        +for help in adding some subscriptions +to your addressbook.
        +Could not find the following destination:

        diff --git a/installer/resources/dnfp-header.ht b/installer/resources/dnfp-header.ht index 9108889fc..1cea2df69 100644 --- a/installer/resources/dnfp-header.ht +++ b/installer/resources/dnfp-header.ht @@ -4,47 +4,26 @@ Cache-control: no-cache Connection: close Proxy-Connection: close - -Outproxy Not Found - - - - - - -
        -The WWW Outproxy was not found. -It is offline, there is network congestion, -or your router is not yet well-integrated with peers. -You may want to -retry -as this will randomly reselect an outproxy from the pool you have defined -here -(if you have more than one configured). -If you continue to have trouble you may want to edit your outproxy list -here. -

        Could not find the following destination:

        + +I2P Warning: Outproxy Not Found + + + + + +
        +

        Warning: I2P Proxy Not Found

        +The WWW Outproxy was not found. +It is offline, there is network congestion, +or your router is not yet well-integrated with peers. +You may want to +retry +as this will randomly reselect an outproxy from the pool you have defined +here +(if you have more than one configured). +If you continue to have trouble you may want to edit your outproxy list +here. +
        Could not find the following destination:

        diff --git a/installer/resources/eepget b/installer/resources/eepget index d4ea04b34..080bcc8d8 100644 --- a/installer/resources/eepget +++ b/installer/resources/eepget @@ -1,4 +1,3 @@ #!/bin/sh -#export I2P=~i2p/i2p -export I2P=`dirname $0` -java -cp $I2P/lib/i2p.jar net.i2p.util.EepGet $* +I2P="%INSTALL_PATH" +java -cp "$I2P/lib/i2p.jar" net.i2p.util.EepGet "$@" diff --git a/installer/resources/eepsite.css b/installer/resources/eepsite.css new file mode 100644 index 000000000..ccd537ec4 --- /dev/null +++ b/installer/resources/eepsite.css @@ -0,0 +1,30 @@ +body { background-color:#000000; color: #ffffe0; margin-left: 8.7%; margin-right: 12.9%; margin-top: 6%; margin-bottom: 6%;} +body,h1,h2,h3,h4,p,ul,ol,li,dl,dt,dd,div,td,th,address,blockquote { font-family:"DejaVu Serif", serif; } +h1 { font-size:23pt; margin-bottom:20pt; } +h1.ph1 { font-size:20pt; margin-bottom:18pt; } +h2 { font-size:18pt; margin-bottom:18pt; } +h3 { font-size:16pt; } +h4 { font-size:14pt; } +h5 { font-size:13pt; } +p,ul,ol,li,dl,dt,dd,div,td,th,address,blockquote { font-size:12.2pt; } + +a.footref { font-size: 70%; } +a:link { color:#ffc266; text-decoration:underline; } +a:visited { color:#ffd699; text-decoration:none; } +a:active { color:#ff9900; text-decoration:none; } +a.nonexistent { color: #ffffe0; text-decoration:underline; } +a.nonexistent:visited { color: #ffffe0; text-decoration:none; } + +dl.contents { margin-top: 0; } +dt.contents { margin-bottom: 0; } +em { font-style: italic; } +li,dt { margin-top: 0.2em; } +p.footnote { font-size: 90%; } +p.verse { white-space: pre; margin-left: 8.7%; } +pre { font-family: monospace; white-space: pre; margin-left: 8.7%; } +strong { font-weight: bold; } +table { width:100%; } +td { border:0px solid #000; vertical-align:top; overflow:hidden; } +ul { list-style-type: disc } + + diff --git a/installer/resources/eepsite_index.html b/installer/resources/eepsite_index.html index 2fe80c8c1..3c6252ed5 100644 --- a/installer/resources/eepsite_index.html +++ b/installer/resources/eepsite_index.html @@ -2,20 +2,21 @@ Welcome to your eepsite +

        Welcome to your eepsite

        - +

        (Deutsch)

        This is your eepsite - simply edit the files under ./eepsite/docroot/ and they'll be reachable by others once you follow the instructions below. In I2P, eepsites are addressed using a 'key', which is represented as a really long Base64 string. (The 'key' is somewhat analogous to an IP address, and is shown on the eepsite's I2PTunnel - configuration page). + configuration page). The instructions below detail how to assign a name like "mysite.i2p" to your key and start up your eepsite.

        You can reach your eepsite locally through - http://localhost:7658/. + http://127.0.0.1:7658/.

        Step-by-step instructions for starting your new eepsite and announcing it to the I2P community

        @@ -27,24 +28,24 @@
        • Pick a name for your eepsite (something.i2p). Use all lower-case. You may wish to check first in your own router's address book - here, + here, or the file i2p/hosts.txt to see if your name is already taken. Enter the new name for your eepsite on the - eepsite i2ptunnel configuration page + eepsite i2ptunnel configuration page where it says "Website name". This will replace the default "mysite.i2p". Also, check the "Auto Start" box. Your eepsite will now start every time you start your router. Be sure and click "Save".
        • Click the start button for your eepsite on the - main i2ptunnel configuration page. + main i2ptunnel configuration page. You should now see "eepsite" listed under "Local Destinations" on the left side of the - I2P Router Console. + I2P Router Console. Your eepsite is now running.
        • Highlight the entire "Local destination" key on the - eepsite i2ptunnel configuration page. + eepsite i2ptunnel configuration page. and copy it for later pasting. Make sure you get the whole thing - it's over 500 characters and it must end in "AAAA".
        • Enter the name and paste in the destination key into your - master address book. + master address book. Click "Add" to add the destination to your address book.
        • In your browser, enter in your eepsite name (something.i2p) and you should be right back here. Hopefully it worked. @@ -57,14 +58,14 @@ your eepsite name and key into a web interface on one or more of these sites. Here is the key entry form at stats.i2p. Again, your key is the entire "Local destination" key on the - eepsite i2ptunnel configuration page. + eepsite i2ptunnel configuration page. Be sure you get the whole thing, ending with "AAAA". Don't forget to click "add a key". Check to see if it reports the key was added. Since many routers periodically get address book updates from these sites, within several hours others will be able to find your website by simply typing something.i2p into their browser.
        • Speaking of address book updates, this would be a good time to add some more addressbooks - to your own subscription list. Go to your subscriptions configuration page + to your own subscription list. Go to your subscriptions configuration page and add a couple of these - http://tino.i2p/hosts.txt, http://stats.i2p/cgi-bin/newhosts.txt, diff --git a/installer/resources/eepsite_index_de.html b/installer/resources/eepsite_index_de.html new file mode 100644 index 000000000..e80081891 --- /dev/null +++ b/installer/resources/eepsite_index_de.html @@ -0,0 +1,170 @@ + + + + + Willkommen zu Ihrer Eepsite! + + + + +

          Willkommen zu Ihrer Eepsite!

          +

          Diese ist Ihre Eepsite, Ihre Web-Präsens Ă¼ber I2P. Editieren Sie einfach die Dateien unter i2p/eepsite/docroot/ +und nachdem Sie den Anweisungen weiter unten gefolgt sind, werden Sie – +vertreten durch Ihre Eepsite – von anderen im I2P-Netz und, soweit +verfĂ¼gbar, Ă¼ber private â€Out-Proxys“ weltweit erreichbar sein.

          + +

          In I2P werden Eepsites unter Verwendung eines SchlĂ¼ssels (key) adressiert, dieser wird durch eine sehr lange Base64-Zeichenkette1 dargestellt. +(Dieser SchlĂ¼ssel ist analog zur Standard IP-Adresse zu verstehen; man kann ihn sich in der Konfiguration fĂ¼r Eepsites unter I2PTunnel anzeigen lassen.)

          + +

          Folgende Anweisungen sollen zeigen, wie man einer Eepsite einen +Namen wie beispielsweise â€meineseite.i2p“ zuweist und an dem SchlĂ¼ssel +bindet. +Sie können Ihre Eepsite, nachdem sie gestartet wurde, lokal unter http://localhost:7658/ erreichen.

          + +

          Es folgt eine schrittweise Anleitung fĂ¼r das Starten Ihrer neuen Eepsite und dessen AnkĂ¼ndigung in der I2P-Gemeinde.

          + +

          In der Grundeinstellung ist Ihre Eepsite nicht eingeschaltet. +Auch nach dem sie gestartet wurde, ist es fĂ¼r andere Teilnehmer immer +noch schwierig Ihre Seite zu finden, solange bis Sie Ihren +Base64-SchlĂ¼ssel und den Namen Ihrer Eepsite veröffentlicht haben. +NatĂ¼rlich können Sie den Leuten diesen sehr langen SchlĂ¼ssel auch so +mitteilen, aber glĂ¼cklicherweise bringt I2P bereits ein Adressbuch mit +und hat verschiedene Wege um Ihre Eepsite bekannt zu machen.

          + + +

          Eine detailierte EinfĂ¼hrung

          + +

          Meine Eepsite

          + +
            +
          1. Wählen Sie einen eigenen Namen fĂ¼r Ihre Eepsite – nur in diesem +Beispiel heiĂŸt sie â€meineseite.i2p“ – benutzen Sie nur Kleinschrift. +Sie können in Ihrem Adressbuch Ă¼berprĂ¼fen, ob der gewĂ¼nschte Name bereits vergeben ist (Anmerkung: die Daten aus den Adressbuch werden im Klartext in der i2p/hosts.txt gespeichert). +
            +
          2. +
          3. Rufen Sie nun, möglichst in einem neuen Browser-Fenster, die Konfiguration fĂ¼r Eepsites I2PTunnel auf. Unter â€Local Server Tunnels“ wählen Sie den Eintrag â€eepsite“. +Sie befinden sich nun auf der Seite mit Ăœberschrift â€Edit server +settings“. In das Feld fĂ¼r â€Website name:“ Ă¼berschreiben Sie die +Vorgabe â€mysite.i2p“ mit Ihrem Wunschnamen. Optional geben Sie im Feld +â€Description:“ eine Beschreibung an. +
            +
          4. +
          5. Wenn Sie möchten das Ihre Eepsite automatisch gestartet wird, kreuzen Sie das Feld â€Auto Start:“ an. +
            +
          6. +
          7. Durch drĂ¼cken des Links â€Add to local addressbook“ gleich rechts +neben Ihrem SchlĂ¼ssel (Feld â€Local destination“) wird Ihr SchlĂ¼ssel in +Ihr privates Adressbuch geschrieben (i2p/privatehosts.txt). +
            +
          8. +
          9. Jetzt sichern Sie Ihre Einstellungen indem Sie auf â€Save“ klicken. +
            +
          10. +
          11. Wir gehen wieder zurĂ¼ck auf die Konfigurationsseite I2PTunnel +und drĂ¼cken den â€Start“-Knopf fĂ¼r die â€eepsite“. Nach dem erfolgreichen +Start wird Ihre Eepsite auf der linken Seite in der I2P Router Console unter â€Local +Destinations“ angezeigt.
          12. +
          + + + +

          Das Veröffentlichen vorbereiten

          + +
            +
          1. Heben Sie in der â€Konfiguration“ +den gesamten SchlĂ¼ssel fĂ¼r Ihre Eepsite hervor und kopieren ihn in die +Zwischenablage. Stellen Sie sicher auch tatsächlich die gesamte, Ă¼ber +500 Zeichen lange Zeichenkette die auf â€AAAA“ endet, â€erwischt“ zu +haben. +
            +
          2. +
          3. Ă–ffnen Sie Ihr Master-Adressbuch, +tragen Ihren zuvor gewählten Wunschnamen ihrer Eepsite unter â€Hostname“ +ein und kopieren den SchlĂ¼ssel in das Feld â€Destination“. Ein Klick auf +â€Add“ und diese â€Destination“ ist in Ihrem Adressbuch.2 +
            +
          4. +
          5. Ihre Eepsite sollte jetzt Ă¼ber den Browser erreichbar sein. Dazu +tragen Sie, wie gewohnt, den Namen Ihrer Eepsite (hier im Beispiel +â€meineseite.i2p“) in die Adressleiste Ihres Browsers ein und rufen sie +auf. Wenn alles gutgegangen ist, sind Sie nun wieder hier – nur die +Adresse hat sich geändert. +
            +
          6. +
          7. Bevor Sie der Welt von Ihrer neuen Eepsite berichten sollte sie +auch Ă¼ber ein wenig Inhalt verfĂ¼gen. Begeben Sie sich in das +Verzeichnis â€i2p/Eepsite/docroot“ und benennen Sie dieses Dokument von â€index.html“ nach â€hilfe.html“ um, so können Sie später darauf zurĂ¼ck greifen. Erstellen Sie Ihre eigene â€index.html“ und fĂ¼llen diese mit Inhalten, Bildern oder was auch immer Sie anderen hierĂ¼ber mitteilen wollen.
          8. +
          + +

          Die Eepsite öffentlich ankĂ¼ndigen

          + +
            +
          • Nun ist es an der Zeit, Ihre Eepsite in einem globalen I2P-Adressbuch, wie beispielsweise bei stats.i2p, +einzutragen. Das heiĂŸt, Sie mĂ¼ssen Namen und SchlĂ¼ssel Ihrer Eepsite +und eine optionale Beschreibung in ein Formular auf einen oder mehreren +dieser Seiten eingeben. Wie schon oben gesagt, Ihr SchlĂ¼ssel ist der vollständige SchlĂ¼ssel wie er in der I2PTunnel Konfiguration fĂ¼r die â€Eepsite“ +im Feld â€Local destination“ angegeben ist (... Ă¼ber 500 Zeichen, endet +auf â€AAAA“). Bestätigen Sie Ihre Angaben mit einem klick auf â€Submit“. +ĂœberprĂ¼fen Sie ob Ihr SchlĂ¼ssel tatsächlich hinzugefĂ¼gt wurde. +
            +
          • +
          • Da viele Router regelmĂ¤ĂŸig Adressbuchupdates von diesen Seiten +erhalten, sollten andere innerhalb einiger Stunden in der Lage sein, +Ihre Eesite durch +den Eintrag des Namens im Browser aufzurufen. +
            +
          • +
          • Weil wir gerade von Adressbuchupdates sprechen – es ist eine gute Zeit um weitere AdressbĂ¼cher dem bestehenden Abonnement +hinzuzufĂ¼gen. Ă–ffnen Sie Ihre Konfiguration und fĂ¼gen Sie einige der +folgenden Dienste Ihrem Abonnement hinzu (nur die jeweilige URL) und +speichern Sie die Angaben.3 Ab jetzt erhalten Sie ebenso alle Updates automatisch! +
            +

            http://tino.i2p/hosts.txt (tino.i2p)
            +http://stats.i2p/cgi-bin/newhosts.txt (stats.i2p)
            +http://i2host.i2p/cgi-bin/i2hostetag (i2host.i2p) +
            +

            +
          • +
          • Haben Sie es eilig und können nicht 12 bis 24 Stunden warten, ist +es möglich das andere fĂ¼r Ihre Eepseite den â€jump“ +Adresshelfer-Umlenkungs-Dienst benutzen. Dieses funktioniert innerhalb +einiger Minuten nach Eingabe des SchlĂ¼ssels zu einem Adressbuch auf der +gleichen Seite.

            +Zuerst testen Sie das mittels Aufruf folgender Dienste. Sobald das +klappt, können anderen diese Möglichkeit nutzen. (Ersetzen Sie +â€meineseite.i2p“ durch Ihre Seite.) +
          • +
          • Manche Leute erkundigen sich auf Eepsites-Listen wie inproxy.tino.i2p/status.php Ă¼ber neue Eepsites, so könnten Sie an einige Besucher kommen. Aber es gibt weitere Wege sich anzukĂ¼ndigen: + +
              +
            • Veröffentlichen Sie eine Nachricht im I2P Forum unter Eepsite Announce
            • +
            • Besuchen sie die IRC-Kanäle #i2p oder #i2p-chat (beide englischsprachig) und Werben Sie sanft fĂ¼r sich.
            • +
            • Verbreiten Sie eine Nachricht Ă¼ber Syndie.
            • +
            • Tragen Sie sich ein in Ughas Eepsite Index Wiki. +
              +
            • +
          • +
          • Bitte beachten Sie, einige Seiten empfehlen das EinfĂ¼gen des langen +â€Destination“-SchlĂ¼ssels; das können Sie wenn Sie möchten – aber wenn +Sie Ihren SchlĂ¼ssel erfolgreich beim â€SchlĂ¼ssel-Dienst“ eingetragen und +ihn mittels â€jump“-Dienst getestet haben, sollte nach 24 Stunden +Wartezeit dieses Vorgehen nicht nötig sein. +
            +
          • +
          • Sollten Sie Fragen haben, benutzen Sie den IRC-Kanal #i2p oder die technische Abteilung im I2P Forum
          • +
          + + +

          ______________ +

          1. Base64 +beschreibt ein Verfahren zur Kodierung von 8-Bit-Binärdaten in eine +Zeichenfolge, die nur aus wenigen, Codepage-unabhängigen ASCII-Zeichen +besteht. +

          2. Anmerkung: Wenn dieses Vorgehen mit der Fehlermeldung â€Invalid nonce. Are you being spoofed?“ quittiert wird, mĂ¼ssen Cookies im Browser erlaubt werden. Ist dies nicht möglich, können Sie mit einem Editor die Datei â€i2p/userhosts.txt“ bearbeiten und so die Adressen einfĂ¼gen. Konqueror ist etwas eigenwillig. +

          3. Gleiches wie unter 2 gilt fĂ¼r â€i2p/addressbook/subscriptions.txt“.

          + diff --git a/installer/resources/favicon.ico b/installer/resources/favicon.ico deleted file mode 100644 index fd09b1b4c..000000000 Binary files a/installer/resources/favicon.ico and /dev/null differ diff --git a/installer/resources/fixperms.bat b/installer/resources/fixperms.bat new file mode 100755 index 000000000..75cb715ab --- /dev/null +++ b/installer/resources/fixperms.bat @@ -0,0 +1,11 @@ +:: Fix Vista permission problems +:: From http://www.nabble.com/Classpath-security-issues-on-Vista-td22456230.html +:: +:: 'echo Y' to get past the 'are you sure' question... +:: cacls requires it on XP, icacls doesnt appear so, but can't hurt +:: F : full control +:: /c : continue on error +:: /q : quiet +:: /t : recursive +:: +echo Y|icacls %1 /grant Users:F /c /t > %1%\fixperms.log diff --git a/installer/resources/geoip.txt b/installer/resources/geoip.txt new file mode 100644 index 000000000..7c9cbc312 --- /dev/null +++ b/installer/resources/geoip.txt @@ -0,0 +1,93295 @@ +# Format and shell script courtesy of Tor +# Last updated based on June 3 2009 ip-to-country db. +# wget http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip +# cut -d, -f0-3 < ip-to-country.csv|sed 's/"//g' > geoip.txt +# cut -d, -f3,5 < ip-to-country.csv|sed 's/"//g' | sort | uniq > countries.txt +33996344,33996351,GB +50331648,69956103,US +69956104,69956111,BM +69956112,72349055,US +72349056,72349119,BM +72349120,83886079,US +94585424,94585439,SE +100663296,121195295,US +121195296,121195327,IT +121195328,134693119,US +134693120,134693375,CA +134693376,134730239,US +134730240,134730495,CA +134730496,152305663,US +152305664,152338431,GB +152338432,167772159,US +184549376,201859071,US +201859072,201859087,VI +201859088,201897983,US +201897984,201898239,PR +201898240,202385407,US +202385408,202385919,PR +202385920,202706431,US +202706432,202706943,PR +202706944,202934671,US +202934672,202934687,VI +202934688,202935551,US +202935552,202935807,PR +202935808,202938479,US +202938480,202938495,VI +202938496,203197063,US +203197064,203197071,CA +203197072,203658303,US +203658304,203658367,PR +203658368,203658415,US +203658416,203658423,VI +203658424,203658751,US +203658752,203658831,VI +203658832,203658847,US +203658848,203658879,PR +203658880,203658927,US +203658928,203658951,PR +203658952,203658967,US +203658968,203658991,VI +203658992,203659039,US +203659040,203659095,VI +203659096,203850679,US +203850680,203850687,CA +203850688,204047231,US +204047232,204047247,VI +204047248,204047255,US +204047256,204047263,PR +204047264,204047295,US +204047296,204047303,VI +204047304,204047311,US +204047312,204047335,VI +204047336,204047431,US +204047432,204047455,VI +204047456,204047463,US +204047464,204047479,VI +204047480,204047487,US +204047488,204047503,PR +204047504,204047535,VI +204047536,204047551,PR +204047552,204047559,VI +204047560,204047567,PR +204047568,204047583,VI +204047584,204047615,PR +204047616,204047999,US +204048000,204048007,VI +204048008,204048015,US +204048016,204048031,VI +204048032,204048047,PR +204048048,204048063,US +204048064,204048127,VI +204048128,204152831,US +204152832,204153855,PR +204153856,205500987,US +205500988,205500991,CA +205500992,210784255,US +210784256,210784383,BO +210784384,210784767,US +210784768,210786303,BO +210786304,211595575,US +211595576,211595583,VI +211595584,211595615,US +211595616,211595623,VI +211595624,211595639,PR +211595640,211596815,US +211596816,211596831,VI +211596832,211597055,US +211597056,211597071,VI +211597072,211597375,US +211597376,211597503,VI +211597504,211597719,US +211597720,211597727,VI +211597728,211597743,PR +211597744,211597759,US +211597760,211597775,PR +211597776,211597791,VI +211597792,211598399,US +211598400,211598463,VI +211598464,211598623,US +211598624,211598631,VI +211598632,211598639,US +211598640,211598719,VI +211598720,212122039,US +212122040,212122047,PR +212122048,212787199,US +212787200,212788223,PR +212788224,212788479,US +212788480,212788607,VI +212788608,212788863,US +212788864,212788991,PR +212788992,212789039,US +212789040,212789055,VI +212789056,212789063,PR +212789064,212789079,VI +212789080,212789087,US +212789088,212789095,VI +212789096,212789111,US +212789112,212789119,PR +212789120,212789127,VI +212789128,212789183,US +212789184,212789191,PR +212789192,212791295,US +212791296,212791423,VI +212791424,212791431,PR +212791432,212791447,VI +212791448,212791455,US +212791456,212791807,PR +212791808,212791815,US +212791816,212791839,VI +212791840,212792191,US +212792192,212792263,PR +212792264,212792271,US +212792272,212792279,PR +212792280,212792287,US +212792288,212792319,PR +212792320,212793199,US +212793200,212793207,VI +212793208,212793215,PR +212793216,212794783,US +212794784,212794791,VI +212794792,212794799,US +212794800,212794815,VI +212794816,212794879,US +212794880,212794887,VI +212794888,212794911,US +212794912,212794943,PR +212794944,212794975,US +212794976,212794983,VI +212794984,213716903,US +213716904,213716911,CA +213716912,213895679,US +213895680,213895743,VI +213895744,213923839,US +213923840,213924863,PR +213924864,213925631,US +213925632,213925887,PR +213925888,214185983,US +214185984,214187007,PR +214187008,214187519,US +214187520,214187775,VI +214187776,214187807,US +214187808,214187815,PR +214187816,214187895,US +214187896,214188031,VI +214188032,214237247,US +214237248,214237311,PR +214237312,214697983,US +214697984,214698007,VI +214698008,214698015,PR +214698016,214698023,US +214698024,214698031,PR +214698032,214698095,VI +214698096,214698103,US +214698104,214698135,VI +214698136,214698143,PR +214698144,214698311,VI +214698312,214858655,US +214858656,214858671,NL +214858672,216417663,US +216417664,216417727,PR +216417728,216637639,US +216637640,216637647,PR +216637648,234881023,US +251658240,260227071,US +260227072,260231167,GB +260231168,260976639,US +260976640,260980735,GB +260980736,264482815,US +264482816,264486911,DE +264486912,264495103,US +264495104,264503295,CH +264503296,264617983,US +264617984,264667135,DE +264667136,264699903,US +264699904,264716287,CH +264716288,264798207,US +264798208,264802303,GB +264802304,265023487,US +265023488,265027583,GB +265027584,265277439,US +265277440,265289727,GB +265289728,289011535,US +289011536,289011543,IT +289011544,323243895,US +323243896,323243903,FR +323243904,332132119,US +332132120,332132127,IL +332132128,355993887,US +355993888,355993895,IT +355993896,368674047,US +368674048,368674303,ES +368674304,385875967,US +386665696,386665727,GB +386666240,386666367,GB +393849728,393849735,GB +402653184,404684799,US +404692992,404979711,US +405012480,405143551,CA +405180416,405184511,CA +405184512,405295103,US +405299200,405331967,US +405340160,405364735,US +405405696,405422079,PR +405422080,405798911,US +405831680,405835775,US +405839872,405843967,US +405880832,405897215,US +405901312,405909503,US +405921792,405929983,CA +405929984,405938175,US +405962752,405966847,US +406003712,406011903,US +406044672,406052863,US +406061056,406077439,US +406093824,406102015,US +406142976,406147071,US +406159360,406175743,US +406183936,406188031,CA +406216704,406241279,US +406241280,406257663,PR +406274048,406282239,PR +406298624,406306815,PR +406323200,406388735,US +406388736,406454271,CA +406454272,406847487,US +406847488,407408639,CA +407408640,407597055,US +407601152,407605247,US +407633920,408420351,CA +408420352,408502271,US +408502272,408518655,CA +408518656,408535039,US +408535040,408551423,CA +408551424,408719359,US +408723456,409239551,US +409272320,409337855,US +409337856,409354239,CA +409370624,409509887,US +409534464,409550847,US +409567232,409595903,US +409600000,409731071,US +409731072,409862143,CA +409862144,410124287,US +410124288,410189823,CA +410189824,410648575,US +410648576,410714111,CA +410714112,411164671,US +411164672,411168767,CA +411172864,411303935,US +411303936,411369471,NL +411566080,411639807,US +411639808,411643903,CA +411648000,411664383,CA +411664384,411680767,US +411680768,411688959,CA +411697152,411717631,CA +411721728,411746303,CA +411746304,411762687,PR +411762688,411770879,CA +411770880,411779071,US +411779072,411828223,PR +411828224,411885567,US +411893760,411959295,CA +411983872,411992063,US +412024832,412069887,US +412073984,412221439,US +412221440,412229631,CA +412286976,412483583,US +412483584,412549119,CA +412549120,412614655,US +412647424,412680191,US +412680192,412688383,CA +412696576,412704767,US +412708864,412909567,US +412909568,412917759,CA +412942336,412946431,US +413007872,413908991,US +413908992,413925375,PR +413925376,415760383,US +415760384,416022527,CA +416022528,416059391,US +416088064,416153599,US +416161792,416219135,US +416219136,416251903,CA +416251904,416546815,US +416546816,416579583,CA +416612352,416628735,US +416628736,416636927,CA +416636928,416641023,US +416645120,416743423,US +416743424,416776191,CA +416776192,417202175,US +417202176,417267711,CA +417267712,417288191,US +417292288,417366015,US +417366016,417398783,CA +417398784,417427455,US +417431552,417464319,US +417464320,417529855,CA +417538048,417775615,US +417775616,417796095,CA +417796096,417800191,US +417800192,417808383,BS +417808384,417820671,CA +417824768,417857535,US +417857536,417923071,AR +417923072,418062335,US +418062336,418070527,CA +418070528,418074623,US +418078720,418119679,CA +418119680,418316287,US +418316288,418320383,CA +418324480,418643967,US +418643968,418668543,CA +418672640,418676735,CA +418676736,418687743,BS +418687744,418687998,DM +418687999,418693119,BS +418693120,418709503,CA +418709504,418725887,US +418729984,418766847,US +418766848,418770943,CA +418824192,418832383,US +418840576,419430399,US +419430400,436207615,GB +436207616,452984831,US +469762048,520093695,US +536870912,540680895,GB +540680896,540680959,BE +540680960,540683775,GB +540683776,540683783,DE +540683784,540685567,GB +540685568,540685631,FR +540685632,540687231,GB +540687232,540687359,CA +540687360,540694527,GB +540694528,540694591,IT +540694592,540705023,GB +540705024,540705031,IE +540705032,540705535,GB +540705536,540705599,IE +540705600,540711935,GB +540711936,540712447,NL +540712448,540737535,GB +540737536,540737791,BZ +540737792,540737919,BR +540737920,540750175,BZ +540750176,540750191,MX +540750192,540803071,BZ +540803072,540819455,GB +540819456,540823551,CA +540823552,540826671,GB +540826672,540826687,CA +540826688,540827135,GB +540827136,540827263,CA +540827264,540827295,GB +540827296,540827311,CA +540827312,540827359,GB +540827360,540827375,CA +540827376,540827391,GB +540827392,540827423,CA +540827424,540827471,GB +540827472,540827487,CA +540827488,540827519,GB +540827520,540827551,CA +540827552,540827583,GB +540827584,540827647,CA +540827648,540829695,GB +540829696,540829951,CA +540829952,540830623,GB +540830624,540830735,CA +540830736,540830815,GB +540830816,540830831,CA +540830832,540830847,GB +540830848,540830895,CA +540830896,543690751,GB +543690752,543691007,AR +543691008,543844351,GB +543844352,543844607,CH +543844608,553648127,GB +553648128,603979775,US +637534208,654311423,US +671088640,687865855,US +721420288,738197503,JP +738197504,771751935,US +788529152,805306367,CA +805306368,822083583,US +855638016,872415231,GB +872415232,889192447,US +889192448,905969663,DE +905969664,956301311,US +956301312,973078527,FR +973078528,973209599,JP +973209600,973275135,IN +973275136,973471743,JP +973471744,973602815,AU +973602816,973864959,TH +973864960,973996031,JP +973996032,974782463,CN +974782464,974880767,MY +974880768,974913535,PK +974913536,974979071,NZ +974979072,975044607,KR +975044608,977272831,CN +977272832,977305599,TH +977305600,977338367,HK +977338368,977346559,SG +977346560,977354751,JP +977354752,977371135,KR +977371136,977395711,PK +977395712,977397759,BD +977397760,977399807,HK +977399808,977401855,ID +977401856,977403903,AU +977403904,977534975,CN +977534976,977567743,IN +977567744,977600511,CN +977600512,977666047,PH +977666048,977731583,JP +977731584,977764351,PH +977764352,977797119,MY +977797120,978321407,KR +978321408,978452479,JP +978452480,978583551,CN +978583552,978599935,JP +978599936,978640895,AU +978640896,978644991,NZ +978644992,978649087,AU +978649088,978714623,JP +978714624,978780159,TW +978780160,978784255,AU +978784256,978788351,JP +978788352,978796543,KR +978796544,978812927,CN +978812928,979369983,JP +979369984,979435519,AU +979435520,979468287,TH +979468288,979501055,AU +979501056,979566591,JP +979566592,979599359,TW +979599360,979763199,CN +979763200,979894271,KR +979894272,980418559,AU +980418560,980549631,JP +980549632,980680703,TW +980680704,980942847,CN +980942848,981467135,KR +981467136,981991423,CN +981991424,982122495,TH +982122496,982171647,JP +982171648,982188031,KR +982188032,982253567,MY +982253568,982515711,KR +982515712,982581247,CN +982581248,982614015,KR +982614016,982622207,AU +982622208,982624255,JP +982624256,982626303,ID +982626304,982628351,AU +982628352,982630399,BD +982630400,982646783,SG +982646784,982671359,JP +982671360,982679551,IN +982679552,982695935,SG +982695936,982712319,KR +982712320,982745087,TH +982745088,982753279,AF +982753280,982755327,JP +982755328,982757375,BD +982757376,982759423,AU +982759424,982761471,ID +982761472,982777855,JP +982777856,983039999,KR +983040000,983171071,HK +983171072,983302143,CN +983302144,983564287,JP +983564288,984612863,AU +984612864,984743935,HK +984743936,984875007,AU +984875008,984956927,KR +984956928,984965119,AU +984965120,984969215,PK +984969216,984973311,AU +984973312,985006079,TH +985006080,985071615,SG +985071616,985137151,JP +985137152,985202687,KR +985202688,985268223,SG +985268224,985399295,VN +985399296,985661439,JP +985661440,987758591,CN +987758592,988807167,KR +988807168,989855743,CN +989855744,991952895,KR +991952896,995360767,CN +995360768,995532799,JP +995532800,995540991,AU +995540992,995557375,KR +995557376,995622911,JP +995622912,996409343,IN +996409344,996605951,AU +996605952,996671487,PK +996671488,996802559,TW +996802560,996868095,JP +996868096,997195775,CN +997195776,998244351,TW +998244352,999292927,JP +999292928,999423999,IN +999424000,999555071,JP +999555072,999686143,HK +999686144,999751679,KR +999751680,999784447,CN +999784448,999800831,AU +999800832,999817215,KR +999817216,999849983,BD +999849984,999866367,KR +999866368,999882751,HK +999882752,999948287,JP +999948288,1000013823,AU +1000013824,1000079359,CN +1000079360,1000341503,JP +1000341504,1000734719,IN +1000734720,1000800255,JP +1000800256,1000865791,AU +1000865792,1001127935,JP +1001127936,1001390079,CN +1001390080,1002045439,IN +1002045440,1002176511,KR +1002176512,1002242047,HK +1002242048,1002307583,SG +1002307584,1002373119,JP +1002373120,1002405887,CN +1002405888,1002422271,JP +1002422272,1002434559,AU +1002434560,1008730111,CN +1008730112,1009778687,JP +1009778688,1010237439,MY +1010237440,1010302975,CN +1010302976,1010761727,JP +1010761728,1010827263,CN +1010827264,1017118719,JP +1017118720,1019215871,CN +1019215872,1019346943,JP +1019346944,1019478015,CN +1019478016,1019609087,KR +1019609088,1019740159,TW +1019740160,1021313023,CN +1021313024,1021837311,AU +1021837312,1021968383,CN +1021968384,1021986495,NZ +1021986496,1021986559,PA +1021986560,1022033919,NZ +1022033920,1022099455,CN +1022099456,1022361599,JP +1022361600,1022558207,AU +1022558208,1022623743,IN +1022623744,1022722047,TW +1022722048,1022754815,CN +1022754816,1022820351,AU +1022820352,1022885887,CN +1022885888,1023148031,TW +1023148032,1023213567,CN +1023213568,1023238143,AU +1023238144,1023246335,ID +1023246336,1023279103,CN +1023279104,1023311871,IN +1023311872,1023328255,US +1023328256,1023344639,JP +1023344640,1023410175,CN +1023410176,1023672319,IN +1023672320,1023688703,HK +1023688704,1023692799,AU +1023692800,1023693823,CN +1023693824,1023696895,AU +1023696896,1023705087,MY +1023705088,1023717375,JP +1023717376,1023721471,CN +1023721472,1023737855,KR +1023737856,1023770623,ID +1023770624,1023778815,PK +1023778816,1023787007,KR +1023787008,1023791103,AU +1023791104,1023795199,NC +1023795200,1023803391,JP +1023803392,1023852543,MY +1023852544,1023868927,BN +1023868928,1023901695,JP +1023901696,1023934463,TH +1023934464,1023950847,AU +1023950848,1023954943,ID +1023954944,1023959039,JP +1023959040,1023967231,AU +1023967232,1023975423,IN +1023975424,1023979519,CN +1023979520,1023983615,AU +1023983616,1023999999,SG +1024000000,1024032767,PH +1024032768,1024065535,AU +1024065536,1024131071,HK +1024131072,1024163839,IN +1024163840,1024184319,JP +1024184320,1024188415,MY +1024188416,1024196607,AU +1024196608,1024229375,IN +1024229376,1024262143,JP +1024262144,1024327679,SG +1024327680,1024328703,US +1024328704,1024329279,IN +1024329280,1024329343,US +1024329344,1024329471,IN +1024329472,1024329663,US +1024329664,1024329695,IN +1024329696,1024330367,US +1024330368,1024330399,IN +1024330400,1024330751,US +1024330752,1024330759,IN +1024330760,1024331327,US +1024331328,1024331519,IN +1024331520,1024331551,US +1024331552,1024331583,IN +1024331584,1024332287,US +1024332288,1024332415,IN +1024332416,1024332487,US +1024332488,1024332495,IN +1024332496,1024332927,US +1024332928,1024333055,IN +1024333056,1024333247,US +1024333248,1024333311,HK +1024333312,1024333367,US +1024333368,1024333375,IN +1024333376,1024333415,US +1024333416,1024333423,IN +1024333424,1024333791,US +1024333792,1024333823,ID +1024333824,1024333951,US +1024333952,1024334079,IN +1024334080,1024334279,US +1024334280,1024334287,CN +1024334288,1024334727,US +1024334728,1024334735,SG +1024334736,1024334847,US +1024334848,1024334911,PH +1024334912,1024335111,US +1024335112,1024335119,CN +1024335120,1024335143,US +1024335144,1024335151,ID +1024335152,1024335167,JP +1024335168,1024335183,US +1024335184,1024335199,CN +1024335200,1024335263,US +1024335264,1024335271,JP +1024335272,1024335679,US +1024335680,1024335743,IN +1024335744,1024335807,US +1024335808,1024335871,IN +1024335872,1024338311,US +1024338312,1024338319,PH +1024338320,1024338631,US +1024338632,1024338639,MY +1024338640,1024339583,US +1024339584,1024339711,HK +1024339712,1024339967,ID +1024339968,1024340511,US +1024340512,1024340519,TH +1024340520,1024344063,US +1024344064,1024352255,SG +1024352256,1024360447,AU +1024360448,1024360535,HK +1024360536,1024360543,AU +1024360544,1024360607,HK +1024360608,1024360615,AU +1024360616,1024360623,HK +1024360624,1024360631,AU +1024360632,1024360735,HK +1024360736,1024360751,AU +1024360752,1024361007,HK +1024361008,1024361039,AU +1024361040,1024361095,HK +1024361096,1024361103,AU +1024361104,1024361135,HK +1024361136,1024361151,AU +1024361152,1024361183,HK +1024361184,1024361215,AU +1024361216,1024361311,HK +1024361312,1024361327,AU +1024361328,1024361439,HK +1024361440,1024361455,AU +1024361456,1024361471,HK +1024361472,1024361487,TW +1024361488,1024361503,AU +1024361504,1024361567,PH +1024361568,1024361599,AU +1024361600,1024361727,PH +1024361728,1024361759,TW +1024361760,1024361775,PH +1024361776,1024361791,TW +1024361792,1024361807,PH +1024361808,1024362239,TW +1024362240,1024362287,MY +1024362288,1024362303,SG +1024362304,1024362335,MY +1024362336,1024362351,AU +1024362352,1024362399,SG +1024362400,1024362495,AU +1024362496,1024362559,MY +1024362560,1024362575,AU +1024362576,1024362599,MY +1024362600,1024362671,SG +1024362672,1024362687,MY +1024362688,1024362703,AU +1024362704,1024362719,MY +1024362720,1024362735,SG +1024362736,1024362751,AU +1024362752,1024362759,SG +1024362760,1024362767,MY +1024362768,1024362815,AU +1024362816,1024362976,SG +1024362977,1024363007,AU +1024363008,1024363015,SG +1024363016,1024363023,AU +1024363024,1024363039,SG +1024363040,1024363071,AU +1024363072,1024363103,SG +1024363104,1024363111,AU +1024363112,1024363119,SG +1024363120,1024363135,AU +1024363136,1024363199,SG +1024363200,1024363215,MY +1024363216,1024363295,SG +1024363296,1024363319,MY +1024363320,1024363391,SG +1024363392,1024363423,MY +1024363424,1024363439,SG +1024363440,1024363447,MY +1024363448,1024363455,AU +1024363456,1024363519,SG +1024363520,1024363999,AU +1024364000,1024364015,NZ +1024364016,1024364799,AU +1024364800,1024364927,MY +1024364928,1024365823,AU +1024365824,1024366335,PH +1024366336,1024368127,AU +1024368128,1024368383,PH +1024368384,1024368639,AU +1024368640,1024369407,MY +1024369408,1024369663,AU +1024369664,1024369919,PH +1024369920,1024370175,TW +1024370176,1024370687,AU +1024370688,1024371455,PH +1024371456,1024371711,JP +1024371712,1024371967,AU +1024371968,1024372223,JP +1024372224,1024372319,HK +1024372320,1024372351,AU +1024372352,1024372735,HK +1024372736,1024373247,AU +1024373248,1024373503,PH +1024373504,1024373823,AU +1024373824,1024373887,TW +1024373888,1024374079,PH +1024374080,1024374111,TW +1024374112,1024374271,PH +1024374272,1024374783,AU +1024374784,1024374815,JP +1024374816,1024374847,AU +1024374848,1024374879,JP +1024374880,1024374895,AU +1024374896,1024374903,JP +1024374904,1024374911,AU +1024374912,1024374951,JP +1024374952,1024374975,AU +1024374976,1024375103,JP +1024375104,1024375151,AU +1024375152,1024375295,JP +1024375296,1024375807,AU +1024375808,1024375999,TW +1024376000,1024376095,PH +1024376096,1024376111,TW +1024376112,1024376127,PH +1024376128,1024376159,AU +1024376160,1024376191,TW +1024376192,1024376199,PH +1024376200,1024376207,AU +1024376208,1024376223,PH +1024376224,1024376255,AU +1024376256,1024376463,TW +1024376464,1024376471,AU +1024376472,1024376479,TW +1024376480,1024376511,PH +1024376512,1024376703,TW +1024376704,1024376767,PH +1024376768,1024376799,TW +1024376800,1024393215,PH +1024393216,1024458751,HK +1024458752,1024491519,SG +1024491520,1024589823,IN +1024589824,1024655359,HK +1024655360,1024720895,TH +1024720896,1024786431,TW +1024786432,1025245183,JP +1025245184,1025277951,CN +1025277952,1025294335,PH +1025294336,1025294591,JP +1025294592,1025294847,AU +1025294848,1025295103,TH +1025295104,1025295615,CN +1025295616,1025296127,AU +1025296128,1025296639,FR +1025296640,1025296895,MY +1025296896,1025297407,SG +1025297408,1025297919,AU +1025297920,1025298175,NZ +1025298176,1025298943,AU +1025298944,1025299199,AE +1025299200,1025302527,AU +1025302528,1025310719,VN +1025310720,1025343487,AU +1025343488,1025376255,CN +1025376256,1025507327,TW +1025507328,1026293759,KR +1026293760,1026392063,JP +1026392064,1026408447,CN +1026408448,1026416639,JP +1026416640,1026420735,ID +1026420736,1026424831,AU +1026424832,1026490367,JP +1026490368,1026523135,TH +1026523136,1026539519,CN +1026539520,1026555903,KR +1026555904,1027080191,CN +1027080192,1027866623,TW +1027866624,1027997695,AU +1027997696,1028128767,TW +1028128768,1029046271,KR +1029046272,1029144575,JP +1029144576,1029160959,SG +1029160960,1029177343,CN +1029177344,1029242879,AU +1029242880,1029308415,JP +1029308416,1029439487,TH +1029439488,1029570559,HK +1029570560,1029636095,ID +1029636096,1029668863,AU +1029668864,1029701631,IN +1029701632,1030750207,KR +1030750208,1031798783,JP +1031798784,1033982787,CN +1033982788,1033982788,FR +1033982789,1034001207,CN +1034001208,1034001215,FR +1034001216,1035993087,CN +1035993088,1037565951,JP +1037565952,1037591499,TW +1037591500,1037591503,CN +1037591504,1038614527,TW +1038614528,1039007743,CN +1039007744,1039138815,HK +1039138816,1039400959,CN +1039400960,1039466495,HK +1039466496,1039499263,JP +1039499264,1039515647,AU +1039515648,1039523839,JP +1039523840,1039532031,KR +1039532032,1039597567,IN +1039597568,1039613951,ID +1039613952,1039638527,KR +1039638528,1039642623,TW +1039642624,1039646719,AU +1039646720,1039654911,KR +1039654912,1039663103,IN +1039663104,1040187391,KR +1040187392,1040252927,IL +1040252928,1040318463,GR +1040318464,1040383999,CH +1040384000,1040392191,SA +1040392192,1040392447,GB +1040392448,1040399359,SA +1040399360,1040400127,GB +1040400128,1040400383,SA +1040400384,1040416767,GB +1040416768,1040424959,SE +1040424960,1040433151,PL +1040433152,1040449535,GB +1040449536,1040449791,FR +1040449792,1040450047,DE +1040450048,1040457727,FR +1040457728,1040465919,ME +1040465920,1040467071,DE +1040467072,1040467087,FR +1040467088,1040467103,DE +1040467104,1040467135,FR +1040467136,1040467583,DE +1040467584,1040467647,FR +1040467648,1040467711,DE +1040467712,1040467743,FR +1040467744,1040467759,DE +1040467760,1040467823,FR +1040467824,1040467935,DE +1040467936,1040467951,FR +1040467952,1040467967,DE +1040467968,1040468223,FR +1040468224,1040468231,DE +1040468232,1040468255,FR +1040468256,1040468263,DE +1040468264,1040468287,FR +1040468288,1040468415,DE +1040468416,1040468479,FR +1040468480,1040468735,DE +1040468736,1040468767,NL +1040468768,1040468799,DE +1040468800,1040468847,NL +1040468848,1040468863,DE +1040468864,1040468991,NL +1040468992,1040469055,DE +1040469056,1040469071,FR +1040469072,1040469087,DE +1040469088,1040469183,FR +1040469184,1040469215,DE +1040469216,1040469279,FR +1040469280,1040469311,DE +1040469312,1040469343,FR +1040469344,1040469375,DE +1040469376,1040469567,FR +1040469568,1040469631,DE +1040469632,1040469887,FR +1040469888,1040469903,DE +1040469904,1040469919,FR +1040469920,1040469967,DE +1040469968,1040469999,FR +1040470000,1040470783,DE +1040470784,1040471295,NL +1040471296,1040471487,DE +1040471488,1040471711,NL +1040471712,1040471743,DE +1040471744,1040471775,NL +1040471776,1040472991,DE +1040472992,1040473343,NL +1040473344,1040473535,DE +1040473536,1040473599,NL +1040473600,1040473855,DE +1040473856,1040474111,NL +1040474112,1040482303,CZ +1040482304,1040515071,BE +1040515072,1040547839,GB +1040547840,1040580607,RU +1040580608,1040711679,GB +1040711680,1040719871,FR +1040719872,1040728063,DE +1040736256,1040744447,GB +1040744448,1040777215,DE +1040777216,1040842751,IE +1040842752,1040843007,DE +1040843008,1040973823,IT +1040973824,1040982015,NL +1040982016,1040982335,DK +1040982336,1040982351,ZW +1040982352,1040982359,GB +1040982360,1040982399,DK +1040982400,1040982407,CH +1040982408,1040982487,DK +1040982488,1040982495,IQ +1040982496,1040982527,DK +1040982528,1040982551,IQ +1040982552,1040982559,FI +1040982560,1040982615,IQ +1040982616,1040982623,DK +1040982624,1040982631,FI +1040982632,1040982639,DE +1040982640,1040982647,FI +1040982648,1040982655,GB +1040982656,1040982663,DE +1040982664,1040982679,NL +1040982680,1040982687,DK +1040982688,1040982695,FI +1040982696,1040982703,IR +1040982704,1040982743,FI +1040982744,1040982751,EG +1040982752,1040982759,FI +1040982760,1040983055,DK +1040983056,1040983063,IE +1040983064,1040983079,IQ +1040983080,1040983087,FI +1040983088,1040983095,DK +1040983096,1040983127,FI +1040983128,1040983159,DK +1040983160,1040983167,FI +1040983168,1040983295,DK +1040983296,1040983487,IQ +1040983488,1040983551,DK +1040983552,1040983567,NG +1040983568,1040983575,AE +1040983576,1040983583,DK +1040983584,1040983599,PH +1040983600,1040983807,DK +1040983808,1040984063,IQ +1040984064,1040984071,NG +1040984072,1040984103,DK +1040984104,1040984151,NG +1040984152,1040984159,DK +1040984160,1040984167,UG +1040984168,1040984175,DK +1040984176,1040984183,NG +1040984184,1040984191,SD +1040984192,1040984207,NE +1040984208,1040990207,DK +1040990208,1040994303,CY +1040994304,1040994815,RU +1040994816,1040998399,CY +1041006592,1041039359,CH +1041039360,1041051647,SE +1041051648,1041051839,NO +1041051840,1041052159,SE +1041052160,1041052175,NO +1041052176,1041072127,SE +1041072128,1041080319,GB +1041080320,1041088511,IT +1041088512,1041096703,AT +1041096704,1041235967,ES +1041235968,1041244159,UA +1041244160,1041252351,RU +1041252352,1041252863,TJ +1041252864,1041253119,RU +1041253120,1041253375,TJ +1041253376,1041268735,RU +1041268736,1041301503,NO +1041301504,1041301599,IE +1041301600,1041301615,GB +1041301616,1041301887,IE +1041301888,1041301919,GB +1041301920,1041302015,IE +1041302016,1041302271,GB +1041302272,1041302303,IE +1041302304,1041302319,GB +1041302320,1041305887,IE +1041305888,1041305903,GB +1041305904,1041305919,IE +1041305920,1041305983,GB +1041305984,1041306031,IE +1041306032,1041306063,GB +1041306064,1041306399,IE +1041306400,1041306495,GB +1041306496,1041306511,IE +1041306512,1041306527,GB +1041306528,1041306607,IE +1041306608,1041306671,GB +1041306672,1041306751,IE +1041306752,1041306815,GB +1041306816,1041307503,IE +1041307504,1041307519,GB +1041307520,1041307551,IE +1041307552,1041307599,GB +1041307600,1041308031,IE +1041308032,1041308063,GB +1041308064,1041308287,IE +1041308288,1041308303,GB +1041308304,1041308335,IE +1041308336,1041308343,GB +1041308344,1041308415,IE +1041308416,1041308671,GB +1041308672,1041310063,IE +1041310064,1041310079,GB +1041310080,1041310511,IE +1041310512,1041310527,GB +1041310528,1041334271,IE +1041334272,1041334527,GB +1041334528,1041334783,IE +1041334784,1041335039,GB +1041335040,1041335295,IE +1041335296,1041335327,GB +1041335328,1041335343,IE +1041335344,1041335359,GB +1041335360,1041335519,IE +1041335520,1041335535,GB +1041335536,1041335551,IE +1041335552,1041335807,GB +1041335808,1041335839,IE +1041335840,1041335871,GB +1041335872,1041335887,IE +1041335888,1041335895,GB +1041335896,1041335935,IE +1041335936,1041335967,GB +1041335968,1041336015,IE +1041336016,1041336031,GB +1041336032,1041336063,IE +1041336064,1041336127,GB +1041336128,1041336207,IE +1041336208,1041336223,GB +1041336224,1041336303,IE +1041336304,1041336319,GB +1041336320,1041337471,IE +1041337472,1041337487,GB +1041337488,1041337663,IE +1041337664,1041337695,GB +1041337696,1041337727,IE +1041337728,1041337791,GB +1041337792,1041337855,IE +1041337856,1041337887,GB +1041337888,1041337919,IE +1041337920,1041337935,GB +1041337936,1041337999,IE +1041338000,1041338015,GB +1041338016,1041338031,IE +1041338032,1041338111,GB +1041338112,1041338751,IE +1041338752,1041338815,GB +1041338816,1041338831,IE +1041338832,1041338847,GB +1041338848,1041338879,IE +1041338880,1041338895,GB +1041338896,1041338943,IE +1041338944,1041339007,GB +1041339008,1041339087,IE +1041339088,1041339119,GB +1041339120,1041339263,IE +1041339264,1041339327,GB +1041339328,1041339359,IE +1041339360,1041339391,GB +1041339392,1041339423,IE +1041339424,1041339439,GB +1041339440,1041339519,IE +1041339520,1041339535,GB +1041339536,1041339679,IE +1041339680,1041339711,GB +1041339712,1041339935,IE +1041339936,1041339967,GB +1041339968,1041339983,IE +1041339984,1041339999,GB +1041340000,1041340063,IE +1041340064,1041340079,GB +1041340080,1041340111,IE +1041340112,1041340127,GB +1041340128,1041340191,IE +1041340192,1041340223,GB +1041340224,1041340255,IE +1041340256,1041340271,GB +1041340272,1041340319,IE +1041340320,1041340335,GB +1041340336,1041340367,IE +1041340368,1041340383,GB +1041340384,1041340447,IE +1041340448,1041340463,GB +1041340464,1041340559,IE +1041340560,1041340607,GB +1041340608,1041340639,IE +1041340640,1041340671,GB +1041340672,1041340735,IE +1041340736,1041340751,GB +1041340752,1041340799,IE +1041340800,1041340863,GB +1041340864,1041340991,IE +1041340992,1041341007,GB +1041341008,1041341151,IE +1041341152,1041341183,GB +1041341184,1041341231,IE +1041341232,1041341247,GB +1041341248,1041341295,IE +1041341296,1041341343,GB +1041341344,1041341855,IE +1041341856,1041341887,GB +1041341888,1041341919,IE +1041341920,1041341935,GB +1041341936,1041342063,IE +1041342064,1041342079,GB +1041342080,1041342207,IE +1041342208,1041342223,GB +1041342224,1041342239,IE +1041342240,1041342255,GB +1041342256,1041342271,IE +1041342272,1041342287,GB +1041342288,1041342383,IE +1041342384,1041342415,GB +1041342416,1041342431,IE +1041342432,1041342463,GB +1041342464,1041342479,IE +1041342480,1041342511,GB +1041342512,1041342543,IE +1041342544,1041342575,GB +1041342576,1041342591,IE +1041342592,1041342607,GB +1041342608,1041342975,IE +1041342976,1041343023,GB +1041343024,1041343055,IE +1041343056,1041343167,GB +1041343168,1041343487,IE +1041343488,1041343743,GB +1041343744,1041344111,IE +1041344112,1041344159,GB +1041344160,1041344191,IE +1041344192,1041344207,GB +1041344208,1041344255,IE +1041344256,1041344511,GB +1041344512,1041344607,IE +1041344608,1041344639,GB +1041344640,1041344687,IE +1041344688,1041344719,GB +1041344720,1041344799,IE +1041344800,1041344831,GB +1041344832,1041344895,IE +1041344896,1041344927,GB +1041344928,1041345551,IE +1041345552,1041345583,GB +1041345584,1041345599,IE +1041345600,1041345631,GB +1041345632,1041345647,IE +1041345648,1041345663,GB +1041345664,1041345759,IE +1041345760,1041345767,GB +1041345768,1041345775,IE +1041345776,1041345791,GB +1041345792,1041346047,IE +1041346048,1041346079,GB +1041346080,1041346095,IE +1041346096,1041346119,GB +1041346120,1041346135,IE +1041346136,1041346143,GB +1041346144,1041346151,IE +1041346152,1041346159,GB +1041346160,1041346207,IE +1041346208,1041346215,GB +1041346216,1041346255,IE +1041346256,1041346263,GB +1041346264,1041347071,IE +1041347072,1041347391,GB +1041347392,1041358047,IE +1041358048,1041358079,GB +1041358080,1041362959,IE +1041362960,1041362975,GB +1041362976,1041363007,IE +1041363008,1041363023,GB +1041363024,1041363167,IE +1041363168,1041363455,GB +1041363456,1041363711,IE +1041363712,1041363751,GB +1041363752,1041363759,IE +1041363760,1041363775,GB +1041363776,1041363839,IE +1041363840,1041363871,GB +1041363872,1041364495,IE +1041364496,1041364575,GB +1041364576,1041364607,IE +1041364608,1041364735,GB +1041364736,1041365039,IE +1041365040,1041365055,GB +1041365056,1041365087,IE +1041365088,1041365103,GB +1041365104,1041365151,IE +1041365152,1041365167,GB +1041365168,1041365199,IE +1041365200,1041365247,GB +1041365248,1041365503,IE +1041365504,1041365743,GB +1041365744,1041366031,IE +1041366032,1041366079,GB +1041366080,1041366119,IE +1041366120,1041366127,GB +1041366128,1041366143,IE +1041366144,1041366207,GB +1041366208,1041366271,IE +1041366272,1041366527,GB +1041366528,1041367039,IE +1041367040,1041498111,GB +1041498112,1041563647,SE +1041563648,1041596415,PL +1041596416,1041629183,NL +1041629184,1041633103,ES +1041633104,1041633119,GB +1041633120,1041694719,ES +1041694720,1041694895,FR +1041694896,1041694911,GB +1041694912,1041694919,FR +1041694920,1041694943,GB +1041694944,1041694959,FR +1041694960,1041694975,GB +1041694976,1041695455,FR +1041695456,1041695487,GB +1041695488,1041695551,FR +1041695552,1041695567,GB +1041695568,1041695615,FR +1041695616,1041695703,GB +1041695704,1041695711,FR +1041695712,1041695743,GB +1041695744,1041695759,FR +1041695760,1041696023,GB +1041696024,1041696415,FR +1041696416,1041696431,GB +1041696432,1041697151,FR +1041697152,1041697155,GB +1041697156,1041697183,FR +1041697184,1041697199,GB +1041697200,1041697391,FR +1041697392,1041697407,GB +1041697408,1041697663,FR +1041697664,1041697671,GB +1041697672,1041697699,FR +1041697700,1041697703,GB +1041697704,1041697815,FR +1041697816,1041697823,GB +1041697824,1041697855,FR +1041697856,1041697863,GB +1041697864,1041697895,FR +1041697896,1041697903,GB +1041697904,1041697919,FR +1041697920,1041697983,GB +1041697984,1041698127,FR +1041698128,1041698143,GB +1041698144,1041698247,FR +1041698248,1041698255,GB +1041698256,1041698263,FR +1041698264,1041698271,GB +1041698272,1041698287,FR +1041698288,1041698303,GB +1041698304,1041698591,FR +1041698592,1041698607,GB +1041698608,1041698647,FR +1041698648,1041698663,GB +1041698664,1041698807,FR +1041698808,1041698815,GB +1041698816,1041699263,FR +1041699264,1041699271,GB +1041699272,1041699287,FR +1041699288,1041699295,GB +1041699296,1041699583,FR +1041699584,1041699591,IT +1041699592,1041699615,GB +1041699616,1041699623,FR +1041699624,1041699631,GB +1041699632,1041699767,FR +1041699768,1041699807,GB +1041699808,1041700359,FR +1041700360,1041700607,GB +1041700608,1041700863,FR +1041700864,1041700895,GB +1041700896,1041700919,FR +1041700920,1041700927,GB +1041700928,1041700959,FR +1041700960,1041700967,GB +1041700968,1041700983,FR +1041700984,1041700991,GB +1041700992,1041701119,FR +1041701120,1041701151,GB +1041701152,1041701175,FR +1041701176,1041701231,GB +1041701232,1041701239,FR +1041701240,1041701247,GB +1041701248,1041701279,FR +1041701280,1041701551,GB +1041701552,1041701567,FR +1041701568,1041701631,GB +1041701632,1041701639,FR +1041701640,1041701647,GB +1041701648,1041701727,FR +1041701728,1041701735,GB +1041701736,1041701783,FR +1041701784,1041701791,GB +1041701792,1041701831,FR +1041701832,1041701847,GB +1041701848,1041701863,FR +1041701864,1041701871,GB +1041701872,1041701887,FR +1041701888,1041701919,GB +1041701920,1041701967,FR +1041701968,1041701975,GB +1041701976,1041702111,FR +1041702112,1041702143,GB +1041702144,1041702183,FR +1041702184,1041702191,GB +1041702192,1041702303,FR +1041702304,1041702311,GB +1041702312,1041702319,FR +1041702320,1041702335,GB +1041702336,1041702351,FR +1041702352,1041702623,GB +1041702624,1041702639,FR +1041702640,1041702655,GB +1041702656,1041702719,FR +1041702720,1041703143,GB +1041703144,1041703147,FR +1041703148,1041703167,GB +1041703168,1041703471,FR +1041703472,1041703503,GB +1041703504,1041703511,FR +1041703512,1041703535,GB +1041703536,1041703551,FR +1041703552,1041703583,GB +1041703584,1041703631,FR +1041703632,1041703639,GB +1041703640,1041703719,FR +1041703720,1041703775,GB +1041703776,1041703783,FR +1041703784,1041703807,GB +1041703808,1041703951,FR +1041703952,1041703967,GB +1041703968,1041703991,FR +1041703992,1041703999,GB +1041704000,1041704015,FR +1041704016,1041704039,GB +1041704040,1041704111,FR +1041704112,1041704143,GB +1041704144,1041704159,FR +1041704160,1041704175,GB +1041704176,1041704255,FR +1041704256,1041704271,GB +1041704272,1041704319,FR +1041704320,1041704335,GB +1041704336,1041704399,FR +1041704400,1041704431,GB +1041704432,1041704447,FR +1041704448,1041704455,GB +1041704456,1041704463,FR +1041704464,1041704487,GB +1041704488,1041704503,FR +1041704504,1041704575,GB +1041704576,1041704607,FR +1041704608,1041704623,GB +1041704624,1041704647,FR +1041704648,1041704655,GB +1041704656,1041704671,FR +1041704672,1041704687,GB +1041704688,1041704703,FR +1041704704,1041704711,GB +1041704712,1041704743,FR +1041704744,1041704759,GB +1041704760,1041704775,FR +1041704776,1041704783,GB +1041704784,1041704807,FR +1041704808,1041704863,GB +1041704864,1041704879,FR +1041704880,1041704887,GB +1041704888,1041704911,FR +1041704912,1041704927,GB +1041704928,1041705247,FR +1041705248,1041705279,GB +1041705280,1041705303,FR +1041705304,1041705311,GB +1041705312,1041705343,FR +1041705344,1041705367,GB +1041705368,1041705391,FR +1041705392,1041705439,GB +1041705440,1041705447,FR +1041705448,1041705463,GB +1041705464,1041705471,FR +1041705472,1041705495,GB +1041705496,1041705511,FR +1041705512,1041705519,GB +1041705520,1041705527,FR +1041705528,1041705535,GB +1041705536,1041705599,FR +1041705600,1041705663,GB +1041705664,1041705727,FR +1041705728,1041705815,GB +1041705816,1041705871,FR +1041705872,1041705919,GB +1041705920,1041705935,FR +1041705936,1041705983,GB +1041705984,1041705999,FR +1041706000,1041706007,GB +1041706008,1041706047,FR +1041706048,1041706079,GB +1041706080,1041706087,FR +1041706088,1041706095,GB +1041706096,1041706111,FR +1041706112,1041706143,GB +1041706144,1041706191,FR +1041706192,1041706287,GB +1041706288,1041706319,FR +1041706320,1041706343,GB +1041706344,1041706359,FR +1041706360,1041706367,GB +1041706368,1041706447,FR +1041706448,1041706463,GB +1041706464,1041706471,FR +1041706472,1041706487,GB +1041706488,1041706495,FR +1041706496,1041706511,GB +1041706512,1041706535,FR +1041706536,1041706543,GB +1041706544,1041706559,FR +1041706560,1041706575,GB +1041706576,1041706583,FR +1041706584,1041706591,GB +1041706592,1041706623,FR +1041706624,1041706631,GB +1041706632,1041706767,FR +1041706768,1041706799,GB +1041706800,1041706815,FR +1041706816,1041706847,GB +1041706848,1041706871,FR +1041706872,1041706879,GB +1041706880,1041706951,FR +1041706952,1041706975,GB +1041706976,1041706983,FR +1041706984,1041706991,GB +1041706992,1041706999,FR +1041707000,1041707007,GB +1041707008,1041707271,FR +1041707272,1041707279,GB +1041707280,1041707311,FR +1041707312,1041707319,GB +1041707320,1041707359,FR +1041707360,1041707367,GB +1041707368,1041707391,FR +1041707392,1041707415,GB +1041707416,1041707439,FR +1041707440,1041707463,GB +1041707464,1041707487,FR +1041707488,1041707495,GB +1041707496,1041707575,FR +1041707576,1041707583,GB +1041707584,1041707615,FR +1041707616,1041707631,GB +1041707632,1041707647,FR +1041707648,1041707655,GB +1041707656,1041707679,FR +1041707680,1041707695,GB +1041707696,1041707711,FR +1041707712,1041707743,GB +1041707744,1041707831,FR +1041707832,1041707839,GB +1041707840,1041707871,FR +1041707872,1041707887,GB +1041707888,1041707895,FR +1041707896,1041707903,GB +1041707904,1041707999,FR +1041708000,1041708007,GB +1041708008,1041708295,FR +1041708296,1041708303,GB +1041708304,1041708311,FR +1041708312,1041708319,GB +1041708320,1041708327,FR +1041708328,1041708351,GB +1041708352,1041708367,FR +1041708368,1041708383,GB +1041708384,1041708415,FR +1041708416,1041708431,GB +1041708432,1041708479,FR +1041708480,1041708487,GB +1041708488,1041708495,FR +1041708496,1041708511,GB +1041708512,1041708551,FR +1041708552,1041708559,GB +1041708560,1041708607,FR +1041708608,1041708615,GB +1041708616,1041708671,FR +1041708672,1041708687,GB +1041708688,1041708703,FR +1041708704,1041708735,GB +1041708736,1041708799,FR +1041708800,1041708815,GB +1041708816,1041708831,FR +1041708832,1041708839,GB +1041708840,1041708847,FR +1041708848,1041708855,GB +1041708856,1041708903,FR +1041708904,1041708911,GB +1041708912,1041708927,FR +1041708928,1041708943,GB +1041708944,1041708991,FR +1041708992,1041708999,GB +1041709000,1041709023,FR +1041709024,1041709055,GB +1041709056,1041709343,FR +1041709344,1041709375,GB +1041709376,1041709463,FR +1041709464,1041709471,GB +1041709472,1041709767,FR +1041709768,1041709775,GB +1041709776,1041709823,FR +1041709824,1041709831,GB +1041709832,1041709919,FR +1041709920,1041709927,GB +1041709928,1041709935,FR +1041709936,1041709943,GB +1041709944,1041709951,FR +1041709952,1041709983,GB +1041709984,1041709991,FR +1041709992,1041709999,GB +1041710000,1041710007,FR +1041710008,1041710015,GB +1041710016,1041710047,FR +1041710048,1041710055,GB +1041710056,1041710063,FR +1041710064,1041710079,GB +1041710080,1041710343,FR +1041710344,1041710359,GB +1041710360,1041710367,FR +1041710368,1041710383,GB +1041710384,1041710391,FR +1041710392,1041710407,GB +1041710408,1041710423,FR +1041710424,1041710431,GB +1041710432,1041710439,FR +1041710440,1041710447,GB +1041710448,1041710471,FR +1041710472,1041710487,GB +1041710488,1041710503,FR +1041710504,1041710511,GB +1041710512,1041710535,FR +1041710536,1041710543,GB +1041710544,1041710559,FR +1041710560,1041710567,GB +1041710568,1041710575,FR +1041710576,1041710583,GB +1041710584,1041710663,FR +1041710664,1041710671,GB +1041710672,1041710687,FR +1041710688,1041710695,GB +1041710696,1041710703,FR +1041710704,1041710711,GB +1041710712,1041710719,FR +1041710720,1041710727,GB +1041710728,1041710735,FR +1041710736,1041710743,GB +1041710744,1041710775,FR +1041710776,1041710783,GB +1041710784,1041710807,FR +1041710808,1041710815,GB +1041710816,1041711367,FR +1041711368,1041711375,GB +1041711376,1041711423,FR +1041711424,1041711439,GB +1041711440,1041711455,FR +1041711456,1041711463,GB +1041711464,1041711471,FR +1041711472,1041711519,GB +1041711520,1041711535,FR +1041711536,1041711567,GB +1041711568,1041711583,FR +1041711584,1041711599,GB +1041711600,1041711887,FR +1041711888,1041711903,GB +1041711904,1041711911,FR +1041711912,1041711927,GB +1041711928,1041711935,FR +1041711936,1041711951,GB +1041711952,1041711967,FR +1041711968,1041711983,GB +1041711984,1041712447,FR +1041712448,1041712463,GB +1041712464,1041712911,FR +1041712912,1041712919,GB +1041712920,1041712927,FR +1041712928,1041712943,GB +1041712944,1041712991,FR +1041712992,1041712999,GB +1041713000,1041713007,FR +1041713008,1041713015,GB +1041713016,1041713023,FR +1041713024,1041713031,GB +1041713032,1041713055,FR +1041713056,1041713063,GB +1041713064,1041713079,FR +1041713080,1041713087,GB +1041713088,1041713119,FR +1041713120,1041713135,GB +1041713136,1041713143,FR +1041713144,1041713151,GB +1041713152,1041713663,FR +1041713664,1041713695,GB +1041713696,1041713791,FR +1041713792,1041713799,GB +1041713800,1041713823,FR +1041713824,1041713831,GB +1041713832,1041713839,FR +1041713840,1041713855,GB +1041713856,1041713871,FR +1041713872,1041713887,GB +1041713888,1041713919,FR +1041713920,1041713951,GB +1041713952,1041713991,FR +1041713992,1041713999,GB +1041714000,1041714047,FR +1041714048,1041714063,GB +1041714064,1041714071,FR +1041714072,1041714079,GB +1041714080,1041714095,FR +1041714096,1041714103,GB +1041714104,1041714431,FR +1041714432,1041714439,GB +1041714440,1041714447,FR +1041714448,1041714455,GB +1041714456,1041714519,FR +1041714520,1041714527,GB +1041714528,1041714543,FR +1041714544,1041714551,GB +1041714552,1041714559,FR +1041714560,1041714575,GB +1041714576,1041714623,FR +1041714624,1041714687,GB +1041714688,1041714711,FR +1041714712,1041714727,GB +1041714728,1041714767,FR +1041714768,1041714783,GB +1041714784,1041714815,FR +1041714816,1041714879,GB +1041714880,1041714911,FR +1041714912,1041714919,GB +1041714920,1041714943,FR +1041714944,1041715039,GB +1041715040,1041715055,FR +1041715056,1041715071,GB +1041715072,1041715079,FR +1041715080,1041715087,GB +1041715088,1041715103,FR +1041715104,1041715111,GB +1041715112,1041715119,FR +1041715120,1041715143,GB +1041715144,1041715151,FR +1041715152,1041715167,GB +1041715168,1041715183,FR +1041715184,1041715199,GB +1041715200,1041715503,FR +1041715504,1041715535,GB +1041715536,1041715551,FR +1041715552,1041715567,GB +1041715568,1041715583,FR +1041715584,1041715615,GB +1041715616,1041715631,FR +1041715632,1041715647,GB +1041715648,1041715711,FR +1041715712,1041715727,GB +1041715728,1041715743,FR +1041715744,1041715775,GB +1041715776,1041715791,FR +1041715792,1041715823,GB +1041715824,1041715863,FR +1041715864,1041715911,GB +1041715912,1041715943,FR +1041715944,1041715951,GB +1041715952,1041715967,FR +1041715968,1041716015,GB +1041716016,1041716039,FR +1041716040,1041716063,GB +1041716064,1041716111,FR +1041716112,1041716223,GB +1041716224,1041716255,FR +1041716256,1041716287,GB +1041716288,1041716303,FR +1041716304,1041716319,GB +1041716320,1041716335,FR +1041716336,1041716343,GB +1041716344,1041716383,FR +1041716384,1041716399,GB +1041716400,1041716407,FR +1041716408,1041716415,GB +1041716416,1041716487,FR +1041716488,1041716527,GB +1041716528,1041716559,FR +1041716560,1041716607,GB +1041716608,1041716671,FR +1041716672,1041716703,GB +1041716704,1041716991,FR +1041716992,1041717007,GB +1041717008,1041717039,FR +1041717040,1041717103,GB +1041717104,1041717111,FR +1041717112,1041717119,GB +1041717120,1041717167,FR +1041717168,1041717183,GB +1041717184,1041717199,FR +1041717200,1041717247,GB +1041717248,1041717519,FR +1041717520,1041717527,GB +1041717528,1041717559,FR +1041717560,1041717567,GB +1041717568,1041717687,FR +1041717688,1041717695,GB +1041717696,1041718023,FR +1041718024,1041718031,GB +1041718032,1041718055,FR +1041718056,1041718063,GB +1041718064,1041718079,FR +1041718080,1041718095,GB +1041718096,1041718103,FR +1041718104,1041718111,GB +1041718112,1041718143,FR +1041718144,1041718159,GB +1041718160,1041718191,FR +1041718192,1041718215,GB +1041718216,1041718231,FR +1041718232,1041718255,GB +1041718256,1041718271,FR +1041718272,1041718311,GB +1041718312,1041718319,FR +1041718320,1041718327,GB +1041718328,1041718335,FR +1041718336,1041718351,GB +1041718352,1041718407,FR +1041718408,1041718455,GB +1041718456,1041718463,FR +1041718464,1041718479,GB +1041718480,1041718495,FR +1041718496,1041718503,GB +1041718504,1041718591,FR +1041718592,1041718607,GB +1041718608,1041718623,FR +1041718624,1041718639,GB +1041718640,1041718663,FR +1041718664,1041718671,GB +1041718672,1041718687,FR +1041718688,1041718703,GB +1041718704,1041718783,FR +1041718784,1041718799,GB +1041718800,1041718815,FR +1041718816,1041718831,GB +1041718832,1041718879,FR +1041718880,1041718911,GB +1041718912,1041718935,FR +1041718936,1041718943,GB +1041718944,1041718975,FR +1041718976,1041718991,GB +1041718992,1041718999,FR +1041719000,1041719007,GB +1041719008,1041719203,FR +1041719204,1041719207,GB +1041719208,1041719224,FR +1041719225,1041719227,GB +1041719228,1041719228,FR +1041719229,1041719231,GB +1041719232,1041719247,FR +1041719248,1041719255,GB +1041719256,1041719272,FR +1041719273,1041719279,GB +1041719280,1041719375,FR +1041719376,1041719407,GB +1041719408,1041719439,FR +1041719440,1041719487,GB +1041719488,1041719559,FR +1041719560,1041719567,GB +1041719568,1041719583,FR +1041719584,1041719631,GB +1041719632,1041719647,FR +1041719648,1041719663,GB +1041719664,1041719679,FR +1041719680,1041719711,GB +1041719712,1041719743,FR +1041719744,1041719759,GB +1041719760,1041719807,FR +1041719808,1041719855,GB +1041719856,1041719879,FR +1041719880,1041719903,GB +1041719904,1041719919,FR +1041719920,1041719935,GB +1041719936,1041719951,FR +1041719952,1041719967,GB +1041719968,1041720015,FR +1041720016,1041720031,GB +1041720032,1041720079,FR +1041720080,1041720087,GB +1041720088,1041720351,FR +1041720352,1041720367,GB +1041720368,1041720519,FR +1041720520,1041720527,GB +1041720528,1041720535,FR +1041720536,1041720543,GB +1041720544,1041720551,FR +1041720552,1041720559,GB +1041720560,1041720567,FR +1041720568,1041720607,GB +1041720608,1041720615,FR +1041720616,1041720639,GB +1041720640,1041720687,FR +1041720688,1041720703,GB +1041720704,1041720719,FR +1041720720,1041720735,GB +1041720736,1041720751,FR +1041720752,1041720767,GB +1041720768,1041720831,FR +1041720832,1041720847,GB +1041720848,1041720895,FR +1041720896,1041720927,GB +1041720928,1041720959,FR +1041720960,1041721007,GB +1041721008,1041721023,FR +1041721024,1041721087,GB +1041721088,1041721343,FR +1041721344,1041721375,GB +1041721376,1041721391,FR +1041721392,1041721439,GB +1041721440,1041721519,FR +1041721520,1041721599,GB +1041721600,1041721727,FR +1041721728,1041721791,GB +1041721792,1041721807,FR +1041721808,1041721855,GB +1041721856,1041722119,FR +1041722120,1041722127,GB +1041722128,1041722135,FR +1041722136,1041722191,GB +1041722192,1041722223,FR +1041722224,1041722279,GB +1041722280,1041722287,FR +1041722288,1041722383,GB +1041722384,1041722391,FR +1041722392,1041722399,GB +1041722400,1041722415,FR +1041722416,1041722431,GB +1041722432,1041722463,FR +1041722464,1041722511,GB +1041722512,1041722535,FR +1041722536,1041722551,GB +1041722552,1041722567,FR +1041722568,1041722575,GB +1041722576,1041722583,FR +1041722584,1041722623,GB +1041722624,1041722655,FR +1041722656,1041722663,GB +1041722664,1041722855,FR +1041722856,1041722863,GB +1041722864,1041722879,FR +1041722880,1041722887,GB +1041722888,1041722927,FR +1041722928,1041722935,GB +1041722936,1041722943,FR +1041722944,1041723007,GB +1041723008,1041723031,FR +1041723032,1041723135,GB +1041723136,1041723167,FR +1041723168,1041723175,GB +1041723176,1041723191,FR +1041723192,1041723199,GB +1041723200,1041723207,FR +1041723208,1041723215,GB +1041723216,1041723295,FR +1041723296,1041723391,GB +1041723392,1041723711,FR +1041723712,1041723903,GB +1041723904,1041724463,FR +1041724464,1041724479,GB +1041724480,1041724511,FR +1041724512,1041724527,GB +1041724528,1041724591,FR +1041724592,1041724607,GB +1041724608,1041724671,FR +1041724672,1041724927,GB +1041724928,1041725007,FR +1041725008,1041725023,GB +1041725024,1041725031,FR +1041725032,1041725039,GB +1041725040,1041725135,FR +1041725136,1041725167,GB +1041725168,1041725183,FR +1041725184,1041725231,GB +1041725232,1041725255,FR +1041725256,1041725271,GB +1041725272,1041725343,FR +1041725344,1041725407,GB +1041725408,1041725703,FR +1041725704,1041725711,GB +1041725712,1041725799,FR +1041725800,1041725807,GB +1041725808,1041725815,FR +1041725816,1041725823,GB +1041725824,1041725983,FR +1041725984,1041725999,GB +1041726000,1041726063,FR +1041726064,1041726079,GB +1041726080,1041726127,FR +1041726128,1041726151,GB +1041726152,1041726159,FR +1041726160,1041726167,GB +1041726168,1041726463,FR +1041726464,1041726471,GB +1041726472,1041726479,FR +1041726480,1041726543,GB +1041726544,1041726559,FR +1041726560,1041726591,GB +1041726592,1041726647,FR +1041726648,1041726655,GB +1041726656,1041726671,FR +1041726672,1041726687,GB +1041726688,1041726735,FR +1041726736,1041726751,GB +1041726752,1041726847,FR +1041726848,1041726855,GB +1041726856,1041726879,FR +1041726880,1041726903,GB +1041726904,1041727239,FR +1041727240,1041727247,GB +1041727248,1041727487,FR +1041727488,1041727999,GB +1041728000,1041728063,FR +1041728064,1041728095,GB +1041728096,1041728111,FR +1041728112,1041728127,GB +1041728128,1041728255,FR +1041728256,1041728511,GB +1041728512,1041728887,FR +1041728888,1041728895,GB +1041728896,1041729023,FR +1041729024,1041729391,GB +1041729392,1041729431,FR +1041729432,1041729463,GB +1041729464,1041729503,FR +1041729504,1041729535,GB +1041729536,1041729561,FR +1041729562,1041729564,GB +1041729565,1041729566,FR +1041729567,1041729567,GB +1041729568,1041729615,FR +1041729616,1041729631,GB +1041729632,1041729663,FR +1041729664,1041729839,GB +1041729840,1041729871,FR +1041729872,1041729887,GB +1041729888,1041729927,FR +1041729928,1041730015,GB +1041730016,1041730031,FR +1041730032,1041730047,GB +1041730048,1041730087,FR +1041730088,1041730095,GB +1041730096,1041730175,FR +1041730176,1041730183,GB +1041730184,1041730239,FR +1041730240,1041730247,GB +1041730248,1041730639,FR +1041730640,1041730655,GB +1041730656,1041731903,FR +1041731904,1041731935,GB +1041731936,1041731967,FR +1041731968,1041732031,GB +1041732032,1041732055,FR +1041732056,1041732063,GB +1041732064,1041732095,FR +1041732096,1041732111,GB +1041732112,1041732119,FR +1041732120,1041732191,GB +1041732192,1041732255,FR +1041732256,1041732295,GB +1041732296,1041732351,FR +1041732352,1041732359,GB +1041732360,1041732447,FR +1041732448,1041732455,GB +1041732456,1041732463,FR +1041732464,1041732511,GB +1041732512,1041732863,FR +1041732864,1041732871,GB +1041732872,1041732879,FR +1041732880,1041732927,GB +1041732928,1041732959,FR +1041732960,1041732967,GB +1041732968,1041732991,FR +1041732992,1041733111,GB +1041733112,1041733375,FR +1041733376,1041733535,GB +1041733536,1041733887,FR +1041733888,1041734143,GB +1041734144,1041734911,FR +1041734912,1041735007,GB +1041735008,1041735055,FR +1041735056,1041735087,GB +1041735088,1041735119,FR +1041735120,1041735135,GB +1041735136,1041735423,FR +1041735424,1041735503,GB +1041735504,1041735511,FR +1041735512,1041735559,GB +1041735560,1041735567,FR +1041735568,1041735583,GB +1041735584,1041735615,FR +1041735616,1041735679,GB +1041735680,1041736191,FR +1041736192,1041736199,GB +1041736200,1041736255,FR +1041736256,1041736263,GB +1041736264,1041736367,FR +1041736368,1041736391,GB +1041736392,1041736423,FR +1041736424,1041736463,GB +1041736464,1041736503,FR +1041736504,1041736511,GB +1041736512,1041736527,FR +1041736528,1041736535,GB +1041736536,1041736543,FR +1041736544,1041736551,GB +1041736552,1041736567,FR +1041736568,1041736599,GB +1041736600,1041736607,FR +1041736608,1041736631,GB +1041736632,1041736671,FR +1041736672,1041736703,GB +1041736704,1041737023,FR +1041737024,1041737031,GB +1041737032,1041737039,FR +1041737040,1041737047,GB +1041737048,1041737063,FR +1041737064,1041737119,GB +1041737120,1041737127,FR +1041737128,1041737135,GB +1041737136,1041737143,FR +1041737144,1041737151,GB +1041737152,1041737247,FR +1041737248,1041737279,GB +1041737280,1041737295,FR +1041737296,1041737303,GB +1041737304,1041737399,FR +1041737400,1041737423,GB +1041737424,1041737455,FR +1041737456,1041737471,GB +1041737472,1041737503,FR +1041737504,1041737535,GB +1041737536,1041737583,FR +1041737584,1041737599,GB +1041737600,1041737607,FR +1041737608,1041737615,GB +1041737616,1041737623,FR +1041737624,1041737631,GB +1041737632,1041737647,FR +1041737648,1041737663,GB +1041737664,1041737671,FR +1041737672,1041737679,GB +1041737680,1041737727,FR +1041737728,1041737759,GB +1041737760,1041737775,FR +1041737776,1041737839,GB +1041737840,1041737847,FR +1041737848,1041737863,GB +1041737864,1041737871,FR +1041737872,1041737879,GB +1041737880,1041737911,FR +1041737912,1041737935,GB +1041737936,1041738159,FR +1041738160,1041738167,GB +1041738168,1041738503,FR +1041738504,1041738511,GB +1041738512,1041738519,FR +1041738520,1041738559,GB +1041738560,1041738567,FR +1041738568,1041738575,GB +1041738576,1041738583,FR +1041738584,1041738591,GB +1041738592,1041738599,FR +1041738600,1041738607,GB +1041738608,1041738703,FR +1041738704,1041738711,GB +1041738712,1041738719,FR +1041738720,1041738743,GB +1041738744,1041739031,FR +1041739032,1041739047,GB +1041739048,1041739055,FR +1041739056,1041739063,GB +1041739064,1041739071,FR +1041739072,1041739095,GB +1041739096,1041739119,FR +1041739120,1041739175,GB +1041739176,1041739183,FR +1041739184,1041739207,GB +1041739208,1041739215,FR +1041739216,1041739239,GB +1041739240,1041739287,FR +1041739288,1041739303,GB +1041739304,1041739311,FR +1041739312,1041739319,GB +1041739320,1041739375,FR +1041739376,1041739383,GB +1041739384,1041739391,FR +1041739392,1041739423,GB +1041739424,1041739463,FR +1041739464,1041739471,GB +1041739472,1041739487,FR +1041739488,1041739503,GB +1041739504,1041739519,FR +1041739520,1041739535,GB +1041739536,1041739743,FR +1041739744,1041739751,GB +1041739752,1041740031,FR +1041740032,1041740039,GB +1041740040,1041740263,FR +1041740264,1041740271,GB +1041740272,1041740591,FR +1041740592,1041740607,GB +1041740608,1041740647,FR +1041740648,1041740655,GB +1041740656,1041740679,FR +1041740680,1041740719,GB +1041740720,1041740727,FR +1041740728,1041740735,GB +1041740736,1041740759,FR +1041740760,1041740767,GB +1041740768,1041740839,FR +1041740840,1041740847,GB +1041740848,1041740863,FR +1041740864,1041740879,GB +1041740880,1041740959,FR +1041740960,1041740975,GB +1041740976,1041740991,FR +1041740992,1041741119,GB +1041741120,1041741135,FR +1041741136,1041741151,GB +1041741152,1041741231,FR +1041741232,1041741311,GB +1041741312,1041741607,FR +1041741608,1041741615,GB +1041741616,1041741631,FR +1041741632,1041741647,GB +1041741648,1041741663,FR +1041741664,1041741679,GB +1041741680,1041741687,FR +1041741688,1041741823,GB +1041741824,1041742095,FR +1041742096,1041742111,GB +1041742112,1041742127,FR +1041742128,1041742135,GB +1041742136,1041742151,FR +1041742152,1041742159,GB +1041742160,1041742223,FR +1041742224,1041742239,GB +1041742240,1041742303,FR +1041742304,1041742343,GB +1041742344,1041742359,FR +1041742360,1041742367,GB +1041742368,1041742375,FR +1041742376,1041742423,GB +1041742424,1041742455,FR +1041742456,1041742463,GB +1041742464,1041742471,FR +1041742472,1041742479,GB +1041742480,1041742511,FR +1041742512,1041742591,GB +1041742592,1041743111,FR +1041743112,1041743119,GB +1041743120,1041743135,FR +1041743136,1041743143,GB +1041743144,1041743167,FR +1041743168,1041743223,GB +1041743224,1041743303,FR +1041743304,1041743311,GB +1041743312,1041743615,FR +1041743616,1041743647,GB +1041743648,1041743671,FR +1041743672,1041743679,GB +1041743680,1041743703,FR +1041743704,1041743727,GB +1041743728,1041743743,FR +1041743744,1041743759,GB +1041743760,1041743767,FR +1041743768,1041743775,GB +1041743776,1041743791,FR +1041743792,1041743799,GB +1041743800,1041743807,FR +1041743808,1041743823,GB +1041743824,1041743831,FR +1041743832,1041743855,GB +1041743856,1041743863,FR +1041743864,1041743871,GB +1041743872,1041744143,FR +1041744144,1041744151,GB +1041744152,1041744255,FR +1041744256,1041744263,GB +1041744264,1041744271,FR +1041744272,1041744295,GB +1041744296,1041744311,FR +1041744312,1041744327,GB +1041744328,1041744479,FR +1041744480,1041744511,GB +1041744512,1041744599,FR +1041744600,1041744607,GB +1041744608,1041744623,FR +1041744624,1041744895,GB +1041744896,1041744919,FR +1041744920,1041744927,GB +1041744928,1041744943,FR +1041744944,1041744951,GB +1041744952,1041744975,FR +1041744976,1041744983,GB +1041744984,1041745007,FR +1041745008,1041745031,GB +1041745032,1041745055,FR +1041745056,1041745071,GB +1041745072,1041745095,FR +1041745096,1041745143,GB +1041745144,1041745151,FR +1041745152,1041745159,GB +1041745160,1041745167,FR +1041745168,1041745191,GB +1041745192,1041745207,FR +1041745208,1041745215,GB +1041745216,1041745247,FR +1041745248,1041745279,GB +1041745280,1041745327,FR +1041745328,1041745343,GB +1041745344,1041745359,FR +1041745360,1041745383,GB +1041745384,1041745415,FR +1041745416,1041745423,GB +1041745424,1041745447,FR +1041745448,1041745471,GB +1041745472,1041745479,FR +1041745480,1041745487,GB +1041745488,1041745495,FR +1041745496,1041745535,GB +1041745536,1041745543,FR +1041745544,1041745551,GB +1041745552,1041745567,FR +1041745568,1041745575,GB +1041745576,1041745599,FR +1041745600,1041745615,GB +1041745616,1041745623,FR +1041745624,1041745631,GB +1041745632,1041745639,FR +1041745640,1041745647,GB +1041745648,1041745655,FR +1041745656,1041745687,GB +1041745688,1041745751,FR +1041745752,1041745767,GB +1041745768,1041745823,FR +1041745824,1041745871,GB +1041745872,1041745887,FR +1041745888,1041745959,GB +1041745960,1041745967,FR +1041745968,1041745983,GB +1041745984,1041745999,FR +1041746000,1041746015,GB +1041746016,1041746023,FR +1041746024,1041746047,GB +1041746048,1041746063,FR +1041746064,1041746095,GB +1041746096,1041746111,FR +1041746112,1041746119,GB +1041746120,1041746127,FR +1041746128,1041746135,GB +1041746136,1041746687,FR +1041746688,1041746735,GB +1041746736,1041746743,FR +1041746744,1041746751,GB +1041746752,1041746799,FR +1041746800,1041746847,GB +1041746848,1041746863,FR +1041746864,1041746887,GB +1041746888,1041746903,FR +1041746904,1041746927,GB +1041746928,1041747071,FR +1041747072,1041747455,GB +1041747456,1041747463,FR +1041747464,1041747487,GB +1041747488,1041747503,FR +1041747504,1041747519,GB +1041747520,1041749503,FR +1041749504,1041749507,GB +1041749508,1041749511,FR +1041749512,1041749555,GB +1041749556,1041749559,FR +1041749560,1041749639,GB +1041749640,1041749643,FR +1041749644,1041749691,GB +1041749692,1041749695,FR +1041749696,1041749715,GB +1041749716,1041749719,FR +1041749720,1041749759,GB +1041749760,1041749807,FR +1041749808,1041749815,GB +1041749816,1041749999,FR +1041750000,1041750007,GB +1041750008,1041750527,FR +1041750528,1041750543,GB +1041750544,1041750559,FR +1041750560,1041750591,GB +1041750592,1041750799,FR +1041750800,1041750807,GB +1041750808,1041750863,FR +1041750864,1041750871,GB +1041750872,1041751311,FR +1041751312,1041751327,GB +1041751328,1041751343,FR +1041751344,1041751359,GB +1041751360,1041751439,FR +1041751440,1041751455,GB +1041751456,1041751623,FR +1041751624,1041751631,GB +1041751632,1041751639,FR +1041751640,1041751647,GB +1041751648,1041751687,FR +1041751688,1041751719,GB +1041751720,1041751743,FR +1041751744,1041751751,GB +1041751752,1041751767,FR +1041751768,1041751775,GB +1041751776,1041753343,FR +1041753344,1041754111,GB +1041754112,1041754143,FR +1041754144,1041754151,GB +1041754152,1041754239,FR +1041754240,1041754247,GB +1041754248,1041754415,FR +1041754416,1041754423,GB +1041754424,1041754479,FR +1041754480,1041754495,GB +1041754496,1041755231,FR +1041755232,1041755239,GB +1041755240,1041755295,FR +1041755296,1041755303,GB +1041755304,1041755311,FR +1041755312,1041755327,GB +1041755328,1041755335,FR +1041755336,1041755343,GB +1041755344,1041755391,FR +1041755392,1041755399,GB +1041755400,1041755455,FR +1041755456,1041755471,GB +1041755472,1041755631,FR +1041755632,1041755647,GB +1041755648,1041756463,FR +1041756464,1041756471,GB +1041756472,1041756599,FR +1041756600,1041756607,GB +1041756608,1041756655,FR +1041756656,1041756663,GB +1041756664,1041756719,FR +1041756720,1041756727,GB +1041756728,1041756895,FR +1041756896,1041756911,GB +1041756912,1041756919,FR +1041756920,1041756927,GB +1041756928,1041757023,FR +1041757024,1041757039,GB +1041757040,1041757087,FR +1041757088,1041757127,GB +1041757128,1041757175,FR +1041757176,1041757179,GB +1041757180,1041757503,FR +1041757504,1041757519,GB +1041757520,1041757583,FR +1041757584,1041757591,GB +1041757592,1041757663,FR +1041757664,1041757671,GB +1041757672,1041758031,FR +1041758032,1041758039,GB +1041758040,1041758207,FR +1041758208,1041760255,GB +1041760256,1041768447,DE +1041768448,1041776639,GB +1041776640,1041784831,CZ +1041793024,1041825791,GB +1041825792,1041842175,NL +1041842176,1041891327,GB +1041891328,1041921535,DE +1041921536,1041921727,US +1041921728,1041945087,DE +1041945088,1041945151,AT +1041945152,1041958463,DE +1041958464,1041958527,DK +1041958528,1041959423,DE +1041959424,1041959679,US +1041959680,1042022399,DE +1042022400,1042087935,PT +1042087936,1042120703,TR +1042120704,1042153471,PL +1042153472,1042284543,GB +1042284544,1042288399,CH +1042288400,1042288415,GB +1042288416,1042292735,CH +1042292736,1042293247,NL +1042293248,1042293503,GB +1042293504,1042293535,NL +1042293536,1042293631,IR +1042293632,1042296063,GE +1042296064,1042296191,CY +1042296192,1042296575,GE +1042296576,1042296831,BY +1042296832,1042297215,NL +1042297216,1042297319,IR +1042297320,1042297327,GE +1042297328,1042297599,IR +1042297600,1042297855,GB +1042297856,1042298111,NL +1042298112,1042298143,US +1042298144,1042298175,NL +1042298176,1042298239,IR +1042298240,1042298279,IQ +1042298280,1042298287,IR +1042298288,1042298303,GB +1042298304,1042298335,IQ +1042298336,1042298351,IR +1042298352,1042298367,NL +1042298368,1042298623,GB +1042298624,1042298879,NL +1042298880,1042299135,GB +1042299136,1042299391,IQ +1042299392,1042300159,NL +1042300160,1042300175,BY +1042300176,1042300223,IQ +1042300224,1042300255,AM +1042300256,1042300287,IR +1042300288,1042300351,IT +1042300352,1042300383,IQ +1042300384,1042300415,IR +1042300416,1042300479,NL +1042300480,1042300495,IQ +1042300496,1042300543,GB +1042300544,1042300639,IQ +1042300640,1042300647,NL +1042300648,1042300655,IQ +1042300656,1042300671,LB +1042300672,1042300799,IQ +1042300800,1042300863,IR +1042300864,1042300895,LB +1042300896,1042300903,MD +1042300904,1042300911,UA +1042300912,1042300919,NL +1042300920,1042300927,UA +1042300928,1042309119,RU +1042309120,1042317311,GB +1042317312,1042350079,ES +1042350080,1042415615,RU +1042415616,1042546687,FR +1042546688,1042677759,ES +1042677760,1042743295,GR +1042743296,1042808831,FR +1042808832,1042817023,DE +1042817024,1042825215,IE +1042825216,1042833407,CZ +1042833408,1042841599,GB +1042841600,1042874367,AT +1042874368,1042875903,NL +1042875904,1042876159,GB +1042876160,1042876415,NL +1042876416,1042876479,GB +1042876480,1042876671,NL +1042876672,1042876927,DE +1042876928,1042880639,NL +1042880640,1042880767,GB +1042880768,1042882559,NL +1042882560,1042882815,DE +1042882816,1042888703,NL +1042888704,1042888959,GB +1042888960,1042889215,NL +1042889216,1042889471,US +1042889472,1042890751,NL +1042890752,1042890783,GB +1042890784,1042890815,NL +1042890816,1042890819,FR +1042890820,1042890847,NL +1042890848,1042890879,GB +1042890880,1042890944,NL +1042890945,1042890950,GB +1042890951,1042890959,NL +1042890960,1042890991,GB +1042890992,1042891775,NL +1042891776,1042891839,GB +1042891840,1042892015,NL +1042892016,1042892031,DE +1042892032,1042892287,NL +1042892288,1042892319,SE +1042892320,1042892383,PT +1042892384,1042892447,IT +1042892448,1042892479,BE +1042892480,1042892543,PL +1042892544,1042892863,NL +1042892864,1042892927,GB +1042892928,1042892967,NL +1042892968,1042892975,PL +1042892976,1042892983,CH +1042892984,1042893055,NL +1042893056,1042893087,GB +1042893088,1042893135,NL +1042893136,1042893143,DE +1042893144,1042893183,NL +1042893184,1042893311,GB +1042893312,1042894079,NL +1042894080,1042894143,DE +1042894144,1042894175,SE +1042894176,1042894559,NL +1042894560,1042894591,DE +1042894592,1042894655,FR +1042894656,1042894783,NL +1042894784,1042894847,DE +1042894848,1042895359,NL +1042895360,1042895615,FR +1042895616,1042895871,GB +1042895872,1042900479,NL +1042900480,1042900735,GB +1042900736,1042907135,NL +1042907136,1042915391,GB +1042915392,1042939903,NL +1042939904,1043070975,ES +1043070976,1043079167,CZ +1043079168,1043087359,DE +1043087360,1043095551,GB +1043095552,1043103743,BG +1043103744,1043120127,DK +1043120128,1043136511,FI +1043136512,1043202047,NL +1043202048,1043333119,AT +1043333120,1043341311,CH +1043341312,1043349503,IT +1043349504,1043350587,DE +1043350588,1043350591,AT +1043350592,1043357695,DE +1043357696,1043365887,CH +1043365888,1043398655,PT +1043398656,1043464191,GB +1043464192,1043465215,NL +1043465216,1043472383,GB +1043472384,1043480575,DE +1043480576,1043488767,CH +1043488768,1043496959,DE +1043496960,1043505151,FR +1043505152,1043513343,NO +1043513344,1043529727,GB +1043529728,1043562495,NL +1043595264,1043600639,DE +1043600640,1043600895,FR +1043600896,1043607679,DE +1043607680,1043607711,FR +1043607712,1043609279,DE +1043609280,1043609343,AT +1043609344,1043609463,DE +1043609464,1043609471,IE +1043609472,1043619839,DE +1043619840,1043620095,IE +1043620096,1043621503,DE +1043621504,1043621567,GB +1043621568,1043623215,DE +1043623216,1043623231,GB +1043623232,1043633663,DE +1043633664,1043633919,FR +1043633920,1043693055,DE +1043693056,1043693127,GB +1043693128,1043693183,DE +1043693184,1043693567,GB +1043693568,1043718783,DE +1043718784,1043718815,FR +1043718816,1043857407,DE +1043857408,1043890175,GB +1043890176,1043890495,IL +1043890496,1043890591,NG +1043890592,1043891775,IL +1043891776,1043891839,NG +1043891840,1043892223,IL +1043892224,1043892239,MZ +1043892240,1043892255,IL +1043892256,1043892287,MZ +1043892288,1043892479,IL +1043892480,1043892735,NG +1043892736,1043892991,MZ +1043892992,1043893247,NG +1043893248,1043893311,IL +1043893312,1043893375,NG +1043893376,1043893567,IL +1043893568,1043893583,NG +1043893584,1043893759,IL +1043893760,1043894015,NG +1043894016,1043894271,MZ +1043894272,1043894559,IL +1043894560,1043894591,NG +1043894592,1043894751,IL +1043894752,1043894783,NG +1043894784,1043894847,IL +1043894848,1043894879,NG +1043894880,1043895039,IL +1043895040,1043895167,NG +1043895168,1043895983,IL +1043895984,1043895999,AO +1043896000,1043896063,IL +1043896064,1043896319,NG +1043896320,1043896575,GH +1043896576,1043897343,IL +1043897344,1043897855,KE +1043897856,1043898367,IL +1043898368,1043898879,CD +1043898880,1043899647,MG +1043899648,1043899903,IL +1043899904,1043900159,TZ +1043900160,1043900415,MG +1043900416,1043905023,IL +1043905024,1043905279,TG +1043905280,1043907071,IL +1043907072,1043907583,MZ +1043907584,1043910143,IL +1043910144,1043910399,TZ +1043910400,1043910655,KE +1043910656,1043912447,IL +1043912448,1043912703,KE +1043912704,1043913215,ZM +1043913216,1043913471,TZ +1043913472,1043914751,IL +1043914752,1043914879,NG +1043914880,1043916799,IL +1043916800,1043917055,NG +1043917056,1043917311,IL +1043917312,1043917567,CM +1043917568,1043918847,IL +1043918848,1043919871,MG +1043919872,1043922943,IL +1043922944,1043988479,ES +1043988480,1043988503,NL +1043988504,1043988511,BE +1043988512,1043988527,NL +1043988528,1043988551,BE +1043988552,1043988559,NL +1043988560,1043988575,BE +1043988576,1043988607,NL +1043988608,1043988639,BE +1043988640,1043988647,NL +1043988648,1043988655,BE +1043988656,1043988663,NL +1043988664,1043988679,BE +1043988680,1043988711,NL +1043988712,1043988719,BE +1043988720,1043988727,NL +1043988728,1043988735,BE +1043988736,1043988767,NL +1043988768,1043988775,BE +1043988776,1043988799,NL +1043988800,1043988823,BE +1043988824,1043988943,NL +1043988944,1043989055,BE +1043989056,1043989503,NL +1043989504,1043989535,BE +1043989536,1043989543,NL +1043989544,1043989567,BE +1043989568,1043989599,NL +1043989600,1043989639,BE +1043989640,1043989655,NL +1043989656,1043989663,BE +1043989664,1043989695,NL +1043989696,1043989751,BE +1043989752,1043989759,NL +1043989760,1043990271,BE +1043990272,1043990367,NL +1043990368,1043990527,BE +1043990528,1043990543,NL +1043990544,1043990559,BE +1043990560,1043990591,NL +1043990592,1043990615,BE +1043990616,1043990623,NL +1043990624,1043990631,BE +1043990632,1043991063,NL +1043991064,1043991071,BE +1043991072,1043991231,NL +1043991232,1043992063,BE +1043992064,1043992319,NL +1043992320,1043992575,BE +1043992576,1043992831,NL +1043992832,1043993599,BE +1043993600,1043993855,NL +1043993856,1043994643,BE +1043994644,1043994651,NL +1043994652,1043994655,BE +1043994656,1043994699,NL +1043994700,1043994703,BE +1043994704,1043994707,NL +1043994708,1043994711,BE +1043994712,1043994747,NL +1043994748,1043994755,BE +1043994756,1043994759,NL +1043994760,1043994791,BE +1043994792,1043994795,NL +1043994796,1043994811,BE +1043994812,1043994815,NL +1043994816,1043994823,BE +1043994824,1043994827,NL +1043994828,1043994851,BE +1043994852,1043994855,NL +1043994856,1043994863,BE +1043994864,1043994867,NL +1043994868,1043994871,BE +1043994872,1043994875,NL +1043994876,1043994879,BE +1043994880,1043994887,NL +1043994888,1043994907,BE +1043994908,1043994911,NL +1043994912,1043994931,BE +1043994932,1043994935,NL +1043994936,1043994943,BE +1043994944,1043994947,NL +1043994948,1043994975,BE +1043994976,1043994979,NL +1043994980,1043994987,BE +1043994988,1043994991,NL +1043994992,1043994995,BE +1043994996,1043995003,NL +1043995004,1043995023,BE +1043995024,1043995027,NL +1043995028,1043995035,BE +1043995036,1043995051,NL +1043995052,1043995059,BE +1043995060,1043995067,NL +1043995068,1043995103,BE +1043995104,1043995115,NL +1043995116,1043995127,BE +1043995128,1043995131,NL +1043995132,1043995135,BE +1043995136,1043995139,NL +1043995140,1043995151,BE +1043995152,1043995155,NL +1043995156,1043995171,BE +1043995172,1043995179,NL +1043995180,1043995183,BE +1043995184,1043995187,NL +1043995188,1043995215,BE +1043995216,1043995223,NL +1043995224,1043995235,BE +1043995236,1043995239,NL +1043995240,1043995259,BE +1043995260,1043995267,NL +1043995268,1043995279,BE +1043995280,1043995283,NL +1043995284,1043995291,BE +1043995292,1043995295,NL +1043995296,1043995303,BE +1043995304,1043995311,NL +1043995312,1043995663,BE +1043995664,1043995687,NL +1043995688,1043995695,BE +1043995696,1043995703,NL +1043995704,1043995719,BE +1043995720,1043995735,NL +1043995736,1043995743,BE +1043995744,1043995759,NL +1043995760,1043995767,BE +1043995768,1043995783,NL +1043995784,1043995807,BE +1043995808,1043995831,NL +1043995832,1043995863,BE +1043995864,1043995887,NL +1043995888,1043995903,BE +1043995904,1043995935,NL +1043995936,1043995943,BE +1043995944,1043995951,NL +1043995952,1043995975,BE +1043995976,1043995999,NL +1043996000,1043996015,BE +1043996016,1043996023,NL +1043996024,1043996095,BE +1043996096,1043996103,NL +1043996104,1043996111,BE +1043996112,1043996119,NL +1043996120,1043996143,BE +1043996144,1043996151,NL +1043996152,1043996159,BE +1043996160,1043996695,NL +1043996696,1043996703,BE +1043996704,1043996815,NL +1043996816,1043997183,BE +1043997184,1043997375,NL +1043997376,1043997463,BE +1043997464,1043997471,NL +1043997472,1043997519,BE +1043997520,1043997551,NL +1043997552,1043997559,BE +1043997560,1043997583,NL +1043997584,1043997639,BE +1043997640,1043997663,NL +1043997664,1043997687,BE +1043997688,1043997919,NL +1043997920,1043998079,BE +1043998080,1043998143,NL +1043998144,1043998151,BE +1043998152,1043998159,NL +1043998160,1043998167,BE +1043998168,1043998191,NL +1043998192,1043998195,BE +1043998196,1043998198,NL +1043998199,1043998199,BE +1043998200,1043998719,NL +1043998720,1043998735,BE +1043998736,1043998751,NL +1043998752,1043998759,BE +1043998760,1043998783,NL +1043998784,1043998799,BE +1043998800,1043998855,NL +1043998856,1043998863,BE +1043998864,1043998911,NL +1043998912,1043998975,BE +1043998976,1043998983,NL +1043998984,1043999007,BE +1043999008,1043999055,NL +1043999056,1043999071,BE +1043999072,1043999111,NL +1043999112,1043999119,BE +1043999120,1043999143,NL +1043999144,1043999151,BE +1043999152,1043999159,NL +1043999160,1043999207,BE +1043999208,1043999215,NL +1043999216,1043999223,BE +1043999224,1043999487,NL +1043999488,1043999751,BE +1043999752,1043999759,NL +1043999760,1043999775,BE +1043999776,1043999783,NL +1043999784,1043999791,BE +1043999792,1043999823,NL +1043999824,1043999831,BE +1043999832,1043999999,NL +1044000000,1044000031,BE +1044000032,1044000063,NL +1044000064,1044000095,BE +1044000096,1044000119,NL +1044000120,1044000127,BE +1044000128,1044000767,NL +1044000768,1044000831,BE +1044000832,1044000895,NL +1044000896,1044000975,BE +1044000976,1044000983,NL +1044000984,1044000999,BE +1044001000,1044001023,NL +1044001024,1044001279,BE +1044001280,1044001663,NL +1044001664,1044001791,BE +1044001792,1044001823,NL +1044001824,1044001831,BE +1044001832,1044001847,NL +1044001848,1044001855,BE +1044001856,1044001887,NL +1044001888,1044001895,BE +1044001896,1044001927,NL +1044001928,1044001943,BE +1044001944,1044002087,NL +1044002088,1044002095,BE +1044002096,1044002103,NL +1044002104,1044002135,BE +1044002136,1044002175,NL +1044002176,1044002239,BE +1044002240,1044002831,NL +1044002832,1044002855,BE +1044002856,1044002859,NL +1044002860,1044002879,BE +1044002880,1044002883,NL +1044002884,1044002891,BE +1044002892,1044002899,NL +1044002900,1044002911,BE +1044002912,1044002919,NL +1044002920,1044002931,BE +1044002932,1044002947,NL +1044002948,1044002959,BE +1044002960,1044002975,NL +1044002976,1044002983,BE +1044002984,1044002987,NL +1044002988,1044002999,BE +1044003000,1044003003,NL +1044003004,1044003019,BE +1044003020,1044003023,NL +1044003024,1044003027,BE +1044003028,1044003031,NL +1044003032,1044003071,BE +1044003072,1044003079,NL +1044003080,1044003099,BE +1044003100,1044003103,NL +1044003104,1044003115,BE +1044003116,1044003119,NL +1044003120,1044003123,BE +1044003124,1044003131,NL +1044003132,1044003147,BE +1044003148,1044003151,NL +1044003152,1044003155,BE +1044003156,1044003159,NL +1044003160,1044003167,BE +1044003168,1044003171,NL +1044003172,1044003175,BE +1044003176,1044003179,NL +1044003180,1044003183,BE +1044003184,1044003187,NL +1044003188,1044003211,BE +1044003212,1044003219,NL +1044003220,1044003223,BE +1044003224,1044003227,NL +1044003228,1044003231,BE +1044003232,1044003251,NL +1044003252,1044003279,BE +1044003280,1044003283,NL +1044003284,1044003291,BE +1044003292,1044003295,NL +1044003296,1044003299,BE +1044003300,1044003303,NL +1044003304,1044003311,BE +1044003312,1044003315,NL +1044003316,1044003319,BE +1044003320,1044003323,NL +1044003324,1044003331,BE +1044003332,1044003343,NL +1044003344,1044003359,BE +1044003360,1044003362,NL +1044003363,1044003363,BE +1044003364,1044003371,NL +1044003372,1044003379,BE +1044003380,1044003383,NL +1044003384,1044003423,BE +1044003424,1044003427,NL +1044003428,1044003459,BE +1044003460,1044003463,NL +1044003464,1044003467,BE +1044003468,1044003471,NL +1044003472,1044003483,BE +1044003484,1044003487,NL +1044003488,1044003511,BE +1044003512,1044003527,NL +1044003528,1044003539,BE +1044003540,1044003543,NL +1044003544,1044003551,BE +1044003552,1044003563,NL +1044003564,1044003575,BE +1044003576,1044003591,NL +1044003592,1044003595,BE +1044003596,1044003599,NL +1044003600,1044003607,BE +1044003608,1044003611,NL +1044003612,1044003615,BE +1044003616,1044003631,NL +1044003632,1044003635,BE +1044003636,1044003639,NL +1044003640,1044003647,BE +1044003648,1044003651,NL +1044003652,1044003655,BE +1044003656,1044003659,NL +1044003660,1044003663,BE +1044003664,1044003667,NL +1044003668,1044003675,BE +1044003676,1044003683,NL +1044003684,1044003687,BE +1044003688,1044003691,NL +1044003692,1044003695,BE +1044003696,1044003699,NL +1044003700,1044003723,BE +1044003724,1044003751,NL +1044003752,1044003755,BE +1044003756,1044003775,NL +1044003776,1044003783,BE +1044003784,1044003787,NL +1044003788,1044003795,BE +1044003796,1044003799,NL +1044003800,1044003807,BE +1044003808,1044003819,NL +1044003820,1044003823,BE +1044003824,1044003831,NL +1044003832,1044003855,BE +1044003856,1044003871,NL +1044003872,1044003879,BE +1044003880,1044003895,NL +1044003896,1044003911,BE +1044003912,1044003919,NL +1044003920,1044003927,BE +1044003928,1044003959,NL +1044003960,1044003967,BE +1044003968,1044003975,NL +1044003976,1044003983,BE +1044003984,1044003991,NL +1044003992,1044004007,BE +1044004008,1044004079,NL +1044004080,1044004095,BE +1044004096,1044004303,NL +1044004304,1044004351,BE +1044004352,1044004879,NL +1044004880,1044004903,BE +1044004904,1044004911,NL +1044004912,1044004927,BE +1044004928,1044005503,NL +1044005504,1044005631,BE +1044005632,1044005647,NL +1044005648,1044005663,BE +1044005664,1044005695,NL +1044005696,1044005799,BE +1044005800,1044005807,NL +1044005808,1044005823,BE +1044005824,1044005847,NL +1044005848,1044005887,BE +1044005888,1044006143,NL +1044006144,1044006399,BE +1044006400,1044006943,NL +1044006944,1044007007,BE +1044007008,1044007023,NL +1044007024,1044007031,BE +1044007032,1044007039,NL +1044007040,1044007047,BE +1044007048,1044007055,NL +1044007056,1044007063,BE +1044007064,1044007087,NL +1044007088,1044007119,BE +1044007120,1044007135,NL +1044007136,1044007159,BE +1044007160,1044007967,NL +1044007968,1044007983,BE +1044007984,1044007991,NL +1044007992,1044008007,BE +1044008008,1044008023,NL +1044008024,1044008031,BE +1044008032,1044008039,NL +1044008040,1044008047,BE +1044008048,1044008063,NL +1044008064,1044008095,BE +1044008096,1044008127,NL +1044008128,1044008183,BE +1044008184,1044008223,NL +1044008224,1044008239,BE +1044008240,1044008255,NL +1044008256,1044008279,BE +1044008280,1044008287,NL +1044008288,1044008319,BE +1044008320,1044008735,NL +1044008736,1044009055,BE +1044009056,1044009087,NL +1044009088,1044009215,BE +1044009216,1044009471,NL +1044009472,1044009487,BE +1044009488,1044009503,NL +1044009504,1044009535,BE +1044009536,1044009583,NL +1044009584,1044009599,BE +1044009600,1044011635,NL +1044011636,1044011639,BE +1044011640,1044011731,NL +1044011732,1044011735,BE +1044011736,1044011771,NL +1044011772,1044011775,BE +1044011776,1044011971,NL +1044011972,1044012031,BE +1044012032,1044012039,NL +1044012040,1044012047,BE +1044012048,1044012087,NL +1044012088,1044012095,BE +1044012096,1044012103,NL +1044012104,1044012111,BE +1044012112,1044012119,NL +1044012120,1044012135,BE +1044012136,1044012143,NL +1044012144,1044012151,BE +1044012152,1044012159,NL +1044012160,1044012167,BE +1044012168,1044012191,NL +1044012192,1044012207,BE +1044012208,1044012239,NL +1044012240,1044012255,BE +1044012256,1044013055,NL +1044013056,1044013111,BE +1044013112,1044013119,NL +1044013120,1044013135,BE +1044013136,1044013143,NL +1044013144,1044013247,BE +1044013248,1044013263,NL +1044013264,1044013271,BE +1044013272,1044013279,NL +1044013280,1044013375,BE +1044013376,1044013439,NL +1044013440,1044013575,BE +1044013576,1044013583,NL +1044013584,1044013615,BE +1044013616,1044013623,NL +1044013624,1044014111,BE +1044014112,1044014119,NL +1044014120,1044017167,BE +1044017168,1044017187,NL +1044017188,1044017191,BE +1044017192,1044017199,NL +1044017200,1044017215,BE +1044017216,1044017247,NL +1044017248,1044017359,BE +1044017360,1044017383,NL +1044017384,1044017399,BE +1044017400,1044017407,NL +1044017408,1044017663,BE +1044017664,1044017983,NL +1044017984,1044018039,BE +1044018040,1044018047,NL +1044018048,1044018175,BE +1044018176,1044019199,NL +1044019200,1044019279,BE +1044019280,1044019283,NL +1044019284,1044019291,BE +1044019292,1044019295,NL +1044019296,1044019315,BE +1044019316,1044019323,NL +1044019324,1044019347,BE +1044019348,1044019351,NL +1044019352,1044019379,BE +1044019380,1044019399,NL +1044019400,1044019403,BE +1044019404,1044019407,NL +1044019408,1044019415,BE +1044019416,1044019439,NL +1044019440,1044019443,BE +1044019444,1044019471,NL +1044019472,1044019491,BE +1044019492,1044019495,NL +1044019496,1044019503,BE +1044019504,1044019507,NL +1044019508,1044019695,BE +1044019696,1044019699,NL +1044019700,1044019819,BE +1044019820,1044019823,NL +1044019824,1044019995,BE +1044019996,1044019999,NL +1044020000,1044020147,BE +1044020148,1044020151,NL +1044020152,1044020215,BE +1044020216,1044020219,NL +1044020220,1044020255,BE +1044020256,1044020263,NL +1044020264,1044020303,BE +1044020304,1044020319,NL +1044020320,1044020511,BE +1044020512,1044020551,NL +1044020552,1044020567,BE +1044020568,1044020591,NL +1044020592,1044020607,BE +1044020608,1044020671,NL +1044020672,1044020735,BE +1044020736,1044021759,NL +1044021760,1044021887,BE +1044021888,1044022319,NL +1044022320,1044022335,BE +1044022336,1044022359,NL +1044022360,1044022399,BE +1044022400,1044022407,NL +1044022408,1044022415,BE +1044022416,1044023303,NL +1044023304,1044023311,BE +1044023312,1044023319,NL +1044023320,1044023327,BE +1044023328,1044023335,NL +1044023336,1044023343,BE +1044023344,1044023359,NL +1044023360,1044023407,BE +1044023408,1044023439,NL +1044023440,1044023551,BE +1044023552,1044024063,NL +1044024064,1044024319,BE +1044024320,1044024447,NL +1044024448,1044024575,BE +1044024576,1044024835,NL +1044024836,1044024843,BE +1044024844,1044024847,NL +1044024848,1044024851,BE +1044024852,1044024855,NL +1044024856,1044024863,BE +1044024864,1044024867,NL +1044024868,1044024875,BE +1044024876,1044024883,NL +1044024884,1044024887,BE +1044024888,1044024891,NL +1044024892,1044024959,BE +1044024960,1044025351,NL +1044025352,1044025855,BE +1044025856,1044026895,NL +1044026896,1044027263,BE +1044027264,1044027423,NL +1044027424,1044027431,BE +1044027432,1044027447,NL +1044027448,1044027455,BE +1044027456,1044027479,NL +1044027480,1044027527,BE +1044027528,1044027543,NL +1044027544,1044027575,BE +1044027576,1044027583,NL +1044027584,1044027591,BE +1044027592,1044027679,NL +1044027680,1044027703,BE +1044027704,1044027727,NL +1044027728,1044027775,BE +1044027776,1044027903,NL +1044027904,1044028799,BE +1044028800,1044028927,NL +1044028928,1044028939,BE +1044028940,1044028947,NL +1044028948,1044028955,BE +1044028956,1044028959,NL +1044028960,1044028987,BE +1044028988,1044028995,NL +1044028996,1044029011,BE +1044029012,1044029015,NL +1044029016,1044029019,BE +1044029020,1044029023,NL +1044029024,1044029027,BE +1044029028,1044029031,NL +1044029032,1044029035,BE +1044029036,1044029043,NL +1044029044,1044029047,BE +1044029048,1044029051,NL +1044029052,1044029055,BE +1044029056,1044029059,NL +1044029060,1044029067,BE +1044029068,1044029075,NL +1044029076,1044029311,BE +1044029312,1044029441,NL +1044029442,1044029442,BE +1044029443,1044029445,NL +1044029446,1044029448,BE +1044029449,1044029451,NL +1044029452,1044029452,BE +1044029453,1044029453,NL +1044029454,1044029455,BE +1044029456,1044029463,NL +1044029464,1044029466,BE +1044029467,1044029467,NL +1044029468,1044029470,BE +1044029471,1044029479,NL +1044029480,1044029483,BE +1044029484,1044029485,NL +1044029486,1044029487,BE +1044029488,1044029488,NL +1044029489,1044029489,BE +1044029490,1044029492,NL +1044029493,1044029493,BE +1044029494,1044029494,NL +1044029495,1044029497,BE +1044029498,1044029498,NL +1044029499,1044029501,BE +1044029502,1044029502,NL +1044029503,1044029505,BE +1044029506,1044029509,NL +1044029510,1044029510,BE +1044029511,1044029511,NL +1044029512,1044029535,BE +1044029536,1044029536,NL +1044029537,1044029537,BE +1044029538,1044029538,NL +1044029539,1044029545,BE +1044029546,1044029546,NL +1044029547,1044029548,BE +1044029549,1044029549,NL +1044029550,1044029552,BE +1044029553,1044029553,NL +1044029554,1044029554,BE +1044029555,1044029556,NL +1044029557,1044029557,BE +1044029558,1044029558,NL +1044029559,1044029561,BE +1044029562,1044029567,NL +1044029568,1044029568,BE +1044029569,1044029569,NL +1044029570,1044029572,BE +1044029573,1044029575,NL +1044029576,1044029580,BE +1044029581,1044029581,NL +1044029582,1044029584,BE +1044029585,1044029585,NL +1044029586,1044029586,BE +1044029587,1044029587,NL +1044029588,1044029590,BE +1044029591,1044029595,NL +1044029596,1044029596,BE +1044029597,1044029598,NL +1044029599,1044029599,BE +1044029600,1044029600,NL +1044029601,1044029601,BE +1044029602,1044029603,NL +1044029604,1044029606,BE +1044029607,1044029608,NL +1044029609,1044029609,BE +1044029610,1044029610,NL +1044029611,1044029611,BE +1044029612,1044029612,NL +1044029613,1044029616,BE +1044029617,1044029618,NL +1044029619,1044029620,BE +1044029621,1044029622,NL +1044029623,1044029625,BE +1044029626,1044029628,NL +1044029629,1044029630,BE +1044029631,1044029631,NL +1044029632,1044029634,BE +1044029635,1044029635,NL +1044029636,1044029636,BE +1044029637,1044029638,NL +1044029639,1044029640,BE +1044029641,1044029641,NL +1044029642,1044029642,BE +1044029643,1044029647,NL +1044029648,1044029648,BE +1044029649,1044029651,NL +1044029652,1044029652,BE +1044029653,1044029659,NL +1044029660,1044029660,BE +1044029661,1044029663,NL +1044029664,1044029665,BE +1044029666,1044029667,NL +1044029668,1044029668,BE +1044029669,1044029669,NL +1044029670,1044029672,BE +1044029673,1044029676,NL +1044029677,1044029678,BE +1044029679,1044029680,NL +1044029681,1044029681,BE +1044029682,1044029682,NL +1044029683,1044029684,BE +1044029685,1044029686,NL +1044029687,1044029687,BE +1044029688,1044029693,NL +1044029694,1044029694,BE +1044029695,1044029703,NL +1044029704,1044029711,BE +1044029712,1044029719,NL +1044029720,1044029727,BE +1044029728,1044029743,NL +1044029744,1044029767,BE +1044029768,1044029775,NL +1044029776,1044029783,BE +1044029784,1044029831,NL +1044029832,1044029839,BE +1044029840,1044029871,NL +1044029872,1044029879,BE +1044029880,1044029895,NL +1044029896,1044029903,BE +1044029904,1044029951,NL +1044029952,1044029959,BE +1044029960,1044029967,NL +1044029968,1044029983,BE +1044029984,1044030015,NL +1044030016,1044030023,BE +1044030024,1044030047,NL +1044030048,1044030055,BE +1044030056,1044030111,NL +1044030112,1044030119,BE +1044030120,1044030127,NL +1044030128,1044030135,BE +1044030136,1044030207,NL +1044030208,1044030223,BE +1044030224,1044030247,NL +1044030248,1044030263,BE +1044030264,1044030279,NL +1044030280,1044030295,BE +1044030296,1044030303,NL +1044030304,1044030311,BE +1044030312,1044030375,NL +1044030376,1044030391,BE +1044030392,1044030399,NL +1044030400,1044030407,BE +1044030408,1044030439,NL +1044030440,1044030447,BE +1044030448,1044030487,NL +1044030488,1044030495,BE +1044030496,1044030527,NL +1044030528,1044030535,BE +1044030536,1044030607,NL +1044030608,1044030615,BE +1044030616,1044030639,NL +1044030640,1044030647,BE +1044030648,1044030671,NL +1044030672,1044030679,BE +1044030680,1044030727,NL +1044030728,1044030735,BE +1044030736,1044030759,NL +1044030760,1044030767,BE +1044030768,1044030815,NL +1044030816,1044030823,BE +1044030824,1044030831,NL +1044030832,1044030847,BE +1044030848,1044030879,NL +1044030880,1044030887,BE +1044030888,1044030911,NL +1044030912,1044030919,BE +1044030920,1044030927,NL +1044030928,1044030935,BE +1044030936,1044030959,NL +1044030960,1044030967,BE +1044030968,1044030999,NL +1044031000,1044031007,BE +1044031008,1044031119,NL +1044031120,1044031127,BE +1044031128,1044031159,NL +1044031160,1044031167,BE +1044031168,1044031271,NL +1044031272,1044031279,BE +1044031280,1044031287,NL +1044031288,1044031295,BE +1044031296,1044031319,NL +1044031320,1044031327,BE +1044031328,1044031343,NL +1044031344,1044031351,BE +1044031352,1044031359,NL +1044031360,1044031360,BE +1044031361,1044031363,NL +1044031364,1044031364,BE +1044031365,1044031367,NL +1044031368,1044031375,BE +1044031376,1044031399,NL +1044031400,1044031423,BE +1044031424,1044031439,NL +1044031440,1044031447,BE +1044031448,1044031489,NL +1044031490,1044031490,BE +1044031491,1044031494,NL +1044031495,1044031495,BE +1044031496,1044031496,NL +1044031497,1044031497,BE +1044031498,1044031507,NL +1044031508,1044031508,BE +1044031509,1044031509,NL +1044031510,1044031510,BE +1044031511,1044031519,NL +1044031520,1044031520,BE +1044031521,1044031523,NL +1044031524,1044031524,BE +1044031525,1044031531,NL +1044031532,1044031532,BE +1044031533,1044031533,NL +1044031534,1044031536,BE +1044031537,1044031550,NL +1044031551,1044031551,BE +1044031552,1044031552,NL +1044031553,1044031553,BE +1044031554,1044031556,NL +1044031557,1044031557,BE +1044031558,1044031558,NL +1044031559,1044031559,BE +1044031560,1044031562,NL +1044031563,1044031563,BE +1044031564,1044031566,NL +1044031567,1044031567,BE +1044031568,1044031568,NL +1044031569,1044031569,BE +1044031570,1044031571,NL +1044031572,1044031572,BE +1044031573,1044031573,NL +1044031574,1044031574,BE +1044031575,1044031579,NL +1044031580,1044031581,BE +1044031582,1044031582,NL +1044031583,1044031584,BE +1044031585,1044031592,NL +1044031593,1044031593,BE +1044031594,1044031597,NL +1044031598,1044031598,BE +1044031599,1044031599,NL +1044031600,1044031600,BE +1044031601,1044031627,NL +1044031628,1044031628,BE +1044031629,1044031629,NL +1044031630,1044031630,BE +1044031631,1044031635,NL +1044031636,1044031636,BE +1044031637,1044031640,NL +1044031641,1044031641,BE +1044031642,1044031643,NL +1044031644,1044031644,BE +1044031645,1044031651,NL +1044031652,1044031652,BE +1044031653,1044031654,NL +1044031655,1044031655,BE +1044031656,1044031656,NL +1044031657,1044031658,BE +1044031659,1044031666,NL +1044031667,1044031667,BE +1044031668,1044031668,NL +1044031669,1044031670,BE +1044031671,1044031673,NL +1044031674,1044031674,BE +1044031675,1044031675,NL +1044031676,1044031677,BE +1044031678,1044031683,NL +1044031684,1044031684,BE +1044031685,1044031687,NL +1044031688,1044031688,BE +1044031689,1044031690,NL +1044031691,1044031692,BE +1044031693,1044031698,NL +1044031699,1044031699,BE +1044031700,1044031702,NL +1044031703,1044031704,BE +1044031705,1044031709,NL +1044031710,1044031710,BE +1044031711,1044031711,NL +1044031712,1044031712,BE +1044031713,1044031714,NL +1044031715,1044031715,BE +1044031716,1044031717,NL +1044031718,1044031719,BE +1044031720,1044031721,NL +1044031722,1044031723,BE +1044031724,1044031726,NL +1044031727,1044031727,BE +1044031728,1044031751,NL +1044031752,1044031759,BE +1044031760,1044031799,NL +1044031800,1044031807,BE +1044031808,1044031815,NL +1044031816,1044031871,BE +1044031872,1044031879,NL +1044031880,1044031887,BE +1044031888,1044031927,NL +1044031928,1044031935,BE +1044031936,1044031967,NL +1044031968,1044031975,BE +1044031976,1044031983,NL +1044031984,1044031991,BE +1044031992,1044031999,NL +1044032000,1044032015,BE +1044032016,1044032023,NL +1044032024,1044032031,BE +1044032032,1044032047,NL +1044032048,1044032055,BE +1044032056,1044032071,NL +1044032072,1044032079,BE +1044032080,1044032103,NL +1044032104,1044032127,BE +1044032128,1044032151,NL +1044032152,1044032167,BE +1044032168,1044032175,NL +1044032176,1044032183,BE +1044032184,1044032191,NL +1044032192,1044032199,BE +1044032200,1044032223,NL +1044032224,1044032239,BE +1044032240,1044032271,NL +1044032272,1044032287,BE +1044032288,1044032303,NL +1044032304,1044032311,BE +1044032312,1044032319,NL +1044032320,1044032327,BE +1044032328,1044032383,NL +1044032384,1044032391,BE +1044032392,1044032399,NL +1044032400,1044032407,BE +1044032408,1044032471,NL +1044032472,1044032479,BE +1044032480,1044032527,NL +1044032528,1044032559,BE +1044032560,1044032591,NL +1044032592,1044032615,BE +1044032616,1044032639,NL +1044032640,1044032647,BE +1044032648,1044032695,NL +1044032696,1044032703,BE +1044032704,1044032719,NL +1044032720,1044032727,BE +1044032728,1044032775,NL +1044032776,1044032783,BE +1044032784,1044032791,NL +1044032792,1044032799,BE +1044032800,1044032815,NL +1044032816,1044032831,BE +1044032832,1044032855,NL +1044032856,1044032863,BE +1044032864,1044032887,NL +1044032888,1044032903,BE +1044032904,1044032967,NL +1044032968,1044032975,BE +1044032976,1044032991,NL +1044032992,1044032999,BE +1044033000,1044033039,NL +1044033040,1044033047,BE +1044033048,1044033111,NL +1044033112,1044033119,BE +1044033120,1044033135,NL +1044033136,1044033151,BE +1044033152,1044033207,NL +1044033208,1044033215,BE +1044033216,1044033223,NL +1044033224,1044033231,BE +1044033232,1044033335,NL +1044033336,1044033343,BE +1044033344,1044033351,NL +1044033352,1044033359,BE +1044033360,1044033375,NL +1044033376,1044033407,BE +1044033408,1044033439,NL +1044033440,1044033447,BE +1044033448,1044033527,NL +1044033528,1044033535,BE +1044033536,1044033543,NL +1044033544,1044033551,BE +1044033552,1044033575,NL +1044033576,1044033583,BE +1044033584,1044033623,NL +1044033624,1044033631,BE +1044033632,1044033655,NL +1044033656,1044033663,BE +1044033664,1044033671,NL +1044033672,1044033687,BE +1044033688,1044033719,NL +1044033720,1044033727,BE +1044033728,1044033895,NL +1044033896,1044033903,BE +1044033904,1044033927,NL +1044033928,1044033935,BE +1044033936,1044033991,NL +1044033992,1044033999,BE +1044034000,1044034015,NL +1044034016,1044034023,BE +1044034024,1044034031,NL +1044034032,1044034039,BE +1044034040,1044034095,NL +1044034096,1044034119,BE +1044034120,1044034127,NL +1044034128,1044034135,BE +1044034136,1044034207,NL +1044034208,1044034215,BE +1044034216,1044034231,NL +1044034232,1044034239,BE +1044034240,1044034263,NL +1044034264,1044034271,BE +1044034272,1044034279,NL +1044034280,1044034287,BE +1044034288,1044034327,NL +1044034328,1044034335,BE +1044034336,1044034375,NL +1044034376,1044034383,BE +1044034384,1044034487,NL +1044034488,1044034495,BE +1044034496,1044034511,NL +1044034512,1044034519,BE +1044034520,1044034615,NL +1044034616,1044034623,BE +1044034624,1044034735,NL +1044034736,1044034743,BE +1044034744,1044034751,NL +1044034752,1044034759,BE +1044034760,1044034783,NL +1044034784,1044034791,BE +1044034792,1044034847,NL +1044034848,1044034855,BE +1044034856,1044034975,NL +1044034976,1044034983,BE +1044034984,1044035047,NL +1044035048,1044035055,BE +1044035056,1044035063,NL +1044035064,1044035071,BE +1044035072,1044035143,NL +1044035144,1044035151,BE +1044035152,1044035191,NL +1044035192,1044035199,BE +1044035200,1044035295,NL +1044035296,1044035311,BE +1044035312,1044035327,NL +1044035328,1044035351,BE +1044035352,1044035415,NL +1044035416,1044035423,BE +1044035424,1044035455,NL +1044035456,1044035471,BE +1044035472,1044035479,NL +1044035480,1044035487,BE +1044035488,1044035495,NL +1044035496,1044035503,BE +1044035504,1044035511,NL +1044035512,1044035527,BE +1044035528,1044035583,NL +1044035584,1044035591,BE +1044035592,1044035607,NL +1044035608,1044035615,BE +1044035616,1044035655,NL +1044035656,1044035663,BE +1044035664,1044035711,NL +1044035712,1044035727,BE +1044035728,1044035791,NL +1044035792,1044035807,BE +1044035808,1044035847,NL +1044035848,1044035871,BE +1044035872,1044035887,NL +1044035888,1044035895,BE +1044035896,1044035911,NL +1044035912,1044035919,BE +1044035920,1044035943,NL +1044035944,1044035967,BE +1044035968,1044035999,NL +1044036000,1044036007,BE +1044036008,1044036039,NL +1044036040,1044036047,BE +1044036048,1044036079,NL +1044036080,1044036087,BE +1044036088,1044036095,NL +1044036096,1044036103,BE +1044036104,1044036111,NL +1044036112,1044036119,BE +1044036120,1044036127,NL +1044036128,1044036135,BE +1044036136,1044036143,NL +1044036144,1044036151,BE +1044036152,1044036183,NL +1044036184,1044036191,BE +1044036192,1044036231,NL +1044036232,1044036239,BE +1044036240,1044036255,NL +1044036256,1044036271,BE +1044036272,1044036295,NL +1044036296,1044036303,BE +1044036304,1044036327,NL +1044036328,1044036335,BE +1044036336,1044036471,NL +1044036472,1044036479,BE +1044036480,1044036575,NL +1044036576,1044036607,BE +1044036608,1044036615,NL +1044036616,1044036623,BE +1044036624,1044036647,NL +1044036648,1044036655,BE +1044036656,1044036671,NL +1044036672,1044036687,BE +1044036688,1044036759,NL +1044036760,1044036767,BE +1044036768,1044036775,NL +1044036776,1044036783,BE +1044036784,1044036807,NL +1044036808,1044036815,BE +1044036816,1044036863,NL +1044036864,1044036864,BE +1044036865,1044036865,NL +1044036866,1044036866,BE +1044036867,1044036890,NL +1044036891,1044036891,BE +1044036892,1044036899,NL +1044036900,1044036900,BE +1044036901,1044036907,NL +1044036908,1044036908,BE +1044036909,1044036909,NL +1044036910,1044036910,BE +1044036911,1044036927,NL +1044036928,1044036928,BE +1044036929,1044036942,NL +1044036943,1044036943,BE +1044036944,1044036948,NL +1044036949,1044036951,BE +1044036952,1044036957,NL +1044036958,1044036958,BE +1044036959,1044036967,NL +1044036968,1044036968,BE +1044036969,1044036970,NL +1044036971,1044036971,BE +1044036972,1044036976,NL +1044036977,1044036977,BE +1044036978,1044036984,NL +1044036985,1044036985,BE +1044036986,1044036990,NL +1044036991,1044036991,BE +1044036992,1044037007,NL +1044037008,1044037010,BE +1044037011,1044037014,NL +1044037015,1044037015,BE +1044037016,1044037021,NL +1044037022,1044037022,BE +1044037023,1044037023,NL +1044037024,1044037025,BE +1044037026,1044037026,NL +1044037027,1044037027,BE +1044037028,1044037037,NL +1044037038,1044037038,BE +1044037039,1044037042,NL +1044037043,1044037043,BE +1044037044,1044037047,NL +1044037048,1044037048,BE +1044037049,1044037049,NL +1044037050,1044037051,BE +1044037052,1044037056,NL +1044037057,1044037057,BE +1044037058,1044037061,NL +1044037062,1044037063,BE +1044037064,1044037065,NL +1044037066,1044037066,BE +1044037067,1044037070,NL +1044037071,1044037071,BE +1044037072,1044037074,NL +1044037075,1044037075,BE +1044037076,1044037091,NL +1044037092,1044037092,BE +1044037093,1044037098,NL +1044037099,1044037100,BE +1044037101,1044037101,NL +1044037102,1044037102,BE +1044037103,1044037106,NL +1044037107,1044037107,BE +1044037108,1044037109,NL +1044037110,1044037110,BE +1044037111,1044037159,NL +1044037160,1044037167,BE +1044037168,1044037191,NL +1044037192,1044037199,BE +1044037200,1044037207,NL +1044037208,1044037223,BE +1044037224,1044037271,NL +1044037272,1044037279,BE +1044037280,1044037287,NL +1044037288,1044037295,BE +1044037296,1044037667,NL +1044037668,1044037671,BE +1044037672,1044037703,NL +1044037704,1044037711,BE +1044037712,1044037735,NL +1044037736,1044037743,BE +1044037744,1044037767,NL +1044037768,1044037783,BE +1044037784,1044037791,NL +1044037792,1044037823,BE +1044037824,1044037831,NL +1044037832,1044037839,BE +1044037840,1044037855,NL +1044037856,1044037887,BE +1044037888,1044038143,NL +1044038144,1044038527,BE +1044038528,1044038535,NL +1044038536,1044038543,BE +1044038544,1044038559,NL +1044038560,1044038567,BE +1044038568,1044038591,NL +1044038592,1044038599,BE +1044038600,1044038615,NL +1044038616,1044038623,BE +1044038624,1044038783,NL +1044038784,1044038911,BE +1044038912,1044038919,NL +1044038920,1044038927,BE +1044038928,1044038935,NL +1044038936,1044038943,BE +1044038944,1044039751,NL +1044039752,1044039759,BE +1044039760,1044039775,NL +1044039776,1044039855,BE +1044039856,1044039999,NL +1044040000,1044040007,BE +1044040008,1044040071,NL +1044040072,1044040095,BE +1044040096,1044040231,NL +1044040232,1044040239,BE +1044040240,1044040255,NL +1044040256,1044040703,BE +1044040704,1044041727,NL +1044041728,1044043775,BE +1044043776,1044043783,NL +1044043784,1044043787,BE +1044043788,1044043791,NL +1044043792,1044043795,BE +1044043796,1044043799,NL +1044043800,1044043803,BE +1044043804,1044043807,NL +1044043808,1044043811,BE +1044043812,1044043823,NL +1044043824,1044043827,BE +1044043828,1044043835,NL +1044043836,1044043847,BE +1044043848,1044043851,NL +1044043852,1044043879,BE +1044043880,1044043883,NL +1044043884,1044043895,BE +1044043896,1044043903,NL +1044043904,1044043907,BE +1044043908,1044043919,NL +1044043920,1044043927,BE +1044043928,1044043931,NL +1044043932,1044043935,BE +1044043936,1044043943,NL +1044043944,1044043955,BE +1044043956,1044043971,NL +1044043972,1044043975,BE +1044043976,1044043987,NL +1044043988,1044043999,BE +1044044000,1044044003,NL +1044044004,1044044007,BE +1044044008,1044044011,NL +1044044012,1044044015,BE +1044044016,1044044019,NL +1044044020,1044044027,BE +1044044028,1044044035,NL +1044044036,1044044043,BE +1044044044,1044044051,NL +1044044052,1044044055,BE +1044044056,1044044059,NL +1044044060,1044044067,BE +1044044068,1044044083,NL +1044044084,1044044095,BE +1044044096,1044044119,NL +1044044120,1044044131,BE +1044044132,1044044135,NL +1044044136,1044044143,BE +1044044144,1044044163,NL +1044044164,1044044167,BE +1044044168,1044044171,NL +1044044172,1044044187,BE +1044044188,1044044215,NL +1044044216,1044044223,BE +1044044224,1044044243,NL +1044044244,1044044247,BE +1044044248,1044044251,NL +1044044252,1044045311,BE +1044045312,1044045695,NL +1044045696,1044045911,BE +1044045912,1044045919,NL +1044045920,1044046079,BE +1044046080,1044046223,NL +1044046224,1044046231,BE +1044046232,1044046239,NL +1044046240,1044046319,BE +1044046320,1044046327,NL +1044046328,1044046847,BE +1044046848,1044051967,NL +1044051968,1044051987,BE +1044051988,1044051991,NL +1044051992,1044052011,BE +1044052012,1044052015,NL +1044052016,1044052031,BE +1044052032,1044052039,NL +1044052040,1044052063,BE +1044052064,1044052067,NL +1044052068,1044052107,BE +1044052108,1044052111,NL +1044052112,1044052131,BE +1044052132,1044052135,NL +1044052136,1044052223,BE +1044052224,1044052227,NL +1044052228,1044052255,BE +1044052256,1044052259,NL +1044052260,1044052347,BE +1044052348,1044052359,NL +1044052360,1044052363,BE +1044052364,1044052375,NL +1044052376,1044052479,BE +1044052480,1044052483,NL +1044052484,1044052967,BE +1044052968,1044052971,NL +1044052972,1044052983,BE +1044052984,1044052987,NL +1044052988,1044053055,BE +1044053056,1044053063,NL +1044053064,1044053255,BE +1044053256,1044053263,NL +1044053264,1044053455,BE +1044053456,1044053463,NL +1044053464,1044053503,BE +1044053504,1044059263,NL +1044059264,1044059935,BE +1044059936,1044060031,NL +1044060032,1044060063,BE +1044060064,1044061199,NL +1044061200,1044061207,BE +1044061208,1044061391,NL +1044061392,1044061399,BE +1044061400,1044061431,NL +1044061432,1044061439,BE +1044061440,1044061759,NL +1044061760,1044061775,BE +1044061776,1044061783,NL +1044061784,1044061791,BE +1044061792,1044061831,NL +1044061832,1044061839,BE +1044061840,1044061887,NL +1044061888,1044061895,BE +1044061896,1044061919,NL +1044061920,1044061951,BE +1044061952,1044062015,NL +1044062016,1044062031,BE +1044062032,1044062039,NL +1044062040,1044062047,BE +1044062048,1044062079,NL +1044062080,1044062087,BE +1044062088,1044062103,NL +1044062104,1044062119,BE +1044062120,1044062175,NL +1044062176,1044062199,BE +1044062200,1044062223,NL +1044062224,1044062239,BE +1044062240,1044062375,NL +1044062376,1044062383,BE +1044062384,1044062399,NL +1044062400,1044062415,BE +1044062416,1044062463,NL +1044062464,1044062471,BE +1044062472,1044062503,NL +1044062504,1044062527,BE +1044062528,1044062535,NL +1044062536,1044062543,BE +1044062544,1044062575,NL +1044062576,1044062583,BE +1044062584,1044062591,NL +1044062592,1044062599,BE +1044062600,1044062647,NL +1044062648,1044062655,BE +1044062656,1044062663,NL +1044062664,1044062671,BE +1044062672,1044063231,NL +1044063232,1044063355,BE +1044063356,1044063363,NL +1044063364,1044067327,BE +1044067328,1044068351,NL +1044068352,1044068991,BE +1044068992,1044069631,NL +1044069632,1044070399,BE +1044070400,1044076607,NL +1044076608,1044076927,BE +1044076928,1044077823,NL +1044077824,1044078591,BE +1044078592,1044092927,NL +1044092928,1044093183,BE +1044093184,1044103263,NL +1044103264,1044103423,BE +1044103424,1044103999,NL +1044104000,1044104031,BE +1044104032,1044104367,NL +1044104368,1044104383,BE +1044104384,1044104543,NL +1044104544,1044104559,BE +1044104560,1044104831,NL +1044104832,1044105023,BE +1044105024,1044105151,NL +1044105152,1044106771,BE +1044106772,1044106775,NL +1044106776,1044106787,BE +1044106788,1044106795,NL +1044106796,1044106807,BE +1044106808,1044106815,NL +1044106816,1044107263,BE +1044107264,1044117503,NL +1044117504,1044117551,BE +1044117552,1044117567,NL +1044117568,1044118527,BE +1044118528,1044119551,NL +1044119552,1044152319,GB +1044152320,1044185087,IR +1044185088,1044193279,RU +1044193280,1044201471,PL +1044201472,1044217855,FI +1044217856,1044226047,DK +1044226048,1044234239,OM +1044250624,1044251391,BE +1044251648,1044252415,BE +1044252928,1044253439,BE +1044253696,1044254463,BE +1044254976,1044255487,BE +1044256000,1044256511,BE +1044256768,1044257535,BE +1044257792,1044258559,BE +1044259072,1044259583,BE +1044260096,1044261631,BE +1044262144,1044262399,BE +1044263168,1044263423,BE +1044264192,1044264447,BE +1044265216,1044265471,BE +1044265984,1044266751,BE +1044267520,1044269567,BE +1044270080,1044271615,BE +1044272128,1044272383,BE +1044272896,1044273151,BE +1044283392,1044316159,FR +1044316160,1044332543,NO +1044332544,1044348927,RU +1044348928,1044365311,LV +1044365312,1044381695,SE +1044381696,1044384511,RU +1044384512,1044384767,KZ +1044384768,1044389887,RU +1044389888,1044398079,FR +1044398080,1044414463,UA +1044414464,1044447231,GB +1044447232,1044451583,SE +1044451584,1044451839,NO +1044451840,1044453183,SE +1044453184,1044453263,NO +1044453264,1044454399,SE +1044454400,1044454415,NO +1044454416,1044454423,SE +1044454424,1044454427,NO +1044454428,1044454463,SE +1044454464,1044454495,NO +1044454496,1044454511,SE +1044454512,1044454559,NO +1044454560,1044454583,SE +1044454584,1044454655,NO +1044454656,1044454911,SE +1044454912,1044455423,NO +1044455424,1044463615,EE +1044463616,1044479999,SE +1044480000,1044488191,CH +1044488192,1044496383,SK +1044496384,1044512767,EE +1044512768,1044578303,DK +1044578304,1044586495,GB +1044586496,1044587007,DE +1044587008,1044587519,GB +1044587520,1044587775,DE +1044587776,1044588031,GB +1044588032,1044588287,DE +1044588288,1044588575,GB +1044588576,1044588607,DE +1044588608,1044589055,GB +1044589056,1044590335,DE +1044590336,1044590591,GB +1044590592,1044590671,DE +1044590672,1044590847,GB +1044590848,1044591359,DE +1044591360,1044591871,GB +1044591872,1044592127,DE +1044592128,1044592143,GB +1044592144,1044592175,DE +1044592176,1044592191,GB +1044592192,1044592255,DE +1044592256,1044592639,GB +1044592640,1044592655,DE +1044592656,1044592831,GB +1044592832,1044594175,DE +1044594176,1044625407,GB +1044625408,1044625463,DE +1044625464,1044625471,GB +1044625472,1044625487,DE +1044625488,1044625663,GB +1044625664,1044625679,DE +1044625680,1044627967,GB +1044627968,1044628479,DE +1044628480,1044629503,GB +1044629504,1044629759,DE +1044629760,1044630527,GB +1044630528,1044630783,DE +1044630784,1044631551,GB +1044631552,1044631935,DE +1044631936,1044631951,GB +1044631952,1044631967,DE +1044631968,1044632063,GB +1044632064,1044633855,DE +1044633856,1044634111,GB +1044634112,1044634367,DE +1044634368,1044634623,GB +1044634624,1044634879,DE +1044634880,1044635135,GB +1044635136,1044635391,DE +1044635392,1044635647,GB +1044635648,1044636159,US +1044636160,1044638207,DE +1044638208,1044638223,GB +1044638224,1044638239,DE +1044638240,1044638271,GB +1044638272,1044638335,DE +1044638336,1044638463,GB +1044638464,1044638719,DE +1044638720,1044638975,GB +1044638976,1044639231,DE +1044639232,1044639743,GB +1044639744,1044643327,DE +1044643328,1044643839,GB +1044643840,1044652031,DE +1044660224,1044664895,GR +1044664896,1044664959,IR +1044664960,1044668415,GR +1044668416,1044676607,BA +1044676608,1044684799,RU +1044684800,1044692991,HU +1044692992,1044701183,AT +1044709376,1044717567,RU +1044717568,1044742143,GB +1044742144,1044750335,KW +1044750336,1044758527,NL +1044758528,1044774911,PL +1044774912,1044776175,NO +1044776176,1044776191,GB +1044776192,1044840447,NO +1044840448,1044905983,FI +1044905984,1044908031,GB +1044908032,1044909055,US +1044909056,1044916735,GB +1044916736,1044917247,DE +1044917248,1044917279,GB +1044917280,1044917295,US +1044917296,1044917311,DE +1044917312,1044917343,GB +1044917344,1044917359,DE +1044917360,1044917503,GB +1044917504,1044917759,DE +1044917760,1044917823,GB +1044917824,1044918271,DE +1044918272,1044918287,GB +1044918288,1044919295,DE +1044919296,1044920191,GB +1044920192,1044920319,DE +1044920320,1044921343,GB +1044921344,1044922367,US +1044922368,1044930559,DE +1044930560,1044930695,BE +1044930696,1044930703,GB +1044930704,1044930775,BE +1044930776,1044930783,GB +1044930784,1044930791,BE +1044930792,1044930795,GB +1044930796,1044930799,BE +1044930800,1044930807,GB +1044930808,1044930823,BE +1044930824,1044930831,GB +1044930832,1044930847,BE +1044930848,1044930879,GB +1044930880,1044930911,BE +1044930912,1044930927,DE +1044930928,1044930967,BE +1044930968,1044930979,GB +1044930980,1044931023,BE +1044931024,1044931027,GB +1044931028,1044931103,BE +1044931104,1044931107,GB +1044931108,1044931111,BE +1044931112,1044931119,GB +1044931120,1044931215,BE +1044931216,1044931231,GB +1044931232,1044931239,BE +1044931240,1044931247,GB +1044931248,1044931263,BE +1044931264,1044931295,GB +1044931296,1044931375,BE +1044931376,1044931391,GB +1044931392,1044931407,BE +1044931408,1044931423,GB +1044931424,1044931487,BE +1044931488,1044931495,GB +1044931496,1044931535,BE +1044931536,1044931543,GB +1044931544,1044931551,BE +1044931552,1044931567,GB +1044931568,1044931615,BE +1044931616,1044931623,GB +1044931624,1044931759,BE +1044931760,1044931775,GB +1044931776,1044931855,BE +1044931856,1044931871,GB +1044931872,1044931903,BE +1044931904,1044931919,GB +1044931920,1044931975,BE +1044931976,1044931983,GB +1044931984,1044932063,BE +1044932064,1044932079,GB +1044932080,1044932135,BE +1044932136,1044932143,GB +1044932144,1044932159,BE +1044932160,1044932191,GB +1044932192,1044932303,BE +1044932304,1044932307,GB +1044932308,1044932343,BE +1044932344,1044932351,GB +1044932352,1044932391,BE +1044932392,1044932407,GB +1044932408,1044932503,BE +1044932504,1044932543,GB +1044932544,1044932675,BE +1044932676,1044932687,GB +1044932688,1044932703,BE +1044932704,1044932707,GB +1044932708,1044932719,BE +1044932720,1044932727,GB +1044932728,1044932735,BE +1044932736,1044932799,GB +1044932800,1044932807,BE +1044932808,1044932815,GB +1044932816,1044932831,BE +1044932832,1044932839,GB +1044932840,1044932855,BE +1044932856,1044932863,GB +1044932864,1044932919,BE +1044932920,1044932927,GB +1044932928,1044932943,BE +1044932944,1044932947,GB +1044932948,1044932951,BE +1044932952,1044932959,GB +1044932960,1044933023,BE +1044933024,1044933039,GB +1044933040,1044933055,BE +1044933056,1044933071,GB +1044933072,1044933215,BE +1044933216,1044933227,GB +1044933228,1044933303,BE +1044933304,1044933311,GB +1044933312,1044933359,BE +1044933360,1044933375,GB +1044933376,1044933415,BE +1044933416,1044933439,GB +1044933440,1044933711,BE +1044933712,1044933719,GB +1044933720,1044933727,BE +1044933728,1044933735,GB +1044933736,1044933743,BE +1044933744,1044933759,GB +1044933760,1044933823,BE +1044933824,1044933831,GB +1044933832,1044933843,BE +1044933844,1044933847,GB +1044933848,1044933863,BE +1044933864,1044933871,GB +1044933872,1044934191,BE +1044934192,1044934199,GB +1044934200,1044934239,BE +1044934240,1044934247,GB +1044934248,1044934311,BE +1044934312,1044934319,GB +1044934320,1044934359,BE +1044934360,1044934367,GB +1044934368,1044934399,BE +1044934400,1044934495,GB +1044934496,1044934575,BE +1044934576,1044934583,GB +1044934584,1044934591,BE +1044934592,1044934599,GB +1044934600,1044934719,BE +1044934720,1044934911,GB +1044934912,1044934979,BE +1044934980,1044934983,GB +1044934984,1044935027,BE +1044935028,1044935039,GB +1044935040,1044935231,BE +1044935232,1044935247,GB +1044935248,1044935279,BE +1044935280,1044935295,GB +1044935296,1044935331,BE +1044935332,1044935335,GB +1044935336,1044935351,BE +1044935352,1044935359,GB +1044935360,1044935391,BE +1044935392,1044935431,GB +1044935432,1044935479,BE +1044935480,1044935487,GB +1044935488,1044935591,BE +1044935592,1044935615,GB +1044935616,1044935647,BE +1044935648,1044935655,GB +1044935656,1044935663,BE +1044935664,1044935671,GB +1044935672,1044935879,BE +1044935880,1044935887,GB +1044935888,1044935903,BE +1044935904,1044936063,GB +1044936064,1044936103,BE +1044936104,1044936111,GB +1044936112,1044936123,BE +1044936124,1044936151,GB +1044936152,1044936207,BE +1044936208,1044936215,GB +1044936216,1044936271,BE +1044936272,1044936287,GB +1044936288,1044936303,BE +1044936304,1044936311,GB +1044936312,1044936335,BE +1044936336,1044936351,GB +1044936352,1044936439,BE +1044936440,1044936463,GB +1044936464,1044936479,BE +1044936480,1044936487,GB +1044936488,1044936495,BE +1044936496,1044936503,GB +1044936504,1044936711,BE +1044936712,1044936719,GB +1044936720,1044936831,BE +1044936832,1044936847,GB +1044936848,1044937015,BE +1044937016,1044937023,GB +1044937024,1044937183,BE +1044937184,1044937187,GB +1044937188,1044937191,BE +1044937192,1044937195,GB +1044937196,1044937287,BE +1044937288,1044937311,GB +1044937312,1044937391,BE +1044937392,1044937399,GB +1044937400,1044937535,BE +1044937536,1044937551,GB +1044937552,1044937591,BE +1044937592,1044937599,GB +1044937600,1044937615,BE +1044937616,1044937631,GB +1044937632,1044937679,BE +1044937680,1044937687,GB +1044937688,1044937703,BE +1044937704,1044937711,GB +1044937712,1044937735,BE +1044937736,1044937743,GB +1044937744,1044937751,BE +1044937752,1044937759,GB +1044937760,1044937847,BE +1044937848,1044937855,GB +1044937856,1044937903,BE +1044937904,1044937911,GB +1044937912,1044938103,BE +1044938104,1044938107,GB +1044938108,1044938111,BE +1044938112,1044938143,GB +1044938144,1044938239,BE +1044938240,1044938271,GB +1044938272,1044938367,BE +1044938368,1044938399,GB +1044938400,1044938407,BE +1044938408,1044938415,GB +1044938416,1044938423,BE +1044938424,1044938431,GB +1044938432,1044938487,BE +1044938488,1044938511,GB +1044938512,1044938519,BE +1044938520,1044938527,GB +1044938528,1044938631,BE +1044938632,1044946943,GB +1044946944,1044955135,UA +1044955136,1044963327,NL +1044963328,1044971519,FI +1044971520,1044979711,FR +1044979712,1044987903,FI +1044987904,1045004287,BG +1045004288,1045004671,GB +1045004672,1045004751,IE +1045004752,1045018207,GB +1045018208,1045018231,FI +1045018232,1045020671,GB +1045020672,1045037055,NO +1045037056,1045119231,GR +1045119232,1045119743,AL +1045119744,1045135359,GR +1045135360,1045141759,DE +1045141760,1045142015,PL +1045142016,1045168127,DE +1045168128,1045233663,RU +1045233664,1045241855,GB +1045241856,1045250047,IT +1045250048,1045266431,CZ +1045266432,1045274623,HU +1045274624,1045282815,IE +1045282816,1045299199,HU +1045299200,1045302271,GB +1045303296,1045305855,DE +1045307392,1045315583,GB +1045315584,1045319679,DE +1045319680,1045323775,RU +1045323776,1045364735,FI +1045364736,1045430271,DK +1045430272,1045430887,DE +1045430888,1045430895,CH +1045430896,1045436911,DE +1045436912,1045436919,GB +1045436920,1045446655,DE +1045446656,1045446911,HU +1045446912,1045447167,SK +1045447168,1045447231,HU +1045447232,1045447239,CZ +1045447240,1045447263,HU +1045447264,1045447279,CZ +1045447280,1045447287,HU +1045447288,1045447295,CZ +1045447296,1045447311,HU +1045447312,1045447423,CZ +1045447424,1045447431,HU +1045447432,1045447439,CZ +1045447440,1045447447,HU +1045447448,1045447471,CZ +1045447472,1045447551,HU +1045447552,1045448031,CZ +1045448032,1045448039,HU +1045448040,1045448055,CZ +1045448056,1045448063,HU +1045448064,1045448159,CZ +1045448160,1045448191,HU +1045448192,1045448239,CZ +1045448240,1045448263,HU +1045448264,1045448543,CZ +1045448544,1045448559,SK +1045448560,1045448703,CZ +1045448704,1045448767,HU +1045448768,1045449471,CZ +1045449472,1045449727,HU +1045449728,1045452543,CZ +1045452544,1045452799,SK +1045452800,1045454847,CZ +1045454848,1045460735,DE +1045460736,1045460991,NL +1045460992,1045461503,FR +1045461504,1045461631,DE +1045461632,1045461695,FR +1045461696,1045461703,DE +1045461704,1045461711,GB +1045461712,1045461719,FR +1045461720,1045461727,IT +1045461728,1045461735,ES +1045461736,1045461743,NL +1045461744,1045463039,DE +1045463040,1045471231,FI +1045471232,1045479423,UA +1045479424,1045487615,SE +1045487616,1045495807,LT +1045495808,1045692415,ES +1045692416,1045700607,LV +1045700608,1045708799,KZ +1045708800,1045716991,LB +1045716992,1045725183,RU +1045725184,1045733375,CZ +1045733376,1045741567,GB +1045741568,1045741887,SE +1045741888,1045742015,GB +1045742016,1045742023,SE +1045742024,1045742039,GB +1045742040,1045742047,SE +1045742048,1045742063,GB +1045742064,1045742127,SE +1045742128,1045742175,GB +1045742176,1045742199,SE +1045742200,1045742207,GB +1045742208,1045742239,SE +1045742240,1045742247,GB +1045742248,1045742271,SE +1045742272,1045742335,GB +1045742336,1045742351,SE +1045742352,1045742367,GB +1045742368,1045742383,SE +1045742384,1045742391,GB +1045742392,1045742399,SE +1045742400,1045742431,GB +1045742432,1045742495,SE +1045742496,1045742535,GB +1045742536,1045742551,SE +1045742552,1045742559,GB +1045742560,1045742763,SE +1045742764,1045742767,GB +1045742768,1045742783,SE +1045742784,1045742831,GB +1045742832,1045742839,SE +1045742840,1045742847,GB +1045742848,1045743023,SE +1045743024,1045743031,GB +1045743032,1045743039,SE +1045743040,1045743063,GB +1045743064,1045743095,SE +1045743096,1045743183,GB +1045743184,1045743191,SE +1045743192,1045743199,GB +1045743200,1045743247,SE +1045743248,1045743263,GB +1045743264,1045743679,SE +1045743680,1045743743,GB +1045743744,1045743783,SE +1045743784,1045743791,GB +1045743792,1045743803,SE +1045743804,1045743807,GB +1045743808,1045743999,SE +1045744000,1045744007,LU +1045744008,1045744063,GB +1045744064,1045744383,SE +1045744384,1045745407,GB +1045745408,1045745607,SE +1045745608,1045745623,GB +1045745624,1045745639,SE +1045745640,1045745647,GB +1045745648,1045745655,SE +1045745656,1045745663,GB +1045745664,1045745695,SE +1045745696,1045745759,GB +1045745760,1045745768,SE +1045745769,1045745879,GB +1045745880,1045745919,SE +1045745920,1045745999,GB +1045746000,1045746079,SE +1045746080,1045746095,GB +1045746096,1045746111,SE +1045746112,1045746143,GB +1045746144,1045746159,SE +1045746160,1045746175,GB +1045746176,1045746431,SE +1045746432,1045746447,GB +1045746448,1045746463,SE +1045746464,1045746543,GB +1045746544,1045746559,SE +1045746560,1045746687,GB +1045746688,1045747071,SE +1045747072,1045747199,GB +1045747200,1045747455,SE +1045747456,1045747583,GB +1045747584,1045747615,SE +1045747616,1045747679,GB +1045747680,1045747711,SE +1045747712,1045747743,GB +1045747744,1045747751,SE +1045747752,1045747759,GB +1045747760,1045747775,SE +1045747776,1045747815,GB +1045747816,1045747823,SE +1045747824,1045747839,GB +1045747840,1045747871,SE +1045747872,1045747919,GB +1045747920,1045747935,SE +1045747936,1045747967,GB +1045747968,1045748223,SE +1045748224,1045748239,GB +1045748240,1045748287,SE +1045748288,1045748295,GB +1045748296,1045748303,SE +1045748304,1045748319,GB +1045748320,1045748351,SE +1045748352,1045748399,GB +1045748400,1045748407,SE +1045748408,1045748463,GB +1045748464,1045748479,SE +1045748480,1045757951,GB +1045757952,1045790719,LV +1045790720,1045798911,FR +1045798912,1045889023,IT +1045889024,1045921791,ES +1045921792,1045954559,PL +1045954560,1045987327,BE +1045987328,1046020095,SE +1046020096,1046028287,AM +1046028288,1046036479,NO +1046036480,1046052863,PL +1046052864,1046061055,GB +1046061056,1046069247,DE +1046069248,1046085631,RU +1046085632,1046150143,IL +1046150144,1046150399,LR +1046150400,1046151167,IL +1046151168,1046216703,DE +1046216704,1046220959,NO +1046220960,1046220975,SE +1046220976,1046225647,NO +1046225648,1046225655,SE +1046225656,1046229111,NO +1046229112,1046229119,SE +1046229120,1046282239,NO +1046282240,1046290431,GB +1046290432,1046298623,PL +1046298624,1046315007,AT +1046315008,1046315519,FR +1046315520,1046316031,IT +1046316032,1046316543,FR +1046316544,1046317055,DK +1046317056,1046317567,ES +1046317568,1046317823,GB +1046317824,1046318335,NL +1046318336,1046318591,GB +1046318592,1046320127,NL +1046320128,1046323199,GB +1046323200,1046327151,ES +1046327152,1046327155,FR +1046327156,1046331383,ES +1046331384,1046331391,PT +1046331392,1046331903,DE +1046331904,1046332159,NL +1046332160,1046332415,FR +1046332416,1046339839,DE +1046339840,1046340095,FR +1046340096,1046341151,NL +1046341152,1046341631,DE +1046341632,1046342143,FR +1046342144,1046342719,NL +1046342720,1046343423,DE +1046343424,1046343935,NL +1046343936,1046347775,DE +1046347776,1046349839,IT +1046349840,1046349847,FR +1046349848,1046352831,IT +1046352832,1046352847,SM +1046352848,1046366807,IT +1046366808,1046366815,PL +1046366816,1046413311,IT +1046413312,1046446079,SE +1046446080,1046479511,DE +1046479512,1046479550,GB +1046479551,1046479687,DE +1046479688,1046479743,GB +1046479744,1046479895,DE +1046479896,1046479903,GB +1046479904,1046479935,DE +1046479936,1046479951,GB +1046479952,1046480475,DE +1046480476,1046480479,GB +1046480480,1046480703,DE +1046480704,1046480735,GB +1046480736,1046480767,DE +1046480768,1046480895,GB +1046480896,1046481175,DE +1046481176,1046481183,GB +1046481184,1046481327,DE +1046481328,1046481375,GB +1046481376,1046481471,DE +1046481472,1046481927,GB +1046481928,1046481963,DE +1046481964,1046481967,GB +1046481968,1046482207,DE +1046482208,1046482239,GB +1046482240,1046482367,DE +1046482368,1046482943,GB +1046482944,1046483231,DE +1046483232,1046483471,GB +1046483472,1046483871,DE +1046483872,1046483967,GB +1046483968,1046484351,DE +1046484352,1046484479,GB +1046484480,1046484511,DE +1046484512,1046484607,GB +1046484608,1046484623,DE +1046484624,1046484991,GB +1046484992,1046485023,DE +1046485024,1046485031,GB +1046485032,1046485127,DE +1046485128,1046485135,GB +1046485136,1046485159,DE +1046485160,1046485167,GB +1046485168,1046485279,DE +1046485280,1046485287,GB +1046485288,1046485367,DE +1046485368,1046485375,GB +1046485376,1046485495,DE +1046485496,1046485543,GB +1046485544,1046485631,DE +1046485632,1046485639,GB +1046485640,1046485647,DE +1046485648,1046485663,GB +1046485664,1046485759,DE +1046485760,1046485791,GB +1046485792,1046485823,DE +1046485824,1046485855,GB +1046485856,1046485991,DE +1046485992,1046485999,GB +1046486000,1046486055,DE +1046486056,1046486063,GB +1046486064,1046486159,DE +1046486160,1046486175,GB +1046486176,1046486183,DE +1046486184,1046486191,GB +1046486192,1046486375,DE +1046486376,1046486383,GB +1046486384,1046486487,DE +1046486488,1046486495,GB +1046486496,1046491391,DE +1046491392,1046491399,GB +1046491400,1046491423,DE +1046491424,1046491431,GB +1046491432,1046491591,DE +1046491592,1046491599,GB +1046491600,1046491711,DE +1046491712,1046491727,GB +1046491728,1046491743,DE +1046491744,1046491775,GB +1046491776,1046491839,DE +1046491840,1046492159,GB +1046492160,1046492319,DE +1046492320,1046492327,GB +1046492328,1046492415,DE +1046492416,1046492447,GB +1046492448,1046492503,DE +1046492504,1046492511,GB +1046492512,1046492543,DE +1046492544,1046492551,GB +1046492552,1046492655,DE +1046492656,1046492663,GB +1046492664,1046492687,DE +1046492688,1046492695,GB +1046492696,1046492911,DE +1046492912,1046492967,GB +1046492968,1046493071,DE +1046493072,1046493087,GB +1046493088,1046493095,DE +1046493096,1046493103,GB +1046493104,1046493175,DE +1046493176,1046493183,GB +1046493184,1046493391,DE +1046493392,1046493471,GB +1046493472,1046493479,DE +1046493480,1046493511,GB +1046493512,1046493519,DE +1046493520,1046493535,GB +1046493536,1046493551,DE +1046493552,1046493575,GB +1046493576,1046493583,DE +1046493584,1046493591,GB +1046493592,1046493599,DE +1046493600,1046493631,GB +1046493632,1046493639,DE +1046493640,1046493695,GB +1046493696,1046493951,DE +1046493952,1046493983,GB +1046493984,1046494031,DE +1046494032,1046494039,GB +1046494040,1046494087,DE +1046494088,1046494095,GB +1046494096,1046494303,DE +1046494304,1046494311,GB +1046494312,1046494327,DE +1046494328,1046494335,GB +1046494336,1046494607,DE +1046494608,1046494615,GB +1046494616,1046494623,DE +1046494624,1046494751,GB +1046494752,1046494759,DE +1046494760,1046494775,GB +1046494776,1046494799,DE +1046494800,1046494807,GB +1046494808,1046494815,DE +1046494816,1046494823,GB +1046494824,1046494831,DE +1046494832,1046494839,GB +1046494840,1046494975,DE +1046494976,1046495007,GB +1046495008,1046495015,DE +1046495016,1046495023,GB +1046495024,1046495039,DE +1046495040,1046495047,GB +1046495048,1046495063,DE +1046495064,1046495071,GB +1046495072,1046495079,DE +1046495080,1046495087,GB +1046495088,1046495103,DE +1046495104,1046495127,GB +1046495128,1046495223,DE +1046495224,1046495231,GB +1046495232,1046495351,DE +1046495352,1046495359,GB +1046495360,1046495407,DE +1046495408,1046495415,GB +1046495416,1046495439,DE +1046495440,1046495447,GB +1046495448,1046495487,DE +1046495488,1046495519,GB +1046495520,1046495527,DE +1046495528,1046495535,GB +1046495536,1046495543,DE +1046495544,1046495551,GB +1046495552,1046495567,DE +1046495568,1046495575,GB +1046495576,1046495599,DE +1046495600,1046495607,GB +1046495608,1046495615,DE +1046495616,1046495623,GB +1046495624,1046495631,DE +1046495632,1046495639,GB +1046495640,1046495647,DE +1046495648,1046495663,GB +1046495664,1046495703,DE +1046495704,1046495719,GB +1046495720,1046495879,DE +1046495880,1046495895,GB +1046495896,1046495999,DE +1046496000,1046496071,GB +1046496072,1046496127,DE +1046496128,1046496135,GB +1046496136,1046496151,DE +1046496152,1046496159,GB +1046496160,1046496191,DE +1046496192,1046496215,GB +1046496216,1046496231,DE +1046496232,1046496239,GB +1046496240,1046496247,DE +1046496248,1046496287,GB +1046496288,1046496303,DE +1046496304,1046496511,GB +1046496512,1046497463,DE +1046497464,1046497567,GB +1046497568,1046497639,DE +1046497640,1046497647,GB +1046497648,1046497663,DE +1046497664,1046497671,GB +1046497672,1046497711,DE +1046497712,1046497727,GB +1046497728,1046497759,DE +1046497760,1046497775,GB +1046497776,1046497815,DE +1046497816,1046497823,GB +1046497824,1046497903,DE +1046497904,1046497911,GB +1046497912,1046497975,DE +1046497976,1046497983,GB +1046497984,1046498047,DE +1046498048,1046498079,GB +1046498080,1046498103,DE +1046498104,1046498111,GB +1046498112,1046498159,DE +1046498160,1046498167,GB +1046498168,1046498175,DE +1046498176,1046498183,GB +1046498184,1046498207,DE +1046498208,1046498215,GB +1046498216,1046498239,DE +1046498240,1046498255,GB +1046498256,1046498263,DE +1046498264,1046498271,GB +1046498272,1046498279,DE +1046498280,1046498295,GB +1046498296,1046498359,DE +1046498360,1046498367,GB +1046498368,1046498455,DE +1046498456,1046498591,GB +1046498592,1046498607,DE +1046498608,1046498615,GB +1046498616,1046498631,DE +1046498632,1046498639,GB +1046498640,1046498655,DE +1046498656,1046498663,GB +1046498664,1046498679,DE +1046498680,1046498687,GB +1046498688,1046498719,DE +1046498720,1046498727,GB +1046498728,1046498819,DE +1046498820,1046499327,GB +1046499328,1046502655,DE +1046502656,1046502719,GB +1046502720,1046502847,DE +1046502848,1046502855,GB +1046502856,1046502863,DE +1046502864,1046502951,GB +1046502952,1046502967,DE +1046502968,1046502975,GB +1046502976,1046503015,DE +1046503016,1046503023,GB +1046503024,1046503135,DE +1046503136,1046503143,GB +1046503144,1046503167,DE +1046503168,1046503207,GB +1046503208,1046503303,DE +1046503304,1046503319,GB +1046503320,1046503327,DE +1046503328,1046503351,GB +1046503352,1046503615,DE +1046503616,1046503679,GB +1046503680,1046503807,DE +1046503808,1046503935,GB +1046503936,1046504383,DE +1046504384,1046504487,GB +1046504488,1046504551,DE +1046504552,1046504559,GB +1046504560,1046504583,DE +1046504584,1046504615,GB +1046504616,1046504671,DE +1046504672,1046504679,GB +1046504680,1046504695,DE +1046504696,1046504735,GB +1046504736,1046504799,DE +1046504800,1046504807,GB +1046504808,1046504871,DE +1046504872,1046504879,GB +1046504880,1046504887,DE +1046504888,1046504911,GB +1046504912,1046504919,DE +1046504920,1046504927,GB +1046504928,1046504943,DE +1046504944,1046504951,GB +1046504952,1046504959,DE +1046504960,1046504999,GB +1046505000,1046505031,DE +1046505032,1046505039,GB +1046505040,1046505055,DE +1046505056,1046505063,GB +1046505064,1046505071,DE +1046505072,1046505087,GB +1046505088,1046505095,DE +1046505096,1046505103,GB +1046505104,1046505159,DE +1046505160,1046505167,GB +1046505168,1046505175,DE +1046505176,1046505191,GB +1046505192,1046505207,DE +1046505208,1046505247,GB +1046505248,1046505255,DE +1046505256,1046505271,GB +1046505272,1046505343,DE +1046505344,1046505359,GB +1046505360,1046505415,DE +1046505416,1046505423,GB +1046505424,1046505431,DE +1046505432,1046505439,GB +1046505440,1046505463,DE +1046505464,1046505511,GB +1046505512,1046505551,DE +1046505552,1046505559,GB +1046505560,1046505583,DE +1046505584,1046505591,GB +1046505592,1046505607,DE +1046505608,1046505631,GB +1046505632,1046505663,DE +1046505664,1046505671,GB +1046505672,1046505679,DE +1046505680,1046505687,GB +1046505688,1046505695,DE +1046505696,1046505703,GB +1046505704,1046505727,DE +1046505728,1046505759,GB +1046505760,1046505807,DE +1046505808,1046505823,GB +1046505824,1046505847,DE +1046505848,1046505887,GB +1046505888,1046505895,DE +1046505896,1046505903,GB +1046505904,1046505959,DE +1046505960,1046505967,GB +1046505968,1046505975,DE +1046505976,1046506015,GB +1046506016,1046506039,DE +1046506040,1046506055,GB +1046506056,1046506087,DE +1046506088,1046506095,GB +1046506096,1046506119,DE +1046506120,1046506135,GB +1046506136,1046506239,DE +1046506240,1046506271,GB +1046506272,1046506295,DE +1046506296,1046506303,GB +1046506304,1046506327,DE +1046506328,1046506351,GB +1046506352,1046506375,DE +1046506376,1046506383,GB +1046506384,1046506391,DE +1046506392,1046506407,GB +1046506408,1046506415,DE +1046506416,1046506423,GB +1046506424,1046506439,DE +1046506440,1046506447,GB +1046506448,1046506479,DE +1046506480,1046506487,GB +1046506488,1046506495,DE +1046506496,1046506535,GB +1046506536,1046506575,DE +1046506576,1046506591,GB +1046506592,1046506599,DE +1046506600,1046506607,GB +1046506608,1046506623,DE +1046506624,1046506639,GB +1046506640,1046506647,DE +1046506648,1046506655,GB +1046506656,1046506671,DE +1046506672,1046506679,GB +1046506680,1046506687,DE +1046506688,1046506703,GB +1046506704,1046506711,DE +1046506712,1046506743,GB +1046506744,1046506751,DE +1046506752,1046506783,GB +1046506784,1046506791,DE +1046506792,1046506807,GB +1046506808,1046506823,DE +1046506824,1046506839,GB +1046506840,1046506895,DE +1046506896,1046506903,GB +1046506904,1046506927,DE +1046506928,1046506935,GB +1046506936,1046506951,DE +1046506952,1046506959,GB +1046506960,1046506991,DE +1046506992,1046506999,GB +1046507000,1046507007,DE +1046507008,1046507039,GB +1046507040,1046507047,DE +1046507048,1046507055,GB +1046507056,1046507071,DE +1046507072,1046507111,GB +1046507112,1046507135,DE +1046507136,1046507151,GB +1046507152,1046507159,DE +1046507160,1046507175,GB +1046507176,1046507199,DE +1046507200,1046507207,GB +1046507208,1046507215,DE +1046507216,1046507519,GB +1046507520,1046511615,DE +1046511616,1046511647,GB +1046511648,1046511695,DE +1046511696,1046511719,GB +1046511720,1046511727,DE +1046511728,1046511815,GB +1046511816,1046511847,DE +1046511848,1046511863,GB +1046511864,1046511871,DE +1046511872,1046511903,GB +1046511904,1046511919,DE +1046511920,1046511927,GB +1046511928,1046511935,DE +1046511936,1046511967,GB +1046511968,1046511975,DE +1046511976,1046511991,GB +1046511992,1046512007,DE +1046512008,1046512055,GB +1046512056,1046512063,DE +1046512064,1046512167,GB +1046512168,1046512175,DE +1046512176,1046512199,GB +1046512200,1046512215,DE +1046512216,1046512287,GB +1046512288,1046512303,DE +1046512304,1046512311,GB +1046512312,1046512327,DE +1046512328,1046512335,GB +1046512336,1046512343,DE +1046512344,1046512351,GB +1046512352,1046512383,DE +1046512384,1046512431,GB +1046512432,1046512447,DE +1046512448,1046512455,GB +1046512456,1046512535,DE +1046512536,1046512543,GB +1046512544,1046512551,DE +1046512552,1046512567,GB +1046512568,1046512607,DE +1046512608,1046512623,GB +1046512624,1046512631,DE +1046512632,1046512679,GB +1046512680,1046512687,DE +1046512688,1046512735,GB +1046512736,1046512751,DE +1046512752,1046512759,GB +1046512760,1046512847,DE +1046512848,1046512879,GB +1046512880,1046512895,DE +1046512896,1046512927,GB +1046512928,1046512943,DE +1046512944,1046512967,GB +1046512968,1046512983,DE +1046512984,1046512991,GB +1046512992,1046512999,DE +1046513000,1046513007,GB +1046513008,1046513015,DE +1046513016,1046513031,GB +1046513032,1046513039,DE +1046513040,1046513047,GB +1046513048,1046513055,DE +1046513056,1046513063,GB +1046513064,1046513079,DE +1046513080,1046513111,GB +1046513112,1046513143,DE +1046513144,1046513263,GB +1046513264,1046513271,DE +1046513272,1046513287,GB +1046513288,1046513295,DE +1046513296,1046513303,GB +1046513304,1046513327,DE +1046513328,1046513343,GB +1046513344,1046513367,DE +1046513368,1046513375,GB +1046513376,1046513391,DE +1046513392,1046513439,GB +1046513440,1046513519,DE +1046513520,1046513527,GB +1046513528,1046513535,DE +1046513536,1046513543,GB +1046513544,1046513551,DE +1046513552,1046513559,GB +1046513560,1046513583,DE +1046513584,1046513759,GB +1046513760,1046513775,DE +1046513776,1046513783,GB +1046513784,1046513791,DE +1046513792,1046513799,GB +1046513800,1046513831,DE +1046513832,1046513847,GB +1046513848,1046513863,DE +1046513864,1046513871,GB +1046513872,1046513879,DE +1046513880,1046513895,GB +1046513896,1046513919,DE +1046513920,1046514207,GB +1046514208,1046514223,DE +1046514224,1046514239,GB +1046514240,1046514247,DE +1046514248,1046514255,GB +1046514256,1046514279,DE +1046514280,1046514287,GB +1046514288,1046514311,DE +1046514312,1046514319,GB +1046514320,1046514335,DE +1046514336,1046514351,GB +1046514352,1046514359,DE +1046514360,1046514367,GB +1046514368,1046514383,DE +1046514384,1046514415,GB +1046514416,1046514423,DE +1046514424,1046514719,GB +1046514720,1046514751,DE +1046514752,1046514783,GB +1046514784,1046515199,DE +1046515200,1046515711,GB +1046515712,1046515967,DE +1046515968,1046516991,GB +1046516992,1046517031,DE +1046517032,1046517039,GB +1046517040,1046517087,DE +1046517088,1046524159,GB +1046524160,1046524191,DE +1046524192,1046524207,GB +1046524208,1046524215,DE +1046524216,1046524287,GB +1046524288,1046524355,DE +1046524356,1046524415,GB +1046524416,1046525183,DE +1046525184,1046525215,GB +1046525216,1046525247,DE +1046525248,1046525311,GB +1046525312,1046525343,DE +1046525344,1046525439,GB +1046525440,1046525695,DE +1046525696,1046526591,GB +1046526592,1046526599,DE +1046526600,1046526631,GB +1046526632,1046526635,DE +1046526636,1046526719,GB +1046526720,1046526991,DE +1046526992,1046526995,GB +1046526996,1046527487,DE +1046527488,1046527743,GB +1046527744,1046527999,DE +1046528000,1046528255,GB +1046528256,1046528287,DE +1046528288,1046528319,GB +1046528320,1046528335,DE +1046528336,1046528351,GB +1046528352,1046528383,DE +1046528384,1046528391,GB +1046528392,1046528399,DE +1046528400,1046528447,GB +1046528448,1046528455,DE +1046528456,1046528459,GB +1046528460,1046528463,DE +1046528464,1046528471,GB +1046528472,1046528479,DE +1046528480,1046528487,GB +1046528488,1046528495,DE +1046528496,1046528519,GB +1046528520,1046528527,DE +1046528528,1046528543,GB +1046528544,1046528559,DE +1046528560,1046528575,GB +1046528576,1046528587,DE +1046528588,1046528599,GB +1046528600,1046528603,DE +1046528604,1046528607,GB +1046528608,1046528639,DE +1046528640,1046528671,GB +1046528672,1046528703,DE +1046528704,1046529279,GB +1046529280,1046529535,DE +1046529536,1046530047,GB +1046530048,1046530687,DE +1046530688,1046530815,GB +1046530816,1046530879,DE +1046530880,1046530943,GB +1046530944,1046530947,DE +1046530948,1046530967,GB +1046530968,1046530975,DE +1046530976,1046531007,GB +1046531008,1046531087,DE +1046531088,1046531095,GB +1046531096,1046531103,DE +1046531104,1046531111,GB +1046531112,1046531127,DE +1046531128,1046531839,GB +1046531840,1046532095,DE +1046532096,1046534015,GB +1046534016,1046534047,DE +1046534048,1046534143,GB +1046534144,1046534655,DE +1046534656,1046534911,GB +1046534912,1046535167,DE +1046535168,1046535295,GB +1046535296,1046535311,DE +1046535312,1046535359,GB +1046535360,1046535423,DE +1046535424,1046535487,GB +1046535488,1046535615,DE +1046535616,1046535619,GB +1046535620,1046535623,DE +1046535624,1046535631,GB +1046535632,1046535935,DE +1046535936,1046536007,GB +1046536008,1046536015,DE +1046536016,1046536023,GB +1046536024,1046536039,DE +1046536040,1046536063,GB +1046536064,1046536151,DE +1046536152,1046536159,GB +1046536160,1046536175,DE +1046536176,1046536187,GB +1046536188,1046536199,DE +1046536200,1046536211,GB +1046536212,1046536215,DE +1046536216,1046536255,GB +1046536256,1046536271,DE +1046536272,1046536279,GB +1046536280,1046536283,DE +1046536284,1046536287,GB +1046536288,1046536295,DE +1046536296,1046536319,GB +1046536320,1046536351,DE +1046536352,1046536423,GB +1046536424,1046536439,DE +1046536440,1046536607,GB +1046536608,1046536667,DE +1046536668,1046536703,GB +1046536704,1046537023,DE +1046537024,1046537055,GB +1046537056,1046537071,DE +1046537072,1046537087,GB +1046537088,1046537151,DE +1046537152,1046537215,GB +1046537216,1046537983,DE +1046537984,1046538431,GB +1046538432,1046538447,DE +1046538448,1046538463,GB +1046538464,1046538495,DE +1046538496,1046538751,GB +1046538752,1046539519,DE +1046539520,1046540031,GB +1046540032,1046540287,DE +1046540288,1046540543,GB +1046540544,1046541055,DE +1046541056,1046541311,GB +1046541312,1046541439,DE +1046541440,1046541503,GB +1046541504,1046541567,DE +1046541568,1046541631,GB +1046541632,1046541695,DE +1046541696,1046541727,GB +1046541728,1046541759,DE +1046541760,1046541767,GB +1046541768,1046541783,DE +1046541784,1046541807,GB +1046541808,1046542591,DE +1046542592,1046542847,GB +1046542848,1046543103,DE +1046543104,1046543263,GB +1046543264,1046543295,DE +1046543296,1046543327,GB +1046543328,1046543351,DE +1046543352,1046543359,GB +1046543360,1046543871,DE +1046543872,1046544127,GB +1046544128,1046544383,DE +1046544384,1046560767,IT +1046560768,1046585343,ES +1046585344,1046609919,NO +1046609920,1046675455,IT +1046675456,1046708223,ES +1046708224,1046740991,AT +1046740992,1046757375,NL +1046757376,1046765567,IT +1046765568,1046773759,ES +1046773760,1046781951,FR +1046781952,1046798335,GB +1046798336,1046806527,HU +1046806528,1046814719,IT +1046814720,1046822911,SE +1046822912,1046847487,IT +1046847488,1046855679,ES +1046855680,1046872063,NO +1046872064,1046872583,BE +1046872608,1046872615,BE +1046872656,1046872671,BE +1046872800,1046872815,BE +1046872976,1046872999,BE +1046873088,1046873279,BE +1046873600,1046878463,BE +1046879248,1046879263,BE +1046879272,1046879311,BE +1046879328,1046879495,BE +1046879504,1046879511,BE +1046879536,1046879551,BE +1046879592,1046879623,BE +1046879648,1046879655,BE +1046879688,1046879711,BE +1046879720,1046879735,BE +1046879776,1046879791,BE +1046879808,1046879831,BE +1046879840,1046879847,BE +1046879896,1046879911,BE +1046879944,1046879959,BE +1046879968,1046880127,BE +1046880136,1046880143,BE +1046880152,1046880191,BE +1046880256,1046880511,BE +1046880520,1046880527,BE +1046880560,1046880567,RO +1046880592,1046880615,BE +1046880640,1046880671,BE +1046880736,1046880759,BE +1046880904,1046880911,BE +1046880920,1046880935,BE +1046880984,1046881039,BE +1046881056,1046881071,BE +1046881080,1046881087,BE +1046881112,1046881127,BE +1046881136,1046881239,BE +1046881248,1046881255,BE +1046881280,1046882047,BE +1046882304,1046884383,BE +1046885376,1046888447,BE +1046888448,1046894591,GB +1046896640,1046897663,GB +1046897664,1046898431,BE +1046898688,1046898943,BE +1046899200,1046904831,BE +1046904832,1046937599,RU +1046937600,1047003135,GR +1047003136,1047068671,DE +1047068672,1047085055,RU +1047085056,1047101439,GB +1047101440,1047109631,RU +1047109632,1047117823,GB +1047117824,1047134207,NL +1047134208,1047150591,FI +1047150592,1047158783,FR +1047158784,1047166975,RU +1047166976,1047199743,FR +1047199744,1047265279,DK +1047265280,1047273471,NL +1047273472,1047281663,GB +1047281664,1047289855,TR +1047289856,1047290111,CS +1047290112,1047291903,CS +1047291904,1047292927,CS +1047292928,1047293695,CS +1047293696,1047293951,CS +1047293952,1047294719,CS +1047294720,1047294735,CS +1047294736,1047294847,CS +1047294848,1047294911,RS +1047294912,1047295231,CS +1047295232,1047295239,CS +1047295240,1047295247,CS +1047295248,1047295263,CS +1047295264,1047295279,CS +1047295280,1047295295,CS +1047295296,1047295327,CS +1047295328,1047295343,CS +1047295344,1047295399,CS +1047295400,1047295415,RS +1047295416,1047295999,CS +1047296000,1047297023,CS +1047297024,1047297567,CS +1047297568,1047297599,CS +1047297600,1047298047,CS +1047298048,1047300095,CH +1047300096,1047300415,GB +1047300416,1047300479,CH +1047300480,1047300495,FR +1047300496,1047300607,CH +1047300608,1047300639,GB +1047300640,1047302143,CH +1047302144,1047302159,US +1047302160,1047302175,GB +1047302176,1047302191,AU +1047302192,1047306239,CH +1047306240,1047314431,PL +1047314432,1047322623,SE +1047322624,1047330815,IT +1047330816,1047339007,RU +1047339008,1047340431,SE +1047340432,1047340439,NO +1047340440,1047340799,SE +1047340800,1047341055,NO +1047341056,1047343871,SE +1047343872,1047344127,NO +1047344128,1047347199,SE +1047347200,1047363583,DE +1047363584,1047371775,CZ +1047371776,1047379967,RU +1047379968,1047396351,NL +1047396352,1047461887,IT +1047461888,1047494655,DE +1047494656,1047527423,PL +1047527424,1047535615,BE +1047535616,1047551999,DE +1047552000,1047560191,RU +1047560192,1047560763,DE +1047560764,1047560767,AT +1047560768,1047561747,DE +1047561748,1047561751,ES +1047561752,1047561887,DE +1047561888,1047561891,US +1047561892,1047563303,DE +1047563304,1047563307,CH +1047563308,1047563407,DE +1047563408,1047563411,CH +1047563412,1047563415,DE +1047563416,1047563419,BE +1047563420,1047563443,DE +1047563444,1047563447,CH +1047563448,1047563451,DE +1047563452,1047563455,NL +1047563456,1047563463,DE +1047563464,1047563471,CH +1047563472,1047563727,DE +1047563728,1047563731,AU +1047563732,1047566363,DE +1047566364,1047566367,CH +1047566368,1047566407,DE +1047566408,1047566415,CH +1047566416,1047566455,DE +1047566456,1047566459,CH +1047566460,1047566475,DE +1047566476,1047566479,CH +1047566480,1047566535,DE +1047566536,1047566539,CH +1047566540,1047566559,DE +1047566560,1047566563,CH +1047566564,1047566847,DE +1047566848,1047566851,AT +1047566852,1047566867,DE +1047566868,1047566871,AT +1047566872,1047566879,CH +1047566880,1047566891,DE +1047566892,1047566903,CH +1047566904,1047566995,DE +1047566996,1047566999,CH +1047567000,1047567031,DE +1047567032,1047567035,CH +1047567036,1047567039,DE +1047567040,1047567043,AT +1047567044,1047567047,CH +1047567048,1047567103,DE +1047567104,1047567111,NL +1047567112,1047567119,DE +1047567120,1047567127,CH +1047567128,1047567143,DE +1047567144,1047567147,CH +1047567148,1047567151,BE +1047567152,1047567163,DE +1047567164,1047567167,AT +1047567168,1047567211,DE +1047567212,1047567227,CH +1047567228,1047567239,DE +1047567240,1047567243,CH +1047567244,1047567247,DE +1047567248,1047567255,CH +1047567256,1047567279,DE +1047567280,1047567287,CH +1047567288,1047567315,DE +1047567316,1047567319,AT +1047567320,1047567359,DE +1047567360,1047567375,ES +1047567376,1047567435,DE +1047567436,1047567439,CH +1047567440,1047567447,DE +1047567448,1047567451,CH +1047567452,1047567455,AT +1047567456,1047567459,CH +1047567460,1047567463,DE +1047567464,1047567467,CH +1047567468,1047567495,DE +1047567496,1047567499,CH +1047567500,1047567551,DE +1047567552,1047567555,CH +1047567556,1047567647,DE +1047567648,1047567651,CH +1047567652,1047567727,DE +1047567728,1047567731,BE +1047567732,1047567747,DE +1047567748,1047567751,CH +1047567752,1047567755,LU +1047567756,1047567759,CH +1047567760,1047567799,DE +1047567800,1047567803,CH +1047567804,1047567847,DE +1047567848,1047567851,CH +1047567852,1047567871,DE +1047567872,1047567875,CH +1047567876,1047567879,AT +1047567880,1047567883,CH +1047567884,1047567935,DE +1047567936,1047567939,CH +1047567940,1047568047,DE +1047568048,1047568055,CH +1047568056,1047568083,DE +1047568084,1047568095,CH +1047568096,1047568159,DE +1047568160,1047568163,CH +1047568164,1047568167,DE +1047568168,1047568171,ES +1047568172,1047568215,DE +1047568216,1047568219,CH +1047568220,1047568235,DE +1047568236,1047568239,CH +1047568240,1047568247,DE +1047568248,1047568251,CH +1047568252,1047568383,DE +1047568384,1047576575,NL +1047576576,1047584767,HU +1047584768,1047592959,NL +1047592960,1047601151,BA +1047601152,1047625727,RU +1047625728,1047633919,NO +1047633920,1047642111,FI +1047642112,1047658495,DE +1047728128,1047732223,SE +1047740672,1047740927,GB +1047782656,1047782687,GB +1047782696,1047782703,GB +1047782720,1047782751,SE +1047782752,1047782783,NO +1047782784,1047782815,FI +1047789568,1047806031,AT +1047806032,1047806047,IT +1047806048,1047822335,AT +1047822336,1047834895,DE +1047834896,1047834903,CY +1047834904,1047838719,DE +1047838720,1047846911,DK +1047846912,1047855103,SE +1047855104,1047863295,DE +1047871488,1047887871,RU +1047887872,1047920639,ES +1047920640,1047941119,RU +1047941120,1047941375,GB +1047941376,1047986175,RU +1047986176,1047997439,SE +1047997440,1047997503,NO +1047997504,1048012383,SE +1048012384,1048012391,DE +1048012392,1048051711,SE +1048051712,1048117247,SA +1048117248,1048125439,GB +1048125440,1048133631,FI +1048133632,1048158207,PL +1048158208,1048166399,DK +1048166400,1048182783,CH +1048182784,1048184831,UA +1048184832,1048186879,FR +1048186880,1048188927,LV +1048188928,1048190975,BE +1048190976,1048193023,VG +1048193024,1048195071,RO +1048195072,1048197119,RU +1048197120,1048203263,UA +1048203264,1048205311,DE +1048205312,1048211455,RU +1048211456,1048215551,PL +1048215552,1048221695,RU +1048221696,1048223743,UA +1048223744,1048225791,DK +1048225792,1048227839,CZ +1048227840,1048233983,RU +1048233984,1048236031,UA +1048236032,1048240127,RU +1048240128,1048242175,IL +1048242176,1048244223,PL +1048244224,1048246271,RU +1048246272,1048248319,NO +1048248320,1048313855,IT +1048313856,1048510463,GB +1048510464,1048575999,SE +1048576000,1048580671,DE +1048580672,1048580735,GB +1048580736,1048584191,DE +1048584192,1048592383,IL +1048592384,1048600575,IT +1048600576,1048603135,EE +1048603136,1048603391,LV +1048603392,1048604927,EE +1048604928,1048604959,LT +1048604960,1048604991,EE +1048604992,1048605055,LT +1048605056,1048608255,EE +1048608256,1048608287,RU +1048608288,1048608767,EE +1048608768,1048611583,GB +1048611584,1048611839,FR +1048611840,1048616959,GB +1048616960,1048621055,KE +1048621056,1048625151,DE +1048625152,1048633343,GB +1048633344,1048641535,NO +1048641536,1048649727,FR +1048649728,1048657919,CZ +1048657920,1048674303,GB +1048674304,1048682495,NL +1048682496,1048690687,FR +1048690688,1048707071,PL +1048707072,1048772607,GB +1048772608,1048838143,NL +1048838144,1048838175,DE +1048838176,1048838207,PL +1048838208,1048838239,NL +1048838240,1048839935,DE +1048839936,1048840095,NL +1048840096,1048840103,DE +1048840104,1048840463,NL +1048840464,1048840471,DE +1048840472,1048840703,NL +1048840704,1048843263,DE +1048843264,1048843983,NL +1048843984,1048843991,DE +1048843992,1048844087,NL +1048844088,1048844095,DE +1048844096,1048844255,NL +1048844256,1048844263,DE +1048844264,1048844287,NL +1048844288,1048844319,DE +1048844320,1048844351,NL +1048844352,1048845567,DE +1048845568,1048845743,NL +1048845744,1048845751,DE +1048845752,1048845759,NL +1048845760,1048845767,DE +1048845768,1048845823,NL +1048845824,1048845831,DE +1048845832,1048846031,NL +1048846032,1048846039,DE +1048846040,1048846095,NL +1048846096,1048846103,DE +1048846104,1048846439,NL +1048846440,1048846447,DE +1048846448,1048846703,NL +1048846704,1048846711,DE +1048846712,1048846847,NL +1048846848,1048847359,DE +1048847360,1048847407,NL +1048847408,1048847415,DE +1048847416,1048847775,NL +1048847776,1048847783,DE +1048847784,1048847871,NL +1048847872,1048847879,DE +1048847880,1048847919,NL +1048847920,1048847927,DE +1048847928,1048847935,NL +1048847936,1048847943,DE +1048847944,1048848023,NL +1048848024,1048848031,DE +1048848032,1048848263,NL +1048848264,1048848271,DE +1048848272,1048848311,NL +1048848312,1048848319,DE +1048848320,1048848615,NL +1048848616,1048848623,DE +1048848624,1048848895,NL +1048848896,1048849407,DE +1048849408,1048849639,NL +1048849640,1048849647,DE +1048849648,1048849703,NL +1048849704,1048849711,DE +1048849712,1048849871,NL +1048849872,1048849879,DE +1048849880,1048849919,NL +1048849920,1048849927,DE +1048849928,1048849991,NL +1048849992,1048849999,DE +1048850000,1048850047,NL +1048850048,1048850055,DE +1048850056,1048850095,NL +1048850096,1048850103,DE +1048850104,1048850311,NL +1048850312,1048850319,DE +1048850320,1048850359,NL +1048850360,1048850367,DE +1048850368,1048850599,NL +1048850600,1048850607,DE +1048850608,1048850719,NL +1048850720,1048850727,DE +1048850728,1048850783,NL +1048850784,1048850791,DE +1048850792,1048850855,NL +1048850856,1048850863,DE +1048850864,1048851351,NL +1048851352,1048851367,DE +1048851368,1048851863,NL +1048851864,1048851871,DE +1048851872,1048852391,NL +1048852392,1048852399,DE +1048852400,1048852415,NL +1048852416,1048852423,DE +1048852424,1048852439,NL +1048852440,1048852447,DE +1048852448,1048852831,NL +1048852832,1048852839,DE +1048852840,1048852911,NL +1048852912,1048852919,DE +1048852920,1048852991,NL +1048852992,1048852999,DE +1048853000,1048853303,NL +1048853304,1048853311,DE +1048853312,1048853367,NL +1048853368,1048853375,DE +1048853376,1048853679,NL +1048853680,1048853687,DE +1048853688,1048854007,NL +1048854008,1048854023,DE +1048854024,1048854039,NL +1048854040,1048854047,DE +1048854048,1048854167,NL +1048854168,1048854175,DE +1048854176,1048854327,NL +1048854328,1048854343,DE +1048854344,1048854423,NL +1048854424,1048854431,DE +1048854432,1048854527,NL +1048854528,1048855039,DE +1048855040,1048855319,NL +1048855320,1048855327,DE +1048855328,1048855367,NL +1048855368,1048855383,DE +1048855384,1048855503,NL +1048855504,1048855511,DE +1048855512,1048855719,NL +1048855720,1048855727,DE +1048855728,1048855759,NL +1048855760,1048855767,DE +1048855768,1048855903,NL +1048855904,1048855911,DE +1048855912,1048856095,NL +1048856096,1048856103,DE +1048856104,1048856375,NL +1048856376,1048856383,DE +1048856384,1048856455,NL +1048856456,1048856463,DE +1048856464,1048856719,NL +1048856720,1048856727,DE +1048856728,1048856815,NL +1048856816,1048856823,DE +1048856824,1048857023,NL +1048857024,1048857031,DE +1048857032,1048857199,NL +1048857200,1048857207,DE +1048857208,1048857511,NL +1048857512,1048857519,DE +1048857520,1048857807,NL +1048857808,1048857815,DE +1048857816,1048857903,NL +1048857904,1048857911,DE +1048857912,1048858111,NL +1048858112,1048858623,DE +1048858624,1048858759,NL +1048858760,1048858767,DE +1048858768,1048858807,NL +1048858808,1048858815,DE +1048858816,1048860687,NL +1048860688,1048860695,DE +1048860696,1048861015,NL +1048861016,1048861023,DE +1048861024,1048861071,NL +1048861072,1048861079,DE +1048861080,1048861119,NL +1048861120,1048861127,DE +1048861128,1048861415,NL +1048861416,1048861423,DE +1048861424,1048861487,NL +1048861488,1048861495,DE +1048861496,1048861503,NL +1048861504,1048861511,DE +1048861512,1048861535,NL +1048861536,1048861543,DE +1048861544,1048861735,NL +1048861736,1048861743,DE +1048861744,1048862039,NL +1048862040,1048862047,DE +1048862048,1048862071,NL +1048862072,1048862079,DE +1048862080,1048862135,NL +1048862136,1048862143,DE +1048862144,1048862215,NL +1048862216,1048862223,DE +1048862224,1048862311,NL +1048862312,1048862319,DE +1048862320,1048862423,NL +1048862424,1048862431,DE +1048862432,1048862495,NL +1048862496,1048862511,DE +1048862512,1048862591,NL +1048862592,1048862599,DE +1048862600,1048862671,NL +1048862672,1048862679,DE +1048862680,1048862687,NL +1048862688,1048862695,DE +1048862696,1048862711,NL +1048862712,1048862719,DE +1048862720,1048862727,NL +1048862728,1048862735,DE +1048862736,1048862775,NL +1048862776,1048862783,DE +1048862784,1048863119,NL +1048863120,1048863127,DE +1048863128,1048863191,NL +1048863192,1048863199,DE +1048863200,1048863543,NL +1048863544,1048863551,DE +1048863552,1048863631,NL +1048863632,1048863639,DE +1048863640,1048863679,NL +1048863680,1048863687,DE +1048863688,1048863711,NL +1048863712,1048863719,DE +1048863720,1048863743,NL +1048863744,1048863751,DE +1048863752,1048864215,NL +1048864216,1048864223,DE +1048864224,1048864367,NL +1048864368,1048864375,DE +1048864376,1048864439,NL +1048864440,1048864447,DE +1048864448,1048864871,NL +1048864872,1048864879,DE +1048864880,1048865007,NL +1048865008,1048865015,DE +1048865016,1048865087,NL +1048865088,1048865095,DE +1048865096,1048865111,NL +1048865112,1048865119,DE +1048865120,1048865239,NL +1048865240,1048865247,DE +1048865248,1048865279,NL +1048865280,1048865791,DE +1048865792,1048866535,NL +1048866536,1048866543,DE +1048866544,1048866831,NL +1048866832,1048866839,DE +1048866840,1048867039,NL +1048867040,1048867047,DE +1048867048,1048867095,NL +1048867096,1048867103,DE +1048867104,1048867327,NL +1048867328,1048868351,DE +1048868352,1048868703,NL +1048868704,1048868711,DE +1048868712,1048868903,NL +1048868904,1048868911,DE +1048868912,1048868951,NL +1048868952,1048868959,DE +1048868960,1048869031,NL +1048869032,1048869039,DE +1048869040,1048869239,NL +1048869240,1048869247,DE +1048869248,1048869495,NL +1048869496,1048869503,DE +1048869504,1048869511,NL +1048869512,1048869519,DE +1048869520,1048869583,NL +1048869584,1048869591,DE +1048869592,1048869727,NL +1048869728,1048869735,DE +1048869736,1048870119,NL +1048870120,1048870127,DE +1048870128,1048870399,NL +1048870400,1048870911,DE +1048870912,1048871447,NL +1048871448,1048871455,DE +1048871456,1048871647,NL +1048871648,1048871655,DE +1048871656,1048871727,NL +1048871728,1048871735,DE +1048871736,1048871935,NL +1048871936,1048872703,DE +1048872704,1048872767,NL +1048872768,1048872775,DE +1048872776,1048872823,NL +1048872824,1048872831,DE +1048872832,1048873127,NL +1048873128,1048873135,DE +1048873136,1048873239,NL +1048873240,1048873247,DE +1048873248,1048873263,NL +1048873264,1048873271,DE +1048873272,1048873367,NL +1048873368,1048873375,DE +1048873376,1048873423,NL +1048873424,1048873431,DE +1048873432,1048873447,NL +1048873448,1048873455,DE +1048873456,1048873727,NL +1048873728,1048873735,DE +1048873736,1048874023,NL +1048874024,1048874031,DE +1048874032,1048874207,NL +1048874208,1048874215,DE +1048874216,1048874231,NL +1048874232,1048874239,DE +1048874240,1048874495,NL +1048874496,1048874503,DE +1048874504,1048874623,NL +1048874624,1048874631,DE +1048874632,1048874679,NL +1048874680,1048874687,DE +1048874688,1048874919,NL +1048874920,1048874927,DE +1048874928,1048874991,NL +1048874992,1048874999,DE +1048875000,1048875095,NL +1048875096,1048875103,DE +1048875104,1048875119,NL +1048875120,1048875127,DE +1048875128,1048875159,NL +1048875160,1048875167,DE +1048875168,1048875239,NL +1048875240,1048875247,DE +1048875248,1048875359,NL +1048875360,1048875367,DE +1048875368,1048875479,NL +1048875480,1048875487,DE +1048875488,1048875575,NL +1048875576,1048875591,DE +1048875592,1048875647,NL +1048875648,1048875655,DE +1048875656,1048875719,NL +1048875720,1048875727,DE +1048875728,1048875799,NL +1048875800,1048875807,DE +1048875808,1048875879,NL +1048875880,1048875887,DE +1048875888,1048875983,NL +1048875984,1048875991,DE +1048875992,1048876007,NL +1048876008,1048876023,DE +1048876024,1048876207,NL +1048876208,1048876215,DE +1048876216,1048876327,NL +1048876328,1048876335,DE +1048876336,1048876519,NL +1048876520,1048876527,DE +1048876528,1048876599,NL +1048876600,1048876607,DE +1048876608,1048876735,NL +1048876736,1048876743,DE +1048876744,1048876903,NL +1048876904,1048876911,DE +1048876912,1048876967,NL +1048876968,1048876975,DE +1048876976,1048877015,NL +1048877016,1048877023,DE +1048877024,1048877143,NL +1048877144,1048877151,DE +1048877152,1048877271,NL +1048877272,1048877279,DE +1048877280,1048877311,NL +1048877312,1048878079,DE +1048878080,1048878983,NL +1048878984,1048878991,DE +1048878992,1048879263,NL +1048879264,1048879271,DE +1048879272,1048879319,NL +1048879320,1048879327,DE +1048879328,1048879375,NL +1048879376,1048879383,DE +1048879384,1048879447,NL +1048879448,1048879455,DE +1048879456,1048879527,NL +1048879528,1048879535,DE +1048879536,1048879559,NL +1048879560,1048879567,DE +1048879568,1048879663,NL +1048879664,1048879671,DE +1048879672,1048879903,NL +1048879904,1048879911,DE +1048879912,1048880071,NL +1048880072,1048880079,DE +1048880080,1048880287,NL +1048880288,1048880295,DE +1048880296,1048880639,NL +1048880640,1048881151,DE +1048881152,1048881159,NL +1048881160,1048881167,DE +1048881168,1048881471,NL +1048881472,1048881479,DE +1048881480,1048881503,NL +1048881504,1048881511,DE +1048881512,1048881535,NL +1048881536,1048881543,DE +1048881544,1048881663,NL +1048881664,1048881671,DE +1048881672,1048881783,NL +1048881784,1048881791,DE +1048881792,1048881823,NL +1048881824,1048881831,DE +1048881832,1048881935,NL +1048881936,1048881943,DE +1048881944,1048881967,NL +1048881968,1048881991,DE +1048881992,1048882111,NL +1048882112,1048882119,DE +1048882120,1048882151,NL +1048882152,1048882159,DE +1048882160,1048882327,NL +1048882328,1048882335,DE +1048882336,1048882487,NL +1048882488,1048882495,DE +1048882496,1048882575,NL +1048882576,1048882583,DE +1048882584,1048882647,NL +1048882648,1048882655,DE +1048882656,1048882727,NL +1048882728,1048882735,DE +1048882736,1048882959,NL +1048882960,1048882967,DE +1048882968,1048883143,NL +1048883144,1048883151,DE +1048883152,1048883335,NL +1048883336,1048883343,DE +1048883344,1048883511,NL +1048883512,1048883519,DE +1048883520,1048883599,NL +1048883600,1048883607,DE +1048883608,1048883695,NL +1048883696,1048883703,DE +1048883704,1048884175,NL +1048884176,1048884183,DE +1048884184,1048884191,NL +1048884192,1048884199,DE +1048884200,1048884279,NL +1048884280,1048884287,DE +1048884288,1048884415,NL +1048884416,1048884423,DE +1048884424,1048884615,NL +1048884616,1048884623,DE +1048884624,1048884655,NL +1048884656,1048884663,DE +1048884664,1048884735,NL +1048884736,1048884743,DE +1048884744,1048884775,NL +1048884776,1048884783,DE +1048884784,1048885271,NL +1048885272,1048885279,DE +1048885280,1048885303,NL +1048885304,1048885311,DE +1048885312,1048885559,NL +1048885560,1048885567,DE +1048885568,1048885591,NL +1048885592,1048885599,DE +1048885600,1048885679,NL +1048885680,1048885687,DE +1048885688,1048886383,NL +1048886384,1048886391,DE +1048886392,1048886559,NL +1048886560,1048886575,DE +1048886576,1048886631,NL +1048886632,1048886639,DE +1048886640,1048886687,NL +1048886688,1048886695,DE +1048886696,1048886727,NL +1048886728,1048886735,DE +1048886736,1048886927,NL +1048886928,1048886935,DE +1048886936,1048886983,NL +1048886984,1048886991,DE +1048886992,1048886999,NL +1048887000,1048887007,DE +1048887008,1048887167,NL +1048887168,1048887175,DE +1048887176,1048888959,NL +1048888960,1048889087,DE +1048889088,1048889951,NL +1048889952,1048889983,DE +1048889984,1048891695,NL +1048891696,1048891703,DE +1048891704,1048891823,NL +1048891824,1048891831,DE +1048891832,1048891911,NL +1048891912,1048891919,DE +1048891920,1048892591,NL +1048892592,1048892599,DE +1048892600,1048893367,NL +1048893368,1048893375,DE +1048893376,1048894607,NL +1048894608,1048894615,DE +1048894616,1048896231,NL +1048896232,1048896239,DE +1048896240,1048896479,NL +1048896480,1048896487,DE +1048896488,1048896735,NL +1048896736,1048896743,DE +1048896744,1048897119,NL +1048897120,1048897127,DE +1048897128,1048897463,NL +1048897464,1048897471,DE +1048897472,1048897735,NL +1048897736,1048897743,DE +1048897744,1048899287,NL +1048899288,1048899295,DE +1048899296,1048899303,NL +1048899304,1048899311,DE +1048899312,1048899591,NL +1048899592,1048899599,DE +1048899600,1048899871,NL +1048899872,1048899879,DE +1048899880,1048900903,NL +1048900904,1048900911,DE +1048900912,1048901167,NL +1048901168,1048901175,DE +1048901176,1048901199,NL +1048901200,1048901207,DE +1048901208,1048901311,NL +1048901312,1048901319,DE +1048901320,1048901855,NL +1048901856,1048901863,DE +1048901864,1048902335,NL +1048902336,1048902343,DE +1048902344,1048902663,NL +1048902664,1048902679,DE +1048902680,1048903047,NL +1048903048,1048903055,DE +1048903056,1048903071,NL +1048903072,1048903079,DE +1048903080,1048903095,NL +1048903096,1048903103,DE +1048903104,1048903679,NL +1048903680,1048911871,GB +1048911872,1048920063,IT +1048920064,1048936447,NL +1048936448,1048944639,PL +1048944640,1048952831,RU +1048952832,1048953407,NL +1048953408,1048953439,BE +1048953440,1048954967,NL +1048954968,1048954975,BE +1048954976,1048969215,NL +1048969216,1048973823,DE +1048974336,1048975183,DE +1048976288,1048976295,DE +1048976297,1048976302,DE +1048976304,1048976319,DE +1048976384,1048976447,DE +1048976512,1048977407,DE +1048978432,1048978943,DE +1048979136,1048979295,DE +1048979328,1048980495,DE +1048980512,1048980527,DE +1048980560,1048980731,DE +1048980736,1048980791,DE +1048980804,1048980807,DE +1048980816,1048980823,DE +1048980832,1048980847,DE +1048980864,1048980959,DE +1048980968,1048980975,DE +1048981504,1048981759,DE +1048981792,1048981823,DE +1048982016,1048983039,DE +1048983168,1048983423,DE +1048983488,1048983679,DE +1048984832,1048985167,DE +1048985184,1048985199,DE +1048985216,1048985375,DE +1048985600,1049002015,DE +1049002176,1049002239,DE +1049002368,1049002495,DE +1049002624,1049002751,DE +1049003264,1049004291,DE +1049004352,1049004415,DE +1049004544,1049006079,DE +1049006504,1049006511,DE +1049007104,1049007111,DE +1049007120,1049007167,DE +1049007360,1049011711,DE +1049011968,1049012479,DE +1049012736,1049016703,DE +1049016704,1049016711,FR +1049016712,1049016715,RU +1049016716,1049016743,DE +1049016744,1049016751,MA +1049016752,1049016759,DE +1049016760,1049016767,FR +1049016768,1049016815,DE +1049016816,1049016831,NL +1049016832,1049016847,DE +1049016848,1049016863,FR +1049016864,1049017983,DE +1049017984,1049018047,GE +1049018048,1049020127,DE +1049020128,1049020135,FR +1049020136,1049020463,DE +1049020464,1049020471,GE +1049020472,1049020479,DE +1049020480,1049020543,GE +1049020544,1049026559,DE +1049026816,1049032171,DE +1049032176,1049032319,DE +1049032384,1049032699,DE +1049032704,1049034751,DE +1049067520,1049100287,DK +1049100288,1049231359,GB +1049231360,1049296895,DE +1049362432,1049362575,DE +1049362576,1049362943,GB +1049362944,1049362959,DE +1049362960,1049363071,GB +1049363072,1049363135,DE +1049363136,1049363967,GB +1049363968,1049364223,DE +1049364224,1049364991,GB +1049364992,1049365247,DE +1049365248,1049365711,GB +1049365712,1049365719,DE +1049365720,1049365727,GB +1049365728,1049365751,DE +1049365752,1049365887,GB +1049365888,1049365951,DE +1049365952,1049366015,GB +1049366016,1049366271,DE +1049366272,1049366335,GB +1049366336,1049366399,DE +1049366400,1049366527,GB +1049366528,1049368575,DE +1049368576,1049369599,GB +1049369600,1049369935,DE +1049369936,1049370111,GB +1049370112,1049370255,DE +1049370256,1049370367,GB +1049370368,1049370623,DE +1049370624,1049378815,AT +1049395200,1049405055,NL +1049405056,1049405183,GB +1049405184,1049405247,LU +1049405248,1049405311,NL +1049405312,1049405375,BE +1049405376,1049405439,NL +1049405440,1049405567,DE +1049405568,1049405631,BE +1049405632,1049405695,AT +1049405696,1049405759,CH +1049405760,1049405823,ES +1049405824,1049405887,FR +1049405888,1049405951,GB +1049405952,1049407615,NL +1049407616,1049407999,CH +1049408000,1049409023,NL +1049409024,1049409279,DE +1049409280,1049411583,NL +1049411584,1049419775,GB +1049419776,1049427967,RU +1049427968,1049436159,CZ +1049436160,1049444351,DE +1049444352,1049460735,RU +1049460736,1049468927,NO +1049468928,1049477119,DE +1049477120,1049493503,PL +1049493504,1049514691,FI +1049514692,1049514695,SE +1049514696,1049518079,FI +1049518080,1049518095,GB +1049518096,1049547295,FI +1049547296,1049547327,AF +1049547328,1049559039,FI +1049559040,1049653095,DE +1049653096,1049653103,US +1049653104,1049698303,DE +1049698304,1049706495,NL +1049706496,1049707007,GB +1049707008,1049707519,NL +1049707520,1049707775,LB +1049707776,1049708031,DZ +1049708032,1049709055,GB +1049709056,1049710079,DZ +1049710080,1049711103,NL +1049711104,1049711359,IR +1049711360,1049711615,NL +1049711616,1049712127,PK +1049712128,1049712383,SA +1049712384,1049712511,IR +1049712512,1049712639,LB +1049712640,1049713055,IR +1049713056,1049713087,MA +1049713088,1049713151,IR +1049713152,1049713663,NL +1049713664,1049713791,LB +1049713792,1049713919,IR +1049713920,1049714175,GB +1049714176,1049714687,NL +1049714688,1049715711,IR +1049715712,1049716735,NL +1049716736,1049717759,IQ +1049717760,1049718015,GB +1049718016,1049718271,IR +1049718272,1049722879,NL +1049722880,1049731071,IS +1049731072,1049739263,FI +1049739264,1049755647,NL +1049755648,1049757599,DE +1049757600,1049757631,LU +1049757632,1049757647,DE +1049757648,1049757663,CA +1049757664,1049757671,BA +1049757672,1049758063,DE +1049758064,1049758071,PL +1049758072,1049758095,DE +1049758096,1049758103,ES +1049758104,1049758527,DE +1049758528,1049758559,DK +1049758560,1049759983,DE +1049759984,1049759999,AE +1049760000,1049760927,DE +1049760928,1049760959,DK +1049760960,1049761023,PL +1049761024,1049761791,DE +1049761792,1049762047,PL +1049762048,1049762271,DE +1049762272,1049762303,DK +1049762304,1049762831,DE +1049762832,1049762835,CH +1049762836,1049763055,DE +1049763056,1049763063,CH +1049763064,1049763871,DE +1049763872,1049763903,PL +1049763904,1049764447,DE +1049764448,1049764463,AE +1049764464,1049764967,DE +1049764968,1049764975,CH +1049764976,1049765695,DE +1049765696,1049765791,PL +1049765792,1049766415,DE +1049766416,1049766431,ES +1049766432,1049766511,DE +1049766512,1049766527,AE +1049766528,1049767935,DE +1049767936,1049767951,AE +1049767952,1049768063,DE +1049768064,1049768095,DK +1049768096,1049768367,DE +1049768368,1049768375,NL +1049768376,1049768383,GB +1049768384,1049768767,DE +1049768768,1049768799,AE +1049768800,1049769119,DE +1049769120,1049769151,AE +1049769152,1049770111,DE +1049770112,1049770127,AE +1049770128,1049771391,DE +1049771392,1049771519,IT +1049771520,1049772895,DE +1049772896,1049772927,AE +1049772928,1049773055,ES +1049773056,1049773311,PL +1049773312,1049775047,DE +1049775048,1049775055,CH +1049775056,1049775087,DE +1049775088,1049775103,AE +1049775104,1049775119,CH +1049775120,1049776447,DE +1049776448,1049776479,AE +1049776480,1049777023,DE +1049777024,1049777039,CH +1049777040,1049777951,DE +1049777952,1049777959,IT +1049777960,1049778111,DE +1049778112,1049778143,ES +1049778144,1049778335,DE +1049778336,1049778351,AE +1049778352,1049778495,DE +1049778496,1049778527,IT +1049778528,1049778535,DE +1049778536,1049778543,AT +1049778544,1049778991,DE +1049778992,1049778999,CR +1049779000,1049779063,DE +1049779064,1049779071,PL +1049779072,1049779135,DE +1049779136,1049779167,AE +1049779168,1049782303,DE +1049782304,1049782335,AE +1049782336,1049782743,DE +1049782744,1049782751,IT +1049782752,1049783071,DE +1049783072,1049783103,DK +1049783104,1049783743,DE +1049783744,1049783759,AE +1049783760,1049784575,DE +1049784576,1049784831,PL +1049784832,1049784999,DE +1049785000,1049785007,AT +1049785008,1049787135,DE +1049787136,1049787391,PL +1049787392,1049787647,DE +1049787648,1049788159,PL +1049788160,1049788415,GB +1049788416,1049791047,DE +1049791048,1049791055,PL +1049791056,1049817151,DE +1049817152,1049817159,PL +1049817160,1049817287,DE +1049817288,1049817295,AE +1049817296,1049821183,DE +1049821184,1049886719,FR +1049886720,1049894911,RU +1049894912,1049903103,NO +1049903104,1049911295,PL +1049911296,1049919487,FI +1049919488,1049927679,RU +1049927680,1049935871,NL +1049935872,1049944063,FI +1049944064,1049952255,RU +1049952256,1049960447,UA +1049960448,1049968639,GB +1049968640,1049985023,SA +1049985024,1050017791,IT +1050017792,1050083327,KW +1050083328,1050148863,ES +1050148864,1050157055,CY +1050157056,1050173439,RU +1050173440,1050181631,IT +1050181632,1050189823,PL +1050189824,1050198015,DE +1050198016,1050206207,CH +1050206208,1050214399,SK +1050214400,1050244935,DE +1050244936,1050244943,PL +1050244944,1050320231,DE +1050320232,1050320239,GB +1050320240,1050340607,DE +1050340608,1050340639,US +1050340640,1050450711,DE +1050450712,1050450719,NL +1050450720,1050471391,DE +1050471392,1050471399,IT +1050471400,1050502559,DE +1050502560,1050502567,US +1050502568,1050505247,DE +1050505248,1050505279,CA +1050505280,1050515647,DE +1050515648,1050515663,DK +1050515664,1050522407,DE +1050522408,1050522415,CH +1050522416,1050616655,DE +1050616656,1050616671,CN +1050616672,1050619503,DE +1050619504,1050619511,CH +1050619512,1050621407,DE +1050621408,1050621439,BE +1050621440,1050625959,DE +1050625960,1050625967,AT +1050625968,1050626559,DE +1050626560,1050626815,GB +1050626816,1050647431,DE +1050647432,1050647439,NL +1050647440,1050664911,DE +1050664912,1050664919,IT +1050664920,1050667519,DE +1050667520,1050667775,FR +1050667776,1050672479,DE +1050672480,1050672487,SG +1050672488,1050673151,DE +1050673152,1050676470,FR +1050676471,1050676471,BE +1050676472,1050677335,FR +1050677336,1050677343,DE +1050677344,1050677505,FR +1050677506,1050677506,BE +1050677507,1050677702,FR +1050677703,1050677703,BE +1050677704,1050683711,FR +1050683712,1050683719,DK +1050683720,1050684095,FR +1050684096,1050684103,GB +1050684104,1050684609,FR +1050684610,1050684610,LU +1050684611,1050702623,FR +1050702624,1050702631,DE +1050702632,1050704082,FR +1050704083,1050704083,BE +1050704084,1050704661,FR +1050704662,1050704662,GB +1050704663,1050722831,FR +1050722832,1050722839,DE +1050722840,1050725463,FR +1050725464,1050725471,GB +1050725472,1050726335,FR +1050726336,1050726343,DE +1050726344,1050731146,FR +1050731147,1050731147,GB +1050731148,1050763476,FR +1050763477,1050763477,GB +1050763478,1050765853,FR +1050765854,1050765854,BE +1050765855,1050766665,FR +1050766666,1050766666,BE +1050766667,1050766729,FR +1050766730,1050766730,BE +1050766731,1050768551,FR +1050768552,1050768558,CH +1050768559,1050804223,FR +1050804224,1050869759,MK +1050869760,1050935295,NL +1050940928,1050941183,ES +1050943232,1050943487,ES +1050945536,1050945791,ES +1050948608,1050948863,ES +1050968064,1051000831,GB +1051000832,1051017215,RU +1051017216,1051033599,NL +1051033600,1051049983,FI +1051049984,1051066367,HU +1051066368,1051084287,NL +1051084288,1051084799,BE +1051084800,1051096831,NL +1051096832,1051097087,BE +1051097088,1051098111,NL +1051098112,1051099135,BE +1051099136,1051099647,NL +1051099648,1051099663,BE +1051099664,1051099679,NL +1051099680,1051099687,BE +1051099688,1051099703,NL +1051099704,1051099711,BE +1051099712,1051099727,NL +1051099728,1051099739,BE +1051099740,1051099743,NL +1051099744,1051099775,BE +1051099776,1051099791,NL +1051099792,1051099799,BE +1051099800,1051099807,NL +1051099808,1051099815,BE +1051099816,1051099823,NL +1051099824,1051099839,BE +1051099840,1051099863,NL +1051099864,1051099879,BE +1051099880,1051099887,NL +1051099888,1051099911,BE +1051099912,1051099919,NL +1051099920,1051099927,BE +1051099928,1051099967,NL +1051099968,1051099975,BE +1051099976,1051099991,NL +1051099992,1051100015,BE +1051100016,1051100023,NL +1051100024,1051100031,BE +1051100032,1051100039,NL +1051100040,1051100047,BE +1051100048,1051100055,NL +1051100056,1051100079,BE +1051100080,1051100095,NL +1051100096,1051100143,BE +1051100144,1051100159,NL +1051100160,1051100455,BE +1051100456,1051100463,NL +1051100464,1051100487,BE +1051100488,1051100499,NL +1051100500,1051100523,BE +1051100524,1051100527,NL +1051100528,1051100575,BE +1051100576,1051100583,NL +1051100584,1051100591,BE +1051100592,1051100607,NL +1051100608,1051100631,BE +1051100632,1051100671,NL +1051100672,1051100679,BE +1051100680,1051100687,NL +1051100688,1051100695,BE +1051100696,1051100703,NL +1051100704,1051100711,BE +1051100712,1051100735,NL +1051100736,1051100831,BE +1051100832,1051100839,NL +1051100840,1051100879,BE +1051100880,1051100919,NL +1051100920,1051100935,BE +1051100936,1051100943,NL +1051100944,1051100951,BE +1051100952,1051100967,NL +1051100968,1051101039,BE +1051101040,1051101055,NL +1051101056,1051101079,BE +1051101080,1051101087,NL +1051101088,1051101095,BE +1051101096,1051101103,NL +1051101104,1051101127,BE +1051101128,1051101151,NL +1051101152,1051101183,BE +1051101184,1051101191,NL +1051101192,1051101199,BE +1051101200,1051101231,NL +1051101232,1051101247,BE +1051101248,1051101279,NL +1051101280,1051101287,BE +1051101288,1051101407,NL +1051101408,1051101415,BE +1051101416,1051101431,NL +1051101432,1051101439,BE +1051101440,1051101463,NL +1051101464,1051101471,BE +1051101472,1051101599,NL +1051101600,1051101607,BE +1051101608,1051101615,NL +1051101616,1051101623,BE +1051101624,1051101631,NL +1051101632,1051101647,BE +1051101648,1051101679,NL +1051101680,1051101687,BE +1051101688,1051101719,NL +1051101720,1051101735,BE +1051101736,1051101783,NL +1051101784,1051101799,BE +1051101800,1051101999,NL +1051102000,1051102007,BE +1051102008,1051102143,NL +1051102144,1051102159,BE +1051102160,1051102207,NL +1051102208,1051102727,BE +1051102728,1051103233,NL +1051103234,1051103239,BE +1051103240,1051103287,NL +1051103288,1051103295,BE +1051103296,1051103439,NL +1051103440,1051103447,BE +1051103448,1051103511,NL +1051103512,1051103519,BE +1051103520,1051103543,NL +1051103544,1051103567,BE +1051103568,1051103583,NL +1051103584,1051103591,BE +1051103592,1051103599,NL +1051103600,1051103607,BE +1051103608,1051103639,NL +1051103640,1051103647,BE +1051103648,1051103695,NL +1051103696,1051103703,BE +1051103704,1051103767,NL +1051103768,1051103775,BE +1051103776,1051103807,NL +1051103808,1051103815,BE +1051103816,1051103919,NL +1051103920,1051103927,BE +1051103928,1051103959,NL +1051103960,1051103975,BE +1051103976,1051104023,NL +1051104024,1051104031,BE +1051104032,1051104111,NL +1051104112,1051104143,BE +1051104144,1051104167,NL +1051104168,1051104175,BE +1051104176,1051104231,NL +1051104232,1051104247,BE +1051104248,1051104359,NL +1051104360,1051104367,BE +1051104368,1051104383,NL +1051104384,1051104391,BE +1051104392,1051104503,NL +1051104504,1051104511,BE +1051104512,1051104583,NL +1051104584,1051104599,BE +1051104600,1051104607,NL +1051104608,1051104631,BE +1051104632,1051104719,NL +1051104720,1051104727,BE +1051104728,1051104751,NL +1051104752,1051104759,BE +1051104760,1051104823,NL +1051104824,1051104831,BE +1051104832,1051104847,NL +1051104848,1051104855,BE +1051104856,1051104951,NL +1051104952,1051104959,BE +1051104960,1051104991,NL +1051104992,1051104999,BE +1051105000,1051105047,NL +1051105048,1051105055,BE +1051105056,1051105063,NL +1051105064,1051105079,BE +1051105080,1051105111,NL +1051105112,1051105119,BE +1051105120,1051105127,NL +1051105128,1051105135,BE +1051105136,1051105143,NL +1051105144,1051105151,BE +1051105152,1051105255,NL +1051105256,1051105263,BE +1051105264,1051105271,NL +1051105272,1051105279,BE +1051105280,1051105375,NL +1051105376,1051105383,BE +1051105384,1051105447,NL +1051105448,1051105455,BE +1051105456,1051105519,NL +1051105520,1051105527,BE +1051105528,1051105535,NL +1051105536,1051105551,BE +1051105552,1051105599,NL +1051105600,1051105607,BE +1051105608,1051105895,NL +1051105896,1051105903,BE +1051105904,1051106031,NL +1051106032,1051106039,BE +1051106040,1051106047,NL +1051106048,1051106055,BE +1051106056,1051106095,NL +1051106096,1051106103,BE +1051106104,1051106111,NL +1051106112,1051106119,BE +1051106120,1051106167,NL +1051106168,1051106175,BE +1051106176,1051106183,NL +1051106184,1051106191,BE +1051106192,1051106247,NL +1051106248,1051106255,BE +1051106256,1051106303,NL +1051106304,1051106311,BE +1051106312,1051106335,NL +1051106336,1051106351,BE +1051106352,1051106391,NL +1051106392,1051106399,BE +1051106400,1051106543,NL +1051106544,1051106551,BE +1051106552,1051106591,NL +1051106592,1051106599,BE +1051106600,1051106663,NL +1051106664,1051106671,BE +1051106672,1051106759,NL +1051106760,1051106767,BE +1051106768,1051106775,NL +1051106776,1051106783,BE +1051106784,1051106823,NL +1051106824,1051106831,BE +1051106832,1051106847,NL +1051106848,1051106863,BE +1051106864,1051106895,NL +1051106896,1051106903,BE +1051106904,1051106943,NL +1051106944,1051106951,BE +1051106952,1051106959,NL +1051106960,1051106967,BE +1051106968,1051107031,NL +1051107032,1051107039,BE +1051107040,1051107071,NL +1051107072,1051107079,BE +1051107080,1051107103,NL +1051107104,1051107111,BE +1051107112,1051107143,NL +1051107144,1051107151,BE +1051107152,1051107159,NL +1051107160,1051107167,BE +1051107168,1051107183,NL +1051107184,1051107199,BE +1051107200,1051107207,NL +1051107208,1051107215,BE +1051107216,1051107223,NL +1051107224,1051107231,BE +1051107232,1051107239,NL +1051107240,1051107247,BE +1051107248,1051107295,NL +1051107296,1051107303,BE +1051107304,1051107311,NL +1051107312,1051107327,BE +1051107328,1051107329,NL +1051107330,1051107359,BE +1051107360,1051107375,NL +1051107376,1051107383,BE +1051107384,1051107391,NL +1051107392,1051107407,BE +1051107408,1051107423,NL +1051107424,1051107455,BE +1051107456,1051107519,NL +1051107520,1051107839,BE +1051107840,1051115519,NL +1051115520,1051121287,BE +1051121288,1051121295,NL +1051121296,1051123711,BE +1051123712,1051125247,NL +1051125248,1051125759,BE +1051125760,1051131903,NL +1051131904,1051197439,CH +1051197440,1051213823,CZ +1051213824,1051230207,SK +1051230208,1051238399,SE +1051238400,1051246591,GE +1051246592,1051254783,DE +1051254784,1051262975,RU +1051262976,1051271167,DE +1051271168,1051279359,IT +1051279360,1051295743,PT +1051295744,1051303935,GB +1051303936,1051312127,SK +1051312128,1051328511,GR +1051328512,1051460095,GB +1051460096,1051460351,ES +1051460352,1051525119,GB +1051525120,1051533311,MT +1051541504,1051557887,GB +1051557888,1051566079,RU +1051566080,1051574271,IT +1051574272,1051574543,GB +1051574544,1051574551,IT +1051574552,1051574623,GB +1051574624,1051574655,GM +1051574656,1051575879,GB +1051575880,1051575887,US +1051575888,1051575999,GB +1051576000,1051576015,IT +1051576016,1051576903,GB +1051576904,1051576911,US +1051576912,1051576943,GB +1051576944,1051576959,DE +1051576960,1051577503,GB +1051577504,1051577519,NL +1051577520,1051577535,GB +1051577536,1051577567,NL +1051577568,1051577575,BE +1051577576,1051577583,GB +1051577584,1051577587,FI +1051577588,1051577591,GB +1051577592,1051577599,NL +1051577600,1051577855,GB +1051577856,1051578111,NL +1051578112,1051578143,GB +1051578144,1051578175,NL +1051578176,1051578239,BE +1051578240,1051578263,FR +1051578264,1051578271,GB +1051578272,1051578279,ES +1051578280,1051578287,GR +1051578288,1051578295,GB +1051578296,1051578303,PL +1051578304,1051578335,NL +1051578336,1051578343,DE +1051578344,1051578351,NL +1051578352,1051578363,GB +1051578364,1051578367,DE +1051578368,1051580415,SZ +1051580416,1051584511,GB +1051584512,1051585663,MG +1051585664,1051585919,GB +1051585920,1051586047,MG +1051586048,1051586175,GB +1051586176,1051586303,MG +1051586304,1051590655,GB +1051590656,1051702527,ES +1051702528,1051702783,US +1051702784,1051721727,ES +1051721728,1051729919,RU +1051729920,1051738111,FI +1051738112,1051754495,BG +1051754496,1051762687,DE +1051762688,1051770879,SK +1051770880,1051779071,NO +1051779072,1051787263,DE +1051787264,1051795455,IT +1051795456,1051803647,RU +1051803648,1051820031,CZ +1051820032,1051852799,NL +1051852800,1051918335,AT +1051918336,1051919359,PL +1051919360,1051920383,AT +1051920384,1051922431,PL +1051922432,1051983871,AT +1051983872,1051991551,DE +1051991808,1051991951,DE +1051992064,1051994699,DE +1051994700,1051994703,BE +1051994704,1051994719,DE +1051994720,1051994751,BE +1051994752,1051994791,DE +1051994792,1051994799,NL +1051994800,1051995135,DE +1051995392,1051996159,DE +1051996336,1051996351,DE +1051996880,1051996927,DE +1051997440,1051997695,DE +1051997712,1051997727,DE +1051997952,1051997983,DE +1051998248,1051998255,DE +1051998688,1051998695,DE +1051999040,1051999043,DE +1051999136,1051999151,DE +1051999168,1051999359,DE +1051999488,1051999743,DE +1052000000,1052000063,DE +1052000128,1052000143,DE +1052000192,1052000511,DE +1052000520,1052000527,DE +1052000536,1052000539,DE +1052000576,1052000623,DE +1052000632,1052002303,DE +1052002312,1052002335,DE +1052002368,1052002431,DE +1052002440,1052002447,DE +1052002464,1052002511,DE +1052002520,1052002523,DE +1052002528,1052002543,DE +1052003328,1052003359,DE +1052003392,1052003455,DE +1052003480,1052003487,DE +1052003552,1052003839,DE +1052003968,1052003999,DE +1052004672,1052004759,DE +1052004768,1052004783,DE +1052004816,1052004831,DE +1052004896,1052004959,DE +1052005120,1052005151,DE +1052005248,1052005631,DE +1052005888,1052005911,DE +1052006544,1052006559,DE +1052006576,1052006607,DE +1052007072,1052007103,DE +1052007432,1052007439,DE +1052007456,1052007471,DE +1052007520,1052007535,DE +1052007776,1052007791,DE +1052007936,1052008223,DE +1052008516,1052008527,DE +1052008544,1052008583,DE +1052008608,1052008623,DE +1052008640,1052008687,DE +1052008704,1052009087,DE +1052009472,1052009487,DE +1052009504,1052009535,DE +1052009600,1052009607,DE +1052010464,1052010519,DE +1052010528,1052010559,DE +1052010608,1052010655,DE +1052010752,1052011135,DE +1052011264,1052012335,DE +1052012376,1052012383,DE +1052012544,1052013055,DE +1052013060,1052013063,DE +1052013072,1052013095,DE +1052013120,1052013127,DE +1052013144,1052013151,DE +1052013216,1052013263,DE +1052013312,1052013567,DE +1052013696,1052013823,DE +1052013832,1052013855,DE +1052013888,1052013951,DE +1052013960,1052013966,DE +1052013968,1052013983,DE +1052014000,1052014007,DE +1052014016,1052014303,DE +1052014592,1052014623,DE +1052015368,1052015375,DE +1052015424,1052015519,DE +1052015552,1052015583,DE +1052015632,1052015647,DE +1052015696,1052015727,DE +1052016000,1052016127,DE +1052016208,1052016223,DE +1052016240,1052016247,DE +1052016256,1052016323,DE +1052016352,1052016383,DE +1052016448,1052016463,DE +1052016480,1052016511,DE +1052016640,1052016655,DE +1052016680,1052016687,DE +1052016896,1052017151,DE +1052017232,1052017247,DE +1052017280,1052017343,DE +1052017472,1052017567,DE +1052017600,1052017663,DE +1052018168,1052018431,DE +1052018720,1052018767,DE +1052019200,1052019455,DE +1052019736,1052019775,DE +1052019872,1052020047,DE +1052020673,1052020702,DE +1052020704,1052041599,DE +1052041728,1052041863,DE +1052041984,1052042047,DE +1052042048,1052042087,NL +1052042088,1052042239,DE +1052042304,1052042311,DE +1052042368,1052042431,DE +1052042480,1052042751,DE +1052042816,1052042863,DE +1052043008,1052043263,DE +1052043528,1052043535,DE +1052043552,1052043575,DE +1052043584,1052043651,DE +1052043664,1052043679,DE +1052043760,1052043775,DE +1052044288,1052044351,DE +1052044384,1052044399,DE +1052044416,1052044447,DE +1052044512,1052044527,DE +1052044544,1052044927,DE +1052045024,1052045055,DE +1052045312,1052046135,DE +1052046336,1052046591,DE +1052046656,1052046719,DE +1052046848,1052047139,DE +1052047360,1052047871,DE +1052049152,1052049183,DE +1052049408,1052057599,PL +1052057600,1052065791,RU +1052065792,1052082175,SE +1052082176,1052090367,DE +1052090368,1052098559,PL +1052098560,1052116991,SE +1052116992,1052119039,RU +1052119040,1052121087,RO +1052121088,1052129279,RU +1052129280,1052131327,BE +1052131328,1052135423,RU +1052135424,1052137471,UA +1052137472,1052139519,RU +1052139520,1052141567,DE +1052141568,1052143615,RU +1052143616,1052145663,BG +1052145664,1052147711,UA +1052147712,1052153855,RU +1052153856,1052157951,UA +1052157952,1052159999,DK +1052160000,1052162047,LU +1052162048,1052164095,CH +1052164096,1052170239,RU +1052170240,1052172287,SE +1052172288,1052174335,PL +1052174336,1052176383,CZ +1052176384,1052178431,NL +1052178432,1052180479,DK +1052180480,1052213247,RU +1052213248,1052246015,FI +1052246016,1052247039,DE +1052247040,1052247295,FR +1052247296,1052247359,DE +1052247360,1052247391,FR +1052247392,1052247407,DE +1052247408,1052247415,GB +1052247416,1052247423,NL +1052247424,1052247551,GB +1052247552,1052248095,DE +1052248096,1052248127,ZA +1052248128,1052248135,FR +1052248136,1052248143,DE +1052248144,1052248159,BE +1052248160,1052249375,DE +1052249376,1052249407,IT +1052249408,1052249471,DE +1052249472,1052249503,ZA +1052249504,1052250655,DE +1052250656,1052250687,GB +1052250688,1052250719,IL +1052250720,1052250735,IT +1052250736,1052250751,NL +1052250752,1052252863,DE +1052252864,1052252879,GB +1052252880,1052252895,ZA +1052252896,1052252927,IT +1052252928,1052254207,DE +1052254208,1052255255,NL +1052255256,1052255263,GB +1052255264,1052255871,NL +1052255872,1052255935,GB +1052255936,1052257279,NL +1052257280,1052257791,FR +1052257792,1052258303,AT +1052258304,1052260623,FR +1052260624,1052260631,ZA +1052260632,1052260639,AT +1052260640,1052260735,FR +1052260736,1052260863,NL +1052260864,1052260895,TR +1052260896,1052261055,FR +1052261056,1052261119,NL +1052261120,1052262399,FR +1052262400,1052263423,DK +1052263424,1052263935,DE +1052263936,1052264447,DK +1052264448,1052264639,SE +1052264640,1052264703,IT +1052264704,1052265471,SE +1052265472,1052265519,IT +1052265520,1052265535,GB +1052265536,1052265599,DE +1052265600,1052265983,IT +1052265984,1052266239,DE +1052266240,1052266495,GB +1052266496,1052268543,BE +1052268544,1052268607,ZA +1052268608,1052268671,BE +1052268672,1052268703,IT +1052268704,1052268719,ZA +1052268720,1052268735,NL +1052268736,1052268799,DE +1052268800,1052270591,ZA +1052270592,1052271871,FR +1052271872,1052272127,BE +1052272128,1052272543,FR +1052272544,1052272575,AT +1052272576,1052272639,SE +1052272640,1052274175,FR +1052274176,1052274687,ZA +1052274688,1052274943,ES +1052274944,1052275199,IT +1052275200,1052275711,AT +1052275712,1052276735,GB +1052276736,1052278207,IT +1052278208,1052278271,GB +1052278272,1052278783,IT +1052278784,1052278823,CH +1052278824,1052278831,GB +1052278832,1052278847,AT +1052278848,1052278863,ZA +1052278864,1052278879,NL +1052278880,1052284607,GB +1052284672,1052286975,GB +1052286976,1052287487,CH +1052287488,1052288255,SE +1052288288,1052288295,IL +1052288296,1052288303,BE +1052288304,1052288319,AT +1052288384,1052288511,FR +1052288512,1052289023,AT +1052289024,1052289151,GB +1052289152,1052289183,CH +1052289184,1052289215,DE +1052289216,1052289279,GB +1052289536,1052290047,GB +1052290048,1052290063,CH +1052290064,1052290303,GB +1052290368,1052290399,CH +1052290400,1052290431,ZA +1052290432,1052290559,FR +1052290560,1052290575,GB +1052290576,1052290591,BE +1052290592,1052290639,GB +1052290640,1052290655,ZA +1052290656,1052290687,DE +1052290688,1052290815,GB +1052290816,1052290831,CH +1052290832,1052291327,GB +1052291328,1052291583,CH +1052291584,1052291679,FI +1052291680,1052291687,TR +1052291688,1052291695,GB +1052291696,1052291711,CH +1052291712,1052292095,FR +1052292096,1052299263,GB +1052299776,1052303359,GB +1052303360,1052307455,DE +1052307456,1052309247,CH +1052309248,1052309503,NO +1052309504,1052310527,CH +1052310528,1052310783,FR +1052310784,1052311039,AT +1052311040,1052311551,GB +1052311552,1052311615,DE +1052311616,1052311679,BE +1052311680,1052311871,DE +1052311872,1052311895,BE +1052311896,1052311903,NL +1052311904,1052311935,IT +1052311936,1052311967,GB +1052311968,1052311999,DE +1052312000,1052312063,CH +1052312064,1052312767,DE +1052312832,1052312895,DE +1052312896,1052312903,CH +1052312904,1052312911,ES +1052312912,1052312927,CH +1052312928,1052313087,GB +1052313088,1052314751,DE +1052314752,1052314815,ES +1052314816,1052314823,DE +1052314824,1052314831,ES +1052314832,1052314847,IT +1052314848,1052315071,DE +1052315072,1052315103,IT +1052315104,1052315135,AT +1052315136,1052315551,DE +1052315552,1052315583,ES +1052315584,1052315647,GB +1052315648,1052316319,DE +1052316320,1052316335,NL +1052316336,1052316767,DE +1052316768,1052316799,IT +1052316800,1052316927,DE +1052317184,1052317599,DE +1052317600,1052317607,BE +1052317608,1052317615,DE +1052317616,1052317631,GB +1052317632,1052317663,IT +1052317664,1052318047,DE +1052318048,1052318079,ES +1052318080,1052318207,SE +1052318208,1052318719,DE +1052319232,1052319743,DE +1052320000,1052320079,GB +1052320080,1052320087,CZ +1052320088,1052320095,GB +1052320096,1052320127,ZA +1052320128,1052320255,BE +1052320256,1052322239,GB +1052322240,1052322303,CH +1052322304,1052323871,GB +1052323872,1052323903,CH +1052323904,1052324927,GB +1052324928,1052324943,ZA +1052324944,1052324959,NL +1052324960,1052324991,ES +1052324992,1052325191,GB +1052325192,1052325199,DE +1052325200,1052325215,AT +1052325216,1052325247,ZA +1052325248,1052325311,GB +1052325312,1052325375,NL +1052325376,1052325567,GB +1052325568,1052325631,ZA +1052325632,1052327935,GB +1052327936,1052328223,CH +1052328224,1052328255,IT +1052328256,1052328319,ES +1052328320,1052328447,DE +1052328448,1052328639,CH +1052328640,1052328671,ZA +1052328672,1052328703,ES +1052328704,1052329983,CH +1052329984,1052330239,DE +1052330240,1052331167,CH +1052331168,1052331183,GB +1052331184,1052331199,CH +1052331200,1052331263,GB +1052331264,1052331615,CH +1052331616,1052331647,AT +1052331648,1052331711,CH +1052331712,1052331743,GB +1052331744,1052332031,CH +1052332032,1052333103,IT +1052333104,1052333119,CH +1052333120,1052333183,FR +1052333184,1052333311,ZA +1052333568,1052334751,IT +1052334752,1052334759,NL +1052334760,1052334767,ZA +1052334768,1052334815,GB +1052334816,1052334847,ZA +1052334848,1052335423,IT +1052335424,1052335455,NL +1052335456,1052335519,ES +1052335520,1052335535,ZA +1052335536,1052335551,DE +1052335552,1052335615,AT +1052335616,1052336127,BE +1052336128,1052336255,FR +1052336256,1052336383,GB +1052336384,1052337343,FR +1052337344,1052337375,DE +1052337376,1052337759,FR +1052337760,1052337887,GB +1052337888,1052337903,ZA +1052337904,1052337911,NL +1052337912,1052337919,ZA +1052337920,1052340111,FR +1052340112,1052340127,ES +1052340128,1052340135,NL +1052340136,1052340223,FR +1052340224,1052340527,AT +1052340528,1052340543,BE +1052340544,1052340575,IT +1052340576,1052340607,NL +1052340608,1052340671,HU +1052340672,1052340703,GB +1052340704,1052340719,ZA +1052340720,1052340735,GB +1052340736,1052340767,AT +1052340768,1052340799,DE +1052340800,1052340863,GB +1052340864,1052341247,AT +1052341248,1052341503,DE +1052341504,1052342271,AT +1052342272,1052342303,SE +1052342304,1052342335,CH +1052342336,1052342463,SE +1052342464,1052342471,ZA +1052342472,1052342479,GB +1052342480,1052342495,ZA +1052342496,1052342527,FR +1052342528,1052343647,CH +1052343648,1052343655,NL +1052343656,1052343663,GB +1052343664,1052343679,DE +1052343680,1052344319,CH +1052344320,1052344863,NL +1052344864,1052344895,ES +1052344896,1052344959,IT +1052344960,1052345087,CH +1052345088,1052345135,NL +1052345136,1052345151,GB +1052345152,1052345247,FR +1052345248,1052345279,IT +1052345280,1052345343,DE +1052345344,1052345471,NL +1052345488,1052345503,NL +1052345504,1052345535,ZA +1052345536,1052345551,AT +1052345552,1052345567,GB +1052345568,1052345631,NL +1052345632,1052345663,IT +1052345664,1052345695,HU +1052345696,1052345727,PT +1052345728,1052345855,AT +1052345856,1052346903,NL +1052346904,1052346911,BE +1052346912,1052346943,ZA +1052346944,1052347007,ES +1052347008,1052347135,DE +1052347136,1052347391,NL +1052347392,1052348415,CH +1052348416,1052348799,GB +1052348800,1052348831,DE +1052348832,1052348863,CH +1052348864,1052348879,DE +1052348880,1052348895,GB +1052348896,1052348927,DE +1052348928,1052349119,GB +1052349120,1052349151,BE +1052349152,1052349343,GB +1052349344,1052349375,DE +1052349376,1052349407,GB +1052349408,1052349439,ZA +1052349440,1052352559,GB +1052352560,1052352591,ZA +1052352592,1052352607,GB +1052352640,1052352703,GB +1052352704,1052352767,DE +1052352768,1052352927,GB +1052352928,1052352959,IT +1052352960,1052352991,ES +1052352992,1052353023,BE +1052353024,1052353279,IT +1052353280,1052353407,DE +1052353536,1052354111,DE +1052354112,1052354175,TR +1052354176,1052354559,DE +1052354560,1052356607,GB +1052356608,1052356703,ZA +1052356704,1052356735,ES +1052356736,1052356799,RU +1052356800,1052356863,IE +1052356864,1052358479,ZA +1052358480,1052358495,GB +1052358496,1052358511,AT +1052358512,1052358527,ZA +1052358528,1052358655,DE +1052358656,1052359839,ZA +1052359840,1052359871,IE +1052359872,1052359935,IT +1052359936,1052360735,ZA +1052360736,1052360743,GB +1052360744,1052360767,ZA +1052360768,1052360783,DE +1052360784,1052360831,IT +1052360832,1052360959,GB +1052360960,1052360991,FR +1052360992,1052361023,BE +1052361024,1052361039,ZA +1052361040,1052361055,NL +1052361056,1052361087,DE +1052361088,1052361151,ES +1052361152,1052361215,GB +1052361216,1052361471,ZA +1052361472,1052361647,BE +1052361648,1052361655,GB +1052361656,1052361663,DE +1052361664,1052361695,BE +1052361696,1052361727,CH +1052361728,1052361919,IT +1052361920,1052361951,ZA +1052361952,1052361967,IT +1052361968,1052361983,ZA +1052361984,1052362239,IT +1052362240,1052362751,DK +1052362752,1052362783,ES +1052362784,1052362815,GB +1052362816,1052362879,CH +1052362880,1052363039,ES +1052363072,1052363135,GB +1052363136,1052363263,ES +1052363264,1052364543,DE +1052364544,1052364671,BE +1052364672,1052364687,DE +1052364688,1052364695,GB +1052364696,1052364703,NL +1052364704,1052364799,GB +1052364800,1052366207,BE +1052366208,1052366271,IE +1052366272,1052366335,GB +1052366336,1052366655,BE +1052366656,1052366719,DE +1052366720,1052367871,BE +1052367872,1052368895,DK +1052368896,1052369023,IE +1052369024,1052369039,IT +1052369040,1052369055,DE +1052369056,1052369087,ZA +1052369088,1052369151,IT +1052369152,1052369407,IE +1052369408,1052369663,HU +1052369664,1052369855,CZ +1052369888,1052369919,CZ +1052369920,1052370175,NO +1052370176,1052370431,DK +1052370432,1052370559,SE +1052370560,1052370623,DE +1052370624,1052370687,IT +1052370688,1052370943,DK +1052370944,1052372255,GB +1052372256,1052372287,ZA +1052372288,1052372351,FI +1052372352,1052374015,GB +1052374016,1052375039,CH +1052375040,1052375551,DE +1052375680,1052375711,DE +1052375712,1052375807,FR +1052375808,1052376063,DE +1052376320,1052376831,DE +1052376832,1052377087,ES +1052377088,1052377535,DE +1052377536,1052377599,NO +1052377600,1052377743,FR +1052377744,1052377759,NL +1052377760,1052377791,ZA +1052377792,1052377855,GB +1052377856,1052377871,DE +1052377872,1052377887,CH +1052377920,1052377951,DE +1052377952,1052377983,FR +1052377984,1052378047,GB +1052378048,1052378079,FR +1052378080,1052378111,NL +1052378112,1052378983,DE +1052378984,1052378991,NO +1052378992,1052379031,GB +1052379032,1052379039,DE +1052379040,1052379103,GB +1052379104,1052379135,SE +1052379392,1052379791,DE +1052379792,1052379799,GB +1052379800,1052379807,NL +1052379808,1052379839,DE +1052379840,1052379903,ZA +1052379904,1052380063,GB +1052380064,1052380127,DE +1052380128,1052380159,NL +1052380160,1052381183,DE +1052381440,1052382623,DE +1052382656,1052382719,ES +1052382720,1052382975,DE +1052382976,1052383999,GB +1052384000,1052384255,NL +1052384256,1052385279,GB +1052385280,1052385535,DE +1052385536,1052385615,GB +1052385616,1052385631,ZA +1052385632,1052385695,GB +1052385696,1052385791,FR +1052385792,1052388863,GB +1052388864,1052389119,NL +1052389120,1052390431,GB +1052390432,1052390447,ZA +1052390448,1052390455,GB +1052390456,1052390463,IT +1052390464,1052393471,GB +1052393472,1052393599,CH +1052393600,1052393695,FR +1052393696,1052394271,CH +1052394272,1052394303,ZA +1052394304,1052394367,GB +1052394368,1052395263,CH +1052395264,1052395679,GB +1052395680,1052395743,DE +1052395744,1052395775,ES +1052395776,1052396031,NL +1052396032,1052396543,CH +1052396544,1052396607,SE +1052396608,1052396671,BE +1052396672,1052396799,SE +1052396800,1052396863,TR +1052396864,1052396927,RO +1052396928,1052397439,HU +1052397568,1052399039,IT +1052399040,1052399103,NO +1052399104,1052399903,IT +1052399904,1052399919,DE +1052399920,1052399927,NL +1052399928,1052399935,FR +1052399936,1052399999,IT +1052400000,1052400127,BE +1052400128,1052401151,IT +1052401152,1052401279,BE +1052401280,1052401311,IT +1052401312,1052401343,AT +1052401344,1052401407,ZA +1052401408,1052401599,BE +1052401600,1052401631,GB +1052401632,1052401663,RU +1052401664,1052402047,FR +1052402048,1052402175,NL +1052402176,1052402271,FR +1052402272,1052402303,IT +1052402304,1052402367,GB +1052402368,1052403359,FR +1052403360,1052403391,DE +1052403392,1052403407,IT +1052403408,1052403415,GB +1052403416,1052403423,NL +1052403424,1052403455,RO +1052403456,1052403727,FR +1052403728,1052403743,NL +1052403744,1052403775,FR +1052403776,1052403839,ZA +1052403840,1052403967,CH +1052403968,1052404383,FR +1052404384,1052404399,ZA +1052404400,1052404447,FR +1052404448,1052404479,GB +1052404480,1052404767,FR +1052404768,1052404783,ZA +1052404784,1052404799,GB +1052404800,1052404863,FR +1052404864,1052404991,GB +1052404992,1052405759,FR +1052405760,1052407519,AT +1052407520,1052407535,FR +1052407536,1052407551,SE +1052407552,1052407839,AT +1052407840,1052407871,ZA +1052407872,1052407887,DE +1052407888,1052407903,ZA +1052407904,1052407935,DE +1052407936,1052408159,AT +1052408160,1052408383,GB +1052408384,1052408447,BE +1052408448,1052408511,FR +1052408512,1052408575,GB +1052408576,1052408831,AT +1052408832,1052409855,GB +1052409856,1052409863,NL +1052409864,1052409871,DE +1052409872,1052409951,NL +1052409952,1052409983,BE +1052409984,1052410047,GB +1052410048,1052410111,BE +1052411136,1052412327,NL +1052412336,1052412343,NL +1052412344,1052412351,GB +1052412352,1052412415,CH +1052412672,1052412831,NL +1052412832,1052412863,DE +1052412864,1052413951,NL +1052413952,1052414335,CZ +1052414464,1052414975,IE +1052414976,1052415999,BE +1052416000,1052416575,DE +1052416576,1052416639,ZA +1052416640,1052416671,GB +1052416672,1052416703,DE +1052416704,1052416735,IT +1052416736,1052416767,DE +1052416768,1052417071,NO +1052417072,1052417087,DE +1052417088,1052417119,AT +1052417120,1052417151,IT +1052417152,1052417279,GB +1052417280,1052417359,NO +1052417368,1052417535,NO +1052417536,1052418047,ZA +1052418048,1052419583,BE +1052419584,1052420031,IT +1052420064,1052420095,IT +1052420096,1052420735,GB +1052420736,1052420767,DE +1052420768,1052420783,GB +1052420784,1052420799,ZA +1052420800,1052420863,DE +1052420864,1052422143,GB +1052422144,1052422847,ZA +1052422848,1052422863,SE +1052422864,1052422879,FR +1052422880,1052423199,ZA +1052423200,1052423231,CH +1052423232,1052423295,ZA +1052423304,1052423311,CH +1052423360,1052423423,NL +1052423424,1052423967,ZA +1052424000,1052424799,ZA +1052424800,1052424815,GB +1052424816,1052424823,ES +1052424824,1052424831,BE +1052424832,1052424959,GB +1052424960,1052425151,ZA +1052425152,1052425215,BE +1052425216,1052426239,ZA +1052426240,1052426319,PT +1052426328,1052426495,PT +1052426512,1052426527,FR +1052427264,1052427839,CH +1052427840,1052427855,GB +1052427856,1052427871,IT +1052427872,1052427903,AT +1052427904,1052427967,DE +1052427968,1052428031,GB +1052428032,1052428287,CH +1052428288,1052428479,ES +1052428480,1052428543,BE +1052428544,1052429407,ES +1052429408,1052429439,FR +1052429440,1052429567,BE +1052429568,1052429759,ES +1052429760,1052429823,DE +1052429824,1052430335,ES +1052430336,1052430407,BE +1052430408,1052430415,ZA +1052430416,1052430431,FR +1052430432,1052430463,DE +1052430464,1052430527,BE +1052430528,1052430591,DE +1052430592,1052433407,BE +1052433408,1052433719,DK +1052433720,1052433727,FR +1052433728,1052433919,DK +1052433920,1052434431,ZA +1052434432,1052434751,GB +1052434752,1052434783,NO +1052434784,1052435455,GB +1052435456,1052435647,NL +1052435680,1052436479,NL +1052436480,1052437023,DE +1052437024,1052437055,ZA +1052437056,1052437119,DE +1052437120,1052437135,ZA +1052437136,1052437151,DE +1052437152,1052437183,GB +1052437184,1052437247,ZA +1052437248,1052437759,DE +1052437760,1052438015,CH +1052438016,1052438399,BE +1052438528,1052439503,AT +1052439520,1052439551,AT +1052439552,1052440575,FR +1052440576,1052441343,DE +1052441600,1052442623,GB +1052442624,1052443647,DE +1052446208,1052446719,DE +1052446720,1052447743,CZ +1052447744,1052447871,PL +1052448000,1052448127,PL +1052448256,1052450815,ZA +1052450816,1052451839,DE +1052451840,1052452159,NO +1052452224,1052452351,NO +1052452352,1052452831,ES +1052452832,1052452847,GB +1052452848,1052452863,FR +1052452992,1052452999,SK +1052453120,1052453375,FR +1052453376,1052453887,AT +1052453888,1052454911,GB +1052454912,1052454943,FR +1052454944,1052454959,NL +1052454976,1052455359,NL +1052455424,1052455935,GB +1052455936,1052456447,NL +1052456448,1052456959,CH +1052456960,1052457983,NL +1052457984,1052458367,AT +1052458432,1052458495,AT +1052458496,1052458847,NL +1052458848,1052458863,FR +1052458864,1052458871,NL +1052458872,1052458879,FR +1052458880,1052460031,GB +1052460032,1052460127,NO +1052460224,1052460287,FR +1052460544,1052460799,NO +1052460800,1052461055,DE +1052461056,1052461295,FR +1052461296,1052461311,BE +1052461312,1052461951,FR +1052461968,1052463103,FR +1052463104,1052463615,ES +1052463616,1052464639,GB +1052464640,1052464927,ES +1052464960,1052465087,ES +1052465152,1052465375,ZA +1052465408,1052465663,ZA +1052466432,1052468223,FR +1052468224,1052469247,GB +1052469248,1052470271,FR +1052470272,1052470783,ZA +1052470784,1052471007,FR +1052471040,1052471295,BE +1052471296,1052472511,GB +1052472576,1052475231,GB +1052475240,1052475255,GB +1052475264,1052475391,GB +1052475392,1052476383,FR +1052476416,1052479487,FR +1052479488,1052479743,NL +1052479744,1052479999,DE +1052480000,1052483583,NL +1052483584,1052483999,IT +1052484032,1052485279,IT +1052485312,1052485631,IT +1052485632,1052486655,GB +1052486656,1052486911,CH +1052486912,1052486975,DE +1052486976,1052487039,FR +1052487040,1052487167,DE +1052487168,1052487423,GB +1052487424,1052487679,AT +1052487680,1052488703,CH +1052488704,1052489727,GB +1052489728,1052490239,IE +1052490240,1052490751,SE +1052490752,1052491679,AT +1052491688,1052491775,AT +1052491776,1052493567,BE +1052493696,1052494335,BE +1052494336,1052494591,NL +1052494592,1052495439,BE +1052495440,1052495487,FR +1052495488,1052495551,BE +1052495552,1052495583,GB +1052495584,1052495871,BE +1052495872,1052495879,UA +1052496128,1052497407,DE +1052497664,1052497919,DE +1052497920,1052498431,ES +1052498432,1052498495,RO +1052498944,1052499455,GB +1052499968,1052500191,DK +1052500208,1052500319,DK +1052500480,1052500991,GB +1052500992,1052501023,FI +1052501032,1052501039,FI +1052501120,1052501247,FI +1052501504,1052502015,CH +1052502016,1052502783,IE +1052502816,1052502847,IE +1052503040,1052504319,GB +1052504320,1052504351,BY +1052504384,1052507583,GB +1052507648,1052507775,GB +1052507904,1052596447,GB +1052596448,1052596463,IT +1052596464,1052602495,GB +1052602496,1052602623,ES +1052602624,1052621951,GB +1052621952,1052622015,IE +1052622016,1052644095,GB +1052644096,1052644351,SE +1052644352,1052647167,GB +1052647168,1052647423,SE +1052647424,1052661759,GB +1052661760,1052662271,SE +1052662272,1052665343,GB +1052665344,1052665599,SE +1052665600,1052684575,GB +1052684576,1052684607,IT +1052684608,1052770303,GB +1052770304,1052775759,CH +1052775760,1052775767,GB +1052775768,1052778495,CH +1052778496,1052786687,RU +1052786688,1052803071,NL +1052803072,1052806655,DE +1052806656,1052807167,MW +1052807168,1052811263,DE +1052811264,1052819455,RU +1052819456,1052827647,DE +1052827648,1052835839,RU +1052835840,1052844031,IR +1052844032,1052852223,FR +1052868608,1052871935,RS +1052871936,1052871959,CS +1052871960,1052871975,RS +1052871976,1052871991,CS +1052871992,1052872000,CS +1052872001,1052872011,RS +1052872012,1052872019,CS +1052872020,1052872095,RS +1052872096,1052872127,CS +1052872128,1052872143,CS +1052872144,1052872159,CS +1052872160,1052872191,CS +1052872192,1052872207,CS +1052872208,1052872235,RS +1052872236,1052872243,CS +1052872244,1052872255,RS +1052872256,1052872271,CS +1052872272,1052872311,RS +1052872312,1052872323,CS +1052872324,1052872343,RS +1052872344,1052872355,CS +1052872356,1052872371,RS +1052872372,1052872375,CS +1052872376,1052872383,RS +1052872384,1052872403,CS +1052872404,1052872407,RS +1052872408,1052872411,CS +1052872412,1052872435,RS +1052872436,1052872451,CS +1052872452,1052872495,RS +1052872496,1052872503,CS +1052872504,1052872507,RS +1052872508,1052872511,CS +1052872512,1052872523,RS +1052872524,1052872527,CS +1052872528,1052872539,RS +1052872540,1052872543,CS +1052872544,1052872559,RS +1052872560,1052872571,CS +1052872572,1052872591,RS +1052872592,1052872615,CS +1052872616,1052872639,RS +1052872640,1052872643,CS +1052872644,1052872679,RS +1052872680,1052872687,CS +1052872688,1052872823,RS +1052872824,1052872831,CS +1052872832,1052872883,RS +1052872884,1052872895,CS +1052872896,1052875775,RS +1052875776,1052876799,CS +1052884992,1052901375,FR +1052901376,1053032447,NL +1053032448,1053097983,IT +1053097984,1053106175,DE +1053106176,1053114367,GB +1053114368,1053130751,BE +1053130752,1053138943,NL +1053138944,1053147135,FI +1053147136,1053163519,SK +1053163520,1053294591,DK +1053294848,1053295103,AT +1053295392,1053295423,AT +1053295456,1053295471,AT +1053295616,1053296639,AT +1053296640,1053296927,IT +1053296992,1053297023,IT +1053297040,1053297055,IT +1053297112,1053297151,IT +1053298176,1053299199,CH +1053299712,1053300119,GB +1053300160,1053300735,GB +1053300736,1053300991,CH +1053300992,1053301023,FR +1053301040,1053301063,FR +1053301072,1053301087,FR +1053301120,1053301135,FR +1053301168,1053301183,FR +1053301200,1053301207,FR +1053301216,1053301343,FR +1053301352,1053301359,FR +1053301368,1053301503,FR +1053302032,1053302055,FR +1053302056,1053302063,DE +1053302064,1053302159,FR +1053302176,1053302183,FR +1053302256,1053302271,FR +1053302320,1053302335,FR +1053302384,1053302687,FR +1053302728,1053302735,FR +1053302760,1053302783,FR +1053305088,1053305951,GR +1053306112,1053306879,GR +1053307904,1053307999,GB +1053308032,1053308095,GB +1053308160,1053308543,GB +1053308672,1053308767,GB +1053308800,1053308863,GB +1053308928,1053308991,ZA +1053309024,1053309055,ZA +1053309184,1053309951,ZA +1053311232,1053311359,CZ +1053312000,1053312831,DK +1053312848,1053312871,DK +1053312880,1053312911,DK +1053312928,1053312959,DK +1053313024,1053313279,GB +1053313296,1053313343,GB +1053313440,1053313599,GB +1053313664,1053313679,GB +1053313728,1053314047,GB +1053314064,1053314079,CZ +1053315072,1053316623,GB +1053316632,1053316639,GB +1053316648,1053316655,GB +1053316688,1053316695,GB +1053316704,1053316711,GB +1053316720,1053316727,GB +1053316736,1053316863,GB +1053317120,1053317295,ZA +1053317376,1053317631,GB +1053318144,1053318655,GB +1053318656,1053318911,FI +1053318928,1053318951,FI +1053318952,1053318959,EE +1053318976,1053318991,FI +1053319424,1053320191,DE +1053320224,1053320319,DE +1053326336,1053326399,BE +1053326432,1053326447,GB +1053326448,1053326463,BE +1053326528,1053326543,BE +1053326560,1053326567,BE +1053326576,1053326847,BE +1053326848,1053327103,FI +1053327104,1053327359,DK +1053327872,1053328383,ZA +1053328640,1053328799,ZA +1053328896,1053329087,ZA +1053329120,1053329135,ZA +1053329144,1053329151,ZA +1053329184,1053329279,ZA +1053329408,1053329439,ES +1053329512,1053329535,ES +1053329600,1053329639,ES +1053330432,1053330687,ES +1053331456,1053331487,NL +1053331584,1053331663,NL +1053331680,1053331703,NL +1053331712,1053331887,NL +1053331904,1053331935,NL +1053332224,1053332271,NL +1053332320,1053332415,NL +1053332992,1053334015,BE +1053334016,1053334191,DK +1053334200,1053334223,DK +1053334240,1053334527,DK +1053334528,1053334783,SE +1053335552,1053336831,ZA +1053337088,1053337119,ZA +1053337128,1053337183,ZA +1053337216,1053337279,ZA +1053337600,1053337631,CH +1053338112,1053338623,FI +1053338624,1053338943,NO +1053338976,1053338983,NO +1053339136,1053339423,NO +1053339456,1053339519,NO +1053339592,1053339599,NO +1053339616,1053339647,NO +1053339648,1053340159,AT +1053340160,1053340415,ZA +1053340480,1053340495,NL +1053340672,1053340711,GB +1053340720,1053340871,GB +1053340888,1053340895,GB +1053340904,1053340919,GB +1053340928,1053341183,GB +1053341440,1053341695,GB +1053343744,1053344255,FI +1053344512,1053344767,BG +1053345280,1053345375,PK +1053345408,1053345471,PK +1053348640,1053348655,PT +1053349120,1053349631,NL +1053349888,1053349951,IE +1053350144,1053350359,IE +1053350368,1053350383,IE +1053350400,1053350479,BE +1053350488,1053350495,BE +1053350656,1053350911,BE +1053351936,1053352191,IL +1053352992,1053353031,IE +1053353104,1053353111,IE +1053353136,1053353151,IE +1053353184,1053353215,IE +1053353232,1053353279,IE +1053353984,1053354239,IL +1053354496,1053354655,IL +1053354688,1053354719,IL +1053354752,1053354831,IL +1053354856,1053354871,IL +1053354912,1053355007,IL +1053360128,1053368319,ES +1053368320,1053376511,SE +1053376512,1053392895,HU +1053392896,1053401087,FR +1053401088,1053409279,DE +1053409280,1053425663,IR +1053425664,1053556735,CH +1053556736,1053564927,FI +1053564928,1053573119,GB +1053573120,1053581311,NL +1053581312,1053589503,CH +1053589504,1053597695,BG +1053597696,1053605887,DE +1053605888,1053614079,ES +1053614080,1053622271,CZ +1053622272,1053630463,IT +1053630464,1053638655,GR +1053638656,1053655039,BE +1053655040,1053663231,UA +1053663232,1053671423,RU +1053671424,1053687807,LV +1053687808,1053702635,DE +1053702636,1053702639,GB +1053702640,1053753343,DE +1053753344,1053818879,IT +1053818880,1053819391,DE +1053819424,1053819439,DE +1053819520,1053819563,DE +1053819584,1053819647,DE +1053820160,1053820927,DE +1053821440,1053821447,GB +1053821568,1053821695,GB +1053824016,1053824023,DE +1053824128,1053824255,NL +1053825024,1053826047,ES +1053826816,1053827327,DE +1053827328,1053827583,BE +1053829888,1053830143,DE +1053831168,1053831423,DE +1053834944,1053834975,DE +1053835264,1053835775,DE +1053837312,1053837439,FK +1053837568,1053837823,GB +1053837824,1053838335,FK +1053838336,1053838591,DE +1053840400,1053840415,DE +1053840448,1053840511,DE +1053843200,1053843207,DK +1053843712,1053843967,DE +1053843968,1053844223,GB +1053844224,1053844479,DE +1053844992,1053845503,DE +1053845728,1053845735,DE +1053846016,1053846527,DE +1053846784,1053848575,DE +1053848576,1053849599,GB +1053849600,1053850367,DE +1053851136,1053851647,DE +1053851904,1053851919,FR +1053852032,1053852047,IT +1053852096,1053852103,DE +1053852112,1053852127,GB +1053852128,1053852159,DE +1053855744,1053859839,GB +1053859840,1053860863,DE +1053862656,1053862783,DE +1053862848,1053862879,DE +1053863424,1053864959,DE +1053865216,1053865727,DE +1053865728,1053865759,US +1053865984,1053866239,DE +1053866240,1053866495,ES +1053866496,1053866799,DE +1053866808,1053866823,DE +1053866832,1053866847,DE +1053867008,1053867775,DE +1053867976,1053867983,DE +1053867992,1053867999,DE +1053868008,1053868015,DE +1053868032,1053868447,ES +1053868448,1053868455,GB +1053868456,1053868463,ES +1053868800,1053869567,DE +1053870080,1053870335,DE +1053870336,1053870591,GB +1053870848,1053871359,DE +1053871616,1053871871,DE +1053872384,1053872447,DE +1053872896,1053873663,DE +1053876224,1053876991,DE +1053877248,1053878271,DE +1053878272,1053878783,GB +1053878784,1053879047,DE +1053879056,1053879071,DE +1053879072,1053879167,GB +1053879296,1053882111,DE +1053882368,1053882879,DE +1053882880,1053883391,GB +1053883392,1053884415,DE +1053884416,1053892607,BH +1053892608,1053892619,DE +1053892620,1053892623,GB +1053892624,1053894495,DE +1053894496,1053894527,GB +1053894528,1053894719,DE +1053894720,1053894735,FR +1053894736,1053894743,GB +1053894744,1053894751,GE +1053894752,1053894783,DE +1053894784,1053894815,IL +1053894816,1053894831,NL +1053894832,1053894847,US +1053894848,1053895423,DE +1053895424,1053895679,GB +1053895680,1053895935,US +1053895936,1053896087,DE +1053896088,1053896095,US +1053896096,1053896127,GB +1053896128,1053896159,DE +1053896160,1053896175,US +1053896176,1053896447,DE +1053896448,1053896703,US +1053896704,1053900799,DE +1053900800,1053917183,NO +1053917184,1053925375,UZ +1053925376,1053933567,SE +1053933568,1053949951,CZ +1053949952,1053984415,FR +1053984416,1053984447,US +1053984448,1053984895,FR +1053984896,1053985023,US +1053985024,1054015487,FR +1054015488,1054089215,IT +1054089216,1054097407,GE +1054097408,1054105599,NL +1054105600,1054113791,FR +1054113792,1054121983,NL +1054121984,1054130175,AT +1054130176,1054138367,LT +1054138368,1054146559,AZ +1054146560,1054179327,RU +1054179328,1054187519,GB +1054187520,1054195711,BG +1054195712,1054212095,BE +1054212096,1054277631,DE +1054277632,1054343167,KW +1054343168,1054351359,NL +1054351360,1054359551,UA +1054359552,1054367743,GB +1054367744,1054375935,FI +1054375936,1054381055,GB +1054381056,1054381823,EG +1054381824,1054384127,GB +1054384128,1054400511,DE +1054400512,1054408703,GB +1054408704,1054416895,FR +1054416896,1054425087,DE +1054425088,1054441471,GR +1054441472,1054449663,AZ +1054449664,1054457855,RU +1054457856,1054474239,RO +1054474240,1054539775,AT +1054539776,1054605311,IL +1054605312,1054613503,DE +1054613504,1054621695,RU +1054621696,1054629887,IT +1054629888,1054638079,IR +1054638080,1054646271,CH +1054646272,1054654463,SE +1054654464,1054662655,MK +1054662656,1054670847,FI +1054670848,1054671103,GB +1054671168,1054671231,IE +1054671372,1054671375,IE +1054671416,1054671423,IE +1054671432,1054671439,IE +1054672160,1054672175,IE +1054672256,1054672287,IE +1054672320,1054672335,US +1054672336,1054672367,IE +1054672384,1054672447,IE +1054672720,1054672727,IE +1054672744,1054672767,IE +1054672776,1054672783,IE +1054672792,1054672807,IE +1054673664,1054673727,IE +1054673856,1054673919,IE +1054673952,1054674047,IE +1054674080,1054674111,IE +1054674456,1054674471,IE +1054674480,1054674495,IE +1054674504,1054674511,IE +1054674520,1054674527,GB +1054674688,1054675199,IE +1054675456,1054675711,IE +1054675968,1054676223,US +1054679040,1054687231,UA +1054687232,1054703615,MD +1054703616,1054711807,BG +1054711808,1054719999,IT +1054720000,1054867455,NL +1054867456,1054943231,DE +1054943232,1054943487,PL +1054943488,1054949807,DE +1054949808,1054949815,ES +1054949816,1054963255,DE +1054963256,1054963263,ES +1054963264,1054969031,DE +1054969032,1054969039,AT +1054969040,1054978815,DE +1054978816,1054979071,FR +1054979072,1055129599,DE +1055196160,1055197823,CH +1055197920,1055198463,CH +1055198976,1055199103,CH +1055199360,1055199375,CH +1055199464,1055199487,CH +1055200416,1055200423,PT +1055201024,1055201279,US +1055203328,1055203359,CZ +1055203840,1055204095,CZ +1055204864,1055205375,CZ +1055205632,1055205887,CZ +1055206656,1055207423,CZ +1055207680,1055209471,CZ +1055209728,1055210239,CZ +1055210496,1055210751,SK +1055211264,1055211519,CZ +1055212044,1055212179,PT +1055212184,1055212247,PT +1055212352,1055212415,PT +1055212544,1055212799,PT +1055213056,1055213307,PT +1055213312,1055213319,PT +1055213328,1055213359,PT +1055213368,1055213455,PT +1055213472,1055213567,PT +1055213824,1055214239,PT +1055214272,1055214847,PT +1055215360,1055215999,PT +1055216032,1055216383,PT +1055216896,1055217663,PT +1055218208,1055218239,PT +1055218272,1055218299,PT +1055218352,1055218383,PT +1055218392,1055218399,PT +1055218432,1055218447,PT +1055218464,1055218471,PT +1055218480,1055219711,PT +1055220224,1055220287,NL +1055220352,1055220399,NL +1055221504,1055221631,BE +1055223040,1055223807,NL +1055223904,1055223999,LU +1055224064,1055224463,LU +1055224576,1055224607,LU +1055224832,1055224911,LU +1055226112,1055226175,ES +1055226192,1055226207,ES +1055226240,1055226255,ES +1055226264,1055226271,ES +1055226368,1055226399,ES +1055227640,1055227647,PT +1055227904,1055228159,TR +1055228928,1055229183,TR +1055232000,1055232255,NL +1055232512,1055233023,NL +1055234064,1055234079,NL +1055234080,1055234127,US +1055241984,1055242239,GR +1055252736,1055252991,ES +1055253056,1055253087,ES +1055256448,1055256463,ES +1055260672,1055326207,SE +1055326208,1055334399,RU +1055334400,1055342591,IE +1055342592,1055358975,RO +1055358976,1055367167,GB +1055367168,1055375359,RU +1055375360,1055391743,OM +1055391744,1055457279,GB +1055457280,1055465471,BE +1055465472,1055467575,FR +1055467576,1055467579,ES +1055467580,1055469055,FR +1055469056,1055469059,CH +1055469060,1055469063,DE +1055469064,1055469067,IT +1055469068,1055469071,BE +1055469072,1055471615,FR +1055471616,1055472127,BE +1055472128,1055472159,NL +1055472160,1055472383,FR +1055472384,1055472639,NL +1055472640,1055473663,FR +1055473664,1055490047,GB +1055490048,1055522815,PL +1055522816,1055588351,NL +1055588352,1055653887,BE +1055653888,1055681055,FI +1055681056,1055681071,SE +1055681072,1055784959,FI +1055784960,1055850495,NL +1055850496,1055916031,GB +1055916032,1055924223,CS +1055932416,1055940607,FI +1055948800,1055956991,DE +1055956992,1055965183,CZ +1055965184,1055973375,CH +1055973376,1055981567,FR +1055981568,1055989759,IT +1055989760,1055995135,DE +1055995136,1055995391,NL +1055995392,1055997951,DE +1055997952,1056014335,FR +1056022528,1056030719,GB +1056030720,1056047103,FI +1056047104,1056178175,DK +1056178176,1056194559,UA +1056194560,1056210943,FR +1056210944,1056219135,PL +1056219136,1056227327,GB +1056227328,1056243711,TR +1056243712,1056251903,MC +1056251904,1056260095,GB +1056260096,1056276479,CZ +1056276480,1056374783,DE +1056374784,1056440319,SE +1056440320,1056473087,TR +1056473088,1056505087,FI +1056505088,1056505107,SE +1056505108,1056505115,FI +1056505116,1056505119,SE +1056505120,1056505343,FI +1056505344,1056505599,SE +1056505600,1056505855,FI +1056505856,1056514047,PT +1056514048,1056522239,IT +1056522240,1056538623,AT +1056538624,1056546815,DE +1056546816,1056555007,NO +1056555008,1056571391,GB +1056571392,1056669695,NL +1056702464,1056874559,GB +1056874560,1056874567,IE +1056874568,1056874599,GB +1056874600,1056874607,IE +1056874608,1056874639,GB +1056874640,1056874647,IE +1056874648,1056874655,GB +1056874656,1056874679,IE +1056874680,1056874751,GB +1056874752,1056874783,IE +1056874784,1056874919,GB +1056874920,1056874927,IE +1056874928,1056874991,GB +1056874992,1056875007,IE +1056875008,1056875071,GB +1056875072,1056875103,IE +1056875104,1056875111,GB +1056875112,1056875135,IE +1056875136,1056875151,GB +1056875152,1056875167,IE +1056875168,1056875263,GB +1056875264,1056875311,IE +1056875312,1056875615,GB +1056875616,1056875623,IE +1056875624,1056875639,GB +1056875640,1056875671,IE +1056875672,1056876031,GB +1056876032,1056876047,IE +1056876048,1056964607,GB +1056964608,1061227007,US +1061227008,1061227263,HT +1061227264,1061227519,BO +1061227520,1061588735,US +1061588736,1061588991,GU +1061588992,1061748991,US +1061748992,1061749247,PR +1061749248,1062069247,US +1062069248,1062070271,PR +1062070272,1062497791,US +1062497792,1062498303,FM +1062498304,1062545919,US +1062545920,1062546431,BM +1062546432,1062871551,US +1062871552,1062872063,PR +1062872064,1063305727,US +1063305728,1063305983,CA +1063305984,1063334911,US +1063334912,1063335423,CO +1063335424,1063340799,US +1063340800,1063340927,CA +1063340928,1063568895,US +1063568896,1063569151,TZ +1063569152,1063573679,US +1063573680,1063573695,VN +1063573696,1063727615,US +1063727616,1063728127,GU +1063728128,1063747839,US +1063747840,1063748095,UG +1063748096,1063748607,US +1063748608,1063749119,GH +1063749120,1063749631,US +1063749632,1063749887,LR +1063749888,1063750143,SA +1063750144,1063750399,NG +1063750400,1063750463,US +1063750464,1063750527,NG +1063750528,1063750655,US +1063750656,1063751679,NG +1063751680,1063895039,US +1063895040,1063899135,KR +1063899136,1064124927,US +1064124928,1064125695,EC +1064125696,1064126719,US +1064126720,1064126975,EC +1064126976,1064127487,US +1064127488,1064127999,EC +1064128000,1064170799,US +1064170800,1064170807,LB +1064170808,1064170991,US +1064170992,1064170999,LB +1064171000,1064171007,US +1064171008,1064171135,LB +1064171136,1064171263,US +1064171264,1064171551,LB +1064171552,1064171559,TZ +1064171560,1064171575,US +1064171576,1064171583,PK +1064171584,1064171607,US +1064171608,1064171615,PK +1064171616,1064171631,GH +1064171632,1064171855,US +1064171856,1064171871,TZ +1064171872,1064171903,US +1064171904,1064171911,LB +1064171912,1064171919,US +1064171920,1064171927,PK +1064171928,1064171935,US +1064171936,1064171967,LB +1064171968,1064204287,US +1064204288,1064205311,MX +1064205312,1064650751,US +1064650752,1064651775,EC +1064651776,1065519359,US +1065519360,1065519487,CA +1065519488,1065594879,US +1065598976,1065611263,US +1065615360,1065811967,US +1065811968,1065820159,CA +1065820160,1065873407,US +1065873408,1065877503,PR +1065877504,1065906175,US +1065906176,1065908223,KY +1065908224,1066139647,US +1066401792,1066584063,US +1066584064,1066586111,PE +1066586112,1066627335,US +1066627336,1066627343,CA +1066627344,1066718559,US +1066718560,1066718591,PR +1066718592,1066828151,US +1066828152,1066828159,CN +1066828160,1066828255,US +1066828256,1066828287,HK +1066828288,1066829311,US +1066829312,1066829567,HK +1066829568,1066830207,US +1066830208,1066830239,SG +1066830240,1066830287,US +1066830288,1066830303,SG +1066830304,1066830311,US +1066830312,1066830319,SG +1066830320,1066830335,US +1066830336,1066830591,SG +1066830592,1066830799,US +1066830800,1066830807,SG +1066830808,1066831039,US +1066831040,1066831071,JP +1066831072,1066898783,US +1066898784,1066898815,CO +1066898816,1067473471,US +1067473472,1067473535,CA +1067473536,1067474751,US +1067474752,1067474767,NL +1067474768,1067481855,US +1067481856,1067482111,CA +1067482112,1067494847,US +1067494848,1067494879,CA +1067494880,1067503615,US +1067503616,1067503743,CA +1067503744,1067532287,US +1067532288,1067532799,HN +1067532800,1067537959,US +1067537960,1067537967,GB +1067537968,1067562495,US +1067562496,1067562751,SL +1067562752,1067573247,US +1067573248,1067573255,SG +1067573256,1067575295,US +1067575296,1067577343,HN +1067577344,1067617791,US +1067617792,1067618047,CN +1067618048,1067625967,US +1067625968,1067625983,CH +1067625984,1067653255,US +1067653256,1067653263,PR +1067653264,1067693055,US +1067693056,1067693567,CO +1067693568,1067726847,US +1067726848,1067727359,EC +1067727360,1067740159,US +1067740160,1067741183,HN +1067741184,1067762815,US +1067762816,1067762831,CA +1067762832,1067780607,US +1067780608,1067780863,GB +1067780864,1067808783,US +1067808784,1067808799,GB +1067808800,1067822863,US +1067822864,1067822871,CA +1067822872,1067824895,US +1067824896,1067825151,PR +1067825152,1067826239,US +1067826240,1067826247,CA +1067826248,1067908295,US +1067908296,1067908303,CH +1067908304,1067909023,US +1067909024,1067909039,SG +1067909040,1067918879,US +1067918880,1067918887,NL +1067918888,1067923231,US +1067923232,1067923239,CA +1067923240,1067977895,US +1067977896,1067977903,CA +1067977904,1067989247,US +1067989248,1067989503,EC +1067989504,1067998463,US +1067998464,1067998719,CO +1067998720,1068119407,US +1068119408,1068119423,DE +1068119424,1068167439,US +1068167440,1068167447,GB +1068167448,1068198879,US +1068198880,1068198911,IN +1068198912,1068199935,US +1068199936,1068204031,CA +1068204032,1068230655,US +1068230656,1068230911,CO +1068230912,1068284735,US +1068284736,1068284743,CA +1068284744,1068326911,US +1068326912,1068327167,EC +1068327168,1068362863,US +1068362864,1068362879,GB +1068362880,1068419071,US +1068419072,1068421119,CO +1068421120,1068425983,US +1068425984,1068426239,EC +1068426240,1068480159,US +1068480160,1068480191,IN +1068480192,1068491263,US +1068491264,1068491519,HN +1068491520,1071472639,US +1071472640,1071480831,CA +1071480832,1071985631,US +1071985632,1071985663,ML +1071985664,1072680623,US +1072680624,1072680631,CA +1072680632,1072922623,US +1072922624,1072922879,PH +1072922880,1072923135,PK +1072923136,1072923391,CA +1072923392,1072923903,US +1072923904,1072924927,CA +1072924928,1072925183,US +1072925184,1072926207,CA +1072926208,1072926471,US +1072926472,1072926527,CA +1072926528,1072926591,US +1072926592,1072926655,LC +1072926656,1072926719,CA +1072926720,1072926975,PH +1072926976,1072927487,CA +1072927488,1072927743,US +1072927744,1072928047,CA +1072928048,1072928063,IE +1072928064,1072928095,US +1072928096,1072928127,CA +1072928128,1072928255,US +1072928256,1072928263,CA +1072928264,1072928287,AF +1072928288,1072928319,CA +1072928320,1072928447,US +1072928448,1072929535,CA +1072929536,1072929791,US +1072929792,1072930047,CA +1072930048,1072930303,US +1072930304,1072931071,CA +1072931072,1072931327,US +1072931328,1072932607,CA +1072932608,1072932863,NG +1072932864,1072934399,CA +1072934400,1072934783,US +1072934784,1072934847,AU +1072934848,1072934879,CA +1072934880,1072934911,TW +1072934912,1072934943,CA +1072934944,1072934975,PH +1072934976,1072935039,CA +1072935040,1072935135,US +1072935136,1072935159,CA +1072935160,1072935167,US +1072935168,1072935679,CA +1072935680,1072935807,PH +1072935808,1072936447,CA +1072936448,1072936959,PH +1072936960,1072937215,US +1072937216,1072937471,IR +1072937472,1072937727,CA +1072937728,1072937983,US +1072937984,1072938239,CA +1072938240,1072938495,VG +1072938496,1072938751,CA +1072938752,1072940031,US +1072940032,1072955391,CA +1072955392,1073022975,US +1073022976,1073025791,HN +1073025792,1073026047,NI +1073026048,1073026303,US +1073026304,1073026431,DO +1073026432,1073027071,US +1073027072,1073028351,NI +1073028352,1073028607,US +1073028608,1073029119,GD +1073029120,1073031167,PR +1073031168,1073031231,US +1073031232,1073031263,AN +1073031264,1073031423,US +1073031424,1073031935,AN +1073031936,1073033215,US +1073033216,1073035263,AN +1073035264,1073036543,US +1073036544,1073037055,MX +1073037056,1073037311,AN +1073037312,1073037823,CO +1073037824,1073038335,GD +1073038336,1073039359,US +1073039360,1073041407,GT +1073041408,1073043455,CO +1073043456,1073045503,US +1073045504,1073047551,CO +1073047552,1073049599,PR +1073049600,1073053695,BS +1073053696,1073070079,US +1073074176,1073143807,US +1073147904,1073233919,US +1073283072,1073373183,US +1073373184,1073381375,CA +1073381376,1073381887,NL +1073381888,1074020351,US +1074020352,1074028543,CA +1074028544,1074089983,US +1074102272,1074118655,US +1074118656,1074120703,CA +1074120704,1074120719,US +1074120720,1074120959,CA +1074120960,1074121215,US +1074121216,1074122415,CA +1074122416,1074122431,US +1074122432,1074125055,CA +1074125056,1074125311,US +1074125312,1074126847,CA +1074126848,1074127359,US +1074127360,1074128511,CA +1074128512,1074128575,US +1074128576,1074135039,CA +1074135040,1074184191,US +1074184192,1074188287,CA +1074188288,1074229247,US +1074229248,1074241535,CA +1074241536,1074672671,US +1074672672,1074672703,IN +1074672704,1074672943,US +1074672944,1074672959,DK +1074672960,1074673663,US +1074673664,1074673679,CY +1074673680,1074675311,US +1074675312,1074675327,NO +1074675328,1074680623,US +1074680624,1074680639,CA +1074680640,1074680703,US +1074680704,1074680719,IL +1074680720,1074681263,US +1074681264,1074681279,CA +1074681280,1074681343,US +1074681344,1074681359,CA +1074681360,1074682687,US +1074682688,1074682751,CA +1074682752,1074683023,US +1074683024,1074683039,CA +1074683040,1074683807,US +1074683808,1074683839,CA +1074683840,1074690895,US +1074690896,1074690911,AR +1074690912,1074690943,US +1074690944,1074691007,AR +1074691008,1074691135,US +1074691136,1074691199,AR +1074691200,1074696063,US +1074696064,1074696095,AU +1074696096,1074701583,US +1074701584,1074701591,CA +1074701592,1074701599,US +1074701600,1074701631,CA +1074701632,1074705791,US +1074705792,1074705799,IL +1074705800,1074705887,US +1074705888,1074705903,IL +1074705904,1074706175,US +1074706176,1074706303,IL +1074706304,1074706367,US +1074706368,1074706431,GB +1074706432,1074706679,US +1074706680,1074706687,GB +1074706688,1074707775,US +1074707776,1074707839,GB +1074707840,1074707967,US +1074707968,1074708223,GB +1074708224,1074708991,US +1074708992,1074709247,PH +1074709248,1074711039,US +1074711040,1074711055,IN +1074711056,1074716679,US +1074716680,1074716687,GB +1074716688,1074716719,US +1074716720,1074716735,GB +1074716736,1074733055,US +1074733056,1074737151,AU +1074737152,1074745343,CA +1074745344,1074757631,US +1074757632,1074765823,CA +1074765824,1074777343,US +1074777344,1074777599,AU +1074777600,1074783167,US +1074783168,1074783199,CA +1074783200,1074783231,BM +1074783232,1074860031,US +1074864128,1074937855,US +1074937856,1074946047,CA +1074946048,1074962431,US +1074962432,1074970623,CA +1074970624,1075117287,US +1075117288,1075117311,IN +1075117312,1075421183,US +1075421184,1075429375,CA +1075429376,1075478527,US +1075478528,1075494911,CA +1075494912,1075558143,US +1075558144,1075558911,VI +1075558912,1075576831,US +1075576832,1075580927,GB +1075580928,1075585023,NO +1075585024,1075593967,US +1075593968,1075593983,CA +1075593984,1075594975,US +1075594976,1075594991,CA +1075594992,1075595343,US +1075595344,1075595359,CA +1075595360,1075596031,US +1075596032,1075596047,CA +1075596048,1075596831,US +1075596832,1075596847,CA +1075596848,1075597023,US +1075597024,1075597039,CA +1075597040,1075597167,US +1075597168,1075597183,CA +1075597184,1075597375,US +1075597376,1075597407,CA +1075597408,1075597439,IL +1075597440,1075597551,US +1075597552,1075597599,CA +1075597600,1075598367,US +1075598368,1075598383,CA +1075598384,1075598943,US +1075598944,1075598991,CA +1075598992,1075599007,US +1075599008,1075599039,CA +1075599040,1075599471,US +1075599472,1075599487,IL +1075599488,1075599967,US +1075599968,1075599983,IE +1075599984,1075601279,US +1075601280,1075601295,CA +1075601296,1075609599,US +1075609600,1075613695,TT +1075613696,1075773439,US +1075789824,1075855359,US +1075855360,1075871743,DO +1075871744,1075970047,US +1075970048,1075972095,CA +1075972096,1075972351,GB +1075972352,1075976191,US +1075976192,1075976447,CA +1075976448,1075976703,US +1075976704,1075976959,CA +1075976960,1075977983,US +1075977984,1075978239,CA +1075978240,1075983359,US +1075983360,1075984383,CA +1075984384,1075985919,US +1075985920,1075986431,CA +1075986432,1075990271,US +1075990272,1075990527,CA +1075990528,1075995007,US +1075995008,1075995023,VG +1075995024,1075996991,US +1075996992,1075997071,CA +1075997072,1075997183,US +1075997184,1075997439,CA +1075997440,1075999999,US +1076000000,1076000255,CA +1076000256,1076000767,US +1076000768,1076002047,CA +1076002048,1076003071,US +1076003072,1076003327,CA +1076003328,1076003519,US +1076003520,1076003535,CA +1076003536,1076003583,US +1076003584,1076004351,CA +1076004352,1076004863,US +1076004864,1076005119,CA +1076005120,1076005375,US +1076005376,1076005631,CA +1076005632,1076006399,US +1076006400,1076006655,CA +1076006656,1076006911,US +1076006912,1076007167,CA +1076007168,1076007423,US +1076007424,1076007679,CA +1076007680,1076007935,US +1076007936,1076008191,CA +1076008192,1076008447,US +1076008448,1076009215,CA +1076009216,1076009727,US +1076009728,1076010495,CA +1076010496,1076026367,US +1076026368,1076026879,CA +1076026880,1076028159,US +1076028160,1076028415,CA +1076028416,1076028927,US +1076028928,1076029183,BZ +1076029184,1076029439,US +1076029440,1076029951,CA +1076029952,1076030207,CN +1076030208,1076030783,US +1076030784,1076030847,CA +1076030848,1076030975,US +1076030976,1076031487,CA +1076031488,1076031743,US +1076031744,1076031999,CA +1076032000,1076281631,US +1076281632,1076281663,AT +1076281664,1076281695,US +1076281696,1076281727,TH +1076281728,1076282111,US +1076282112,1076282143,AU +1076282144,1076282351,US +1076282352,1076282367,CA +1076282368,1076283903,US +1076283904,1076284159,NO +1076284160,1076284679,US +1076284680,1076284687,HU +1076284688,1076285439,US +1076285440,1076285455,DK +1076285456,1076291903,US +1076291904,1076291919,UA +1076291920,1076292559,US +1076292560,1076292567,NL +1076292568,1076294655,US +1076294656,1076294687,CY +1076294688,1076294703,US +1076294704,1076294719,NO +1076294720,1076295071,US +1076295072,1076295087,NL +1076295088,1076295167,US +1076295168,1076295199,CY +1076295200,1076306511,US +1076306512,1076306527,AE +1076306528,1076307495,US +1076307496,1076307503,DE +1076307504,1076307519,US +1076307520,1076307535,DE +1076307536,1076307743,US +1076307744,1076307807,DE +1076307808,1076307967,US +1076307968,1076308223,DE +1076308224,1076308495,US +1076308496,1076308511,AE +1076308512,1076308575,US +1076308576,1076308591,IL +1076308592,1076308671,US +1076308672,1076308687,DE +1076308688,1076308991,US +1076308992,1076309007,IE +1076309008,1076309119,US +1076309120,1076309135,IE +1076309136,1076309151,US +1076309152,1076309183,DE +1076309184,1076309967,US +1076309968,1076309983,DE +1076309984,1076310015,US +1076310016,1076310271,DE +1076310272,1076310303,AE +1076310304,1076310367,US +1076310368,1076310383,IE +1076310384,1076310399,US +1076310400,1076310431,AE +1076310432,1076310463,AU +1076310464,1076310527,IL +1076310528,1076338687,US +1076338688,1076346879,CA +1076346880,1076387839,US +1076387840,1076393727,CA +1076393728,1076394239,US +1076394240,1076396031,CA +1076396032,1076408319,US +1076408320,1076412415,CA +1076412416,1076424703,US +1076424704,1076428799,CA +1076428800,1076493311,US +1076493312,1076493375,IN +1076493376,1076543487,US +1076543488,1076559871,CA +1076559872,1076756479,US +1076756480,1076772863,CA +1076772864,1076781055,US +1076789248,1076850687,US +1076850688,1076850943,CA +1076850944,1077055487,US +1077055488,1077059583,CA +1077059584,1077444607,US +1077444608,1077452799,CA +1077452800,1077460991,JP +1077460992,1077469183,US +1077469184,1077477375,CA +1077477376,1077506047,US +1077510144,1077561327,US +1077561328,1077561343,AR +1077561344,1077565503,US +1077565504,1077565567,AR +1077565568,1077592063,US +1077600256,1077641215,US +1077641216,1077657599,CA +1077657600,1077936127,US +1078001664,1078067199,US +1078075392,1078124543,US +1078124544,1078128639,CA +1078128640,1078198271,US +1078206464,1078247423,US +1078247424,1078251519,CA +1078251520,1078280639,US +1078280640,1078280671,CR +1078280672,1078282751,US +1078282752,1078283007,CA +1078283008,1078283015,US +1078283016,1078283023,VG +1078283024,1078283423,US +1078283424,1078283439,CA +1078283440,1078283743,US +1078283744,1078283775,CA +1078283776,1078283999,US +1078284000,1078284031,CA +1078284032,1078284367,US +1078284368,1078284383,VG +1078284384,1078287871,US +1078287872,1078288127,CA +1078288128,1078336447,US +1078336448,1078336455,HK +1078336456,1078336463,US +1078336464,1078336479,HK +1078336480,1078341807,US +1078341808,1078341823,PH +1078341824,1078349311,US +1078349312,1078349823,PH +1078349824,1078413311,US +1078419456,1078456319,US +1078456320,1078460415,CA +1078460416,1078484991,US +1078489088,1078517759,US +1078517760,1078525951,CA +1078525952,1078575103,US +1078583296,1078660799,US +1078660800,1078660831,CN +1078660832,1078661807,US +1078661808,1078661823,IN +1078661824,1078722559,US +1078722560,1078734847,AR +1078734848,1078737919,CO +1078737920,1078738943,EC +1078738944,1078739455,VE +1078739456,1078739967,US +1078739968,1078743039,PE +1078743040,1078746111,CO +1078746112,1078747135,PE +1078747136,1078749183,CL +1078749184,1078750231,PE +1078750232,1078750239,CA +1078750240,1078751231,PE +1078751232,1078753279,CO +1078753280,1078755327,AR +1078755328,1078757375,PE +1078757376,1078767615,CL +1078767616,1078768639,CO +1078768640,1078769663,CL +1078769664,1078771711,CO +1078771712,1078773759,EC +1078773760,1078775807,PE +1078775808,1078777855,CO +1078777856,1078780927,EC +1078780928,1078935551,US +1078947840,1078956799,US +1078956800,1078957055,GB +1078957056,1079320575,US +1079320576,1079328767,CA +1079328768,1079329919,US +1079329920,1079329951,CA +1079329952,1079377919,US +1079377920,1079378943,CA +1079378944,1079379199,US +1079379200,1079379455,CA +1079379456,1079379711,US +1079379712,1079380927,CA +1079380928,1079381183,US +1079381184,1079381567,CA +1079381568,1079381599,US +1079381600,1079381631,WS +1079381632,1079382015,US +1079382016,1079382527,CA +1079382528,1079383039,US +1079383040,1079383295,VG +1079383296,1079383807,US +1079383808,1079384063,MH +1079384064,1079384575,CA +1079384576,1079385087,ZW +1079385088,1079385855,CA +1079385856,1079386111,SZ +1079386112,1079386623,CA +1079386624,1079386879,SG +1079386880,1079387135,EG +1079387136,1079387391,US +1079387392,1079387647,NG +1079387648,1079387903,US +1079387904,1079388159,PH +1079388160,1079389439,CA +1079389440,1079389695,US +1079389696,1079389951,LC +1079389952,1079390719,CA +1079390720,1079390975,US +1079390976,1079391231,CA +1079391232,1079391487,LC +1079391488,1079393279,CA +1079393280,1079393791,US +1079393792,1079394063,CA +1079394064,1079394071,SG +1079394072,1079394079,CA +1079394080,1079394111,US +1079394112,1079394143,AF +1079394144,1079394175,CA +1079394176,1079394191,US +1079394192,1079394239,CA +1079394240,1079394303,US +1079394304,1079396351,CA +1079396352,1079397375,MP +1079397376,1079397631,MH +1079397632,1079397887,CA +1079397888,1079398399,US +1079398400,1079399583,CA +1079399584,1079399599,US +1079399600,1079399935,CA +1079399936,1079400447,US +1079400448,1079400511,FR +1079400512,1079400575,CA +1079400576,1079400639,US +1079400640,1079400767,CA +1079400768,1079400799,US +1079400800,1079401983,CA +1079401984,1079402239,US +1079402240,1079403007,CA +1079403008,1079403519,US +1079403520,1079403775,CA +1079403776,1079403807,US +1079403808,1079403903,CA +1079403904,1079403935,US +1079403936,1079403999,CA +1079404000,1079404031,US +1079404032,1079404543,CA +1079404544,1079404799,US +1079404800,1079405023,CA +1079405024,1079405119,US +1079405120,1079405407,CA +1079405408,1079405439,BD +1079405440,1079405567,US +1079405568,1079407615,CA +1079407616,1079408127,US +1079408128,1079408383,CA +1079408384,1079408415,SA +1079408416,1079408431,CA +1079408432,1079408447,US +1079408448,1079408895,CA +1079408896,1079409407,PK +1079409408,1079409919,CA +1079409920,1079410175,US +1079410176,1079411455,CA +1079411456,1079411711,PK +1079411712,1079413311,CA +1079413312,1079413343,US +1079413344,1079415807,CA +1079415808,1079416319,US +1079416320,1079422223,CA +1079422224,1079422239,IN +1079422240,1079425535,CA +1079425536,1079425551,ZA +1079425552,1079433215,CA +1079433216,1079435263,CR +1079435264,1079437311,CA +1079437312,1079439359,US +1079439360,1079443199,CA +1079443200,1079443231,PW +1079443232,1079443327,CA +1079443328,1079443455,AU +1079443456,1079451647,US +1079476224,1079508991,CA +1079508992,1079566847,US +1079566848,1079567103,GB +1079567104,1079567359,US +1079567360,1079567615,AU +1079567616,1079574527,US +1079574528,1079578623,PR +1079578624,1079585391,US +1079585392,1079585407,IN +1079585408,1079664639,US +1079664640,1079668735,CA +1079668736,1079861247,US +1079861248,1079865343,CA +1079865344,1080033279,US +1080033280,1080295423,CA +1080295424,1080999935,US +1080999936,1081016319,CA +1081016320,1081212927,US +1081212928,1081278463,CA +1081278464,1081377983,US +1081377984,1081377999,VE +1081378000,1081379327,US +1081379328,1081379839,VE +1081379840,1081385215,US +1081385216,1081385471,PA +1081385472,1081387519,US +1081387520,1081388031,PA +1081388032,1081391103,US +1081391104,1081393151,PA +1081393152,1081393775,US +1081393776,1081393783,CL +1081393784,1081394175,US +1081394176,1081397247,CL +1081397248,1081397759,US +1081397760,1081398783,CL +1081398784,1081399295,US +1081399296,1081401343,CL +1081401344,1081401415,US +1081401416,1081401423,AR +1081401424,1081401855,US +1081401856,1081402367,AR +1081402368,1081403615,US +1081403616,1081403631,AR +1081403632,1081409791,US +1081409792,1081410047,PR +1081410048,1081410559,US +1081410560,1081411583,PR +1081411584,1081413423,US +1081413424,1081413439,PR +1081413440,1081416191,US +1081416192,1081416447,PR +1081416448,1081419199,US +1081419200,1081419231,PR +1081419232,1081420319,US +1081420320,1081420351,PR +1081420352,1081443327,US +1081443328,1081444863,CL +1081444864,1081445375,US +1081445376,1081446399,CL +1081446400,1081460735,US +1081460736,1081462783,PA +1081462784,1081462815,CO +1081462816,1081462911,BR +1081462912,1081479167,US +1081479168,1081483263,CA +1081483264,1081565183,US +1081565184,1081573375,CA +1081573376,1081589759,US +1081589760,1081593855,BB +1081593856,1081597951,CA +1081597952,1081639423,US +1081639424,1081639679,DE +1081639680,1081655295,US +1081671680,1082314751,US +1082314752,1082315263,CA +1082315264,1082315471,US +1082315472,1082318847,CA +1082318848,1082434239,US +1082434240,1082434255,IN +1082434256,1082683391,US +1082683392,1082687487,CA +1082687488,1082945535,US +1082945536,1082949631,CA +1082949632,1082982399,US +1082982400,1083015167,CA +1083015168,1083391999,US +1083400192,1083437055,US +1083437056,1083441151,CA +1083441152,1083621375,US +1083621376,1083637759,BS +1083637760,1083686911,US +1083686912,1083703295,CA +1083703296,1083738367,US +1083738368,1083738879,PR +1083738880,1084067583,US +1084067584,1084067839,CA +1084067840,1085439999,US +1085440000,1085448191,CA +1085448192,1085456383,US +1085456384,1085464575,PR +1085464576,1085521919,US +1085530112,1085538303,US +1085538304,1085603839,CA +1085603840,1085849599,US +1085849600,1085857791,CA +1085857792,1085927423,US +1085931520,1085968383,US +1085972480,1085997055,US +1085997056,1086013439,CA +1086013440,1086022079,US +1086022080,1086022111,CA +1086022112,1086022175,US +1086022176,1086022207,CA +1086022208,1086022303,US +1086022304,1086022367,CA +1086022368,1086022591,US +1086022592,1086022655,CA +1086022656,1086025247,US +1086025248,1086025279,CA +1086025280,1086025799,US +1086025800,1086025807,RO +1086025808,1086026879,US +1086026880,1086027007,CA +1086027008,1086029023,US +1086029024,1086029055,CA +1086029056,1086029663,US +1086029664,1086029695,CA +1086029696,1086070783,US +1086095360,1086358143,US +1086358144,1086358271,PA +1086358272,1086359231,US +1086359232,1086359295,IL +1086359296,1086421503,US +1086421504,1086422015,MP +1086422016,1086476543,US +1086476544,1086476607,BM +1086476608,1086922751,US +1086922752,1086930943,CA +1086930944,1086955519,US +1086955520,1086971903,CA +1086971904,1087016959,US +1087016960,1087021055,CA +1087021056,1087419903,US +1087419904,1087420159,CA +1087420160,1087440895,US +1087440896,1087442943,PR +1087442944,1087495519,US +1087495520,1087495535,TW +1087495536,1087496703,US +1087496704,1087496959,CA +1087496960,1087497855,US +1087497856,1087497887,CA +1087497888,1087554751,US +1087554752,1087554759,IL +1087554760,1087557631,US +1087557632,1087557887,NO +1087557888,1087686655,US +1087686656,1087686911,PR +1087686912,1087715327,US +1087715328,1087717375,PA +1087717376,1087758335,US +1087758336,1087766527,PR +1087766528,1087862783,US +1087862784,1087864831,PA +1087864832,1088684031,US +1088684032,1088946175,CA +1088946176,1089154915,US +1089154916,1089154932,AU +1089154933,1089167359,US +1089167360,1089171455,CA +1089171456,1089191935,US +1089191936,1089200127,CA +1089200128,1089306623,US +1089306624,1089339391,PR +1089339392,1089376255,US +1089380352,1089482927,US +1089482928,1089482935,CA +1089482936,1089488463,US +1089488464,1089488479,JP +1089488480,1089493631,US +1089493632,1089493647,CA +1089493648,1089503871,US +1089503872,1089503879,CA +1089503880,1089526783,US +1089526784,1089527039,VE +1089527040,1089542047,US +1089542048,1089542079,CA +1089542080,1089552383,US +1089552384,1089552391,AU +1089552392,1089557551,US +1089557552,1089557559,CA +1089557560,1089576623,US +1089576624,1089576631,CA +1089576632,1089579215,US +1089579216,1089579223,VI +1089579224,1089579519,US +1089579520,1089580031,VE +1089580032,1089581287,US +1089581288,1089581295,CA +1089581296,1089585919,US +1089585920,1089585951,CA +1089585952,1089587999,US +1089588000,1089588015,IN +1089588016,1089593615,US +1089593616,1089593623,CA +1089593624,1089631055,US +1089631056,1089631071,CA +1089631072,1089644815,US +1089644816,1089644831,GB +1089644832,1089696063,US +1089696064,1089696071,GB +1089696072,1089703455,US +1089703456,1089703487,CA +1089703488,1089721503,US +1089721504,1089721519,CA +1089721520,1089721727,US +1089721728,1089721791,CA +1089721792,1089723823,US +1089723824,1089723831,CA +1089723832,1089961983,US +1089961984,1089970175,CA +1089970176,1089974271,PR +1089974272,1090129919,US +1090142208,1090146303,US +1090174976,1090207743,US +1090207744,1090215935,CA +1090220032,1090355199,US +1090355200,1090363391,CA +1090363392,1090387967,US +1090387968,1090391300,CA +1090391301,1090391302,US +1090391303,1090391359,CA +1090391360,1090391360,US +1090391361,1090396159,CA +1090396160,1090424831,US +1090424832,1090428927,CA +1090428928,1090445311,US +1090445312,1090447359,CA +1090447360,1090447487,US +1090447488,1090448127,CA +1090448128,1090448255,US +1090448256,1090453503,CA +1090453504,1090486271,US +1090494464,1090497903,US +1090497904,1090497919,AU +1090497920,1091960831,US +1091960832,1092026367,CA +1092026368,1092075519,US +1092075520,1092091903,PR +1092091904,1092755455,US +1092759552,1093017599,US +1093017600,1093021695,CA +1093021696,1093025791,US +1093025792,1093033983,CA +1093033984,1093058559,US +1093058560,1093059071,PR +1093059072,1093059583,US +1093059584,1093066751,PR +1093066752,1093074943,US +1093074944,1093091327,CA +1093091328,1093107967,US +1093107968,1093108223,CA +1093108224,1093108735,US +1093108736,1093109247,CA +1093109248,1093109503,US +1093109504,1093109759,CA +1093109760,1093110015,US +1093110016,1093110271,CA +1093110272,1093111295,US +1093111296,1093111551,CA +1093111552,1093111959,US +1093111960,1093111967,VG +1093111968,1093112063,US +1093112064,1093112319,CA +1093112320,1093114687,US +1093114688,1093114703,CA +1093114704,1093114711,US +1093114712,1093114719,VG +1093114720,1093114751,CA +1093114752,1093114879,US +1093114880,1093115135,CA +1093115136,1093115391,US +1093115392,1093115647,CA +1093115648,1093115903,US +1093115904,1093116415,CA +1093116416,1093117631,US +1093117632,1093117647,VG +1093117648,1093117951,US +1093117952,1093118207,CA +1093118208,1093119999,US +1093120000,1093120255,CA +1093120256,1093120399,US +1093120400,1093120415,VG +1093120416,1093120511,US +1093120512,1093120767,GB +1093120768,1093123071,US +1093123072,1093123583,CA +1093123584,1093123983,US +1093123984,1093123999,VG +1093124000,1093124607,US +1093124608,1093124863,CA +1093124864,1093126143,US +1093126144,1093126399,CA +1093126400,1093126431,VG +1093126432,1093126911,US +1093126912,1093127167,CA +1093127168,1093130751,US +1093130752,1093131007,CA +1093131008,1093131231,US +1093131232,1093131247,VG +1093131248,1093133695,US +1093133696,1093133823,CA +1093133824,1093135359,US +1093135360,1093135615,CA +1093135616,1093139663,US +1093139664,1093139679,CA +1093139680,1093139711,US +1093139712,1093140223,CA +1093140224,1093693439,US +1093697536,1093699071,BB +1093699072,1093700607,GD +1093700608,1093701631,VC +1093701632,1093708287,BB +1093708288,1093709311,LC +1093709312,1093719807,BB +1093719808,1093720319,LC +1093720320,1093730303,BB +1093730304,1093730559,US +1093730560,1093730815,HK +1093730816,1093844991,US +1093861376,1094565887,US +1094565888,1094582271,CA +1094582272,1095408887,US +1095408888,1095408895,SE +1095408896,1095450623,US +1095450624,1095467007,BS +1095467008,1095627775,US +1095627776,1095628287,CA +1095628288,1096278015,US +1096278016,1096286207,CA +1096286208,1096548351,US +1096548352,1096810495,CA +1096810496,1096884223,US +1096884224,1096888319,CA +1096888320,1096925183,US +1096925184,1096941567,CA +1096941568,1096952455,US +1096952456,1096952463,GB +1096952464,1096952519,US +1096952520,1096952527,GB +1096952528,1096956463,US +1096956464,1096956471,GB +1096956472,1096956631,US +1096956632,1096956639,GB +1096956640,1096959599,US +1096959600,1096959607,GB +1096959608,1096960767,US +1096960768,1096960895,GB +1096960896,1096961023,US +1096961024,1096961151,GB +1096961152,1096964119,US +1096964120,1096964127,GB +1096964128,1096968191,US +1096968192,1096968319,GB +1096968320,1096968447,US +1096968448,1096968575,GB +1096968576,1097058303,US +1097058304,1097058367,IT +1097058368,1097063663,US +1097063664,1097063679,IT +1097063680,1097067519,US +1097067520,1097068031,GB +1097068032,1097069055,US +1097069056,1097069311,CA +1097069312,1097727999,US +1097728000,1097736191,CA +1097736192,1097768959,US +1097768960,1097777151,CA +1097777152,1097798495,US +1097798496,1097798527,CA +1097798528,1097830399,US +1097830400,1097834495,CA +1097834496,1097896191,US +1097896192,1097897215,VI +1097897216,1097947135,US +1097947136,1097949183,VI +1097949184,1097951231,US +1097951232,1097953279,VI +1097953280,1098057375,US +1098057376,1098057407,CA +1098057408,1098188047,US +1098188048,1098188055,CA +1098188056,1098353967,US +1098353968,1098353983,CA +1098353984,1098382143,US +1098382144,1098382175,CA +1098382176,1098891583,US +1098891584,1098891607,AU +1098891608,1098891623,US +1098891624,1098891631,AU +1098891632,1098891695,US +1098891696,1098891711,AU +1098891712,1098891743,US +1098891744,1098891775,AU +1098891776,1098891871,US +1098891872,1098891887,AU +1098891888,1098891903,US +1098891904,1098891935,AU +1098891936,1098891951,US +1098891952,1098891999,AU +1098892000,1098892015,US +1098892016,1098892031,AU +1098892032,1101041279,US +1101041280,1101041407,IN +1101041408,1101078455,US +1101078456,1101078463,CA +1101078464,1101113135,US +1101113136,1101113143,CA +1101113144,1101118239,US +1101118240,1101118271,GB +1101118272,1101121535,US +1101121536,1101121791,EC +1101121792,1101190655,US +1101190656,1101191167,EC +1101191168,1101224959,US +1101224960,1101225215,EC +1101225216,1101267711,US +1101267712,1101267967,CA +1101267968,1101304063,US +1101304064,1101304319,EC +1101304320,1101304831,US +1101304832,1101305855,HN +1101305856,1101339887,US +1101339888,1101339903,CA +1101339904,1101352959,US +1101352960,1101355007,HN +1101355008,1101357215,US +1101357216,1101357223,SE +1101357224,1101384415,US +1101384416,1101384447,CA +1101384448,1101385855,US +1101385856,1101385919,DK +1101385920,1101425919,US +1101425920,1101426175,EC +1101426176,1101431679,US +1101431680,1101431807,AU +1101431808,1101445775,US +1101445776,1101445791,CA +1101445792,1101461759,US +1101461760,1101462015,AN +1101462016,1101492623,US +1101492624,1101492639,BE +1101492640,1101523039,US +1101523040,1101523071,GB +1101523072,1101542399,US +1101542400,1101542911,CO +1101542912,1101574655,US +1101574656,1101575167,EC +1101575168,1101617679,US +1101617680,1101617687,CA +1101617688,1101619247,US +1101619248,1101619255,NL +1101619256,1101625343,US +1101625344,1101625407,VI +1101625408,1101635327,US +1101635328,1101635583,HN +1101635584,1101650431,US +1101650432,1101650943,HN +1101650944,1101668095,US +1101668096,1101668351,EC +1101668352,1101676135,US +1101676136,1101676143,CA +1101676144,1101676543,US +1101676544,1101678591,EC +1101678592,1101681407,US +1101681408,1101681663,NL +1101681664,1101685383,US +1101685384,1101685391,NL +1101685392,1101726407,US +1101726408,1101726415,CA +1101726416,1101732199,US +1101732200,1101732207,CH +1101732208,1101750783,US +1101750784,1101751295,BM +1101751296,1101837311,US +1101837312,1101837567,EC +1101837568,1101856767,US +1101856768,1101856775,DK +1101856776,1101857295,US +1101857296,1101857311,CA +1101857312,1101864223,US +1101864224,1101864255,BE +1101864256,1101869055,US +1101869056,1101869567,GH +1101869568,1101871103,US +1101871104,1101873151,BO +1101873152,1101881935,US +1101881936,1101881951,GB +1101881952,1101905407,US +1101905408,1101905663,GH +1101905664,1101921407,US +1101921408,1101921471,BA +1101921472,1101952439,US +1101952440,1101952447,CA +1101952448,1101971071,US +1101971072,1101971079,VI +1101971080,1102389247,US +1102389248,1102393343,CA +1102393344,1102446591,US +1102446592,1102448383,HN +1102448384,1102449151,US +1102449152,1102449407,SV +1102449408,1102454527,CR +1102454528,1102454783,HN +1102454784,1102512127,US +1102512128,1102516223,JM +1102516224,1103244799,US +1103244800,1103245055,EC +1103245056,1103474943,US +1103474944,1103475199,MH +1103475200,1103603711,US +1103603712,1103605759,EC +1103605760,1103623167,US +1103623168,1103623679,CO +1103623680,1103930879,US +1103930880,1103931135,MX +1103931136,1103987967,US +1103987968,1103988223,BR +1103988224,1103996927,US +1103996928,1103997439,EC +1103997440,1104166911,US +1104166912,1104168959,CO +1104168960,1104399071,US +1104399072,1104399079,CA +1104399080,1104492287,US +1104492288,1104492543,PH +1104492544,1104510975,US +1104510976,1104511743,EC +1104511744,1105099519,US +1105099520,1105099775,EC +1105099776,1106320175,US +1106320176,1106320183,CA +1106320184,1106469695,US +1106469696,1106469759,CO +1106469760,1106469887,US +1106469888,1106470911,BS +1106470912,1106475007,US +1106475008,1106475519,CO +1106475520,1106758655,US +1106758656,1106759167,EC +1106759168,1106759679,CO +1106759680,1106767871,US +1106767872,1106768383,CO +1106768384,1106768895,EC +1106768896,1106769919,CO +1106769920,1106814719,US +1106814720,1106814975,EC +1106814976,1107197951,US +1107206144,1107238911,US +1107243008,1107247103,TC +1107247104,1107275775,US +1107275776,1107279871,CA +1107279872,1107288063,US +1107288064,1107296255,CA +1107296256,1107701759,US +1107701760,1107705855,CA +1107705856,1107730431,US +1107734528,1107820543,US +1107853312,1108025343,US +1108029440,1108033535,US +1108033536,1108041727,CA +1108041728,1108054015,US +1108054016,1108066303,CA +1108066304,1108492287,US +1108500480,1108525055,US +1108525056,1108541439,CA +1108541440,1109639199,US +1109639200,1109639215,IN +1109639216,1109641663,US +1109641664,1109641679,JP +1109641680,1109642367,US +1109642368,1109642383,IL +1109642384,1109642415,US +1109642416,1109642431,IL +1109642432,1109642583,US +1109642584,1109642591,DE +1109642592,1109643303,US +1109643304,1109643311,DE +1109643312,1109643519,US +1109643520,1109643551,CA +1109643552,1109647231,US +1109647232,1109647247,AU +1109647248,1109648319,US +1109648320,1109648335,JP +1109648336,1109648927,US +1109648928,1109648943,AU +1109648944,1109650639,US +1109650640,1109650655,AU +1109650656,1109688319,US +1109688320,1109696511,CA +1109696512,1109705727,US +1109705728,1109705743,CG +1109705744,1109705759,US +1109705760,1109705791,CD +1109705792,1109705823,US +1109705824,1109705839,CD +1109705840,1109705855,US +1109705856,1109705983,CD +1109705984,1109706239,HT +1109706240,1109707007,US +1109707008,1109707263,JM +1109707264,1109707519,US +1109707520,1109707775,MW +1109707776,1109708639,US +1109708640,1109708671,HT +1109708672,1109709823,US +1109709824,1109710847,ZM +1109710848,1109711175,US +1109711176,1109711183,HT +1109711184,1109774175,US +1109774176,1109774183,CA +1109774184,1109776575,US +1109776576,1109776607,CN +1109776608,1109776615,CA +1109776616,1109819391,US +1109819392,1109852159,CA +1109852160,1109902415,US +1109902416,1109902431,CY +1109902432,1109902511,US +1109902512,1109902527,CY +1109902528,1109907455,US +1109907456,1109907711,CY +1109907712,1109919487,US +1109919488,1109919743,GB +1109919744,1109927167,US +1109927168,1109927423,AU +1109927424,1110126591,US +1110126592,1110130687,CA +1110130688,1110310911,US +1110310912,1110376447,CA +1110376448,1110445311,US +1110445312,1110446591,CA +1110446592,1110449151,US +1110449152,1110449663,CA +1110449664,1110450687,US +1110450688,1110450943,CA +1110450944,1110452223,US +1110452224,1110453247,CA +1110453248,1110454271,US +1110454272,1110455295,CA +1110455296,1110459551,US +1110459552,1110459583,CA +1110459584,1110461759,US +1110461760,1110461823,CA +1110461824,1110462463,US +1110462464,1110462719,CA +1110462720,1110472447,US +1110472448,1110472703,CA +1110472704,1110540287,US +1110540288,1110573055,CA +1110573056,1110638591,PR +1110638592,1110663167,US +1110663168,1110675455,CA +1110675456,1110679551,US +1110679552,1110683647,CA +1110683648,1110700031,US +1110700032,1110704127,CA +1110704128,1110851583,US +1110863872,1110867967,JM +1110867968,1110917119,US +1110925312,1110929407,US +1110929408,1110933503,BM +1110933504,1110941695,US +1110949888,1111195647,US +1111195648,1111212031,CA +1111212032,1111228415,US +1111228416,1111238911,AR +1111238912,1111240959,US +1111240960,1111244799,AR +1111244800,1112432639,US +1112432640,1112440831,CA +1112440832,1112530943,US +1112530944,1112539135,CA +1112539136,1113591807,US +1113591808,1113595903,CA +1113595904,1113596159,CL +1113596160,1113602047,US +1113602048,1113603071,VE +1113603072,1113657343,US +1113657344,1113661439,CA +1113661440,1113696575,US +1113696576,1113696639,CA +1113696640,1113696831,US +1113696832,1113696895,CA +1113696896,1113718783,US +1113718784,1113743359,DO +1113743360,1113854207,US +1113854208,1113854463,CA +1113854464,1113857023,US +1113857024,1113857031,CA +1113857032,1113862247,US +1113862248,1113862255,MX +1113862256,1113864735,US +1113864736,1113864743,BR +1113864744,1113864767,US +1113864768,1113864783,VI +1113864784,1113881871,US +1113881872,1113881879,GB +1113881880,1113882351,US +1113882352,1113882359,CA +1113882360,1113888599,US +1113888600,1113888607,CA +1113888608,1113903295,US +1113903296,1113903359,CA +1113903360,1113905791,US +1113905792,1113905807,CA +1113905808,1113916831,US +1113916832,1113916839,GB +1113916840,1113919383,US +1113919384,1113919391,CA +1113919392,1113923839,US +1113923840,1113923903,BR +1113923904,1113932815,US +1113932816,1113932823,CA +1113932824,1113997311,US +1113997312,1114005503,CA +1114005504,1114054655,US +1114054656,1114062847,CA +1114062848,1114095615,US +1114095616,1114103807,CA +1114103808,1114170095,US +1114170096,1114170111,CA +1114170112,1114464255,US +1114472448,1114505215,US +1114505216,1114507279,CA +1114507280,1114507295,US +1114507296,1114507423,CA +1114507424,1114507431,TZ +1114507432,1114511359,CA +1114511360,1114511615,US +1114511616,1114513407,CA +1114513408,1114515455,SA +1114515456,1114517503,GU +1114517504,1114524159,CA +1114524160,1114524671,SA +1114524672,1114533375,CA +1114533376,1114533887,SA +1114533888,1114550271,CA +1114550272,1114677247,US +1114681344,1114685439,CA +1114685440,1114730495,US +1114730496,1114734591,CA +1114734592,1114853375,US +1114857472,1114877183,US +1114877184,1114877439,PA +1114877440,1114877951,US +1114877952,1114878207,PA +1114878208,1114878849,US +1114878850,1114878977,LT +1114878978,1115104511,US +1115104512,1115104639,CA +1115104640,1115113471,US +1115113472,1115114495,HN +1115114496,1115114751,MX +1115114752,1115115007,GT +1115115008,1115115519,US +1115115520,1115116543,HN +1115116544,1115117055,US +1115117056,1115117311,GB +1115117312,1115117567,US +1115117568,1115118591,HN +1115118592,1115119615,SV +1115119616,1115135999,US +1115136000,1115144191,CA +1115144192,1115693055,US +1115697152,1115705343,US +1115705344,1115709439,CA +1115709440,1115783167,US +1115783168,1115791359,CA +1115791360,1115791871,PR +1115791872,1115792383,US +1115792384,1115792639,PR +1115792640,1115792895,US +1115792896,1115793407,PR +1115793408,1115793663,US +1115793664,1115793919,PR +1115793920,1115795455,US +1115795456,1115799551,CA +1115799552,1115815935,US +1115815936,1115947007,CA +1115947008,1116168191,US +1116168192,1116176383,CA +1116176384,1116897279,US +1116897280,1116905471,CA +1116905472,1117274111,US +1117274112,1117282303,CA +1117282304,1117413375,US +1117413376,1117415423,CA +1117415424,1117416191,AN +1117416192,1117419007,CA +1117419008,1117419519,US +1117419520,1117421567,CA +1117421568,1117683711,US +1117683712,1117691903,CA +1117691904,1117724671,US +1117724672,1117728767,CA +1117728768,1117745151,US +1117745152,1117749247,CA +1117749248,1117978623,US +1117978624,1117986815,CA +1117986816,1117995007,US +1117995008,1117999103,CA +1117999104,1118007295,US +1118011392,1118027775,US +1118027776,1118031871,CA +1118031872,1118158847,US +1118158848,1118167039,CA +1118167040,1118474239,US +1118474240,1118478335,CA +1118478336,1118796543,US +1118796544,1118796799,GB +1118796800,1118962839,US +1118962840,1118962847,NI +1118962848,1118962943,US +1118962944,1118963199,TR +1118963200,1118963455,US +1118963456,1118963463,TZ +1118963464,1118963471,US +1118963472,1118963479,NG +1118963480,1118963487,GB +1118963488,1118963495,AO +1118963496,1118963583,US +1118963584,1118963647,KE +1118963648,1118964863,US +1118964864,1118964879,LB +1118964880,1118964991,US +1118964992,1118965503,LC +1118965504,1118965839,US +1118965840,1118965847,EC +1118965848,1118965903,US +1118965904,1118965911,NG +1118965912,1118965919,MA +1118965920,1118965991,US +1118965992,1118966007,NG +1118966008,1118966039,US +1118966040,1118966063,EC +1118966064,1118966079,US +1118966080,1118966087,NG +1118966088,1118966111,US +1118966112,1118966119,SV +1118966120,1118966143,VE +1118966144,1118966151,BB +1118966152,1118966215,US +1118966216,1118966223,EC +1118966224,1118966271,US +1118966272,1118966351,SV +1118966352,1118966367,US +1118966368,1118966399,SV +1118966400,1118966407,US +1118966408,1118966415,SV +1118966416,1118966655,US +1118966656,1118966687,SV +1118966688,1118966719,US +1118966720,1118966783,EC +1118966784,1118966847,US +1118966848,1118966911,PY +1118966912,1118966959,US +1118966960,1118966975,SA +1118966976,1118967391,US +1118967392,1118967399,MA +1118967400,1118967559,US +1118967560,1118967567,LB +1118967568,1118967799,US +1118967800,1118967807,RW +1118967808,1118968175,US +1118968176,1118968183,AE +1118968184,1118968207,US +1118968208,1118968223,IQ +1118968224,1118968255,US +1118968256,1118968287,IQ +1118968288,1118968295,AE +1118968296,1118968303,US +1118968304,1118968319,AE +1118968320,1118968575,SR +1118968576,1118969471,US +1118969472,1118969599,TT +1118969600,1118969727,GY +1118969728,1118969855,US +1118969856,1118970111,LB +1118970112,1118970119,KE +1118970120,1118970239,US +1118970240,1118970367,NG +1118970368,1118970623,GY +1118970624,1118970751,US +1118970752,1118970879,GY +1118970880,1118971520,SR +1118971521,1118971647,US +1118971648,1118971903,GY +1118971904,1118972159,CA +1118972160,1118972415,VE +1118972416,1118972671,EC +1118972672,1118972943,US +1118972944,1118972959,VE +1118972960,1118972999,US +1118973000,1118973007,SV +1118973008,1118973063,US +1118973064,1118973071,EC +1118973072,1118973079,SV +1118973080,1118973111,VE +1118973112,1118973119,SV +1118973120,1118973183,US +1118973184,1118973439,VE +1118973440,1118973695,GY +1118973696,1118973951,LB +1118973952,1118974015,GY +1118974016,1118974047,US +1118974048,1118974055,SV +1118974056,1118974095,US +1118974096,1118974103,EC +1118974104,1118974111,SV +1118974112,1118974135,US +1118974136,1118974207,EC +1118974208,1118975231,US +1118975232,1118975487,NI +1118975488,1118975743,KE +1118975744,1118975999,US +1118976000,1118976255,GB +1118976256,1118976511,US +1118976512,1118976575,NG +1118976576,1118976599,US +1118976600,1118976607,NI +1118976608,1118976687,US +1118976688,1118976695,NG +1118976696,1118976703,NI +1118976704,1118976727,US +1118976728,1118976735,NI +1118976736,1118976767,US +1118976768,1118976791,NI +1118976792,1118976831,US +1118976832,1118976863,NI +1118976864,1118976895,US +1118976896,1118977023,NI +1118977024,1118977311,US +1118977312,1118977343,LB +1118977344,1118977351,KE +1118977352,1118977631,US +1118977632,1118977663,LB +1118977664,1118978447,US +1118978448,1118978463,LB +1118978464,1118979311,US +1118979312,1118979319,LB +1118979320,1118979455,US +1118979456,1118979471,LB +1118979472,1118979495,US +1118979496,1118979503,LB +1118979504,1118979535,US +1118979536,1118979551,LB +1118979552,1118979567,US +1118979568,1118979575,LB +1118979576,1118979711,US +1118979712,1118979775,LB +1118979776,1118980095,US +1118980096,1118980351,NG +1118980352,1118980607,US +1118980608,1118980863,TZ +1118980864,1118981119,LC +1118981120,1118981375,US +1118981376,1118981631,IQ +1118981632,1118981687,EC +1118981688,1118981695,US +1118981696,1118981735,SV +1118981736,1118981743,EC +1118981744,1118981751,SV +1118981752,1118981759,NG +1118981760,1118981791,US +1118981792,1118981823,NG +1118981824,1118981831,EC +1118981832,1118981855,US +1118981856,1118981863,EC +1118981864,1118982175,US +1118982176,1118982183,NI +1118982184,1118982191,US +1118982192,1118982199,KE +1118982200,1118982215,US +1118982216,1118982231,NG +1118982232,1118982239,NI +1118982240,1118982271,NG +1118982272,1118982279,NI +1118982280,1118982287,US +1118982288,1118982295,NG +1118982296,1118982303,US +1118982304,1118982311,KE +1118982312,1118982327,NG +1118982328,1118982335,US +1118982336,1118982367,NG +1118982368,1118982383,US +1118982384,1118982391,NI +1118982392,1118982399,US +1118982400,1118982407,NI +1118982408,1118982415,NG +1118982416,1118982431,SV +1118982432,1118982439,NI +1118982440,1118982447,NG +1118982448,1118982463,US +1118982464,1118982471,NI +1118982472,1118982479,NG +1118982480,1118982487,US +1118982488,1118982495,NI +1118982496,1118982543,NG +1118982544,1118982551,NI +1118982552,1118982559,US +1118982560,1118982567,NI +1118982568,1118982575,US +1118982576,1118982583,NI +1118982584,1118982591,CM +1118982592,1118982599,NG +1118982600,1118982607,US +1118982608,1118982615,NI +1118982616,1118982655,NG +1118982656,1118982783,US +1118982784,1118982911,NG +1118982912,1118982919,LB +1118982920,1118982927,US +1118982928,1118982935,NI +1118982936,1118983039,US +1118983040,1118983047,NG +1118983048,1118983079,US +1118983080,1118983087,NG +1118983088,1118983167,US +1118983168,1118983199,AE +1118983200,1118983295,US +1118983296,1118983359,AE +1118983360,1118983423,US +1118983424,1118983679,NI +1118983680,1118983743,TZ +1118983744,1118983759,VE +1118983760,1118983871,US +1118983872,1118983879,TZ +1118983880,1118984703,US +1118984704,1118984775,TZ +1118984776,1118984783,IQ +1118984784,1118984791,US +1118984792,1118984799,NG +1118984800,1118984831,US +1118984832,1118984839,LB +1118984840,1118984855,US +1118984856,1118984863,IQ +1118984864,1118984887,TZ +1118984888,1118984959,US +1118984960,1118985215,VE +1118985216,1118985983,US +1118985984,1118986111,NG +1118986112,1118986239,US +1118986240,1118987007,GB +1118987008,1118987263,US +1118987264,1118988287,KE +1118988288,1118988543,CA +1118988544,1118988575,NG +1118988576,1118988615,US +1118988616,1118988623,GB +1118988624,1118988735,US +1118988736,1118988751,GB +1118988752,1118988799,US +1118988800,1118989055,VE +1118989056,1118989183,KE +1118989184,1118989311,GB +1118989312,1118989823,KE +1118989824,1118989951,US +1118989952,1118990079,FR +1118990080,1118990719,US +1118990720,1118990727,KE +1118990728,1118991487,US +1118991488,1118991615,LR +1118991616,1118992639,US +1118992640,1118992655,KE +1118992656,1118993919,US +1118993920,1118994431,GY +1118994432,1119109119,US +1119109120,1119113215,CA +1119113216,1119150079,US +1119158272,1119211519,US +1119211520,1119215615,CA +1119215616,1119289343,US +1119289344,1119354879,CA +1119354880,1119428607,US +1119428608,1119432703,VI +1119432704,1119436799,CA +1119436800,1119440895,US +1119440896,1119444991,CA +1119444992,1119469567,US +1119469568,1119477759,CA +1119477760,1119502335,US +1119502336,1119510527,CA +1119510528,1119567871,US +1119567872,1119571967,CA +1119571968,1119580159,US +1119580160,1119584255,CA +1119584256,1120041983,US +1120041984,1120042495,AR +1120042496,1120064511,US +1120064512,1120064767,AR +1120064768,1120149503,US +1120149504,1120149599,CA +1120149600,1120149631,US +1120149632,1120150031,CA +1120150032,1120150039,TW +1120150040,1120150047,CA +1120150048,1120150055,US +1120150056,1120151695,CA +1120151696,1120151711,TW +1120151712,1120152159,CA +1120152160,1120152191,US +1120152192,1120152319,CA +1120152320,1120152575,US +1120152576,1120153599,CA +1120153600,1120272383,US +1120272384,1120281087,CA +1120281088,1120281095,PG +1120281096,1120281111,CA +1120281112,1120281119,US +1120281120,1120281135,ZA +1120281136,1120281375,CA +1120281376,1120281383,AR +1120281384,1120281391,US +1120281392,1120281407,ZA +1120281408,1120281599,CA +1120281600,1120282111,US +1120282112,1120286719,CA +1120286720,1120288767,US +1120288768,1120299007,CA +1120299008,1120299263,PK +1120299264,1120299519,CA +1120299520,1120300799,PK +1120300800,1120306431,CA +1120306432,1120306943,PH +1120306944,1120310015,CA +1120310016,1120310271,PH +1120310272,1120312063,CA +1120312064,1120312447,PH +1120312448,1120312575,CA +1120312576,1120312831,PH +1120312832,1120321535,CA +1120321536,1120346111,US +1120350208,1120370943,US +1120370944,1120371199,CA +1120371200,1120372223,US +1120372224,1120372479,CA +1120372480,1120372735,US +1120372736,1120372991,CA +1120372992,1120373503,US +1120373504,1120374015,CA +1120374016,1120376831,US +1120376832,1120377087,CA +1120377088,1120377343,US +1120377344,1120377599,CA +1120377600,1120377855,US +1120377856,1120378367,CA +1120378368,1120378623,US +1120378624,1120378879,CA +1120378880,1120379391,US +1120379392,1120379647,CA +1120379648,1120380415,US +1120380416,1120380431,VG +1120380432,1120381439,US +1120381440,1120381695,CA +1120381696,1120382463,US +1120382464,1120382719,CA +1120382720,1120383999,US +1120384000,1120385023,CA +1120385024,1120509951,US +1120509952,1120516095,SV +1120516096,1120517375,US +1120517376,1120517631,AR +1120517632,1120517887,US +1120517888,1120518143,CL +1120518144,1120534527,CA +1120534528,1120641023,US +1120641024,1120657407,CA +1120657408,1120733183,US +1120733184,1120735231,BB +1120735232,1120735487,US +1120735488,1120735743,BB +1120735744,1120736207,US +1120736208,1120736223,PY +1120736224,1120736991,US +1120736992,1120737007,KN +1120737008,1120737023,US +1120737024,1120737279,BS +1120737280,1120739951,US +1120739952,1120739983,MX +1120739984,1120739991,US +1120739992,1120740079,MX +1120740080,1120740095,US +1120740096,1120740351,MX +1120740352,1120741375,TT +1120741376,1120741631,US +1120741632,1120741887,MX +1120741888,1120743423,US +1120743424,1120743679,KN +1120743680,1120744447,US +1120744448,1120744703,KN +1120744704,1120804863,US +1120808960,1120854015,US +1120854016,1120862207,CA +1120862208,1120870399,US +1120874496,1120886783,US +1120886784,1120894975,CA +1120894976,1120911359,US +1120911360,1120913383,CA +1120913384,1120913391,GE +1120913392,1120914415,CA +1120914416,1120914431,AT +1120914432,1120914687,CA +1120914688,1120914719,AG +1120914720,1120918623,CA +1120918624,1120918639,US +1120918640,1120919551,CA +1120919552,1121005567,US +1121005568,1121009663,CA +1121009664,1121038335,US +1121038336,1121042431,CA +1121042432,1121230847,US +1121230848,1121239039,CA +1121239040,1121247231,US +1121247232,1121247519,CA +1121247520,1121247527,BZ +1121247528,1121247535,CA +1121247536,1121247543,BZ +1121247544,1121247663,CA +1121247664,1121247679,BZ +1121247680,1121248127,CA +1121248128,1121248135,MT +1121248136,1121248311,CA +1121248312,1121248319,MT +1121248320,1121248343,CA +1121248344,1121248351,BZ +1121248352,1121248407,CA +1121248408,1121248431,GB +1121248432,1121248447,CA +1121248448,1121248495,BZ +1121248496,1121248911,CA +1121248912,1121248919,BZ +1121248920,1121250183,CA +1121250184,1121250191,BZ +1121250192,1121250303,CA +1121250304,1121250815,BZ +1121250816,1121251071,CA +1121251072,1121251079,GB +1121251080,1121251607,CA +1121251608,1121251615,BZ +1121251616,1121251663,CA +1121251664,1121251671,MT +1121251672,1121251727,CA +1121251728,1121251775,BZ +1121251776,1121251839,CA +1121251840,1121251847,BZ +1121251848,1121252863,CA +1121252864,1121253119,BZ +1121253120,1121255423,CA +1121255424,1121878015,US +1121878016,1121910783,CA +1121910784,1122074623,US +1122074624,1122087935,CA +1122087936,1122088191,US +1122088192,1122091007,CA +1122091008,1122092799,US +1122092800,1122093055,CA +1122093056,1122140159,US +1122140160,1122148351,CA +1122148352,1122268047,US +1122268048,1122268055,AR +1122268056,1122270207,US +1122270208,1122270215,EG +1122270216,1122320959,US +1122320960,1122320995,PT +1122320996,1122411551,US +1122411552,1122411583,AU +1122411584,1122412287,US +1122412288,1122412543,AU +1122412544,1122414335,US +1122414336,1122414591,AU +1122414592,1122416383,US +1122416384,1122416639,DM +1122416640,1122417919,US +1122417920,1122418175,AU +1122418176,1122451455,US +1122451456,1122455551,CO +1122455552,1122476031,US +1122476032,1122480127,PR +1122480128,1122511103,US +1122511104,1122511359,VG +1122511360,1122535423,US +1122535424,1122538495,KR +1122538496,1122635775,US +1122635776,1122639871,CA +1122639872,1123057663,US +1123057664,1123074047,CA +1123074048,1123123199,US +1123123200,1123127295,CA +1123127296,1123180543,US +1123180544,1123184639,CA +1123184640,1123319807,US +1123319808,1123323903,CA +1123323904,1123336191,US +1123336192,1123352575,CA +1123352576,1123397631,US +1123398656,1123399679,US +1123401728,1123534847,US +1123534848,1123536895,AW +1123536896,1123582239,US +1123582240,1123582271,CY +1123582272,1123582431,US +1123582432,1123582463,CA +1123582464,1123583327,US +1123583328,1123583359,CA +1123583360,1123583455,US +1123583456,1123583519,CY +1123583520,1123584703,US +1123584704,1123584735,CA +1123584736,1123585535,US +1123585536,1123585791,CA +1123585792,1123586815,US +1123586816,1123587071,CA +1123587072,1123588863,US +1123588864,1123589119,CA +1123589120,1123590143,US +1123590144,1123598335,VI +1123598336,1123651583,US +1123651584,1123655679,JM +1123655680,1123663871,US +1123663872,1123667967,SV +1123667968,1123670015,PR +1123670016,1123671039,US +1123671040,1123672063,PY +1123672064,1123794943,US +1123794944,1123795199,DO +1123795200,1123801087,US +1123801088,1123801343,RU +1123801344,1123848191,US +1123848192,1123852287,CA +1123852288,1123950591,US +1123950592,1123958783,CA +1123958784,1125064703,US +1125064704,1125065215,GB +1125065216,1125081087,US +1125081088,1125081151,CL +1125081152,1125081183,CA +1125081184,1125081215,US +1125081216,1125081279,GB +1125081280,1125081855,US +1125081856,1125082111,DE +1125082112,1125082367,US +1125082368,1125082623,DE +1125082624,1125082655,US +1125082656,1125082687,UY +1125082688,1125082783,US +1125082784,1125082799,UY +1125082800,1125083007,US +1125083008,1125083023,RU +1125083024,1125083967,US +1125083968,1125084031,UY +1125084032,1125084063,US +1125084064,1125084095,SE +1125084096,1125085135,US +1125085136,1125085151,DE +1125085152,1125086079,US +1125086080,1125086143,AU +1125086144,1125087999,US +1125088000,1125088255,CA +1125088256,1125090303,US +1125090304,1125090335,AU +1125090336,1125090367,US +1125090368,1125090431,ZA +1125090432,1125090479,US +1125090480,1125090495,DE +1125090496,1125091087,US +1125091088,1125091103,CA +1125091104,1125091135,US +1125091136,1125091167,SK +1125091168,1125091183,US +1125091184,1125091199,UY +1125091200,1125091455,US +1125091456,1125091519,ES +1125091520,1125091583,US +1125091584,1125091647,GB +1125091648,1125091663,US +1125091664,1125091679,HU +1125091680,1125091711,SE +1125091712,1125091743,CA +1125091744,1125091759,US +1125091760,1125091775,UY +1125091776,1125091839,CA +1125091840,1125093375,US +1125093376,1125093407,TH +1125093408,1125093471,US +1125093472,1125093503,IL +1125093504,1125093567,SK +1125093568,1125093631,AU +1125093632,1125094463,US +1125094464,1125094527,BR +1125094528,1125094655,US +1125094656,1125094671,GB +1125094672,1125094687,SK +1125094688,1125094783,US +1125094784,1125094799,GB +1125094800,1125094847,CA +1125094848,1125094911,BR +1125094912,1125095039,AU +1125095040,1125095167,GB +1125095168,1125095183,BE +1125095184,1125095295,US +1125095296,1125095327,AU +1125095328,1125096959,US +1125096960,1125097087,AR +1125097088,1125097119,US +1125097120,1125097151,TH +1125097152,1125097215,US +1125097216,1125097279,AU +1125097280,1125097343,BR +1125097344,1125097407,US +1125097408,1125097439,IL +1125097440,1125097455,US +1125097456,1125097471,GB +1125097472,1125097791,US +1125097792,1125097823,ES +1125097824,1125097855,AU +1125097856,1125097871,JO +1125097872,1125097887,UY +1125097888,1125097919,US +1125097920,1125097983,IL +1125097984,1125099775,US +1125099776,1125100031,GB +1125100032,1125103487,US +1125103488,1125103519,UY +1125103520,1125106063,US +1125106064,1125106111,CA +1125106112,1125106175,GB +1125106176,1125106207,AU +1125106208,1125106223,TR +1125106224,1125106239,FR +1125106240,1125106255,UY +1125106256,1125106271,FR +1125106272,1125106303,US +1125106304,1125106367,DE +1125106368,1125110271,US +1125110272,1125110335,GB +1125110336,1125110399,US +1125110400,1125110463,KW +1125110464,1125110783,US +1125110784,1125110911,TR +1125110912,1125110927,UY +1125110928,1125110943,TW +1125110944,1125110959,CA +1125110960,1125110975,US +1125110976,1125111039,MA +1125111040,1125111423,US +1125111424,1125111439,BR +1125111440,1125111455,US +1125111456,1125111471,CA +1125111472,1125111487,US +1125111488,1125111519,GB +1125111520,1125111535,IL +1125111536,1125111743,US +1125111744,1125111775,DE +1125111776,1125112447,US +1125112448,1125112511,PL +1125112512,1125112767,US +1125112768,1125112783,GB +1125112784,1125115647,US +1125115648,1125115663,ES +1125115664,1125115727,US +1125115728,1125115743,ES +1125115744,1125116159,US +1125116160,1125116191,BR +1125116192,1125116223,TR +1125116224,1125116415,US +1125116416,1125116671,MA +1125116672,1125116959,US +1125116960,1125116991,JP +1125116992,1125117023,US +1125117024,1125117055,BR +1125117056,1125117151,US +1125117152,1125117167,UY +1125117168,1125118495,US +1125118496,1125118511,BR +1125118512,1125118527,US +1125118528,1125118559,UY +1125118560,1125118591,TR +1125118592,1125118655,US +1125118656,1125118687,IL +1125118688,1125118719,BR +1125118720,1125119199,US +1125119200,1125119231,TR +1125119232,1125119743,US +1125119744,1125119871,RO +1125119872,1125119903,US +1125119904,1125119935,IL +1125119936,1125119967,JP +1125119968,1125120255,US +1125120256,1125120511,MA +1125120512,1125120767,US +1125120768,1125120799,UY +1125120800,1125120831,IL +1125120832,1125120847,TH +1125120848,1125120863,US +1125120864,1125120895,GB +1125120896,1125121023,RO +1125121024,1125388287,US +1125396480,1125416959,US +1125425152,1125449727,US +1125453824,1125457919,US +1125459200,1125459455,US +1125466112,1125474303,US +1125478400,1125482495,US +1125486592,1125490687,US +1125494784,1125498879,US +1125498880,1125515263,CA +1125515264,1125531647,US +1125531648,1125543935,CA +1125543936,1125545983,US +1125556224,1125560319,US +1125564416,1125572607,US +1125572608,1125576703,CA +1125576704,1125593087,US +1125601280,1125613567,US +1125617664,1125638143,US +1125646336,1126009343,US +1126009344,1126009599,AR +1126009600,1126903807,US +1126907904,1126924287,US +1126924288,1126928383,CA +1126928384,1126948863,US +1126948864,1126952959,CA +1126952960,1127677951,US +1127677952,1127694335,CA +1127694336,1127875839,US +1127875840,1127876095,CA +1127876096,1127877375,US +1127877376,1127877631,CA +1127877632,1127878399,US +1127878400,1127878911,CA +1127878912,1127879679,US +1127879680,1127879935,CA +1127879936,1127880703,US +1127880704,1127880959,CA +1127880960,1127881471,US +1127881472,1127881983,CA +1127881984,1127923711,US +1127923712,1127931903,CA +1127931904,1128529919,US +1128529920,1128641023,CA +1128641024,1128641535,US +1128641536,1128792063,CA +1128792064,1128818687,US +1128818688,1128818719,CA +1128818720,1130536959,US +1130536960,1130539007,GU +1130539008,1132764423,US +1132764424,1132764431,MX +1132764432,1132947431,US +1132947432,1132947439,CA +1132947440,1134440447,US +1134444544,1134448639,CA +1134448640,1134546943,US +1134546944,1134551039,CA +1134551040,1136517007,US +1136517008,1136517023,GB +1136517024,1136517039,US +1136517040,1136517055,GB +1136517056,1136721919,US +1136721920,1136787455,CA +1136787456,1137160191,US +1137164288,1137195519,US +1137195520,1137195775,JP +1137195776,1137238015,US +1137246208,1137278975,US +1137278976,1137283071,CA +1137283072,1137287167,US +1137287168,1137295359,CA +1137295360,1137337599,US +1137337600,1137338367,CA +1137338368,1137356799,US +1137360896,1137426431,US +1137426432,1137442815,PR +1137442816,1137459199,CA +1137459200,1137487871,US +1137491968,1137508351,CA +1137508352,1137524735,US +1137524736,1137541119,CA +1137541120,1137623039,US +1137623040,1137639423,PR +1137639424,1137704959,US +1137704960,1137713151,CA +1137713152,1137724063,US +1137724064,1137724071,KR +1137724072,1137843711,US +1137843712,1137843775,NO +1137843776,1137868799,US +1137868800,1137872895,CA +1137872896,1137876991,US +1137876992,1137881087,CA +1137881088,1137889279,US +1137889280,1137893375,CA +1137893376,1137917951,US +1137917952,1137922047,CA +1137922048,1137926143,US +1137926144,1137934335,CA +1137934336,1137953023,US +1137953024,1137954815,CA +1137954816,1137963007,US +1137963008,1137967103,VI +1137967104,1137975295,CA +1137975296,1137983487,US +1137983488,1137983823,CA +1137983824,1137983831,US +1137983832,1137983839,CA +1137983840,1137983863,RU +1137983864,1137991679,CA +1137991680,1138049023,US +1138049024,1138049919,CA +1138049920,1138050047,US +1138050048,1138050175,CA +1138050176,1138050303,US +1138050304,1138061311,CA +1138061312,1138163711,US +1138163712,1138167039,CA +1138167040,1138167199,MA +1138167200,1138167807,CA +1138167808,1138175999,US +1138176000,1138180095,CA +1138180096,1138188287,US +1138188288,1138192383,PR +1138192384,1138196479,US +1138196480,1138204671,CA +1138204672,1138212863,US +1138212864,1138216959,CA +1138216960,1138417663,US +1138417664,1138417695,CA +1138417696,1138418175,US +1138418176,1138418431,CA +1138418432,1138421759,US +1138421760,1138421791,DO +1138421792,1138499583,US +1138499584,1138503679,CA +1138503680,1138544895,US +1138544896,1138545151,GB +1138545152,1138548735,US +1138548736,1138550015,CA +1138550016,1138552575,US +1138552576,1138556927,CA +1138556928,1138593791,US +1138597888,1138601983,US +1138606080,1138618367,US +1138622464,1138651135,US +1138655232,1138667519,US +1138671616,1138675711,US +1138679808,1138683903,US +1138688000,1138704383,US +1138704384,1138716671,CA +1138720768,1138728959,CA +1138728960,1138733055,US +1138737152,1138774015,US +1138774016,1138778111,CA +1138778112,1138786303,US +1138786304,1138819071,PR +1138819072,1138851839,CA +1138851840,1138854927,US +1138854928,1138854943,GB +1138854944,1138917375,US +1138917376,1138937855,CA +1138950144,1139146751,US +1139146752,1139154943,GT +1139154944,1139167231,JM +1139167232,1139179519,US +1139179520,1139187711,CA +1139195904,1139199999,US +1139212288,1139261439,US +1139261440,1139269631,CA +1139269632,1140563967,US +1140850688,1145073663,US +1145077760,1145094143,US +1145098240,1145110527,US +1145118720,1145141247,US +1145142784,1145180159,US +1145184256,1145188351,US +1145192448,1145196543,US +1145208832,1145221119,US +1145241600,1145245695,US +1145274368,1145290751,US +1145294848,1145298943,US +1145303040,1145307135,US +1145307136,1145311231,CA +1145319424,1145327615,US +1145331712,1145376767,US +1145380864,1145384959,US +1145389056,1145397247,US +1145401344,1145405439,US +1145405440,1145409535,CA +1145413632,1145421823,US +1145421824,1145430015,CA +1145438208,1145450495,US +1145466880,1145475071,US +1145483264,1145487359,US +1145503744,1145507839,CA +1145511936,1145516031,CA +1145520128,1145524223,US +1145528320,1145536511,US +1145552896,1145556991,CA +1145556992,1145561087,US +1145569280,1150287871,US +1150287872,1150812159,CA +1150812160,1151860735,US +1151868928,1151881215,US +1151889408,1151893503,CA +1151901696,1151905791,US +1151913984,1151918079,US +1151926272,1151946751,US +1151959040,1151967231,US +1151979520,1151987711,US +1151991808,1152016383,US +1152024576,1152028671,US +1152032768,1152040959,US +1152049152,1152053247,US +1152061440,1152073727,US +1152086016,1152094207,US +1152098304,1152102399,US +1152106496,1152114687,US +1152114688,1152122879,CA +1152122880,1152581631,US +1152581632,1152614399,CA +1152614400,1152643071,US +1152647168,1152778239,US +1152778240,1152843775,CA +1152843776,1156055039,US +1156063232,1156067327,US +1156071424,1156075519,CA +1156083712,1156104191,US +1156112384,1156128767,US +1156132864,1156136959,US +1156161536,1156177919,US +1156186112,1156190207,US +1156194304,1156214783,US +1156218880,1156235263,US +1156251648,1156255743,US +1156268032,1156276223,US +1156284416,1156292607,US +1156308992,1157713663,US +1157713664,1157713791,CA +1157713792,1157931007,US +1157931008,1157935103,BS +1157935104,1157943295,US +1157943296,1157947391,CA +1157947392,1157950919,US +1157950920,1157950975,HK +1157950976,1158027263,US +1158027264,1158027519,CA +1158027520,1158028287,US +1158028288,1158028543,CA +1158028544,1158041599,US +1158045696,1158148095,US +1158148096,1158152191,CA +1158152192,1158193151,US +1158193152,1158197247,CA +1158197248,1158294719,US +1158294720,1158294751,GB +1158294752,1158295807,US +1158295808,1158296063,GB +1158296064,1158316031,US +1158316032,1158320031,CA +1158320032,1158320047,SY +1158320048,1158322671,CA +1158322672,1158322687,SY +1158322688,1158324223,CA +1158324224,1158328319,US +1158332416,1158340607,US +1158340608,1158343199,CA +1158343200,1158343231,US +1158343232,1158344703,CA +1158344704,1158348799,US +1158348800,1158381567,CA +1158381568,1158774783,US +1158774784,1158791167,CA +1158791168,1158799359,BM +1158799360,1158807551,CA +1158807552,1158995967,US +1158995968,1159004159,CA +1159004160,1159213055,US +1159213056,1159217151,CA +1159217152,1159262207,US +1159266304,1159314367,US +1159314368,1159314383,BR +1159314384,1159348223,US +1159348224,1159356415,CA +1159356416,1159421951,US +1159421952,1159430143,CA +1159430144,1159512575,US +1159512576,1159512831,CA +1159512832,1159514111,US +1159514112,1159514367,CA +1159514368,1159515391,US +1159515392,1159515647,CA +1159515648,1159515807,US +1159515808,1159515839,CA +1159515840,1159515903,US +1159515904,1159516159,CA +1159516160,1159519743,US +1159519744,1159520255,CA +1159520256,1159521535,US +1159521536,1159521791,CA +1159521792,1159522287,US +1159522288,1159522303,VG +1159522304,1159522815,CA +1159522816,1159523583,US +1159523584,1159523839,CA +1159523840,1159524095,US +1159524096,1159524351,CA +1159524352,1159525375,US +1159525376,1159526399,CA +1159526400,1159527935,US +1159527936,1159528191,CA +1159528192,1159667711,US +1159667712,1159669759,AU +1159669760,1159700479,US +1159700480,1159725055,CA +1159725056,1160011775,US +1160011776,1160019967,CA +1160019968,1160040447,US +1160044544,1160364031,US +1160364032,1160368127,CA +1160368128,1160392703,US +1160392704,1160395519,CA +1160395520,1160395775,US +1160395776,1160396799,CA +1160396800,1160415637,US +1160415638,1160415733,KN +1160415734,1160425471,US +1160425472,1160429567,CA +1160429568,1160543327,US +1160543328,1160543359,MX +1160543360,1160544055,US +1160544056,1160544071,CA +1160544072,1160547839,US +1160547840,1160548351,MX +1160548352,1160563199,US +1160563200,1160563711,MP +1160563712,1160609791,US +1160609792,1160610815,MX +1160610816,1160667135,US +1160667136,1160675327,CA +1160675328,1160677015,US +1160677016,1160677023,AR +1160677024,1160677247,US +1160677248,1160677279,GB +1160677280,1160677375,US +1160677376,1160677439,GB +1160677440,1160678399,US +1160678400,1160678655,MX +1160678656,1160683519,US +1160683520,1160691711,CA +1160691712,1160808255,US +1160808256,1160808287,CA +1160808288,1160811551,US +1160811552,1160811559,BE +1160811560,1160847359,US +1160847360,1160855551,CA +1160855552,1160863999,US +1160864000,1160864255,CA +1160864256,1160921087,US +1160921088,1160925183,AG +1160925184,1160941535,US +1160941536,1160941567,CA +1160941568,1160949679,US +1160949680,1160949727,CY +1160949728,1160949743,US +1160949744,1160949759,CY +1160949760,1161019391,US +1161019392,1161035775,CA +1161035776,1161187215,US +1161187216,1161187223,UM +1161187224,1161256959,US +1161265152,1161293823,US +1161293824,1161297919,CA +1161297920,1161298303,US +1161298304,1161298311,IL +1161298312,1161311743,US +1161311744,1161311759,KN +1161311760,1161311991,US +1161311992,1161311999,KN +1161312000,1161312991,US +1161312992,1161312999,IL +1161313000,1161313127,US +1161313128,1161313135,MP +1161313136,1161314151,US +1161314152,1161314159,CA +1161314160,1161363455,US +1161363456,1161367551,CA +1161367552,1161388031,US +1161392128,1161420799,US +1161420800,1161422079,AG +1161422080,1161422335,VG +1161422336,1161422591,LC +1161422592,1161422847,AG +1161422848,1161423103,LC +1161423104,1161423359,VG +1161423360,1161423871,AG +1161423872,1161424127,LC +1161424128,1161424383,AG +1161424384,1161424639,KN +1161424640,1161424895,LC +1161424896,1161425151,VG +1161425152,1161425407,DM +1161425408,1161427199,AG +1161427200,1161427455,VG +1161427456,1161428223,AG +1161428224,1161428991,KN +1161428992,1161453567,US +1161453568,1161457663,CA +1161457664,1161576447,US +1161580544,1161617407,US +1161617408,1161625599,CA +1161625600,1161653503,US +1161653504,1161653759,CA +1161653760,1161764863,US +1161764864,1161773055,CA +1161777152,1161818111,US +1161818112,1161822207,CA +1161822208,1161837567,US +1161837568,1161837823,JP +1161837824,1161838351,US +1161838352,1161838367,GB +1161838368,1162018815,US +1162018816,1162022911,CA +1162031104,1162059775,US +1162059776,1162067967,CA +1162067968,1162215423,US +1162215424,1162280959,CA +1162280960,1162297343,US +1162297344,1162305535,CA +1162305536,1162330111,US +1162334208,1162394463,US +1162394464,1162394471,GB +1162394472,1162461183,US +1162461184,1162461695,BB +1162461696,1162462207,GD +1162462208,1162462975,BB +1162462976,1162463999,VC +1162464000,1162465279,BB +1162465280,1162465535,GD +1162465536,1162470911,BB +1162470912,1162471423,GD +1162471424,1162472703,BB +1162472704,1162473471,VC +1162473472,1162475007,GD +1162475008,1162477567,BB +1162477568,1162715135,US +1162715136,1162723327,CA +1162723328,1162805247,US +1162805248,1162811391,PR +1162811392,1162811647,AN +1162811648,1162812159,US +1162812160,1162812415,DO +1162812416,1162813439,US +1162813440,1162821631,CO +1162821632,1162823679,PR +1162823680,1162825727,GT +1162825728,1162827775,US +1162827776,1162833919,PR +1162833920,1162835967,GT +1162835968,1162836223,BS +1162836224,1162836991,US +1162836992,1162838015,BS +1162838016,1162870783,CO +1162903552,1163407359,US +1163407360,1163411455,CA +1163411456,1163527023,US +1163527024,1163527039,VG +1163527040,1163531007,US +1163531008,1163532287,CA +1163532288,1163533055,US +1163533056,1163533311,CA +1163533312,1163533567,US +1163533568,1163533631,CA +1163533632,1163536127,US +1163536128,1163536383,CA +1163536384,1163537663,US +1163537664,1163537919,CA +1163537920,1163538175,US +1163538176,1163540479,CA +1163540480,1163540735,US +1163540736,1163541503,CA +1163541504,1163542527,US +1163542528,1163542783,CA +1163542784,1163543295,US +1163543296,1163543551,CA +1163543552,1163544063,US +1163544064,1163544319,CA +1163544320,1163544511,US +1163544512,1163544575,CA +1163544576,1163544831,US +1163544832,1163545087,CA +1163545088,1163546623,US +1163546624,1163546879,CA +1163546880,1163547135,US +1163547136,1163547391,CA +1163547392,1163547567,US +1163547568,1163547583,VG +1163547584,1163547647,US +1163547648,1163547903,CA +1163547904,1163548159,US +1163548160,1163548671,CA +1163548672,1163549951,US +1163549952,1163550207,CA +1163550208,1163551455,US +1163551456,1163551487,CR +1163551488,1163551743,US +1163551744,1163552255,CA +1163552256,1163554047,US +1163554048,1163554303,CA +1163554304,1163556095,US +1163556096,1163556607,CA +1163556608,1163560959,US +1163560960,1163561727,CA +1163561728,1163561983,FI +1163561984,1163562239,US +1163562240,1163563007,CA +1163563008,1163571199,US +1163571200,1163571711,CA +1163571712,1163575295,US +1163575296,1163575551,CA +1163575552,1163575807,US +1163575808,1163576319,CA +1163576320,1163576639,US +1163576640,1163576703,CA +1163576704,1163577151,US +1163577152,1163577215,CA +1163577216,1163577599,US +1163577600,1163577855,CA +1163577856,1163578367,US +1163578368,1163578495,CA +1163578496,1163579135,US +1163579136,1163579391,CA +1163579392,1163581695,US +1163581696,1163581951,CA +1163581952,1163582207,US +1163582208,1163583487,CA +1163583488,1163588351,US +1163588352,1163588607,CA +1163588608,1163588863,US +1163588864,1163589631,CA +1163589632,1167310847,US +1167319040,1167321959,US +1167321960,1167321967,GB +1167321968,1167851519,US +1167851520,1168113663,CA +1168130048,1168138239,US +1168162816,1168171007,US +1168175104,1168187391,US +1168195584,1168211967,US +1168211968,1168220159,CA +1168228352,1168236543,US +1168244736,1168322559,US +1168343040,1168359423,US +1168375808,1168392191,US +1168408576,1168412671,US +1168416768,1168420863,US +1168424960,1168429055,US +1168437248,1168441343,US +1168457728,1168461823,US +1168470016,1168474111,US +1168474112,1168490495,CA +1168509440,1168509695,US +1168509952,1168510975,US +1168515072,1168523263,US +1168539648,1168551935,US +1168556032,1168584703,US +1168588800,1168625663,US +1168646144,1168670719,US +1168670720,1168687103,CA +1168687104,1168728063,US +1168736256,1168785407,US +1168801792,1168805887,US +1168818176,1168859135,US +1168859136,1168863231,CA +1168863232,1168867327,US +1168867328,1168875519,CA +1168875520,1168887807,US +1168900096,1168908287,US +1168916480,1168932863,CA +1168932864,1168936959,US +1168949248,1168963583,US +1168963584,1168965119,CA +1168965120,1168973823,US +1168982016,1169068031,US +1169092608,1169113087,US +1169129472,1169182975,US +1169182976,1169183487,CA +1169183488,1169184767,US +1169184768,1169185023,CA +1169185024,1169185279,US +1169185280,1169185791,HK +1169185792,1169186047,US +1169186048,1169186303,SG +1169186304,1169203199,US +1169203200,1169211391,CA +1169211392,1170333695,US +1170341888,1170374655,US +1170407424,1170411519,US +1170472960,1170481151,CA +1170481152,1170489343,US +1170489344,1170497535,CA +1170497536,1170505727,US +1170505728,1170522111,CA +1170522112,1170718719,US +1170735104,1175977983,US +1175977984,1176502271,CA +1176502272,1176555519,US +1176567808,1176616959,US +1176616960,1176623103,CA +1176623104,1176625151,US +1176625152,1176629247,CA +1176629248,1176629759,US +1176629760,1176631039,CA +1176631040,1176633343,US +1176666112,1176702975,US +1176702976,1176707071,CA +1176707072,1176719359,US +1176727552,1176731647,US +1176731648,1176735743,PR +1176748032,1176752127,US +1176756224,1176760319,US +1176764416,1176768511,PM +1176772608,1176776703,US +1176780800,1176784895,US +1176788992,1176879103,US +1176895488,1176928255,CA +1176928256,1176969215,US +1177026560,1177030655,US +1177030656,1177033727,AG +1177033728,1177354239,US +1177354240,1177419775,PR +1177419776,1177550847,US +1177550848,1178000911,CA +1178000912,1178000919,US +1178000920,1178075135,CA +1178075136,1178599423,US +1178599424,1179910143,CA +1179910144,1191673855,US +1191673856,1191706623,CA +1191706624,1192296447,US +1192296448,1192361983,CA +1192361984,1192427519,US +1192427520,1192460287,CA +1192460288,1207975935,US +1207975936,1207980031,CA +1207980032,1208008703,US +1208008704,1208016895,CA +1208016896,1208020991,US +1208020992,1208025087,CA +1208025088,1208050943,US +1208050944,1208051199,CA +1208051200,1208074239,US +1208074240,1208082431,CA +1208082432,1208090623,US +1208090624,1208107007,CA +1208107008,1208590335,US +1208590336,1208598527,CA +1208598528,1208647679,US +1208647680,1208659967,CA +1208659968,1208721407,US +1208721408,1208729599,CA +1208729600,1208770559,US +1208770560,1208774655,CA +1208774656,1208778751,US +1208778752,1208795135,CA +1208795136,1208832607,US +1208832608,1208832623,IT +1208832624,1208852479,US +1208852480,1208860671,CA +1208860672,1208918015,US +1208918016,1208922111,CA +1208922112,1208954879,US +1208954880,1208958207,CA +1208958208,1208958463,US +1208958464,1208958975,CA +1208958976,1208975359,US +1208975360,1208983551,CA +1208983552,1209347839,US +1209347840,1209348095,GB +1209348096,1209434111,US +1209434112,1209436671,BB +1209436672,1209437183,VC +1209437184,1209440767,BB +1209440768,1209441279,GD +1209441280,1209442303,BB +1209442304,1209647103,US +1209647104,1209663487,CA +1209663488,1209729023,US +1209729024,1209786367,JM +1209786368,1209810943,US +1209810944,1209819135,CA +1209819136,1209885127,US +1209885128,1209885143,IT +1209885144,1209885167,US +1209885168,1209885175,IT +1209885176,1209917439,US +1209917440,1209925631,CA +1209925632,1210253311,US +1210253312,1210254703,CA +1210254704,1210254719,NZ +1210254720,1210261503,CA +1210261504,1210366655,US +1210366656,1210366719,GB +1210366720,1210449919,US +1210449920,1210580991,CA +1210580992,1210925055,US +1210925056,1210941439,CA +1210941440,1211236351,US +1211236352,1211269119,PR +1211269120,1211304447,US +1211304448,1211304703,CA +1211304704,1211308175,US +1211308176,1211308191,VG +1211308192,1211308223,US +1211308224,1211308543,CA +1211308544,1211308703,US +1211308704,1211308719,VG +1211308720,1211308735,US +1211308736,1211308751,VG +1211308752,1211309823,US +1211309824,1211310079,CA +1211310080,1211317503,US +1211317504,1211317759,CA +1211317760,1211318271,US +1211318272,1211321343,BB +1211321344,1211322367,VC +1211322368,1211322623,BB +1211322624,1211324159,GD +1211324160,1211324927,VC +1211324928,1211333119,BB +1211333120,1211333631,VC +1211333632,1211333887,GD +1211333888,1211334655,VG +1211334656,1211432959,US +1211432960,1211473919,CA +1211473920,1211596799,US +1211596800,1211605247,CA +1211605248,1211605311,BS +1211605312,1211613183,CA +1211613184,1216872447,US +1216872448,1217396735,CA +1217396736,1219256319,US +1219256320,1219264511,CA +1219264512,1219272703,US +1219272704,1219276799,CA +1219276800,1223199743,US +1223199744,1223199999,GB +1223200000,1223208831,US +1223208832,1223208959,ES +1223208960,1224278111,US +1224278112,1224278143,MY +1224278144,1224286719,US +1224286720,1224286975,CA +1224286976,1224290815,US +1224290816,1224291071,CA +1224291072,1224292095,US +1224292096,1224292351,CA +1224292352,1224295423,US +1224295424,1224295679,VN +1224295680,1224296447,US +1224296448,1224296959,CA +1224296960,1224299519,US +1224299520,1224299775,CA +1224299776,1224311807,US +1224311808,1224312319,CA +1224312320,1224317439,US +1224317440,1224317695,CA +1224317696,1224318207,US +1224318208,1224318463,CA +1224318464,1224321023,US +1224321024,1224321535,CA +1224321536,1224476671,US +1224476672,1224478719,AN +1224478720,1224480767,US +1224480768,1224484863,JM +1224484864,1224493055,GT +1224493056,1224497151,US +1224497152,1224501247,GT +1224501248,1224503551,JM +1224503552,1224503807,BS +1224503808,1224521727,JM +1224521728,1224527871,US +1224527872,1224529664,JM +1224529665,1224529919,US +1224529920,1224538111,JM +1224538112,1241743359,US +1241743360,1241759743,CA +1241759744,1241763839,US +1241776128,1242300415,US +1242300416,1242562559,CA +1242562560,1244659711,US +1244659712,1244790783,CA +1244790784,1244831743,US +1244831744,1244839935,CA +1244839936,1244848127,US +1244848128,1244852223,CA +1244852224,1244864511,US +1244864512,1244872703,CA +1244872704,1245183999,US +1245184000,1245446143,CA +1245446144,1246904319,US +1246953472,1247156311,US +1247156312,1247156319,EG +1247156320,1247169503,US +1247169504,1247169511,IE +1247169512,1247170743,US +1247170744,1247170751,GB +1247170752,1247170927,US +1247170928,1247170935,GB +1247170936,1247173319,US +1247173320,1247173327,IE +1247173328,1247178703,US +1247178704,1247178711,IE +1247178712,1247179967,US +1247179968,1247179975,ID +1247179976,1247180255,US +1247180256,1247180271,ID +1247180272,1247180399,US +1247180400,1247180407,NO +1247180408,1247182343,US +1247182344,1247182351,IE +1247182352,1247184559,US +1247184560,1247184567,IE +1247184568,1247186703,US +1247186704,1247186711,EG +1247186712,1247187199,US +1247187200,1247187207,LB +1247187208,1247191127,US +1247191128,1247191135,IE +1247191136,1247191199,US +1247191200,1247191207,IE +1247191208,1247346687,US +1247543296,1248571391,US +1248854016,1248864255,US +1248864256,1248866303,CA +1248866304,1248885759,US +1248885760,1248886783,CA +1248886784,1248899071,US +1248899072,1248900095,CA +1248900096,1248913407,US +1248913408,1248915455,MF +1248915456,1248919551,US +1248919552,1248920575,CA +1248920576,1248921599,US +1248921600,1248923647,CA +1248923648,1248931839,US +1248933888,1248936959,US +1248936960,1248939007,CA +1248939008,1248946175,US +1248946176,1248947199,VG +1248947200,1248958463,US +1248958464,1248959487,CA +1248959488,1248964607,US +1248964608,1248966655,CA +1248966656,1249003519,US +1249003520,1249005567,CA +1249005568,1249010687,US +1249640448,1249648639,US +1249673216,1249677311,US +1249681408,1249796095,US +1249796096,1249804287,CA +1249804288,1249886207,US +1249886208,1249902591,CA +1249902592,1254490111,US +1254490112,1254555647,CA +1254555648,1254621183,US +1254621184,1254629375,CA +1254629376,1254989823,US +1254989824,1254998015,CA +1254998016,1255002111,US +1255002112,1255006207,CA +1255006208,1255047167,US +1255047168,1255055359,CA +1255055360,1255062463,US +1255062464,1255062527,PA +1255062528,1255063551,US +1255063552,1255071743,PR +1255071744,1255194623,US +1255211008,1255247871,US +1255251968,1255256063,US +1255260160,1255276543,US +1255276544,1255342079,CA +1255342080,1255374303,US +1255374304,1255374335,DO +1255374336,1255489535,US +1255489536,1255505919,PR +1255505920,1255514111,US +1255514112,1255522303,CA +1255522304,1255571455,US +1255571456,1255579647,CA +1255579648,1255669759,US +1255669760,1255735295,CA +1255735296,1255771135,US +1255771136,1255772159,CA +1255772160,1255972863,US +1255972864,1255981055,CA +1255981056,1256001535,US +1256001536,1256005631,CA +1256005632,1256079359,US +1256079360,1256087551,KY +1256087552,1263267327,US +1263267328,1263267839,CA +1263271936,1264721919,US +1264779264,1264980223,US +1264980224,1264980479,HK +1264980480,1265025023,US +1265041408,1265057791,US +1265074176,1265102847,US +1265106944,1266147327,US +1266147328,1266155519,CA +1266155520,1266489663,US +1266489664,1266489695,CA +1266489696,1266498175,US +1266498176,1266498303,MA +1266498304,1266514815,US +1266514816,1266514879,CA +1266514880,1266551519,US +1266551520,1266551527,PH +1266551528,1266554207,US +1266554208,1266554215,SA +1266554216,1266559095,US +1266559096,1266559103,SA +1266559104,1266559415,US +1266559416,1266559423,CA +1266559424,1266565031,US +1266565032,1266565039,SA +1266565040,1266566815,US +1266566816,1266566823,AU +1266566824,1266567407,US +1266567408,1266567415,CA +1266567416,1266569567,US +1266569568,1266569575,NO +1266569576,1266574631,US +1266574632,1266574639,TR +1266574640,1266581535,US +1266581536,1266581543,IE +1266581544,1266581551,US +1266581552,1266581559,IE +1266581560,1266583679,US +1266583680,1266583687,ID +1266583688,1266583887,US +1266583888,1266583895,ID +1266583896,1266584783,US +1266584784,1266584791,SA +1266584792,1266587511,US +1266587512,1266587519,EG +1266587520,1266587631,US +1266587632,1266587639,GB +1266587640,1266589295,US +1266589296,1266589303,IE +1266589304,1266599295,US +1266599296,1266599303,IE +1266599304,1266599559,US +1266599560,1266599567,SA +1266599568,1266606527,US +1266606528,1266606559,AR +1266606560,1266607223,US +1266607224,1266607231,SA +1266607232,1266607567,US +1266607568,1266607575,SA +1266607576,1266609407,US +1266609408,1266609415,CN +1266609416,1266618367,US +1266622464,1266626559,US +1266630656,1268252671,US +1268252672,1268776959,CA +1268776960,1275600895,US +1275600896,1275604991,BM +1275604992,1275621375,US +1275621376,1275625471,CA +1275625472,1275658239,US +1275658240,1275658495,GB +1275658496,1275659007,US +1275659008,1275659263,GB +1275659264,1275665151,US +1275665152,1275665407,UA +1275665408,1275666431,US +1275666432,1275674623,CA +1275674624,1275707391,US +1275707392,1275708927,CA +1275708928,1275709183,US +1275709184,1275711487,CA +1275711488,1275712511,US +1275712512,1275714047,CA +1275714048,1275714559,US +1275714560,1275715583,CA +1275715584,1275756543,US +1275756544,1275772927,CA +1275772928,1275785215,US +1275789312,1275822079,CA +1275822080,1279262719,US +1279262720,1279787007,CA +1279787008,1279819775,US +1279852544,1279950847,US +1279950848,1279951103,FI +1279951104,1279951359,US +1279951360,1279952895,CA +1279952896,1279952919,US +1279952920,1279952927,VG +1279952928,1279953023,US +1279953024,1279953055,VG +1279953056,1279953151,US +1279953152,1279953407,CA +1279953408,1279960511,US +1279960512,1279960527,CA +1279960528,1279967231,US +1279967232,1279971327,CA +1279971328,1279977471,US +1279977472,1279977983,CA +1279977984,1279979775,US +1279979776,1279980031,CA +1279980032,1279980159,US +1279980160,1279980287,CA +1279980288,1279982335,US +1279982336,1279982591,CA +1279982592,1279999999,US +1280000000,1280032767,CA +1280032768,1280040959,US +1280040960,1280049151,CA +1280049152,1280073727,US +1280073728,1280081919,CA +1280081920,1280090111,US +1280090112,1280092159,AG +1280092160,1280093183,KN +1280093184,1280097279,AG +1280097280,1280097791,LC +1280097792,1280098303,AG +1280098304,1280102399,PR +1280102400,1280131071,US +1280131072,1280139263,CA +1280139264,1287589887,US +1287593984,1287598079,US +1287602176,1291845631,US +1291845632,1292894207,DE +1292894208,1293156351,NO +1293156352,1293549567,DE +1293549568,1293680639,ES +1293680640,1293811711,MK +1293811712,1293942783,SA +1293942784,1294073855,PL +1294073856,1294204927,RU +1294204928,1294237695,RO +1294237696,1294270463,IR +1294270464,1294303231,DE +1294303232,1294335999,RU +1294336000,1294368767,SI +1294368768,1294401535,LV +1294401536,1294434303,RU +1294434304,1294467071,IT +1294467072,1294499839,RU +1294499840,1294532607,NO +1294532608,1294598143,RU +1294598144,1294630911,IT +1294630912,1294663679,LB +1294663680,1294696447,IT +1294696448,1294729215,RU +1294729216,1294761983,GB +1294761984,1294794751,SY +1294794752,1294827519,PL +1294827520,1294860287,RU +1294860288,1294893055,PL +1294893056,1294895135,CS +1294895136,1294895151,RS +1294895152,1294895279,CS +1294895280,1294895287,RS +1294895288,1294895495,CS +1294895496,1294895615,RS +1294895616,1294902015,CS +1294902016,1294902271,RS +1294902272,1294925823,CS +1294925824,1294958591,DE +1294958592,1294991359,UA +1294991360,1294998527,CZ +1294998528,1294998591,SK +1294998592,1295009023,CZ +1295009024,1295009407,SK +1295009408,1295047679,CZ +1295047680,1295048191,SK +1295048192,1295056895,CZ +1295056896,1295122431,GR +1295122432,1295253503,RU +1295253504,1295319039,UA +1295319040,1295384575,SE +1295384576,1295450111,PT +1295450112,1295515647,PL +1295515648,1295777791,CH +1295777792,1296039935,NL +1296039936,1296072703,SA +1296072704,1296105471,DE +1296105472,1296171007,PL +1296171008,1296171599,DK +1296171600,1296171600,DE +1296171601,1296171601,GB +1296171602,1296181743,DK +1296181744,1296181751,GB +1296181752,1296203775,DK +1296203776,1296236543,RU +1296236544,1296236671,FR +1296236672,1296236799,US +1296236800,1296237055,GB +1296237056,1296237311,FR +1296237312,1296237567,US +1296237568,1296237823,NL +1296237824,1296238079,ES +1296238080,1296239103,NL +1296239104,1296239231,FR +1296239232,1296239359,NL +1296239360,1296239615,ES +1296239616,1296241151,BE +1296241152,1296241407,IT +1296241408,1296242175,NL +1296242176,1296242303,DE +1296242304,1296242431,NL +1296242432,1296242687,BE +1296242688,1296243199,US +1296243200,1296243455,GB +1296243456,1296243711,US +1296243712,1296244223,IT +1296244224,1296244479,NL +1296244480,1296244735,GB +1296244736,1296244991,IR +1296244992,1296245247,CH +1296245248,1296245503,FR +1296245504,1296245759,NL +1296245760,1296246783,ES +1296246784,1296247295,NL +1296247296,1296247807,FR +1296247808,1296247871,US +1296247872,1296247935,FR +1296247936,1296247999,BE +1296248000,1296248063,IE +1296248064,1296248127,NL +1296248128,1296248255,IE +1296248256,1296248318,BE +1296248319,1296248319,NL +1296248320,1296248383,BE +1296248384,1296249855,NL +1296249856,1296249887,US +1296249888,1296249919,FR +1296249920,1296249951,BE +1296249952,1296250015,DE +1296250016,1296250047,IL +1296250048,1296250079,IE +1296250080,1296250111,IL +1296250112,1296250143,IE +1296250144,1296250175,GB +1296250176,1296250207,BE +1296250208,1296250239,ES +1296250240,1296250271,BE +1296250272,1296251199,NL +1296251200,1296251295,DE +1296251296,1296251327,BE +1296251328,1296251359,IE +1296251360,1296251391,DE +1296251392,1296252207,NL +1296252208,1296252223,BG +1296252224,1296252239,GB +1296252240,1296252255,IT +1296252256,1296252271,GB +1296252272,1296252303,FR +1296252304,1296252319,IL +1296252320,1296252335,NL +1296252336,1296252351,FR +1296252352,1296252367,NL +1296252368,1296252383,DE +1296252384,1296252415,IE +1296252416,1296252839,NL +1296252840,1296252847,DE +1296252848,1296252855,NL +1296252856,1296252871,IE +1296252872,1296252879,BE +1296252880,1296252887,DE +1296252888,1296252895,IE +1296252896,1296252911,BE +1296252912,1296252919,NL +1296252920,1296252927,PL +1296252928,1296254719,DE +1296254720,1296254975,NL +1296254976,1296255487,DE +1296255488,1296258047,NL +1296258048,1296258303,TW +1296258304,1296259071,NL +1296259072,1296259839,US +1296259840,1296260351,NL +1296260352,1296262655,US +1296262656,1296262911,CA +1296262912,1296263935,US +1296263936,1296263943,NL +1296263944,1296263991,US +1296263992,1296264063,NL +1296264064,1296264087,GB +1296264088,1296264191,NL +1296264192,1296264223,US +1296264224,1296264239,IE +1296264240,1296264255,NL +1296264256,1296264303,US +1296264304,1296264319,CA +1296264320,1296264335,US +1296264336,1296264447,NL +1296264448,1296264543,US +1296264544,1296264607,CA +1296264608,1296264703,NL +1296264704,1296264959,US +1296264960,1296265087,NL +1296265088,1296265151,CA +1296265152,1296265215,FR +1296265216,1296267519,US +1296267520,1296267775,CA +1296267776,1296268799,US +1296268800,1296269311,FR +1296269312,1296302079,TR +1296302080,1296334847,GB +1296334848,1296367615,DK +1296367616,1296400383,GR +1296400384,1296433151,BH +1296433152,1296465919,BG +1296465920,1296466239,NG +1296466240,1296466303,NO +1296466304,1296466335,BF +1296466336,1296466431,NO +1296466432,1296466559,CG +1296466560,1296466655,NO +1296466656,1296466671,BJ +1296466672,1296466687,NO +1296466688,1296466815,NG +1296466816,1296467967,NO +1296467968,1296468223,NE +1296468224,1296468351,NG +1296468352,1296468479,NO +1296468480,1296469247,NG +1296469248,1296469503,NO +1296469504,1296469759,ZM +1296469760,1296470015,NO +1296470016,1296470439,TZ +1296470440,1296470463,NO +1296470464,1296470527,TZ +1296470528,1296472319,NO +1296472320,1296472327,CD +1296472328,1296472351,NO +1296472352,1296472383,NG +1296472384,1296472415,BI +1296472416,1296473087,NO +1296473088,1296474111,LT +1296474112,1296474367,ZM +1296474368,1296475135,LT +1296475136,1296475647,US +1296475648,1296476159,LT +1296476160,1296477183,GA +1296477184,1296478207,LT +1296478208,1296479231,NG +1296479232,1296498687,LT +1296498688,1296531455,BG +1296531456,1296564223,MT +1296564224,1296566271,GB +1296566272,1296568319,DE +1296568320,1296570367,RU +1296570368,1296574463,IT +1296574464,1296576511,FR +1296576512,1296578559,DK +1296578560,1296580607,FI +1296580608,1296582655,CH +1296582656,1296584703,IE +1296584704,1296586751,RU +1296586752,1296588799,FR +1296588800,1296590847,SE +1296590848,1296592895,ES +1296592896,1296594943,NL +1296594944,1296596991,RU +1296596992,1296599039,CH +1296599040,1296601087,RU +1296601088,1296603135,DE +1296603136,1296605183,NL +1296605184,1296607231,AT +1296607232,1296607759,DE +1296607760,1296607999,NL +1296608000,1296609023,CH +1296609024,1296609279,NL +1296609280,1296611327,CH +1296611328,1296613375,TR +1296613376,1296615423,IT +1296615424,1296617471,GB +1296617472,1296619519,ES +1296619520,1296621567,IT +1296621568,1296623615,SE +1296623616,1296625663,BE +1296625664,1296629759,RU +1296629760,1296631807,NO +1296631808,1296633855,GB +1296633856,1296635903,NL +1296635904,1296637951,RU +1296637952,1296639999,GB +1296640000,1296642047,ES +1296642048,1296644095,RU +1296644096,1296646143,IT +1296646144,1296648191,RU +1296648192,1296650239,GB +1296650240,1296652287,ES +1296652288,1296654335,RU +1296654336,1296656383,BE +1296656384,1296658431,RU +1296658432,1296662527,GB +1296662528,1296666623,RU +1296666624,1296670719,GB +1296670720,1296672767,ES +1296672768,1296674815,IT +1296674816,1296676863,BE +1296676864,1296677271,NG +1296677272,1296677287,JE +1296677288,1296677311,NG +1296677312,1296677319,JE +1296677320,1296677343,NG +1296677344,1296677351,JE +1296677352,1296677367,NG +1296677368,1296677375,US +1296677376,1296677511,NG +1296677512,1296677519,JE +1296677520,1296677591,NG +1296677592,1296677599,JE +1296677600,1296677703,NG +1296677704,1296677719,JE +1296677720,1296677735,NG +1296677736,1296677751,JE +1296677752,1296677767,NG +1296677768,1296677775,JE +1296677776,1296677959,NG +1296677960,1296677967,JE +1296677968,1296677991,NG +1296677992,1296678015,JE +1296678016,1296678047,NG +1296678048,1296678079,JE +1296678080,1296678119,NG +1296678120,1296678143,JE +1296678144,1296678151,NG +1296678152,1296678159,JE +1296678160,1296678215,NG +1296678216,1296678223,JE +1296678224,1296678319,NG +1296678320,1296678327,JE +1296678328,1296678351,NG +1296678352,1296678367,JE +1296678368,1296678415,NG +1296678416,1296678431,US +1296678432,1296678447,NG +1296678448,1296678463,JE +1296678464,1296678471,NG +1296678472,1296678479,JE +1296678480,1296678775,NG +1296678776,1296678791,JE +1296678792,1296678831,NG +1296678832,1296678839,JE +1296678840,1296678911,NG +1296678912,1296680959,SA +1296680960,1296683007,ES +1296683008,1296685055,IE +1296685056,1296687103,TR +1296687104,1296689151,NL +1296689152,1296691199,RU +1296691200,1296693247,CH +1296693248,1296695295,DE +1296695296,1296697343,CH +1296697344,1296699391,RU +1296699392,1296701439,IT +1296701440,1296703487,RU +1296703488,1296705535,BY +1296705536,1296707583,GE +1296707584,1296707999,NL +1296708000,1296708031,AE +1296708032,1296708039,AT +1296708040,1296708047,AE +1296708048,1296709631,NL +1296709632,1296711679,CY +1296711680,1296713727,KZ +1296713728,1296715775,RU +1296715776,1296717823,AT +1296717824,1296719871,BE +1296719872,1296721919,CH +1296721920,1296723967,GB +1296723968,1296726015,AT +1296726016,1296728063,GB +1296728064,1296730111,SE +1296730112,1296732159,DE +1296732160,1296734207,IT +1296734208,1296736255,FR +1296736256,1296738303,NO +1296738304,1296738815,CH +1296738816,1296739327,FI +1296739328,1296740351,CH +1296740352,1296744447,RU +1296744448,1296746495,GB +1296746496,1296748543,SI +1296748544,1296750591,FR +1296750592,1296752639,NO +1296752640,1296754687,BA +1296754688,1296754911,DE +1296754912,1296754927,AT +1296754928,1296756735,DE +1296756736,1296758783,FR +1296758784,1296760831,RS +1296760832,1296762879,GB +1296762880,1296764927,RU +1296764928,1296766975,AT +1296766976,1296767231,GB +1296767232,1296767375,NL +1296767376,1296769023,GB +1296769024,1296771071,TR +1296771072,1296773119,LT +1296773120,1296774367,FR +1296775168,1296779263,FR +1296779264,1296781311,CZ +1296781312,1296783359,DK +1296783360,1296785407,LB +1296785408,1296787455,IE +1296787456,1296789503,GB +1296789504,1296791551,CH +1296791552,1296793599,NL +1296793600,1296795647,RU +1296795648,1296795903,NL +1296795904,1296797695,GB +1296797696,1296799743,UA +1296799744,1296801791,RU +1296801792,1296803839,DK +1296803840,1296805887,RU +1296805888,1296807935,ES +1296807936,1296812031,GB +1296812032,1296814079,DE +1296814080,1296816127,NO +1296816128,1296818175,TR +1296818176,1296820223,ES +1296820224,1296822271,GB +1296822272,1296824319,IE +1296824320,1296826367,DE +1296826368,1296842751,BG +1296842752,1296859135,GB +1296859136,1296875519,BG +1296875520,1296891903,DE +1296891904,1296908287,BG +1296908288,1296924671,IR +1296924672,1296941055,BG +1296941056,1296957439,BA +1296957440,1296973823,BG +1296973824,1296990207,CZ +1296990208,1297006591,BG +1297006592,1297022975,BA +1297022976,1297039359,LT +1297039360,1297055743,TR +1297055744,1297072127,RU +1297072128,1297083375,PL +1297083376,1297083391,SE +1297083392,1297088511,PL +1297154048,1297219583,RO +1297219584,1297285119,RU +1297285120,1297350655,GR +1297350656,1297416191,FR +1297416192,1297481727,BG +1297481728,1297514495,GB +1297514496,1297547263,FI +1297547264,1297549311,PL +1297549312,1297551359,LT +1297551360,1297553407,SA +1297553408,1297555455,IE +1297555456,1297557503,UA +1297557504,1297559551,BE +1297559552,1297561599,DE +1297561600,1297563647,NL +1297563648,1297565695,RU +1297565696,1297567743,PL +1297567744,1297569791,RU +1297569792,1297571839,RO +1297571840,1297573887,RU +1297573888,1297575935,FR +1297575936,1297577983,RU +1297577984,1297580031,PL +1297580032,1297582079,GB +1297582080,1297584127,PL +1297584128,1297588223,UA +1297588224,1297590271,NL +1297590272,1297592319,RU +1297592320,1297594367,GB +1297594368,1297596415,DE +1297596416,1297598463,UA +1297598464,1297602559,RU +1297602560,1297604607,PL +1297604608,1297606655,DE +1297606656,1297608703,CZ +1297610752,1297612799,DE +1297612800,1297629183,RU +1297629184,1297645567,NO +1297645568,1297661951,PL +1297661952,1297678335,UA +1297678336,1297694719,IT +1297694720,1297711103,PL +1297711104,1297727487,GB +1297727488,1297743871,MD +1297743872,1297760255,DE +1297760256,1297776639,LT +1297776640,1297793023,DE +1297793024,1297809407,UA +1297809408,1297825791,PL +1297825792,1297842175,RU +1297842176,1297858559,UA +1297858560,1297860607,RU +1297860608,1297862655,PT +1297862656,1297864703,FI +1297864704,1297866751,SE +1297866752,1297867687,RU +1297867688,1297867695,CY +1297867696,1297868607,RU +1297868608,1297868671,CY +1297868672,1297868799,RU +1297868800,1297870847,DE +1297870848,1297872895,FR +1297872896,1297874943,GB +1297874944,1297875487,CY +1297875488,1297875503,TR +1297875504,1297875536,CY +1297875537,1297875551,TR +1297875552,1297883135,CY +1297883136,1297891327,IT +1297891328,1297899519,GB +1297899520,1297915903,TR +1297915904,1297924095,BH +1297924096,1297932287,CZ +1297932288,1297940479,GE +1297940480,1297948671,LV +1297948672,1297956863,UA +1297956864,1297965055,NL +1297965056,1297973247,RU +1297973248,1297981439,GB +1297981440,1297989631,RO +1297989632,1297993295,CZ +1297993296,1297993311,SK +1297993312,1297997823,CZ +1297997824,1298006015,IT +1298006016,1298014207,RU +1298014208,1298014719,LB +1298014720,1298014975,RU +1298014976,1298015231,LT +1298015232,1298015487,RU +1298015488,1298015743,LB +1298015744,1298015999,IQ +1298016000,1298016255,LB +1298016256,1298017279,RU +1298017280,1298018303,KG +1298018304,1298018559,TM +1298018560,1298019327,RU +1298019328,1298019839,LT +1298019840,1298022399,RU +1298022400,1298030591,IT +1298030592,1298038783,RU +1298038784,1298046975,SI +1298046976,1298063359,RU +1298063360,1298065407,FR +1298065408,1298067455,NO +1298067456,1298071551,NL +1298071552,1298073599,TJ +1298073600,1298075647,RU +1298075648,1298077695,CY +1298077696,1298079743,DE +1298079744,1298081791,GB +1298081792,1298083839,CZ +1298083840,1298085887,PL +1298085888,1298087935,KG +1298087936,1298089983,FR +1298089984,1298092031,NO +1298092032,1298094079,GB +1298094080,1298096127,RU +1298096128,1298098175,NL +1298098176,1298100223,SE +1298100224,1298102271,GB +1298102272,1298104319,CH +1298104320,1298106367,RU +1298106368,1298108415,IT +1298108416,1298110463,FI +1298110464,1298112511,ES +1298112512,1298114559,IE +1298114560,1298116607,IT +1298116608,1298118655,RU +1298118656,1298120703,AM +1298120704,1298122751,CZ +1298122752,1298124799,RU +1298124800,1298126847,IT +1298126848,1298127615,SA +1298127616,1298128127,IR +1298128128,1298128895,SA +1298128896,1298130943,FR +1298130944,1298132991,BG +1298132992,1298135039,FI +1298135040,1298137087,NL +1298137088,1298661375,GB +1298661376,1298677759,FR +1298677760,1298694143,IR +1298694144,1298710527,HR +1298710528,1298726911,CZ +1298726912,1298743295,RS +1298743296,1298759679,FI +1298759680,1298776063,RU +1298776064,1298792447,SE +1298792448,1298825215,RU +1298825216,1298841599,NO +1298841600,1298857983,RU +1298857984,1298874367,SE +1298874368,1298907135,GB +1298907136,1298923519,IE +1298923520,1298939903,IT +1298939904,1298956287,RU +1298956288,1298972671,GB +1298972672,1298989055,RU +1298989056,1299005439,UA +1299005440,1299009535,NL +1299009536,1299011583,RU +1299011584,1299011839,FR +1299011840,1299012095,DE +1299012096,1299012607,BE +1299012608,1299013119,GB +1299013120,1299013375,FR +1299013376,1299013631,DE +1299013632,1299021823,BE +1299021824,1299024679,CH +1299024680,1299024687,DE +1299024688,1299037695,CH +1299037696,1299037951,US +1299037952,1299038207,CH +1299038208,1299054591,FI +1299054592,1299070975,SE +1299070976,1299075071,SA +1299075072,1299087359,LB +1299087360,1299103743,HU +1299103744,1299120127,NO +1299120128,1299136511,SI +1299136512,1299169279,HU +1299169280,1299174399,FR +1299174400,1299176447,GB +1299176448,1299177471,FR +1299177472,1299179519,DE +1299179520,1299185663,FR +1299185664,1299447807,PL +1299447808,1299709951,AT +1299709952,1299972095,UA +1299972096,1300234239,IL +1300234240,1302331391,DE +1302331392,1303379967,NL +1303379968,1304428543,DE +1304428544,1305477119,FR +1305477120,1305739263,ES +1305739264,1306001407,DK +1306001408,1306263551,FR +1306263552,1306271743,KE +1306271744,1306279935,RU +1306279936,1306288127,IT +1306288128,1306296319,AT +1306296320,1306311143,RU +1306311144,1306311151,CH +1306311152,1306312703,RU +1306312704,1306320895,UZ +1306320896,1306329087,DE +1306329088,1306337279,BA +1306337280,1306345471,HU +1306345472,1306353663,LT +1306353664,1306361855,SA +1306361856,1306370047,RU +1306370048,1306378239,GB +1306378240,1306386431,RU +1306386432,1306394623,DK +1306394624,1306402815,ME +1306402816,1306411007,RU +1306411008,1306413199,NL +1306413200,1306413215,BE +1306413216,1306419199,NL +1306419200,1306427391,RU +1306427392,1306435583,UA +1306435584,1306451967,NO +1306451968,1306460159,PL +1306460160,1306468351,IT +1306468352,1306476543,FI +1306476544,1306492927,RU +1306492928,1306501119,TR +1306501120,1306509311,NO +1306509312,1306525695,PL +1306525696,1307049983,ES +1307049984,1307066367,RU +1307069696,1307069823,DE +1307069856,1307069887,DE +1307074560,1307082751,SA +1307082752,1307090943,RU +1307090944,1307099135,GB +1307099136,1307107327,RO +1307107328,1307115519,DE +1307115520,1307123711,RU +1307123712,1307131903,NL +1307131904,1307140095,EE +1307140096,1307148287,FR +1307148288,1307156479,GB +1307156480,1307172863,RU +1307172864,1307181055,DK +1307181056,1307189247,RU +1307189248,1307197439,DE +1307197440,1307205631,HU +1307205632,1307213823,FI +1307213824,1307222015,SI +1307222016,1307230207,DK +1307230208,1307238399,RU +1307238400,1307246591,SK +1307246592,1307254783,KG +1307254784,1307255551,NL +1307255552,1307255807,GR +1307255808,1307262975,NL +1307262976,1307271167,AT +1307271168,1307279359,MD +1307279360,1307287551,LB +1307287552,1307295743,DE +1307295744,1307303935,RU +1307303936,1307312127,SE +1307312128,1307320319,PL +1307320320,1307336703,RU +1307336704,1307344895,DE +1307344896,1307353087,RU +1307353088,1307361279,BG +1307361280,1307369471,CZ +1307369472,1307377663,RU +1307377664,1307385855,PL +1307385856,1307394047,AT +1307394048,1307402239,IR +1307402240,1307410431,HR +1307410432,1307418623,CZ +1307418624,1307426815,IR +1307426816,1307435007,CH +1307435008,1307443199,DE +1307443200,1307451391,IT +1307451392,1307459583,SE +1307459584,1307484159,RU +1307484160,1307488767,GB +1307488768,1307489023,IE +1307489024,1307491327,GB +1307491328,1307491839,IE +1307491840,1307492351,GB +1307492352,1307500543,BA +1307500544,1307508735,RU +1307508736,1307516927,BA +1307516928,1307525119,CH +1307525120,1307533311,BA +1307533312,1307541503,GB +1307541504,1307549695,IT +1307549696,1307557887,UA +1307557888,1307574271,RU +1307574272,1307578367,GB +1307578368,1307582463,FI +1307582464,1307586559,KZ +1307586560,1307590655,GB +1307590656,1307594751,SE +1307594752,1307598847,SA +1307598848,1307602943,CZ +1307602944,1307607039,ES +1307607040,1307611135,SA +1307611136,1307619327,RU +1307619328,1307623423,CZ +1307623424,1307627519,FR +1307627520,1307631615,SE +1307631616,1307635711,IT +1307635712,1307636991,EE +1307636992,1307637031,LV +1307637032,1307638015,EE +1307638016,1307638095,LT +1307638096,1307638375,EE +1307638376,1307638383,LT +1307638384,1307638447,EE +1307638448,1307638463,LT +1307638464,1307638575,EE +1307638576,1307638607,LT +1307638608,1307638783,EE +1307638784,1307639295,LT +1307639296,1307639807,EE +1307639808,1307643903,IT +1307643904,1307652095,RU +1307652096,1307656191,ES +1307656192,1307660287,JO +1307660288,1307662335,BE +1307662336,1307662351,NL +1307662352,1307662359,GB +1307662360,1307662367,FR +1307662368,1307664383,BE +1307664384,1307668479,NO +1307668480,1307672575,ES +1307672576,1307674623,SE +1307674624,1307676671,DK +1307676672,1307680767,RU +1307680768,1307684863,LV +1307684864,1307688959,GB +1307688960,1307693055,LT +1307693056,1307697151,IT +1307697152,1307701247,NL +1307701248,1307709439,RU +1307709440,1307713535,AL +1307713536,1307717631,IT +1307717632,1307721727,DK +1307721728,1307725823,AT +1307725824,1307729919,CZ +1307729920,1307734015,RU +1307734016,1307738111,NL +1307738112,1307742207,IT +1307742208,1307746303,HU +1307746304,1307750399,UA +1307750400,1307754495,IT +1307754496,1307755519,US +1307755520,1307756031,GB +1307756032,1307756287,US +1307756288,1307756543,GB +1307756544,1307757567,FR +1307757568,1307758591,GB +1307758592,1307762687,SM +1307762688,1307766783,PL +1307766784,1307770879,GB +1307770880,1307774975,RU +1307774976,1307777023,CS +1307777024,1307778047,RS +1307778048,1307779071,CS +1307779072,1307787263,DK +1307787264,1307791359,MT +1307791360,1307795455,KZ +1307795456,1307803647,RU +1307803648,1307807743,DK +1307807744,1307811839,SE +1307811840,1307815935,NL +1307815936,1307819791,BE +1307820032,1307824127,ES +1307824128,1307828223,HU +1307828224,1307832319,NL +1307832320,1307836415,RU +1307836416,1307840511,SE +1307840512,1307844607,RU +1307844608,1307848703,UA +1307848704,1307852799,CH +1307852800,1307856895,RU +1307856896,1307860991,IT +1307860992,1307865087,DE +1307865088,1307869183,AZ +1307869184,1307873279,GB +1307873280,1307877375,TJ +1307877376,1307881471,RU +1307881472,1307885567,IT +1307885568,1307886095,DK +1307886096,1307886103,SE +1307886104,1307886975,DK +1307886976,1307887103,SE +1307887104,1307889663,DK +1307889664,1307893759,RU +1307893760,1307897855,SE +1307897856,1307901951,AT +1307901952,1307906047,JO +1307906048,1307906599,CH +1307906600,1307906607,DK +1307906608,1307910143,CH +1307910144,1307914239,DE +1307914240,1307918335,NL +1307918336,1307919439,GB +1307919440,1307919447,ES +1307919448,1307919503,GB +1307919504,1307919511,ES +1307919512,1307920575,GB +1307920576,1307920583,AU +1307920584,1307922431,GB +1307922432,1307926527,NL +1307926528,1307930623,KZ +1307930624,1307934719,RU +1307934720,1307938815,FR +1307938816,1307942911,TR +1307942912,1307947007,RU +1307947008,1307951103,CH +1307951104,1307959295,RU +1307959296,1307963391,IR +1307963392,1307967487,PL +1307967488,1307971583,IT +1307971584,1307980799,GB +1307980800,1307981823,ZW +1307981824,1307983871,GB +1307983872,1307987967,LB +1307987968,1307992063,FR +1307992064,1307996159,RU +1307996160,1308000255,DE +1308000256,1308004351,CH +1308004352,1308008447,RU +1308008448,1308012543,GB +1308012544,1308016639,ES +1308016640,1308020735,FI +1308020736,1308024831,BG +1308024832,1308033023,RU +1308033024,1308033279,NL +1308033280,1308033535,FR +1308033536,1308033791,DE +1308033792,1308034047,IT +1308034048,1308034559,DE +1308034560,1308034815,CZ +1308034816,1308035327,DE +1308035328,1308035583,GB +1308035584,1308037119,DE +1308037120,1308041215,UA +1308041216,1308049407,RU +1308049408,1308053503,DK +1308053504,1308057599,RU +1308057600,1308061695,GR +1308061696,1308069887,RU +1308069888,1308073983,NO +1308073984,1308078079,RU +1308078080,1308078599,NL +1308078600,1308078601,RU +1308078602,1308078605,NL +1308078606,1308078607,PL +1308078608,1308080127,NL +1308080128,1308082175,RU +1308082176,1308084223,GB +1308084224,1308086271,RS +1308086272,1308088319,RU +1308088320,1308090367,UA +1308090368,1308092415,SK +1308092416,1308094463,RU +1308094464,1308096511,KW +1308096512,1308098559,RS +1308098560,1308360703,NL +1308360704,1308622847,PL +1308622848,1308884991,HR +1308884992,1309147135,IT +1309147136,1309409279,PL +1309409280,1309671423,IT +1309671424,1309933567,IE +1309933568,1310195711,BE +1310195712,1310197759,RU +1310197760,1310199807,CZ +1310199808,1310201855,IE +1310201856,1310203903,RU +1310203904,1310204159,BE +1310204160,1310204191,FR +1310204192,1310204255,BE +1310204256,1310204271,FR +1310204272,1310204695,BE +1310204696,1310204707,FR +1310204708,1310205951,BE +1310205952,1310207999,RU +1310208000,1310210047,MD +1310210048,1310212095,RU +1310212096,1310214143,HU +1310214144,1310216191,UA +1310216192,1310218239,IT +1310218240,1310220287,NO +1310220288,1310222335,NL +1310222336,1310224383,RS +1310224384,1310226431,GB +1310226432,1310228479,BE +1310228480,1310230527,FR +1310230528,1310232575,ES +1310232576,1310234623,NO +1310234624,1310236671,RU +1310236672,1310238719,KZ +1310238720,1310240767,BE +1310240768,1310242815,RU +1310242816,1310244863,HU +1310244864,1310246911,EE +1310246912,1310246927,FR +1310246928,1310246943,ES +1310246944,1310246959,IT +1310246960,1310246975,AT +1310246976,1310246991,PT +1310246992,1310247007,NL +1310247008,1310247023,GB +1310247024,1310247039,GR +1310247040,1310247055,TR +1310247056,1310247071,SE +1310247072,1310247087,NO +1310247088,1310247103,AR +1310247104,1310247119,PL +1310247120,1310247135,IE +1310247136,1310247151,DK +1310247152,1310247167,RU +1310247168,1310247183,IL +1310247184,1310247199,BR +1310247200,1310247215,CZ +1310247216,1310247231,BG +1310247232,1310247247,RO +1310247248,1310247263,CN +1310247264,1310247279,LT +1310247280,1310247295,CY +1310247296,1310247311,JP +1310247312,1310247327,HU +1310247328,1310247343,DE +1310247344,1310247359,FI +1310247360,1310247375,LV +1310247376,1310247391,IN +1310247392,1310247407,US +1310247408,1310247423,CA +1310247424,1310247431,IL +1310247432,1310247439,BR +1310247440,1310247447,CZ +1310247448,1310247463,BG +1310247464,1310247471,CN +1310247472,1310247479,LT +1310247480,1310247487,CY +1310247488,1310247495,JP +1310247496,1310247503,HU +1310247504,1310247511,DE +1310247512,1310247519,FI +1310247520,1310247527,LV +1310247528,1310247535,IN +1310247536,1310247543,US +1310247544,1310247551,CA +1310247552,1310247559,FR +1310247560,1310247567,ES +1310247568,1310247575,IT +1310247576,1310247583,AT +1310247584,1310247591,PT +1310247592,1310247599,NL +1310247600,1310247607,GB +1310247608,1310247615,GR +1310247616,1310247623,TR +1310247624,1310247631,SE +1310247632,1310247639,NO +1310247640,1310247647,AR +1310247648,1310247655,PL +1310247656,1310247663,IE +1310247664,1310247671,DK +1310247672,1310247679,RU +1310247680,1310247687,IL +1310247688,1310247695,BR +1310247696,1310247703,CZ +1310247704,1310247711,BG +1310247712,1310247719,RO +1310247720,1310247727,CN +1310247728,1310247735,LT +1310247736,1310247743,CY +1310247744,1310247751,JP +1310247752,1310247759,HU +1310247760,1310247767,DE +1310247768,1310247775,FI +1310247776,1310247783,LV +1310247784,1310247791,IN +1310247792,1310247799,US +1310247800,1310247807,CA +1310247808,1310247815,FR +1310247816,1310247823,ES +1310247824,1310247831,IT +1310247832,1310247839,AT +1310247840,1310247847,PT +1310247848,1310247855,NL +1310247856,1310247863,GB +1310247864,1310247871,GR +1310247872,1310247879,TR +1310247880,1310247887,SE +1310247888,1310247895,NO +1310247896,1310247903,AR +1310247904,1310247911,PL +1310247912,1310247919,IE +1310247920,1310247927,DK +1310247928,1310247935,RU +1310247936,1310248447,CH +1310248448,1310248455,IL +1310248456,1310248463,BR +1310248464,1310248487,FR +1310248488,1310248495,CN +1310248496,1310248503,FR +1310248504,1310248511,CY +1310248512,1310248519,JP +1310248520,1310248527,HU +1310248528,1310248535,DE +1310248536,1310248543,FI +1310248544,1310248551,LV +1310248552,1310248559,IN +1310248560,1310248567,US +1310248568,1310248575,CA +1310248576,1310248583,FR +1310248584,1310248591,ES +1310248592,1310248599,IT +1310248600,1310248607,AT +1310248608,1310248615,PT +1310248616,1310248623,NL +1310248624,1310248631,GB +1310248632,1310248639,GR +1310248640,1310248647,TR +1310248648,1310248655,SE +1310248656,1310248663,NO +1310248664,1310248671,AR +1310248672,1310248679,PL +1310248680,1310248687,IE +1310248688,1310248695,DK +1310248696,1310248703,RU +1310248704,1310248959,CH +1310248960,1310249215,IM +1310249216,1310249279,GB +1310249280,1310250495,IM +1310250496,1310251007,MT +1310251008,1310253055,LU +1310253056,1310255103,RU +1310255104,1310257151,CZ +1310257152,1310259199,FR +1310259200,1310261247,DE +1310261248,1310277631,UA +1310277632,1310310399,RU +1310310400,1310326783,GB +1310326784,1310343167,NO +1310343168,1310359551,IT +1310359552,1310392319,UA +1310392320,1310408703,NL +1310408704,1310425087,FI +1310425088,1310457855,UA +1310457856,1310474239,PL +1310474240,1310490623,EE +1310490624,1310507007,BA +1310507008,1310523391,LV +1310523392,1310556159,RU +1310556160,1310572543,PT +1310572544,1310588927,BE +1310588928,1310605311,RU +1310605312,1310621695,PL +1310621696,1310638079,RS +1310638080,1310654463,UA +1310654464,1310656511,RU +1310656512,1310658559,LU +1310658560,1310660607,RU +1310660608,1310662655,CZ +1310662656,1310664703,DK +1310664704,1310666751,FR +1310666752,1310668799,NL +1310668800,1310670847,RO +1310670848,1310672895,DE +1310672896,1310674943,RU +1310674944,1310676991,NO +1310676992,1310679039,PL +1310679040,1310681087,RU +1310681088,1310683135,GB +1310683136,1310685183,NL +1310685184,1310687231,PL +1310687232,1310689279,RO +1310689280,1310695423,PL +1310695424,1310697471,RO +1310697472,1310699519,DE +1310699520,1310707711,UA +1310707712,1310711807,RU +1310711808,1310713855,LT +1310713856,1310715903,UA +1310715904,1310717951,RU +1310717952,1310719999,UA +1310720000,1310851071,GB +1310851072,1310982143,DE +1310982144,1311113215,RU +1311113216,1311244287,IR +1311244288,1311246335,MK +1311246336,1311248383,IT +1311248384,1311250431,GB +1311250432,1311252479,RU +1311252480,1311254527,GB +1311254528,1311256575,SE +1311256576,1311258623,FR +1311258624,1311262719,GB +1311262720,1311262975,FR +1311262976,1311264767,CH +1311264768,1311266815,RU +1311266816,1311268863,FR +1311268864,1311270911,BE +1311270912,1311272959,RU +1311272960,1311275007,GB +1311275008,1311277055,FR +1311277056,1311279103,IT +1311279104,1311281151,BG +1311281152,1311285247,GB +1311285248,1311289343,IT +1311289344,1311291391,LB +1311291392,1311293439,RU +1311293440,1311295487,NL +1311295488,1311297535,IT +1311297536,1311299583,AT +1311299584,1311301631,RU +1311301632,1311303679,TR +1311303680,1311307775,GB +1311307776,1311309823,IS +1311309824,1311311871,GB +1311311872,1311315967,CZ +1311315968,1311316423,PL +1311316424,1311316439,GB +1311316440,1311316447,PL +1311316448,1311316455,HR +1311316456,1311318015,PL +1311318016,1311320063,RU +1311320064,1311322111,FR +1311322112,1311324159,IT +1311324160,1311326207,LB +1311326208,1311328255,BE +1311328256,1311330559,NL +1311330560,1311330847,DE +1311330848,1311330879,NL +1311330880,1311330943,DE +1311330944,1311331327,NL +1311331328,1311332351,DE +1311332352,1311338495,RU +1311338496,1311340543,AT +1311340544,1311342591,NO +1311342592,1311344639,FR +1311344640,1311346687,NO +1311346688,1311348735,AT +1311348736,1311350783,GB +1311350784,1311352831,RU +1311352832,1311354879,SK +1311354880,1311356927,RU +1311356928,1311358263,FR +1311358264,1311358271,ES +1311358272,1311358975,FR +1311358976,1311361023,RU +1311361024,1311363071,NL +1311363072,1311365119,GB +1311365120,1311367167,DE +1311367168,1311367295,GN +1311367296,1311367423,GA +1311367424,1311367679,MM +1311367680,1311367711,UG +1311367712,1311367743,CD +1311367744,1311367775,SL +1311367776,1311367807,LR +1311367808,1311367839,US +1311367840,1311367871,DK +1311367872,1311367887,LR +1311367888,1311367895,DE +1311367896,1311367935,DK +1311367936,1311367967,BJ +1311367968,1311368191,DE +1311368192,1311368319,BD +1311368320,1311368447,CF +1311368448,1311368575,TZ +1311368576,1311368703,PG +1311368704,1311368831,NP +1311368832,1311368959,GM +1311368960,1311369087,PT +1311369088,1311369215,BT +1311369216,1311371263,FR +1311371264,1311373311,SE +1311373312,1311375359,FR +1311375360,1311506431,DE +1311506432,1311637503,CZ +1311637504,1312292863,DE +1312292864,1312817151,LT +1312817152,1313865727,SE +1313865728,1313931263,CZ +1313931264,1313996799,RU +1313996800,1314062335,SE +1314062336,1314127871,BG +1314127872,1314193407,LV +1314193408,1314258943,RU +1314258944,1314324479,GB +1314324480,1314357247,GR +1314357248,1314372352,CY +1314372353,1314390015,GR +1314390016,1314455551,PL +1314455552,1314521087,KW +1314521088,1314586623,BG +1314586624,1314652159,NO +1314652160,1314717695,HU +1314717696,1314783231,SA +1314783232,1314848767,DE +1314848768,1315045375,RO +1315045376,1315176447,SK +1315176448,1315307519,QA +1315307520,1315438591,CZ +1315438592,1315504127,AT +1315504128,1315569663,GB +1315569664,1315700735,RU +1315700736,1315704831,SE +1315704832,1315708927,HU +1315708928,1315713023,GR +1315713024,1315717119,SE +1315717120,1315725311,RU +1315725312,1315729407,CZ +1315733504,1315737599,NL +1315737600,1315741695,CZ +1315741696,1315745791,LB +1315745792,1315749887,CZ +1315749888,1315753983,RU +1315753984,1315758079,KZ +1315758080,1315762175,FR +1315762176,1315766271,BG +1315766272,1315770367,NL +1315770368,1315770391,UA +1315770392,1315770399,NA +1315770400,1315770503,UA +1315770504,1315770511,NA +1315770512,1315770575,UA +1315770576,1315770583,NA +1315770584,1315770591,UA +1315770592,1315770599,NA +1315770600,1315770624,UA +1315770625,1315770631,NA +1315770632,1315770719,UA +1315770720,1315770727,NA +1315770728,1315770975,UA +1315770976,1315770999,NA +1315771000,1315771007,UA +1315771008,1315771015,NA +1315771016,1315771127,UA +1315771128,1315771135,NA +1315771136,1315771199,UA +1315771200,1315771207,NA +1315771208,1315771223,UA +1315771224,1315771231,NA +1315771232,1315771247,UA +1315771248,1315771263,NA +1315771264,1315771415,UA +1315771416,1315771423,NA +1315771424,1315771639,UA +1315771640,1315771647,NA +1315771648,1315771759,UA +1315771760,1315771767,NA +1315771768,1315771815,UA +1315771816,1315771823,NA +1315771824,1315771871,UA +1315771872,1315771879,NA +1315771880,1315771935,UA +1315771936,1315771951,NA +1315771952,1315771959,UA +1315771960,1315771967,NA +1315771968,1315771975,UA +1315771976,1315771983,NA +1315771984,1315772031,UA +1315772032,1315772047,NA +1315772048,1315772303,UA +1315772304,1315772311,NA +1315772312,1315772319,UA +1315772320,1315772327,NA +1315772328,1315772399,UA +1315772400,1315772407,NA +1315772408,1315772463,UA +1315772464,1315772479,NA +1315772480,1315772503,UA +1315772504,1315772511,NA +1315772512,1315772583,UA +1315772584,1315772599,NA +1315772600,1315772703,UA +1315772704,1315772711,NA +1315772712,1315772791,UA +1315772792,1315772799,NA +1315772800,1315772887,UA +1315772888,1315772895,NA +1315772896,1315772919,UA +1315772920,1315772927,NA +1315772928,1315773463,UA +1315773464,1315773471,NA +1315773472,1315773487,UA +1315773488,1315773495,NA +1315773496,1315773511,UA +1315773512,1315773519,NA +1315773520,1315773535,UA +1315773536,1315773543,NA +1315773544,1315773551,UA +1315773552,1315773567,NA +1315773568,1315773575,UA +1315773576,1315773583,NA +1315773584,1315773679,UA +1315773680,1315773687,NA +1315773688,1315773703,UA +1315773704,1315773711,NA +1315773712,1315773719,UA +1315773720,1315773751,NA +1315773752,1315773895,UA +1315773896,1315773903,NA +1315773904,1315773955,UA +1315773956,1315773959,NA +1315773960,1315773983,UA +1315773984,1315773991,BY +1315773992,1315774015,UA +1315774016,1315774031,NA +1315774032,1315774039,UA +1315774040,1315774071,NA +1315774072,1315774135,UA +1315774136,1315774143,US +1315774144,1315774191,UA +1315774192,1315774207,NA +1315774208,1315774223,UA +1315774224,1315774231,NA +1315774232,1315774239,UA +1315774240,1315774255,RU +1315774256,1315774263,NA +1315774264,1315774423,UA +1315774424,1315774431,NA +1315774432,1315774463,UA +1315774464,1315782655,RU +1315782656,1315786751,AM +1315786752,1315790847,FR +1315790848,1315794943,RS +1315794944,1315803135,RU +1315803136,1315807231,KZ +1315807232,1315815423,GB +1315815424,1315819519,IR +1315819520,1315823615,DK +1315823616,1315827711,IQ +1315827712,1315831807,RU +1315831808,1315835903,SA +1315835904,1315836159,CY +1315836160,1315839487,MT +1315839488,1315839743,CY +1315839744,1315839999,MT +1315840000,1315844095,EE +1315844096,1315848191,RU +1315848192,1315852287,SA +1315852288,1315856383,SE +1315856384,1315860479,SY +1315860480,1315864575,IR +1315864576,1315868671,CH +1315868672,1315872767,RU +1315872768,1315873055,GB +1315873056,1315873063,RU +1315873064,1315875183,GB +1315875184,1315875199,ES +1315875200,1315876607,GB +1315876608,1315876863,RU +1315876864,1315880959,IT +1315880960,1315885055,BE +1315885056,1315889151,CZ +1315889152,1315893247,DE +1315893248,1315897343,RU +1315897344,1315897855,IR +1315897856,1315897919,AE +1315897920,1315897951,IR +1315897952,1315897991,AE +1315897992,1315897999,IR +1315898000,1315898111,AE +1315898112,1315898367,IR +1315898368,1315898431,AE +1315898432,1315898447,IR +1315898448,1315898623,AE +1315898624,1315901439,IR +1315901440,1315905535,UA +1315905536,1315907583,BA +1315907584,1315909631,SI +1315909632,1315913727,AZ +1315913728,1315917823,DE +1315917824,1315921919,RU +1315921920,1315926015,TR +1315930112,1315934207,DE +1315934208,1315938303,RU +1315938304,1315942399,DK +1315942400,1315946495,UA +1315946496,1315950591,GB +1315950592,1315954687,UA +1315954688,1315958783,DE +1315958784,1315962879,RU +1315962880,1317011455,FR +1317011456,1317044223,BG +1317044224,1317076991,CZ +1317076992,1317109759,BE +1317109760,1317113279,GB +1317113280,1317113343,RU +1317113344,1317113855,GB +1317113856,1317114111,AE +1317114112,1317115135,GB +1317115136,1317115391,IE +1317115392,1317115647,CN +1317115648,1317118207,GB +1317118208,1317118463,IN +1317118464,1317119103,GB +1317119104,1317119167,IT +1317119168,1317119487,GB +1317119488,1317119743,KY +1317119744,1317126399,GB +1317126400,1317126655,US +1317126656,1317129087,GB +1317129088,1317129151,TR +1317129152,1317129279,GB +1317129280,1317129343,CA +1317129344,1317129471,GB +1317129472,1317129727,IT +1317129728,1317132287,GB +1317132288,1317132543,IL +1317132544,1317132735,GB +1317132736,1317132799,CA +1317132800,1317133823,GB +1317133824,1317134079,FI +1317134080,1317134655,GB +1317134656,1317134719,CN +1317134720,1317137279,GB +1317137280,1317137343,CN +1317137344,1317137663,GB +1317137664,1317137919,SE +1317137920,1317139967,GB +1317139968,1317140095,BY +1317140096,1317141247,GB +1317141248,1317141503,CA +1317141504,1317142143,GB +1317142144,1317142271,CA +1317142272,1317142527,GB +1317142528,1317175295,PT +1317175296,1317208063,BG +1317208064,1317240831,HU +1317240832,1317273599,PL +1317273600,1317306367,AT +1317306368,1317339135,RU +1317339136,1317371903,MT +1317371904,1317404671,PL +1317404672,1317437439,IT +1317437440,1317470207,HR +1317470208,1317478399,TR +1317478400,1317480447,CY +1317480448,1317494783,TR +1317494784,1317495807,CY +1317495808,1317502719,TR +1317502720,1317502975,CY +1317502976,1317535743,IE +1317535744,1317552127,GB +1317552128,1317568511,ES +1317568512,1317584895,CZ +1317584896,1317601279,RU +1317601280,1317617663,UA +1317617664,1317634047,RU +1317634048,1317646895,IE +1317646896,1317646911,GB +1317646912,1317646991,IE +1317646992,1317646999,GB +1317647000,1317649407,IE +1317649408,1317649919,GB +1317649920,1317650431,IE +1317650432,1317666815,RU +1317666816,1317666823,NG +1317666824,1317666831,CD +1317666832,1317666839,NG +1317666840,1317666871,GH +1317666872,1317666879,NG +1317666880,1317666887,LR +1317666888,1317666919,NG +1317666920,1317666935,GB +1317666936,1317666943,NG +1317666944,1317666951,GB +1317666952,1317666967,NG +1317666968,1317666983,GB +1317666984,1317666991,CM +1317666992,1317666999,GB +1317667000,1317667007,AO +1317667008,1317667015,GH +1317667016,1317667023,NG +1317667024,1317667031,LR +1317667032,1317667039,NG +1317667040,1317667047,GH +1317667048,1317667055,NG +1317667056,1317667063,LR +1317667064,1317667087,AO +1317667088,1317667095,NG +1317667096,1317667103,GH +1317667104,1317667111,NG +1317667112,1317667119,GH +1317667120,1317667127,GB +1317667128,1317667135,NG +1317667136,1317667143,AO +1317667144,1317667159,NG +1317667160,1317667167,AO +1317667168,1317667175,NG +1317667176,1317667191,GH +1317667192,1317667231,NG +1317667232,1317667239,GH +1317667240,1317667263,NG +1317667264,1317667271,GB +1317667272,1317667295,NG +1317667296,1317667303,GB +1317667304,1317667311,NG +1317667312,1317667327,GB +1317667328,1317667351,NG +1317667352,1317667367,AO +1317667368,1317667375,NG +1317667376,1317667391,AO +1317667392,1317667399,NG +1317667400,1317667423,GB +1317667424,1317667431,TD +1317667432,1317667439,GH +1317667440,1317667455,GB +1317667456,1317667487,NG +1317667488,1317667495,GH +1317667496,1317667503,NG +1317667504,1317667527,GB +1317667528,1317667535,AO +1317667536,1317667543,GB +1317667544,1317667551,AO +1317667552,1317667567,NG +1317667568,1317667583,GB +1317667584,1317667759,NG +1317667760,1317667767,FR +1317667768,1317667775,ZA +1317667776,1317667783,CD +1317667784,1317667807,NG +1317667808,1317667815,GB +1317667816,1317667823,NG +1317667824,1317667831,GB +1317667832,1317667839,GN +1317667840,1317668095,GB +1317668096,1317668103,GH +1317668104,1317668111,ZM +1317668112,1317668119,NG +1317668120,1317668127,AO +1317668128,1317668135,GB +1317668136,1317668143,NG +1317668144,1317668151,AO +1317668152,1317668183,NG +1317668184,1317668191,CI +1317668192,1317668199,NG +1317668200,1317668207,BW +1317668208,1317668215,LR +1317668216,1317668223,GB +1317668224,1317668239,NG +1317668240,1317668247,LR +1317668248,1317668263,NG +1317668264,1317668271,AO +1317668272,1317668279,SL +1317668280,1317668311,NG +1317668312,1317668319,IQ +1317668320,1317668343,NG +1317668344,1317668351,AO +1317668352,1317668367,SL +1317668368,1317668399,NG +1317668400,1317668407,GB +1317668408,1317668415,GH +1317668416,1317668447,NG +1317668448,1317668455,GB +1317668456,1317668463,NG +1317668464,1317668471,AO +1317668472,1317668479,GH +1317668480,1317668487,NG +1317668488,1317668495,GB +1317668496,1317668503,GH +1317668504,1317668511,CD +1317668512,1317668519,IQ +1317668520,1317668527,MZ +1317668528,1317668535,AO +1317668536,1317668543,BJ +1317668544,1317668551,UG +1317668552,1317668559,AO +1317668560,1317668583,NG +1317668584,1317668591,LR +1317668592,1317668607,NG +1317668608,1317668615,GH +1317668616,1317668623,NG +1317668624,1317668631,SL +1317668632,1317668639,GB +1317668640,1317668735,NG +1317668736,1317668751,AO +1317668752,1317668759,GB +1317668760,1317668767,IQ +1317668768,1317668775,LR +1317668776,1317668791,NG +1317668792,1317668807,AO +1317668808,1317668823,NG +1317668824,1317668831,AO +1317668832,1317668855,NG +1317668856,1317668863,GH +1317668864,1317668871,LR +1317668872,1317668879,NG +1317668880,1317668887,GB +1317668888,1317668895,SL +1317668896,1317668983,NG +1317668984,1317668991,GB +1317668992,1317668999,NG +1317669000,1317669007,CD +1317669008,1317669031,NG +1317669032,1317669039,TD +1317669040,1317669047,CD +1317669048,1317669055,GB +1317669056,1317669119,NG +1317669120,1317669375,GE +1317669376,1317669631,CG +1317669632,1317669887,GB +1317669888,1317669895,AO +1317669896,1317669911,NG +1317669912,1317669919,GH +1317669920,1317669983,NG +1317669984,1317669991,LR +1317669992,1317670015,NG +1317670016,1317670031,GB +1317670032,1317670103,NG +1317670104,1317670111,CD +1317670112,1317670143,NG +1317670144,1317670175,SL +1317670176,1317670223,NG +1317670224,1317670231,AO +1317670232,1317670239,GB +1317670240,1317670263,NG +1317670264,1317670271,GB +1317670272,1317670399,NG +1317670400,1317670415,CD +1317670416,1317670447,NG +1317670448,1317670455,IQ +1317670456,1317670471,NG +1317670472,1317670479,CO +1317670480,1317670487,GB +1317670488,1317670511,NG +1317670512,1317670519,CI +1317670520,1317670543,NG +1317670544,1317670551,IQ +1317670552,1317670567,NG +1317670568,1317670575,BI +1317670576,1317670583,NG +1317670584,1317670599,GH +1317670600,1317670607,AO +1317670608,1317670639,NG +1317670640,1317670647,GB +1317670648,1317670671,NG +1317670672,1317670679,CM +1317670680,1317670711,NG +1317670712,1317670719,GH +1317670720,1317670727,NG +1317670728,1317670735,GH +1317670736,1317670743,AO +1317670744,1317670767,NG +1317670768,1317670775,GH +1317670776,1317670783,GB +1317670784,1317670791,GH +1317670792,1317670807,NG +1317670808,1317670815,AO +1317670816,1317670823,NG +1317670824,1317670831,CD +1317670832,1317670855,NG +1317670856,1317670863,CD +1317670864,1317670871,GB +1317670872,1317670887,NG +1317670888,1317670895,AO +1317670896,1317670896,GB +1317670897,1317670911,NG +1317670912,1317671167,GB +1317671168,1317671175,AO +1317671176,1317671191,NG +1317671192,1317671199,SL +1317671200,1317671207,CI +1317671208,1317671239,NG +1317671240,1317671247,CI +1317671248,1317671255,NG +1317671256,1317671263,CI +1317671264,1317671335,NG +1317671336,1317671343,BW +1317671344,1317671351,CD +1317671352,1317671383,NG +1317671384,1317671391,CI +1317671392,1317671399,NG +1317671400,1317671407,IQ +1317671408,1317671487,NG +1317671488,1317671511,AO +1317671512,1317671519,NG +1317671520,1317671527,AO +1317671528,1317671543,NG +1317671544,1317671551,GH +1317671552,1317671559,LR +1317671560,1317671575,GB +1317671576,1317671576,NG +1317671577,1317671583,GB +1317671584,1317671607,NG +1317671608,1317671615,GH +1317671616,1317671623,NG +1317671624,1317671631,SL +1317671632,1317671639,NG +1317671640,1317671647,SL +1317671648,1317671663,NG +1317671664,1317671671,SL +1317671672,1317671679,NG +1317671680,1317671687,LR +1317671688,1317671743,NG +1317671744,1317671759,GB +1317671760,1317671767,NG +1317671768,1317671775,GB +1317671776,1317671807,NG +1317671808,1317671823,CI +1317671824,1317671831,NG +1317671832,1317671839,GH +1317671840,1317671847,AO +1317671848,1317671895,NG +1317671896,1317671903,GH +1317671904,1317671911,NG +1317671912,1317671919,AO +1317671920,1317671927,NG +1317671928,1317671935,GH +1317671936,1317672447,GA +1317672448,1317672479,NG +1317672480,1317672487,ZM +1317672488,1317672583,NG +1317672584,1317672591,CD +1317672592,1317672607,NG +1317672608,1317672615,CM +1317672616,1317672631,NG +1317672632,1317672639,GB +1317672640,1317672655,NG +1317672656,1317672663,CD +1317672664,1317672719,NG +1317672720,1317672727,LR +1317672728,1317672735,NG +1317672736,1317672743,LR +1317672744,1317672751,GB +1317672752,1317672767,NG +1317672768,1317672775,GB +1317672776,1317672783,NG +1317672784,1317672791,AO +1317672792,1317672799,GB +1317672800,1317672807,RW +1317672808,1317672815,TD +1317672816,1317672823,BW +1317672824,1317672831,NG +1317672832,1317672839,GB +1317672840,1317672903,NG +1317672904,1317672919,CI +1317672920,1317672927,GH +1317672928,1317672935,NG +1317672936,1317672943,LR +1317672944,1317672951,NG +1317672952,1317672959,AO +1317672960,1317673239,NG +1317673240,1317673247,ZW +1317673248,1317673287,NG +1317673288,1317673295,LR +1317673296,1317673319,NG +1317673320,1317673327,LR +1317673328,1317673335,NG +1317673336,1317673351,GB +1317673352,1317673407,NG +1317673408,1317673415,GB +1317673416,1317673423,CI +1317673424,1317673431,NG +1317673432,1317673463,AO +1317673464,1317673487,NG +1317673488,1317673495,HK +1317673496,1317673527,NG +1317673528,1317673535,GB +1317673536,1317673575,NG +1317673576,1317673583,CD +1317673584,1317673591,GB +1317673592,1317673599,NG +1317673600,1317673607,GB +1317673608,1317673631,NG +1317673632,1317673639,CD +1317673640,1317673647,AO +1317673648,1317673671,NG +1317673672,1317673679,GB +1317673680,1317673687,CD +1317673688,1317673711,NG +1317673712,1317673719,CO +1317673720,1317673727,NG +1317673728,1317673743,AO +1317673744,1317673751,CD +1317673752,1317673767,NG +1317673768,1317673775,AO +1317673776,1317673783,NG +1317673784,1317673791,AO +1317673792,1317673815,NG +1317673816,1317673823,TD +1317673824,1317673831,NG +1317673832,1317673839,AO +1317673840,1317673887,NG +1317673888,1317673895,GB +1317673896,1317673911,NG +1317673912,1317673919,AO +1317673920,1317673927,CI +1317673928,1317673943,NG +1317673944,1317673951,AO +1317673952,1317674255,NG +1317674256,1317674263,GB +1317674264,1317674271,AO +1317674272,1317674279,NG +1317674280,1317674287,CD +1317674288,1317674295,GH +1317674296,1317674303,AO +1317674304,1317674359,NG +1317674360,1317674367,AO +1317674368,1317674415,NG +1317674416,1317674423,AO +1317674424,1317674431,NG +1317674432,1317674440,AO +1317674441,1317674447,GB +1317674448,1317674455,AO +1317674456,1317674471,NG +1317674472,1317674479,GB +1317674480,1317674487,AO +1317674488,1317674495,NG +1317674496,1317674503,GB +1317674504,1317674511,AO +1317674512,1317674535,NG +1317674536,1317674543,GB +1317674544,1317674551,NG +1317674552,1317674559,GB +1317674560,1317674575,NG +1317674576,1317674583,GB +1317674584,1317674615,NG +1317674616,1317674623,GB +1317674624,1317674671,NG +1317674672,1317674679,GB +1317674680,1317674687,AO +1317674688,1317674735,NG +1317674736,1317674743,AO +1317674744,1317674791,NG +1317674792,1317674799,GH +1317674800,1317674807,NG +1317674808,1317674831,GB +1317674832,1317674887,NG +1317674888,1317674911,AO +1317674912,1317674927,NG +1317674928,1317674935,AO +1317674936,1317674943,NG +1317674944,1317674951,GA +1317674952,1317674959,NG +1317674960,1317674983,GB +1317674984,1317674991,NG +1317674992,1317674999,GB +1317675000,1317675007,NG +1317675008,1317675023,GB +1317675024,1317675063,NG +1317675064,1317675071,AO +1317675072,1317675079,GB +1317675080,1317675127,NG +1317675128,1317675167,GB +1317675168,1317675175,NG +1317675176,1317675199,GB +1317675200,1317675231,NG +1317675232,1317675239,LR +1317675240,1317675255,AO +1317675256,1317675295,GB +1317675296,1317675319,NG +1317675320,1317675343,GB +1317675344,1317675351,AO +1317675352,1317675359,GB +1317675360,1317675375,NG +1317675376,1317675383,GB +1317675384,1317675391,NG +1317675392,1317675407,GB +1317675408,1317675415,NG +1317675416,1317675423,GB +1317675424,1317675439,NG +1317675440,1317675455,GB +1317675456,1317675463,CD +1317675464,1317675471,CI +1317675472,1317675479,NG +1317675480,1317675487,GB +1317675488,1317675519,NG +1317675520,1317675551,GB +1317675552,1317675559,NG +1317675560,1317675567,NA +1317675568,1317675575,AO +1317675576,1317675583,GB +1317675584,1317675591,LR +1317675592,1317675615,NG +1317675616,1317675631,GB +1317675632,1317675639,NG +1317675640,1317675647,FR +1317675648,1317675655,LR +1317675656,1317675687,NG +1317675688,1317675695,CM +1317675696,1317675711,NG +1317675712,1317675719,CM +1317675720,1317675735,NG +1317675736,1317675743,CD +1317675744,1317675751,GH +1317675752,1317675759,GB +1317675760,1317675775,GH +1317675776,1317683199,GB +1317683200,1317683839,DE +1317683840,1317683855,CH +1317683856,1317683859,US +1317683860,1317683863,DE +1317683864,1317683871,FR +1317683872,1317686271,DE +1317686272,1317686287,NL +1317686288,1317686303,DE +1317686304,1317686319,NL +1317686320,1317695743,DE +1317695744,1317695999,CH +1317696000,1317699583,DE +1317699584,1317715967,RU +1317715968,1317732351,SA +1317732352,1317748735,HU +1317748736,1317765119,RU +1317765120,1317781503,GE +1317781504,1317814271,RU +1317814272,1317830655,DE +1317830656,1317832191,NL +1317832192,1317832447,GB +1317832448,1317832511,CY +1317832512,1317832959,NL +1317832960,1317833215,IT +1317833216,1317835615,NL +1317835616,1317835647,RU +1317835648,1317847039,NL +1317847040,1317863423,RU +1317863424,1317879807,GB +1317879808,1317896191,SK +1317896192,1317912575,LU +1317912576,1317920767,GB +1317920768,1317928959,ES +1317928960,1317945343,BG +1317945344,1317965047,AT +1317965048,1317965055,DE +1317965056,1317978111,AT +1317978112,1317994495,RU +1317994496,1318000383,DE +1318000384,1318000447,NL +1318000448,1318002175,DE +1318002176,1318002431,NL +1318002432,1318005631,DE +1318005632,1318005759,NL +1318005760,1318006271,DE +1318006272,1318006783,NL +1318006784,1318010879,DE +1318010880,1318027263,DK +1318027264,1318043647,IE +1318043648,1318584319,GB +1318584320,1318592511,PL +1318592512,1318600703,FI +1318600704,1318608895,AT +1318608896,1318617087,IT +1318625280,1318633471,UA +1318633472,1318649855,IE +1318649856,1318658047,RU +1318658048,1318666239,SI +1318666240,1318674431,DE +1318674432,1318682623,GR +1318682624,1318690815,RU +1318690816,1318699007,DK +1318699008,1318707199,IE +1318707200,1318707743,FR +1318707744,1318707967,SE +1318707968,1318708495,FR +1318708496,1318708991,SE +1318708992,1318711495,FR +1318711496,1318711503,SE +1318711504,1318711647,FR +1318711648,1318711663,IT +1318711664,1318711887,FR +1318711888,1318712319,SE +1318712320,1318712575,FR +1318712576,1318713343,SE +1318713344,1318713855,FR +1318713856,1318714111,CH +1318714112,1318715390,FR +1318715392,1318723583,BG +1318723584,1318731775,IR +1318731776,1318739967,PL +1318739968,1318748159,GB +1318748160,1318756351,LV +1318756352,1318764543,UA +1318764544,1318780927,KW +1318780928,1318789119,CH +1318789120,1318797311,ME +1318797312,1318805503,SY +1318805504,1318813695,PL +1318813696,1318821887,FR +1318821888,1318838271,RU +1318838272,1318846463,GB +1318846464,1318854655,NO +1318854656,1318862847,CZ +1318862848,1318871039,GB +1318871040,1318879231,DK +1318879232,1318887423,CZ +1318887424,1318895615,PL +1318895616,1318899711,SE +1318899712,1318903807,DK +1318903808,1318911999,RU +1318912000,1318920191,MK +1318920192,1318928383,IR +1318928384,1318936575,LT +1318936576,1318944767,DK +1318944768,1318952959,LV +1318952960,1318956543,CZ +1318956544,1318957055,PL +1318957056,1318958847,CZ +1318958848,1318960895,PL +1318960896,1318961151,CZ +1318961152,1318969343,NL +1318969344,1318977535,RU +1318977536,1318985727,LT +1318985728,1319001087,GB +1319001088,1319002111,US +1319002112,1319010303,IE +1319010304,1319017215,CY +1319017216,1319017279,DE +1319017280,1319017295,CY +1319017296,1319017303,DE +1319017304,1319018495,CY +1319018496,1319026687,IR +1319026688,1319034879,RU +1319034880,1319035903,NO +1319035904,1319036927,DK +1319036928,1319038975,SE +1319038976,1319043071,NO +1319043072,1319051263,FR +1319051264,1319059455,UA +1319059456,1319067647,PL +1319067648,1319069776,DE +1319069777,1319069823,CN +1319069824,1319070217,DE +1319070218,1319070254,CN +1319070255,1319070271,GB +1319070272,1319070335,PT +1319070336,1319070463,RU +1319070464,1319070975,DE +1319070976,1319071103,PL +1319071104,1319071231,RU +1319071232,1319071487,PL +1319071488,1319072767,DE +1319072768,1319073023,IT +1319073024,1319073279,TR +1319073280,1319074303,DE +1319074304,1319074559,CN +1319074560,1319074815,DE +1319074816,1319074943,PL +1319074944,1319075071,RU +1319075072,1319075199,PL +1319075200,1319075327,RU +1319075328,1319075455,DE +1319075456,1319075583,RU +1319075584,1319075664,DE +1319075665,1319075711,CN +1319075712,1319075839,RU +1319075840,1319084031,BG +1319084032,1319092223,KW +1319092224,1319100415,IT +1319100416,1319108607,RU +1319108608,1321205759,TR +1321205760,1325400063,FR +1325400064,1329594367,IT +1329594368,1330642943,GB +1330642944,1331691519,FR +1331691520,1331757055,PL +1331757056,1331822591,IE +1331822592,1331824639,IT +1331824640,1331826687,RU +1331826688,1331828735,FR +1331828736,1331830783,LT +1331830784,1331831343,GB +1331831344,1331831351,AE +1331831352,1331832831,GB +1331832832,1331834879,IT +1331834880,1331836927,BY +1331836928,1331838975,FR +1331838976,1331841023,GR +1331841024,1331843071,CZ +1331843072,1331845119,GB +1331845120,1331847167,RU +1331847168,1331849215,SE +1331849216,1331851263,RU +1331851264,1331853311,AL +1331853312,1331855359,AE +1331855360,1331857407,TR +1331857408,1331859455,RU +1331859456,1331861503,PL +1331861504,1331863551,CZ +1331863552,1331867647,GB +1331867648,1331869695,NL +1331869696,1331871743,SA +1331871744,1331873791,DK +1331873792,1331879935,RU +1331879936,1331881983,DE +1331881984,1331883007,GB +1331883008,1331883263,SE +1331883264,1331886079,GB +1331886080,1331888127,ES +1331888128,1331890175,SE +1331890176,1331892223,IT +1331892224,1331894271,RU +1331894272,1331896319,NL +1331896320,1331898367,FR +1331898368,1331900415,GB +1331900416,1331902463,RU +1331902464,1331904511,MK +1331904512,1331908607,GB +1331908608,1331910655,DE +1331910656,1331912703,BH +1331912704,1331914751,DE +1331914752,1331916799,RU +1331916800,1331918847,IT +1331918848,1331920895,BE +1331920896,1331922943,NL +1331922944,1331924991,DE +1331924992,1331927039,GB +1331927040,1331929087,FI +1331929088,1331931135,FR +1331931136,1331933183,SE +1331933184,1331935231,TR +1331935232,1331937279,GB +1331937280,1331937535,US +1331937536,1331937567,SM +1331937568,1331937583,US +1331937584,1331937599,ZA +1331937600,1331938303,GB +1331938304,1331938559,US +1331938560,1331939327,GB +1331939328,1331941375,BE +1331941376,1331943423,GR +1331943424,1331945471,RU +1331945472,1331947519,SE +1331947520,1331948287,CH +1331948288,1331948543,US +1331948544,1331948547,NL +1331948548,1331948551,CH +1331948552,1331948559,FR +1331948560,1331948567,CZ +1331948568,1331948575,DE +1331948576,1331948583,CZ +1331948584,1331948607,GB +1331948608,1331948615,US +1331948616,1331949567,CH +1331949568,1331951615,RU +1331951616,1331953663,GE +1331953664,1332019199,BG +1332019200,1332027135,CS +1332027136,1332027391,RS +1332027392,1332027903,CS +1332027904,1332028159,RS +1332028160,1332028671,CS +1332028672,1332028735,RS +1332028736,1332028895,CS +1332028896,1332028903,RS +1332028904,1332028923,CS +1332028924,1332028927,RS +1332028928,1332029015,CS +1332029016,1332029023,RS +1332029024,1332029039,CS +1332029040,1332029047,RS +1332029048,1332029295,CS +1332029296,1332029311,RS +1332029312,1332029591,CS +1332029592,1332029631,RS +1332029632,1332029663,CS +1332029664,1332029711,RS +1332029712,1332029719,CS +1332029720,1332029743,RS +1332029744,1332029751,CS +1332029752,1332029943,RS +1332029944,1332029951,CS +1332029952,1332030463,RS +1332030464,1332033535,CS +1332033536,1332035071,RS +1332035072,1332044287,CS +1332044288,1332044799,RS +1332044800,1332045823,CS +1332045824,1332051967,RS +1332051968,1332084735,CS +1332084736,1332150271,SE +1332150272,1332215807,GR +1332215808,1332346879,RU +1332346880,1332412415,AL +1332412416,1332477951,GR +1332477952,1332609023,ES +1332609024,1332613119,PL +1332613120,1332629503,UA +1332629504,1332633599,DE +1332633600,1332637695,UA +1332637696,1332641791,BG +1332641792,1332658175,UA +1332658176,1332662271,PL +1332662272,1332670463,UA +1332670464,1332740095,RU +1332740096,1333264383,RO +1333264384,1333297151,RU +1333297152,1333317887,HU +1333317888,1333318143,MK +1333318144,1333362687,HU +1333362688,1333395455,GB +1333395456,1333428223,HU +1333428224,1333460991,RU +1333460992,1333493759,GB +1333493760,1333526527,TR +1333526528,1333551103,BG +1333551104,1333555199,UA +1333555200,1333559295,RO +1333559296,1333592063,UA +1333592064,1333624831,IE +1333624832,1333657599,MK +1333657600,1333690367,RU +1333690368,1333723135,MK +1333723136,1333755903,IR +1333755904,1333788671,CZ +1333788672,1334050815,GR +1334050816,1334059007,BG +1334059008,1334067199,FR +1334067200,1334075391,LV +1334075392,1334083583,RU +1334083584,1334091775,DE +1334091776,1334099967,LT +1334099968,1334108159,IR +1334108160,1334116351,BE +1334116352,1334124543,AX +1334124544,1334132735,DE +1334132736,1334165503,RU +1334165504,1334173695,PL +1334173696,1334181887,LT +1334181888,1334190079,RU +1334190080,1334198271,RO +1334198272,1334206463,RU +1334206464,1334214655,FI +1334214656,1334222847,JO +1334222848,1334231039,BG +1334231040,1334239231,EE +1334239232,1334247423,IS +1334247424,1334255615,NO +1334255616,1334263807,IT +1334263808,1334271999,RU +1334272000,1334280191,GB +1334280192,1334288383,LV +1334288384,1334296575,TR +1334296576,1334304767,UA +1334304768,1334312959,RU +1334312960,1334316031,SE +1334316032,1334316543,NO +1334316544,1334342415,SE +1334342416,1334342431,GB +1334342432,1334345727,SE +1334345728,1334378495,RU +1334378496,1334411263,IT +1334411264,1334444031,RU +1334444032,1334484991,SE +1334484992,1334489087,DK +1334489088,1334501375,SE +1334501376,1334509567,DK +1334509568,1334542335,PL +1334542336,1334575103,RU +1334575104,1334579199,UA +1334579200,1334583295,RU +1334583296,1334583311,DE +1334583312,1334583319,US +1334583320,1334583327,DE +1334583328,1334583359,US +1334583360,1334583535,DE +1334583536,1334583543,US +1334583544,1334583807,DE +1334583808,1334584063,CH +1334584064,1334584255,DE +1334584256,1334584287,AT +1334584288,1334584351,DE +1334584352,1334584383,LU +1334584384,1334584903,DE +1334584904,1334584911,AT +1334584912,1334584999,DE +1334585000,1334585007,US +1334585008,1334585055,DE +1334585056,1334585087,US +1334585088,1334585111,DE +1334585112,1334585119,US +1334585120,1334591487,DE +1334591488,1334595583,RU +1334595584,1334596351,IT +1334596352,1334596607,GR +1334596608,1334597887,IT +1334597888,1334598143,GR +1334598144,1334598271,SK +1334598272,1334598399,CZ +1334598400,1334598463,GR +1334598464,1334598527,IT +1334598528,1334598655,GR +1334598656,1334599679,IT +1334599680,1334603775,RU +1334603776,1334607871,DE +1334607872,1334609994,IE +1334609995,1334609995,GB +1334609996,1334611967,IE +1334611968,1334616063,ME +1334616064,1334620159,MD +1334620160,1334624255,DE +1334624256,1334628351,GB +1334628352,1334632447,IE +1334632448,1334636543,KZ +1334636544,1334640639,RU +1334640640,1334644735,FR +1334644736,1334644991,IQ +1334644992,1334645175,DE +1334645176,1334645183,IQ +1334645184,1334645247,DE +1334645248,1334647807,IQ +1334647808,1334648831,DE +1334648832,1334651391,GB +1334651392,1334651647,NL +1334651648,1334651903,FR +1334651904,1334652159,DE +1334652160,1334652927,GB +1334652928,1334661119,RU +1334661120,1334665215,CH +1334665216,1334669311,NO +1334669312,1334673407,MK +1334673408,1334677503,GB +1334677504,1334681599,FI +1334681600,1334681855,PL +1334681856,1334682111,GB +1334682112,1334682367,IR +1334682368,1334682623,FR +1334682624,1334682879,NO +1334682880,1334683135,DK +1334683136,1334683391,CZ +1334683392,1334683647,CH +1334683648,1334684159,DE +1334684160,1334684415,SE +1334684416,1334684671,DE +1334684672,1334684927,FI +1334684928,1334685183,NL +1334685184,1334685695,DE +1334685696,1334689791,IT +1334689792,1334693887,FR +1334693888,1334702079,RU +1334702080,1334706175,CZ +1334706176,1334710271,BA +1334710272,1334714367,RU +1334714368,1334718463,DE +1334718464,1334722559,KZ +1334722560,1334726655,IT +1334726656,1334730239,RU +1334730240,1334730363,KZ +1334730364,1334730367,RU +1334730368,1334730399,KZ +1334730400,1334730495,RU +1334730496,1334730499,KZ +1334730500,1334730503,RU +1334730504,1334730539,KZ +1334730540,1334730543,RU +1334730544,1334730551,KZ +1334730552,1334730559,RU +1334730560,1334730571,KZ +1334730572,1334730575,RU +1334730576,1334730591,KZ +1334730592,1334730603,RU +1334730604,1334730615,KZ +1334730616,1334734847,RU +1334734848,1334738943,LT +1334738944,1334743039,CH +1334743040,1334747135,UA +1334747136,1334751231,RU +1334751232,1334755327,BH +1334755328,1334759423,UA +1334759424,1334763519,SE +1334763520,1334767615,DK +1334771712,1334779903,RU +1334779904,1334783999,UA +1334784000,1334788095,AT +1334788096,1334796287,RU +1334796288,1334800383,ME +1334800384,1334804479,IT +1334804480,1334808575,FR +1334808576,1334812671,GB +1334812672,1334816767,BA +1334816768,1334817791,LV +1334817792,1334818047,NL +1334818048,1334820863,LV +1334820864,1334824959,IE +1334824960,1334829055,NL +1334829056,1334833151,RU +1334833152,1334837247,FR +1334837248,1335885823,ES +1335885824,1336016895,NO +1336016896,1336147967,PL +1336147968,1336279039,RU +1336279040,1336410111,GR +1336410112,1336541183,PT +1336541184,1336543231,SA +1336543232,1336545279,ES +1336545280,1336547327,SE +1336547328,1336549375,RU +1336549376,1336551423,IM +1336551424,1336553471,GB +1336553472,1336555519,SA +1336555520,1336557567,BE +1336557568,1336558591,ES +1336558592,1336559328,US +1336559329,1336559615,ES +1336559616,1336561663,GB +1336561664,1336563711,NO +1336563712,1336567807,NL +1336567808,1336569855,BY +1336569856,1336571903,FR +1336571904,1336573951,PL +1336573952,1336575999,DK +1336576000,1336578047,RU +1336578048,1336580095,IR +1336580096,1336584191,RU +1336584192,1336586239,TR +1336586240,1336588287,GB +1336588288,1336590335,TJ +1336590336,1336592383,GB +1336592384,1336594431,AM +1336594432,1336596479,AT +1336596480,1336598527,FR +1336598528,1336600575,MD +1336600576,1336602623,FR +1336602624,1336604671,IE +1336604672,1336606719,CZ +1336606720,1336608767,PL +1336608768,1336610815,RU +1336610816,1336612863,TR +1336612864,1336614911,ES +1336614912,1336616959,GB +1336616960,1336619007,ES +1336619008,1336621055,AL +1336621056,1336623103,IT +1336623104,1336625151,BE +1336625152,1336625823,IE +1336625824,1336625839,GB +1336625840,1336626207,IE +1336626208,1336626271,GB +1336626272,1336627199,IE +1336627200,1336629247,NO +1336629248,1336631295,DE +1336631296,1336633343,IS +1336633344,1336635391,ES +1336635392,1336637439,RU +1336637440,1336639487,UA +1336639488,1336643583,HU +1336643584,1336645631,DK +1336645632,1336647679,GB +1336647680,1336649727,IT +1336649728,1336651775,RU +1336651776,1336653823,DE +1336653824,1336655871,CZ +1336655872,1336657919,NL +1336657920,1336659967,DE +1336659968,1336662015,RU +1336662016,1336663039,ES +1336663040,1336663071,FR +1336663072,1336664063,ES +1336664064,1336668159,FI +1336668160,1336670207,BH +1336670208,1336672255,SE +1336672256,1336705023,RU +1336705024,1336721407,SA +1336721408,1336737791,HU +1336737792,1336754175,PL +1336754176,1336770559,RU +1336770560,1336786943,GB +1336786944,1336803327,JO +1336803328,1336811519,UA +1336811520,1336827903,RU +1336827904,1336836095,AT +1336836096,1336852479,RU +1336852480,1336868863,FR +1336868864,1336885247,RU +1336885248,1336901631,RS +1336901632,1336918015,IR +1336918016,1336934399,PL +1336934400,1337458687,IL +1337458688,1337982975,PL +1337982976,1342177279,DE +1342177280,1342628031,GB +1342628032,1342628095,IE +1342628096,1342628159,GB +1342628160,1342628175,IE +1342628176,1342628207,GB +1342628208,1342628223,IE +1342628224,1342628319,GB +1342628320,1342628335,IE +1342628336,1342628351,GB +1342628352,1342628367,IE +1342628368,1342628431,GB +1342628432,1342628463,IE +1342628464,1342628663,GB +1342628664,1342628671,IE +1342628672,1342701567,GB +1342701568,1342981887,FR +1342981888,1342981935,GB +1342981936,1342982143,FR +1342982144,1342982399,MG +1342982400,1342988287,FR +1342988288,1342989055,US +1342989056,1343013119,FR +1343013120,1343013375,US +1343013376,1343017983,FR +1343017984,1343018367,RE +1343018368,1343025151,FR +1343025152,1343025663,RE +1343025664,1343217663,FR +1343217664,1343218687,MU +1343218688,1343219711,FR +1343219712,1343219967,KR +1343219968,1343220479,FR +1343220480,1343220607,DE +1343220608,1343220735,FR +1343220736,1343220863,GB +1343220864,1343221023,FR +1343221024,1343221027,DE +1343221028,1343221503,FR +1343221504,1343221759,GB +1343221760,1343221823,LB +1343221824,1343221855,FR +1343221856,1343222271,LB +1343222272,1343222287,CI +1343222288,1343222527,FR +1343222528,1343222575,TD +1343222576,1343222783,FR +1343222784,1343222911,TD +1343222912,1343223039,FR +1343223040,1343223434,MG +1343223435,1343223439,FR +1343223440,1343223447,MG +1343223448,1343223531,FR +1343223532,1343223547,MG +1343223548,1343223551,FR +1343223552,1343223807,LB +1343223808,1343223983,MG +1343223984,1343224063,FR +1343224064,1343224303,US +1343224304,1343224319,FR +1343224320,1343224535,LB +1343224536,1343224543,FR +1343224544,1343224575,LB +1343224576,1343225855,FR +1343225856,1343750143,IT +1343750144,1344798719,ES +1344798720,1345323007,GB +1345323008,1345847295,PL +1345847296,1345978367,NL +1345978368,1346109439,ES +1346109440,1346240511,NL +1346240512,1346371583,DK +1346371584,1346375679,FI +1346375680,1346379775,RU +1346379776,1346383871,ES +1346383872,1346387967,GB +1346387968,1346392063,HU +1346392064,1346400255,RU +1346400256,1346404351,IT +1346404352,1346408447,AT +1346408448,1346412543,LU +1346412544,1346416639,RU +1346416640,1346420735,DE +1346420736,1346424831,NO +1346424832,1346428927,JO +1346428928,1346431743,FR +1346431744,1346431999,KZ +1346432000,1346433023,FR +1346433024,1346439167,NL +1346439168,1346440447,ES +1346440448,1346440463,NL +1346440464,1346440479,ES +1346440480,1346441215,NL +1346441216,1346445311,RU +1346445312,1346449407,DE +1346449408,1346453503,NO +1346453504,1346461695,BA +1346461696,1346469887,NL +1346469888,1346473983,BE +1346473984,1346477823,IT +1346477824,1346477855,HU +1346477856,1346478079,IT +1346478080,1346482175,BA +1346482176,1346486271,CZ +1346486272,1346490367,SE +1346490368,1346494463,GB +1346494464,1346498559,FR +1346498560,1346502655,GB +1346502656,1346510847,DE +1346510848,1346519039,AT +1346519040,1346527231,RU +1346527232,1346531327,DE +1346531328,1346535423,ES +1346535424,1346537983,BE +1346537984,1346537988,AT +1346537989,1346537991,BE +1346537992,1346537999,AT +1346538000,1346538007,CZ +1346538008,1346538015,BE +1346538016,1346538031,CH +1346538032,1346539519,BE +1346539520,1346543615,RU +1346543616,1346547711,FI +1346547712,1346551807,IR +1346551808,1346555903,DE +1346555904,1346559999,IT +1346560000,1346563071,LI +1346563072,1346563327,CH +1346563328,1346564095,LI +1346564096,1346568191,EE +1346568192,1346572287,SE +1346572288,1346576383,DE +1346576384,1346580479,DK +1346580480,1346584575,RU +1346584576,1346588159,US +1346588160,1346588671,KR +1346588672,1346589439,US +1346589440,1346589695,DE +1346589696,1346592767,US +1346592768,1346596863,ES +1346596864,1346600959,IT +1346605056,1346609151,CH +1346609152,1346617343,FR +1346617344,1346620415,SE +1346620416,1346620927,DK +1346620928,1346621439,SE +1346621440,1346625535,RU +1346625536,1346629631,DE +1346629632,1346637823,RU +1346637824,1346650111,GB +1346650112,1346654207,IT +1346654208,1346658303,GB +1346658304,1346666495,SE +1346666496,1346670591,ES +1346670592,1346674687,IT +1346674688,1346678783,DE +1346678784,1346686975,IT +1346686976,1346691071,GB +1346691072,1346695167,PL +1346695168,1346699263,RU +1346699264,1346700575,GB +1346700576,1346700591,VG +1346700592,1346700608,GB +1346700609,1346700623,US +1346700624,1346700671,GB +1346700672,1346700735,US +1346700736,1346700847,GB +1346700848,1346700855,US +1346700856,1346701184,GB +1346701185,1346701215,GR +1346701216,1346703871,GB +1346703872,1346704127,LI +1346704128,1346704383,GB +1346704384,1346704447,US +1346704448,1346704479,GB +1346704480,1346704511,US +1346704512,1346704639,GB +1346704640,1346704767,LI +1346704768,1346707455,GB +1346707456,1346711551,DE +1346711552,1346715647,AZ +1346715648,1346723839,NL +1346723840,1346732031,DE +1346732032,1346736127,GB +1346736128,1346740223,RU +1346740224,1346744319,NL +1346744320,1346748415,RU +1346748416,1346752511,DE +1346752512,1346756607,FR +1346756608,1346760703,SE +1346760704,1346764799,IR +1346764800,1346768895,RU +1346768896,1346772991,LV +1346772992,1346775071,FR +1346775072,1346775103,DE +1346775104,1346777087,FR +1346777088,1346781183,GB +1346781184,1346789375,UA +1346789376,1346793471,RU +1346793472,1346797567,IT +1346797568,1346801663,IL +1346801664,1346805759,SE +1346805760,1346806079,DE +1346806080,1346806111,GB +1346806112,1346806167,DE +1346806168,1346806207,SE +1346806208,1346813951,DE +1346813952,1346822143,FR +1346822144,1346826239,RU +1346826240,1346830335,CS +1346830336,1346838527,GB +1346838528,1346842623,RU +1346842624,1346846719,MT +1346846720,1346854911,DK +1346854912,1346859007,MT +1346859008,1346863103,IR +1346863104,1346867199,TR +1346867200,1346871295,BA +1346871296,1346879487,RU +1346879488,1346883583,FI +1346883584,1346887679,RU +1346887680,1346891775,IT +1346891776,1346895871,RU +1346895872,1346899967,SE +1346899968,1346904063,RU +1346904064,1346908159,PL +1346908160,1346912255,LI +1346912256,1346920447,BG +1346924544,1346928639,RU +1346928640,1346932735,DE +1346932736,1346936831,DK +1346936832,1346940927,IT +1346940928,1346945023,DE +1346945024,1346949119,PL +1346949120,1346957311,RU +1346957312,1346961407,DE +1346961408,1346965503,UA +1346965504,1346969599,RU +1346969600,1346973695,DE +1346973696,1346977791,SE +1346977792,1346985983,RU +1346985984,1346986975,DE +1346986976,1346987007,ES +1346987008,1346991231,DE +1346991232,1346991247,CH +1346991248,1346994175,DE +1346994176,1346998271,NL +1346998272,1347002367,ES +1347002368,1347006463,RU +1347006464,1347010559,SE +1347010560,1347014655,RU +1347014656,1347018751,GB +1347018752,1347022847,IT +1347022848,1347024895,AT +1347024896,1347025071,GB +1347025072,1347025079,FR +1347025080,1347025103,GB +1347025104,1347025111,FR +1347025112,1347025151,GB +1347025152,1347025215,US +1347025216,1347025279,GB +1347025280,1347025343,ES +1347025344,1347025407,DE +1347025408,1347026943,AT +1347026944,1347035135,GB +1347035136,1347039231,CZ +1347039232,1347043327,RO +1347043328,1347047423,FR +1347047424,1347051519,SA +1347051520,1347059711,IL +1347059712,1347067903,CH +1347067904,1347071743,CS +1347071744,1347071751,CS +1347071752,1347071759,CS +1347071760,1347071767,CS +1347071768,1347071775,CS +1347071776,1347071791,CS +1347071792,1347071999,CS +1347072000,1347076095,IT +1347076096,1347084287,FI +1347084288,1347092479,GB +1347092480,1347096575,IR +1347096576,1347100671,SE +1347100672,1347108863,AT +1347108864,1347112959,GB +1347112960,1347117055,RU +1347117056,1347121151,FI +1347121152,1347125247,CH +1347125248,1347129343,RU +1347129344,1347133439,GB +1347141632,1347145727,CH +1347145728,1347146239,GB +1347146240,1347146751,FR +1347146752,1347149823,GB +1347149824,1347153919,HU +1347153920,1347158015,AT +1347158016,1347162111,CH +1347162112,1347166207,IT +1347166208,1347174399,GR +1347174400,1347186687,IT +1347186688,1347190783,GB +1347190784,1347194879,RU +1347194880,1347198975,SE +1347198976,1347203071,QA +1347203072,1347207167,RU +1347207168,1347210735,GB +1347210736,1347210743,IE +1347210744,1347210911,GB +1347210912,1347210919,IE +1347210920,1347210927,GB +1347210928,1347210935,IE +1347210936,1347211111,GB +1347211112,1347211119,IE +1347211120,1347215359,GB +1347215360,1347219455,RU +1347219456,1347223551,KW +1347223552,1347223807,EG +1347223808,1347224063,HK +1347224064,1347224319,US +1347224320,1347224575,EG +1347224576,1347224831,US +1347224832,1347225599,EG +1347225600,1347226623,PK +1347226624,1347227135,EG +1347227136,1347227391,HK +1347227392,1347227647,EG +1347227648,1347229311,DE +1347229312,1347229343,AT +1347229344,1347229727,DE +1347229728,1347229743,AT +1347229744,1347231071,DE +1347231072,1347231087,AT +1347231088,1347231095,GR +1347231096,1347231743,DE +1347231744,1347235839,UA +1347235840,1347239935,GE +1347239936,1347244031,DK +1347244032,1347247359,GB +1347247360,1347247871,RU +1347247872,1347247872,GB +1347247873,1347248127,US +1347248128,1347248863,SE +1347248864,1347248864,FI +1347248865,1347249343,SE +1347249344,1347249375,FI +1347249376,1347250687,SE +1347250688,1347250691,NO +1347250692,1347250695,SE +1347250696,1347250735,NO +1347250736,1347250767,SE +1347250768,1347250783,FI +1347250784,1347252223,SE +1347252224,1347256319,HU +1347256320,1347260415,FO +1347260416,1347264511,MK +1347264512,1347268607,RU +1347268608,1347271935,LB +1347271936,1347272447,IQ +1347272448,1347272703,LB +1347272704,1347276799,MT +1347276800,1347278831,DE +1347278832,1347278847,BR +1347278848,1347280895,DE +1347280896,1347284991,FR +1347284992,1347286271,GB +1347286272,1347286335,BN +1347286336,1347286527,GB +1347286528,1347286535,BG +1347286536,1347289087,GB +1347289088,1347293183,FR +1347293184,1347293311,SE +1347293312,1347293319,LR +1347293320,1347293327,GA +1347293328,1347293335,NG +1347293336,1347293339,SE +1347293340,1347293343,SO +1347293344,1347293351,SE +1347293352,1347293391,NG +1347293392,1347293399,CY +1347293400,1347293407,IQ +1347293408,1347293415,NG +1347293416,1347293423,SE +1347293424,1347293431,GN +1347293432,1347293439,NG +1347293440,1347293447,SE +1347293448,1347293455,GB +1347293456,1347293463,NG +1347293464,1347293471,SE +1347293472,1347293479,IQ +1347293480,1347293487,LR +1347293488,1347293495,TD +1347293496,1347293503,GH +1347293504,1347293511,US +1347293512,1347293519,GN +1347293520,1347293527,PS +1347293528,1347293535,NG +1347293536,1347293543,GH +1347293544,1347293551,US +1347293552,1347293559,SE +1347293560,1347293567,GN +1347293568,1347293575,GH +1347293576,1347293583,IQ +1347293584,1347293591,AF +1347293592,1347293599,SE +1347293600,1347293607,NG +1347293608,1347293615,SE +1347293616,1347293623,US +1347293624,1347293631,PK +1347293632,1347293639,US +1347293640,1347293647,IQ +1347293648,1347293655,US +1347293656,1347293675,GN +1347293676,1347293679,BH +1347293680,1347293687,GN +1347293688,1347293723,NG +1347293724,1347293727,IQ +1347293728,1347293735,SE +1347293736,1347293759,GN +1347293760,1347293767,NG +1347293768,1347293775,CM +1347293776,1347293799,NG +1347293800,1347293807,IQ +1347293808,1347293815,NG +1347293816,1347293823,SO +1347293824,1347293831,CM +1347293832,1347293839,NG +1347293840,1347293847,CA +1347293848,1347293855,BH +1347293856,1347293863,GN +1347293864,1347293871,GB +1347293872,1347293879,SE +1347293880,1347293887,NG +1347293888,1347293903,GQ +1347293904,1347293911,NG +1347293912,1347293919,GA +1347293920,1347293927,GB +1347293928,1347293935,US +1347293936,1347293943,NG +1347293944,1347293951,SE +1347293952,1347293959,NG +1347293960,1347293967,GN +1347293968,1347293975,NG +1347293976,1347293983,GN +1347293984,1347293991,US +1347293992,1347293999,NG +1347294000,1347294007,US +1347294008,1347294015,SE +1347294016,1347294023,US +1347294024,1347294039,GN +1347294040,1347294047,GB +1347294048,1347294055,TH +1347294056,1347294063,NG +1347294064,1347294071,GH +1347294072,1347294079,NG +1347294080,1347294087,SE +1347294088,1347294095,US +1347294096,1347294111,CM +1347294112,1347294119,GN +1347294120,1347294127,SE +1347294128,1347294135,NG +1347294136,1347294143,LR +1347294144,1347294151,NG +1347294152,1347294159,GB +1347294160,1347294167,CM +1347294168,1347294175,GB +1347294176,1347294183,NG +1347294184,1347294191,SE +1347294192,1347294199,GB +1347294200,1347294207,NG +1347294208,1347294215,SE +1347294216,1347294223,IQ +1347294224,1347294231,SE +1347294232,1347294239,US +1347294240,1347294271,SE +1347294272,1347294279,BH +1347294280,1347294287,BD +1347294288,1347294303,UG +1347294304,1347294311,US +1347294312,1347294319,SE +1347294320,1347294327,NG +1347294328,1347294343,SE +1347294344,1347294351,CM +1347294352,1347294367,LR +1347294368,1347294375,NG +1347294376,1347294383,SE +1347294384,1347294399,NG +1347294400,1347294407,SE +1347294408,1347294415,GN +1347294416,1347294423,SE +1347294424,1347294431,KW +1347294432,1347294435,US +1347294436,1347294439,SE +1347294440,1347294447,SO +1347294448,1347294975,US +1347294976,1347294991,SE +1347294992,1347295007,NG +1347295008,1347295039,SE +1347295040,1347295047,GB +1347295048,1347295055,IQ +1347295056,1347295063,AF +1347295064,1347295071,SE +1347295072,1347295079,US +1347295080,1347295087,NG +1347295088,1347295095,SE +1347295096,1347295103,NG +1347295104,1347295143,SE +1347295144,1347295151,IQ +1347295152,1347295159,US +1347295160,1347295199,SE +1347295200,1347295215,GB +1347295216,1347295223,SE +1347295224,1347295231,CH +1347295232,1347295743,SE +1347295744,1347295755,US +1347295756,1347295759,SE +1347295760,1347295775,US +1347295776,1347295783,IQ +1347295784,1347295999,SE +1347296000,1347296015,US +1347296016,1347297279,SE +1347297280,1347305471,UA +1347305472,1347309567,AL +1347309568,1347309839,DE +1347309840,1347309855,CH +1347309856,1347313663,DE +1347313664,1347321855,RU +1347321856,1347323775,KW +1347323776,1347323903,IR +1347323904,1347325183,KW +1347325184,1347325439,SA +1347325440,1347325951,KW +1347325952,1347327231,CZ +1347327232,1347327487,SK +1347327488,1347329535,CZ +1347329536,1347329599,SK +1347329600,1347330047,CZ +1347330048,1347338239,DE +1347338240,1347342335,RU +1347342336,1347346431,SE +1347346432,1347354623,AT +1347354624,1347358719,PT +1347358720,1347362815,CZ +1347362816,1347366911,NL +1347366912,1347371007,IT +1347371008,1347375103,RU +1347375104,1347379199,GB +1347379200,1347383295,NL +1347383296,1347387391,EE +1347387392,1347391487,GB +1347391488,1347395583,LB +1347395584,1347399679,SE +1347399680,1347403775,RU +1347403776,1347407871,NL +1347407872,1347411967,GB +1347411968,1347416063,DE +1347416064,1347420159,RU +1347420160,1347420671,DK +1347420672,1347420679,SE +1347420680,1347420791,DK +1347420792,1347420799,US +1347420800,1347420831,DK +1347420832,1347420847,US +1347420848,1347420991,DK +1347420992,1347421007,CH +1347421008,1347423775,DK +1347423776,1347423807,NO +1347423808,1347424339,DK +1347424340,1347424351,NO +1347424352,1347427135,DK +1347427136,1347427327,NO +1347427328,1347428351,DK +1347428352,1347432447,IT +1347432448,1347436543,HR +1347436544,1347440639,SE +1347440640,1347444735,ES +1347444736,1347452927,RU +1347452928,1347461119,BG +1347461120,1347465215,CS +1347465216,1347469311,GB +1347469312,1347473407,RU +1347473408,1347477503,UZ +1347477504,1347481599,CH +1347481600,1347485695,AT +1347485696,1347493887,DE +1347493888,1347502079,LV +1347502080,1347503103,ES +1347503104,1347503359,GB +1347503360,1347504383,ES +1347504384,1347504639,US +1347504640,1347506175,ES +1347506176,1347510271,FR +1347510272,1347518463,ES +1347518464,1347522559,AT +1347522560,1347526655,LB +1347526656,1347527951,FI +1347527952,1347528015,SE +1347528016,1347528319,FI +1347528320,1347528351,SE +1347528352,1347528639,FI +1347528640,1347528703,SE +1347528704,1347528959,FI +1347528960,1347529087,SE +1347529088,1347529471,FI +1347529472,1347529983,SE +1347529984,1347534847,FI +1347534848,1347538943,DE +1347538944,1347543039,RU +1347543040,1347544063,SK +1347544064,1347544319,SL +1347544320,1347547135,SK +1347547136,1347550303,DE +1347550304,1347550335,AT +1347550336,1347551167,DE +1347551168,1347551231,PL +1347551232,1347555327,IT +1347559424,1347567615,RU +1347567616,1347571711,CH +1347571712,1347575807,RU +1347575808,1347579903,DK +1347579904,1347588095,GB +1347588096,1347590911,CZ +1347590912,1347591167,PL +1347591168,1347592191,CZ +1347592192,1347600383,RU +1347600384,1347604479,IT +1347604480,1347608575,DE +1347608576,1347612671,FR +1347612672,1347616767,GB +1347616768,1347620863,FI +1347620864,1347624959,LB +1347624960,1347633151,CH +1347633152,1347637247,CZ +1347637248,1347641343,SE +1347641344,1347646194,DE +1347646195,1347646207,TR +1347646208,1347649535,DE +1347649536,1347653631,GE +1347653632,1347654615,GB +1347654616,1347654623,EG +1347654624,1347655175,GB +1347655176,1347655183,EG +1347655184,1347657727,GB +1347657728,1347661823,IT +1347661824,1347663119,DE +1347663120,1347663127,GB +1347663128,1347665919,DE +1347665920,1347670015,RU +1347670016,1347674111,SE +1347674112,1347682303,RU +1347682304,1347686399,DE +1347688736,1347688743,BE +1347688744,1347688751,ET +1347688752,1347688767,SN +1347688960,1347689343,BE +1347690496,1347694591,SE +1347694592,1347706879,GB +1347706880,1347710975,IT +1347710976,1347715071,RU +1347715072,1347715519,ES +1347715520,1347715527,SA +1347715528,1347716151,ES +1347716152,1347716159,LB +1347716160,1347716207,ES +1347716208,1347716223,CY +1347716224,1347718367,ES +1347718368,1347718399,IR +1347718400,1347719711,ES +1347719712,1347719719,SO +1347719720,1347722495,ES +1347722496,1347722751,LB +1347722752,1347723263,ES +1347723264,1347727359,GB +1347727360,1347731455,UA +1347731456,1347739647,DE +1347739648,1347747839,NL +1347747840,1347751935,DE +1347751936,1347754751,CY +1347754752,1347754775,GR +1347754776,1347754791,CY +1347754792,1347754887,GR +1347754888,1347754888,CY +1347754889,1347754894,GR +1347754895,1347754895,CY +1347754896,1347754919,GR +1347754920,1347754927,CY +1347754928,1347754935,GR +1347754936,1347754943,RS +1347754944,1347754951,CY +1347754952,1347754959,TN +1347754960,1347754967,MA +1347754968,1347754983,GR +1347754984,1347754991,CY +1347754992,1347755063,GR +1347755064,1347755079,CY +1347755080,1347755112,GR +1347755113,1347755119,CY +1347755120,1347755191,GR +1347755192,1347755223,CY +1347755224,1347755231,GR +1347755232,1347755263,CY +1347755264,1347755519,GR +1347755520,1347755775,CY +1347755776,1347756031,GR +1347756032,1347760127,NL +1347760128,1347764223,HU +1347764224,1347772415,GB +1347772416,1347776511,MT +1347776512,1347780607,SE +1347780608,1347784703,NL +1347784704,1347788799,RU +1347788800,1347792895,NL +1347792896,1347796991,RU +1347796992,1347801087,DE +1347801088,1347805183,GB +1347805184,1347809279,PL +1347809280,1347813375,IT +1347813376,1347817471,DE +1347817472,1347821567,IT +1347821568,1347822343,GB +1347822344,1347822351,NL +1347822352,1347825663,GB +1347825664,1347829759,IT +1347829760,1347833855,SE +1347833856,1347836223,DE +1347836224,1347836255,SE +1347836256,1347837951,DE +1347837952,1347846143,RO +1347846144,1347850239,NO +1347850240,1347854335,IT +1347854336,1347854871,DE +1347854880,1347854887,DE +1347854912,1347855071,DE +1347855080,1347855103,DE +1347855104,1347855359,CH +1347855360,1347855935,DE +1347855944,1347855951,DE +1347855960,1347855967,DE +1347856000,1347856063,DE +1347856080,1347856243,DE +1347856256,1347856431,DE +1347856448,1347856471,DE +1347856480,1347856639,DE +1347856640,1347856895,AT +1347856896,1347858495,DE +1347858504,1347858527,DE +1347858560,1347858575,DE +1347858592,1347858631,DE +1347858640,1347859351,DE +1347859360,1347859383,DE +1347859408,1347859439,DE +1347859456,1347860863,DE +1347860880,1347860895,DE +1347860912,1347861391,DE +1347861408,1347861471,DE +1347861504,1347861759,DE +1347861800,1347861823,DE +1347861944,1347861951,DE +1347862112,1347862143,DE +1347862288,1347862431,DE +1347862448,1347862471,DE +1347862480,1347862487,DE +1347862496,1347862527,DE +1347862528,1347866623,CH +1347866624,1347870719,NO +1347870720,1347874815,AM +1347874816,1347878911,RU +1347878912,1347883007,GB +1347883008,1347887103,IT +1347887104,1347891199,PL +1347891200,1347895295,SE +1347903488,1347907583,RU +1347907584,1347911679,DE +1347911680,1347915775,GB +1347915776,1347919871,RU +1347919872,1347923967,DE +1347923968,1347928063,CZ +1347928064,1347932159,RU +1347932160,1347936255,SK +1347936256,1347940351,FR +1347940352,1347944447,BA +1347948544,1347952639,DE +1347952640,1347956735,BE +1347956736,1347960831,RU +1347960832,1347964927,DE +1347964928,1347969023,IT +1347969024,1347977215,SE +1347977216,1347977471,DK +1347977472,1347977487,NG +1347977488,1347977503,DK +1347977504,1347977511,NG +1347977512,1347977519,DK +1347977520,1347977599,MZ +1347977600,1347977607,DK +1347977608,1347977623,NG +1347977624,1347977631,KE +1347977632,1347977791,DK +1347977792,1347977919,NG +1347977920,1347977951,DK +1347977952,1347977967,NG +1347977968,1347977975,UG +1347977976,1347977991,NG +1347977992,1347977999,DK +1347978000,1347978007,SO +1347978008,1347978047,NG +1347978048,1347978055,ZW +1347978056,1347978063,SD +1347978064,1347978135,MZ +1347978136,1347978143,ZW +1347978144,1347978207,NG +1347978208,1347978215,MZ +1347978216,1347978223,NG +1347978224,1347978231,AO +1347978232,1347978239,DK +1347978240,1347978263,NG +1347978264,1347978271,DK +1347978272,1347978319,NG +1347978320,1347978327,DK +1347978328,1347978351,NG +1347978352,1347978367,DK +1347978368,1347978407,NG +1347978408,1347978415,MZ +1347978416,1347978423,ET +1347978424,1347978431,RW +1347978432,1347978439,AO +1347978440,1347978463,NG +1347978464,1347978487,DK +1347978488,1347978495,YE +1347978496,1347978559,NG +1347978560,1347978575,DK +1347978576,1347978663,NG +1347978664,1347978671,DK +1347978672,1347978679,NG +1347978680,1347978687,AO +1347978688,1347978695,NG +1347978696,1347978711,AO +1347978712,1347978719,UG +1347978720,1347978727,NG +1347978728,1347978735,DK +1347978736,1347978743,NG +1347978744,1347978751,AO +1347978752,1347978759,DK +1347978760,1347978807,NG +1347978808,1347978815,UG +1347978816,1347978823,DK +1347978824,1347978831,NG +1347978832,1347978847,DK +1347978848,1347978855,NG +1347978856,1347978863,IQ +1347978864,1347978871,NG +1347978872,1347978879,IQ +1347978880,1347978895,DK +1347978896,1347978919,NG +1347978920,1347978927,IQ +1347978928,1347978935,CG +1347978936,1347978943,DK +1347978944,1347979007,AO +1347979008,1347979039,NG +1347979040,1347979055,AO +1347979056,1347979143,NG +1347979144,1347979159,DK +1347979160,1347979167,NG +1347979168,1347979183,IQ +1347979184,1347979199,NG +1347979200,1347979215,AO +1347979216,1347979263,NG +1347979264,1347979279,IQ +1347979280,1347979287,UG +1347979288,1347979311,NG +1347979312,1347979319,CG +1347979320,1347979327,DK +1347979328,1347979335,AO +1347979336,1347979343,NG +1347979344,1347979359,DK +1347979360,1347979367,NG +1347979368,1347979375,DK +1347979376,1347979399,NG +1347979400,1347979407,KM +1347979408,1347979423,IQ +1347979424,1347979471,NG +1347979472,1347979479,DK +1347979480,1347979487,NG +1347979488,1347979535,DK +1347979536,1347979543,UG +1347979544,1347979551,NG +1347979552,1347979559,IQ +1347979560,1347979567,SO +1347979568,1347979591,NG +1347979592,1347979607,IQ +1347979608,1347979623,NG +1347979624,1347979631,UG +1347979632,1347979655,DK +1347979656,1347979663,NG +1347979664,1347979671,GB +1347979672,1347979679,DK +1347979680,1347979751,NG +1347979752,1347979759,AE +1347979760,1347979767,NG +1347979768,1347979791,DK +1347979792,1347979807,NG +1347979808,1347979823,DK +1347979824,1347979831,NG +1347979832,1347979839,DK +1347979840,1347979847,BI +1347979848,1347979863,NG +1347979864,1347979935,DK +1347979936,1347979967,NG +1347979968,1347980063,DK +1347980064,1347980071,UG +1347980072,1347980079,AO +1347980080,1347980095,GH +1347980096,1347980111,NG +1347980112,1347980127,GN +1347980128,1347980151,NG +1347980152,1347980159,UG +1347980160,1347980167,DK +1347980168,1347980175,NG +1347980176,1347980183,TZ +1347980184,1347980191,DK +1347980192,1347980271,NG +1347980272,1347980415,DK +1347980416,1347980543,NG +1347980544,1347980559,DK +1347980560,1347980607,NG +1347980608,1347980623,DK +1347980624,1347980631,NG +1347980632,1347980639,DK +1347980640,1347980647,NG +1347980648,1347980671,DK +1347980672,1347980703,NG +1347980704,1347980735,TR +1347980736,1347980799,NG +1347980800,1347980991,IQ +1347980992,1347980999,DK +1347981000,1347981031,NG +1347981032,1347981039,IQ +1347981040,1347981055,NG +1347981056,1347981183,IQ +1347981184,1347981191,NG +1347981192,1347981199,IQ +1347981200,1347981207,NG +1347981208,1347981215,DK +1347981216,1347981247,NG +1347981248,1347981255,UG +1347981256,1347981263,DK +1347981264,1347981271,UG +1347981272,1347981279,DK +1347981280,1347981311,AO +1347981312,1347981887,NG +1347981888,1347981903,UG +1347981904,1347981919,AO +1347981920,1347981935,NG +1347981936,1347981943,CG +1347981944,1347981959,IQ +1347981960,1347981983,DK +1347981984,1347981999,AO +1347982000,1347982055,NG +1347982056,1347982063,DK +1347982064,1347982079,IQ +1347982080,1347982087,NG +1347982088,1347982095,DK +1347982096,1347982111,AO +1347982112,1347982143,DK +1347982144,1347982207,NG +1347982208,1347982223,IQ +1347982224,1347982239,NG +1347982240,1347982279,AO +1347982280,1347982287,DK +1347982288,1347982303,NG +1347982304,1347982335,AO +1347982336,1347982847,NG +1347982848,1347982863,DK +1347982864,1347982879,NG +1347982880,1347982887,IQ +1347982888,1347982991,NG +1347982992,1347983007,DK +1347983008,1347983055,NG +1347983056,1347983063,SE +1347983064,1347983071,NG +1347983072,1347983087,BJ +1347983088,1347983103,DK +1347983104,1347983119,NG +1347983120,1347983231,IQ +1347983232,1347983263,DK +1347983264,1347983271,LS +1347983272,1347983279,IQ +1347983280,1347983287,UG +1347983288,1347983295,DK +1347983296,1347983303,MR +1347983304,1347983311,NG +1347983312,1347983319,IQ +1347983320,1347983327,NG +1347983328,1347983335,ZM +1347983336,1347983343,MU +1347983344,1347983359,DK +1347983360,1347983519,NG +1347983520,1347983527,NR +1347983528,1347983535,NG +1347983536,1347983543,DK +1347983544,1347983551,NG +1347983552,1347983559,DK +1347983560,1347983575,NG +1347983576,1347983583,DK +1347983584,1347983591,AO +1347983592,1347983599,NG +1347983600,1347983615,BJ +1347983616,1347983887,DK +1347983888,1347983911,NG +1347983912,1347983919,DK +1347983920,1347983935,NG +1347983936,1347983943,UG +1347983944,1347983951,NG +1347983952,1347983967,DK +1347983968,1347983975,NG +1347983976,1347983983,NA +1347983984,1347984303,NG +1347984304,1347984311,TZ +1347984312,1347984335,NG +1347984336,1347984343,SZ +1347984344,1347984351,NG +1347984352,1347984367,DK +1347984368,1347984375,CI +1347984376,1347984383,DK +1347984384,1347984399,NG +1347984400,1347984407,DK +1347984408,1347984415,IQ +1347984416,1347984423,NG +1347984424,1347984431,DK +1347984432,1347984447,AO +1347984448,1347984575,IQ +1347984576,1347984607,NG +1347984608,1347984639,IQ +1347984640,1347984647,MW +1347984648,1347984671,NG +1347984672,1347984703,IQ +1347984704,1347984711,GA +1347984712,1347984719,DK +1347984720,1347984751,NG +1347984752,1347984791,DK +1347984792,1347984799,CO +1347984800,1347984807,CM +1347984808,1347984815,ZA +1347984816,1347984823,KE +1347984824,1347984831,DK +1347984832,1347984839,ZW +1347984840,1347984847,BJ +1347984848,1347984855,MR +1347984856,1347984863,KE +1347984864,1347984871,UG +1347984872,1347984903,NG +1347984904,1347984911,DK +1347984912,1347984927,CG +1347984928,1347984943,NG +1347984944,1347984959,DK +1347984960,1347984999,NG +1347985000,1347985007,UG +1347985008,1347985015,NG +1347985016,1347985023,UG +1347985024,1347985039,NG +1347985040,1347985047,UG +1347985048,1347985071,DK +1347985072,1347985079,CG +1347985080,1347985095,DK +1347985096,1347985119,NG +1347985120,1347985407,DK +1347985408,1347989503,IT +1347989504,1347993599,FI +1347993600,1348001791,GB +1348001792,1348005887,ES +1348005888,1348009983,BH +1348009984,1348014079,RU +1348014080,1348018175,DK +1348018176,1348026367,NO +1348026368,1348030463,DE +1348030464,1348034559,GB +1348034560,1348038655,AT +1348038656,1348042751,FR +1348042752,1348050943,RU +1348050944,1348055039,SE +1348055040,1348059135,LB +1348059136,1348063231,RU +1348063232,1348067327,CH +1348067328,1348071423,NL +1348071424,1348075519,DE +1348075520,1348075967,LV +1348075968,1348076031,PA +1348076032,1348076287,LV +1348076288,1348076543,RU +1348076544,1348083711,LV +1348083712,1348091903,LU +1348091904,1348095999,RU +1348096000,1348100095,AL +1348100096,1348104191,DE +1348104192,1348108287,RU +1348108288,1348112383,CZ +1348112384,1348116479,DE +1348116480,1348120575,JO +1348120576,1348124671,RU +1348124672,1348128767,GB +1348128768,1348132863,SI +1348132864,1348136959,UA +1348136960,1348141055,RU +1348141056,1348145151,DK +1348145152,1348149247,RU +1348149248,1348153343,NO +1348153344,1348157439,IT +1348157440,1348161535,ES +1348161536,1348162559,PT +1348162560,1348165631,ES +1348165632,1348169727,DE +1348169728,1348173823,AL +1348173824,1348174591,FI +1348174592,1348177919,DK +1348177920,1348182015,BE +1348182016,1348190207,UA +1348190208,1348194303,RU +1348194304,1348198399,GR +1348198400,1348202495,NO +1348206592,1348218879,RU +1348218880,1348219167,DE +1348219168,1348219183,IQ +1348219184,1348219247,DE +1348219248,1348219263,IQ +1348219264,1348219295,BH +1348219296,1348219327,DE +1348219328,1348219391,SA +1348219392,1348219647,DE +1348219648,1348219903,PK +1348219904,1348220415,DE +1348220416,1348220479,SA +1348220480,1348220511,DE +1348220512,1348220543,SA +1348220544,1348220687,DE +1348220688,1348220703,SA +1348220704,1348220711,DE +1348220712,1348220735,SA +1348220736,1348220799,BH +1348220800,1348220863,DE +1348220864,1348220895,BH +1348220896,1348221951,DE +1348221952,1348222463,PK +1348222464,1348222975,DE +1348222976,1348231167,LU +1348231168,1348235263,RU +1348235264,1348239359,AT +1348239360,1348241407,SE +1348241408,1348242687,GB +1348242688,1348243455,SE +1348243456,1348247551,GB +1348247552,1348251647,RU +1348251648,1348255743,GE +1348255744,1348263935,RU +1348263936,1348268031,UA +1348268032,1348272127,RU +1348272128,1348274695,IE +1348274696,1348274771,CH +1348274772,1348274775,IE +1348274776,1348274791,CH +1348274792,1348274799,IE +1348274800,1348274815,IL +1348274816,1348274927,IE +1348274928,1348274935,IL +1348274936,1348274943,IE +1348274944,1348275199,CH +1348275200,1348275711,GB +1348275712,1348275967,CH +1348275968,1348280319,IE +1348284416,1348288511,RU +1348288512,1348292607,IT +1348292608,1348296703,FR +1348296704,1348300799,RU +1348300800,1348304895,UA +1348304896,1348308991,IT +1348308992,1348313087,MT +1348313088,1348317183,GB +1348317184,1348321279,RU +1348321280,1348325375,GB +1348325376,1348329471,TR +1348329472,1348337663,CS +1348337664,1348341759,ES +1348341760,1348345855,PL +1348345856,1348349951,GB +1348349952,1348354047,SK +1348354048,1348358143,NL +1348358144,1348362239,DE +1348362240,1348366335,MC +1348366336,1348370431,IT +1348370432,1348374527,DE +1348374528,1348378623,CH +1348378624,1348382719,BY +1348382720,1348386815,FR +1348386816,1348390911,GB +1348390912,1348395007,SE +1348395008,1348399103,BY +1348399104,1348403199,MD +1348407296,1348411391,BG +1348411392,1348415487,RU +1348415488,1348419583,GB +1348419584,1348427775,HU +1348427776,1348435967,CZ +1348435968,1348440063,FI +1348440064,1348444159,DE +1348444160,1348448255,NL +1348448256,1348456447,GB +1348456448,1348460543,BH +1348460544,1348464639,SI +1348464640,1348468735,CZ +1348468736,1348548607,RO +1348548608,1348549631,MD +1348549632,1348599807,RO +1348599808,1348730879,HU +1348730880,1348861951,NL +1348861952,1348993023,ES +1348993024,1349124095,IT +1349124096,1349255167,GR +1349255168,1349517311,AT +1349517312,1349763071,NL +1349763072,1349771263,RU +1349771264,1349779455,NL +1349779456,1349910527,IT +1349910528,1350041599,FR +1350041600,1350091135,AT +1350091136,1350091199,SA +1350091200,1350091991,AT +1350091992,1350091999,SA +1350092000,1350092375,AT +1350092376,1350092391,IQ +1350092392,1350092467,AT +1350092468,1350092471,DE +1350092472,1350092495,AT +1350092496,1350092503,IQ +1350092504,1350215167,AT +1350215168,1350215191,IQ +1350215192,1350215679,AT +1350215680,1350215683,SA +1350215684,1350215699,AT +1350215700,1350215703,IQ +1350215704,1350215743,AT +1350215744,1350215751,IQ +1350215752,1350215763,AT +1350215764,1350215767,IQ +1350215768,1350215783,AT +1350215784,1350215787,AE +1350215788,1350215791,IQ +1350215792,1350215903,AT +1350215904,1350215911,IQ +1350215912,1350215971,AT +1350215972,1350215975,IQ +1350215976,1350215987,AT +1350215988,1350215991,DE +1350215992,1350216023,AT +1350216024,1350216031,IQ +1350216032,1350216047,AT +1350216048,1350216055,SA +1350216056,1350216075,AT +1350216076,1350216079,SA +1350216080,1350216095,AT +1350216096,1350216107,SA +1350216108,1350216111,AT +1350216112,1350216123,SA +1350216124,1350216127,IQ +1350216128,1350216151,AT +1350216152,1350216159,SA +1350216160,1350216175,AT +1350216176,1350216183,SA +1350216184,1350216203,AT +1350216204,1350216207,SA +1350216208,1350216211,AT +1350216212,1350216219,SA +1350216220,1350216223,AT +1350216224,1350216227,SA +1350216228,1350216231,AT +1350216232,1350216235,SA +1350216236,1350216239,AT +1350216240,1350216243,SA +1350216244,1350216247,AT +1350216248,1350216251,SA +1350216252,1350216275,AT +1350216276,1350216287,SA +1350216288,1350216295,AT +1350216296,1350216299,SA +1350216300,1350216311,AT +1350216312,1350216315,SA +1350216316,1350216431,AT +1350216432,1350216451,SA +1350216452,1350216455,AT +1350216456,1350216459,SA +1350216460,1350216467,AT +1350216468,1350216471,SA +1350216472,1350216475,IQ +1350216476,1350216479,SA +1350216480,1350216487,DE +1350216488,1350216551,AT +1350216552,1350216555,SA +1350216556,1350216711,AT +1350216712,1350216719,SA +1350216720,1350216723,AT +1350216724,1350216727,SA +1350216728,1350216731,AT +1350216732,1350216735,IQ +1350216736,1350216743,AT +1350216744,1350216759,IQ +1350216760,1350216983,AT +1350216984,1350216987,IQ +1350216988,1350217011,AT +1350217012,1350217015,IQ +1350217016,1350217027,AT +1350217028,1350217031,SA +1350217032,1350217043,AT +1350217044,1350217047,IQ +1350217048,1350217051,SA +1350217052,1350217079,AT +1350217080,1350217083,SA +1350217084,1350217115,AT +1350217116,1350217119,SA +1350217120,1350217135,AT +1350217136,1350217139,SA +1350217140,1350217343,AT +1350217344,1350217347,IQ +1350217348,1350217351,AE +1350217352,1350217403,AT +1350217404,1350217407,SA +1350217408,1350217423,AE +1350217424,1350217455,AT +1350217456,1350217471,IT +1350217472,1350217635,AT +1350217636,1350217639,DE +1350217640,1350217695,AT +1350217696,1350217711,AE +1350217712,1350220287,AT +1350220288,1350220543,DE +1350220544,1350295823,AT +1350295824,1350295831,SA +1350295832,1350295847,AT +1350295848,1350295855,SA +1350295856,1350296071,AT +1350296072,1350296079,IQ +1350296080,1350296099,AT +1350296100,1350296103,SA +1350296104,1350296111,IQ +1350296112,1350296119,AT +1350296120,1350296127,IQ +1350296128,1350296199,AT +1350296200,1350296207,SA +1350296208,1350296243,IQ +1350296244,1350296247,AT +1350296248,1350296255,IQ +1350296256,1350296303,AT +1350296304,1350296319,IQ +1350296320,1350296327,AT +1350296328,1350296343,IQ +1350296344,1350296351,AT +1350296352,1350296359,IQ +1350296360,1350296367,AT +1350296368,1350296387,IQ +1350296388,1350296391,AT +1350296392,1350296395,IQ +1350296396,1350296399,AT +1350296400,1350296403,SA +1350296404,1350296419,IQ +1350296420,1350296431,SA +1350296432,1350296439,DE +1350296440,1350296511,AT +1350296512,1350296519,IQ +1350296520,1350296539,AT +1350296540,1350296543,SA +1350296544,1350303743,AT +1350303744,1350434815,FR +1350434816,1350565887,NL +1350565888,1351793791,DE +1351793792,1351793855,GB +1351793856,1351797231,DE +1351797232,1351797239,PL +1351797240,1351800351,DE +1351800352,1351800359,CN +1351800360,1351801327,DE +1351801328,1351801335,HU +1351801336,1351879631,DE +1351879632,1351879639,IT +1351879640,1351879999,DE +1351880000,1351880031,IT +1351880032,1352010239,DE +1352010240,1352010495,US +1352010496,1352011447,DE +1352011448,1352011455,IT +1352011456,1352139671,DE +1352139672,1352139679,IT +1352139680,1352144519,DE +1352144520,1352144527,IT +1352144528,1352144535,US +1352144536,1352144559,DE +1352144560,1352144575,HK +1352144576,1352147007,DE +1352147008,1352147015,SE +1352147016,1352147107,DE +1352147108,1352147111,SE +1352147112,1352147263,DE +1352147264,1352147271,ES +1352147272,1352147391,DE +1352147392,1352147399,CZ +1352147400,1352147423,DE +1352147424,1352147431,ES +1352147432,1352147439,DE +1352147440,1352147447,SZ +1352147448,1352148151,DE +1352148152,1352148159,IT +1352148160,1352148751,DE +1352148752,1352148759,US +1352148760,1352271087,DE +1352271088,1352271095,AT +1352271096,1352277535,DE +1352277536,1352277567,IT +1352277568,1352402791,DE +1352402792,1352402799,BE +1352402800,1352404599,DE +1352404600,1352404607,NL +1352404608,1352663039,DE +1352663040,1353187327,DK +1353187328,1353255071,GB +1353255072,1353255087,CA +1353255088,1353255839,GB +1353255840,1353255855,FR +1353255856,1353258239,GB +1353258240,1353258263,SE +1353258264,1353258271,GB +1353258272,1353258303,SE +1353258304,1353258367,FI +1353258368,1353258415,SE +1353258416,1353258423,GB +1353258424,1353258503,SE +1353258504,1353258527,GB +1353258528,1353258543,SE +1353258544,1353258631,GB +1353258632,1353258647,SE +1353258648,1353258783,GB +1353258784,1353258807,SE +1353258808,1353266959,GB +1353266960,1353266975,IE +1353266976,1353267455,GB +1353267456,1353267743,IE +1353267744,1353267751,GB +1353267752,1353267767,IE +1353267768,1353267775,GB +1353267776,1353267839,IE +1353267840,1353267967,GB +1353267968,1353268223,IE +1353268224,1353268487,GB +1353268488,1353268511,BE +1353268512,1353268559,GB +1353268560,1353268567,BE +1353268568,1353268575,GB +1353268576,1353268583,BE +1353268584,1353268599,GB +1353268600,1353268647,BE +1353268648,1353268655,GB +1353268656,1353268679,BE +1353268680,1353268687,GB +1353268688,1353268735,BE +1353268736,1353268883,GB +1353268884,1353268887,BE +1353268888,1353269015,GB +1353269016,1353269039,BE +1353269040,1353269055,GB +1353269056,1353269087,BE +1353269088,1353271807,GB +1353271808,1353271831,ES +1353271832,1353271895,GB +1353271896,1353271919,ES +1353271920,1353271927,GB +1353271928,1353272031,ES +1353272032,1353272039,FR +1353272040,1353272055,ES +1353272056,1353272063,GB +1353272064,1353272191,ES +1353272192,1353272207,GB +1353272208,1353272247,ES +1353272248,1353272255,GB +1353272256,1353272303,ES +1353272304,1353272583,GB +1353272584,1353272591,ES +1353272592,1353272599,GB +1353272600,1353272631,ES +1353272632,1353272639,GB +1353272640,1353272647,ES +1353272648,1353272655,GB +1353272656,1353272663,ES +1353272664,1353272687,GB +1353272688,1353272691,ES +1353272692,1353272703,GB +1353272704,1353272711,ES +1353272712,1353272719,GB +1353272720,1353272727,ES +1353272728,1353272767,GB +1353272768,1353272775,ES +1353272776,1353272815,GB +1353272816,1353272823,ES +1353272824,1353272831,GB +1353272832,1353272839,ES +1353272840,1353272967,GB +1353272968,1353272975,ES +1353272976,1353272991,GB +1353272992,1353272999,ES +1353273000,1353273039,GB +1353273040,1353273047,ES +1353273048,1353273343,GB +1353273344,1353273607,BE +1353273608,1353273623,GB +1353273624,1353273647,BE +1353273648,1353273663,GB +1353273664,1353273711,BE +1353273712,1353273719,GB +1353273720,1353273727,BE +1353273728,1353274623,GB +1353274624,1353274655,ES +1353274656,1353274663,GB +1353274664,1353274671,ES +1353274672,1353274719,GB +1353274720,1353274751,ES +1353274752,1353274783,GB +1353274784,1353274799,ES +1353274800,1353274831,GB +1353274832,1353274839,ES +1353274840,1353274855,GB +1353274856,1353274863,ES +1353274864,1353274879,GB +1353274880,1353274887,ES +1353274888,1353274911,GB +1353274912,1353274919,ES +1353274920,1353274927,GB +1353274928,1353274943,ES +1353274944,1353275039,GB +1353275040,1353275063,ES +1353275064,1353275103,GB +1353275104,1353275111,ES +1353275112,1353275119,GB +1353275120,1353275159,ES +1353275160,1353275167,GB +1353275168,1353275231,ES +1353275232,1353275279,GB +1353275280,1353275287,ES +1353275288,1353275295,GB +1353275296,1353275335,ES +1353275336,1353275343,GB +1353275344,1353275391,ES +1353275392,1353277439,GB +1353277440,1353279487,CH +1353279488,1353279495,GB +1353279496,1353279735,IT +1353279736,1353279751,GB +1353279752,1353279759,IT +1353279760,1353279791,GB +1353279792,1353279999,IT +1353280000,1353280007,GB +1353280008,1353280031,IT +1353280032,1353280039,GB +1353280040,1353280103,IT +1353280104,1353280111,GB +1353280112,1353280303,IT +1353280304,1353280335,GB +1353280336,1353280383,IT +1353280384,1353280391,GB +1353280392,1353280471,IT +1353280472,1353280479,GB +1353280480,1353280487,IT +1353280488,1353280495,GB +1353280496,1353280623,IT +1353280624,1353280631,GB +1353280632,1353280639,IT +1353280640,1353280647,GB +1353280648,1353280655,IT +1353280656,1353280663,GB +1353280664,1353280687,IT +1353280688,1353280703,GB +1353280704,1353281023,IT +1353281024,1353281279,GB +1353281280,1353281535,BE +1353281536,1353282047,GB +1353282048,1353282111,IT +1353282112,1353282119,GB +1353282120,1353282239,IT +1353282240,1353282247,GB +1353282248,1353282255,IT +1353282256,1353282263,GB +1353282264,1353282287,IT +1353282288,1353282295,GB +1353282296,1353282303,IT +1353282304,1353287327,GB +1353287328,1353287359,IE +1353287360,1353287935,GB +1353287936,1353287951,IE +1353287952,1353287959,GB +1353287960,1353288031,IE +1353288032,1353288063,GB +1353288064,1353288071,IE +1353288072,1353288079,GB +1353288080,1353288151,IE +1353288152,1353288191,GB +1353288192,1353288231,IE +1353288232,1353288239,GB +1353288240,1353288319,IE +1353288320,1353288407,GB +1353288408,1353288431,IE +1353288432,1353288447,GB +1353288448,1353288511,IE +1353288512,1353288527,GB +1353288528,1353288655,IE +1353288656,1353288663,GB +1353288664,1353288687,IE +1353288688,1353288703,GB +1353288704,1353288831,IE +1353288832,1353288959,GB +1353288960,1353289343,IE +1353289344,1353289351,GB +1353289352,1353289359,IE +1353289360,1353289367,GB +1353289368,1353289375,IE +1353289376,1353289383,GB +1353289384,1353289391,IE +1353289392,1353289415,GB +1353289416,1353289423,IE +1353289424,1353289431,GB +1353289432,1353289471,IE +1353289472,1353289599,GB +1353289600,1353289623,IE +1353289624,1353289631,GB +1353289632,1353289647,IE +1353289648,1353290751,GB +1353290752,1353290815,DE +1353290816,1353290927,GB +1353290928,1353290935,IE +1353290936,1353297151,GB +1353297152,1353297183,IE +1353297184,1353298687,GB +1353298688,1353298695,SE +1353298696,1353298703,DE +1353298704,1353298719,GB +1353298720,1353298751,DE +1353298752,1353298879,SE +1353298880,1353298887,GB +1353298888,1353298895,SE +1353298896,1353298911,GB +1353298912,1353299607,SE +1353299608,1353299615,GB +1353299616,1353299631,SE +1353299632,1353299647,GB +1353299648,1353299711,SE +1353299712,1353299839,GB +1353299840,1353299847,SE +1353299848,1353299863,GB +1353299864,1353299879,SE +1353299880,1353299887,GB +1353299888,1353299911,SE +1353299912,1353299967,GB +1353299968,1353300031,SE +1353300032,1353300039,GB +1353300040,1353300047,SE +1353300048,1353300063,GB +1353300064,1353300271,SE +1353300272,1353300279,FI +1353300280,1353300287,SE +1353300288,1353300319,GB +1353300320,1353300351,SE +1353300352,1353300367,GB +1353300368,1353300383,SE +1353300384,1353301095,GB +1353301096,1353301103,US +1353301104,1353304879,GB +1353304880,1353304895,ES +1353304896,1353305599,GB +1353305600,1353305607,IE +1353305608,1353306111,GB +1353306112,1353306623,ES +1353306624,1353306880,BE +1353306881,1353308159,GB +1353308160,1353309183,FR +1353309184,1353310471,GB +1353310472,1353310479,ES +1353310480,1353310495,GB +1353310496,1353310527,ES +1353310528,1353310543,GB +1353310544,1353310559,ES +1353310560,1353310583,GB +1353310584,1353310591,ES +1353310592,1353310975,GB +1353310976,1353311023,IT +1353311024,1353311087,GB +1353311088,1353311095,IT +1353311096,1353311103,GB +1353311104,1353311119,IT +1353311120,1353312255,GB +1353312256,1353312767,CH +1353312768,1353317375,GB +1353317376,1353317631,FR +1353317632,1353318399,GB +1353318400,1353383935,FR +1353383936,1353449471,DE +1353449472,1353515007,PT +1353515008,1353646079,ES +1353646080,1353842687,GB +1353842688,1353956607,IL +1353956608,1353956863,GB +1353956864,1353973759,IL +1353973760,1354235903,IT +1354235904,1354301439,KW +1354301440,1354366975,FR +1354366976,1354432511,FI +1354432512,1354498047,DE +1354498048,1354563583,CZ +1354563584,1354629119,GB +1354629120,1354663807,DE +1354663808,1354663808,AT +1354663809,1354664743,DE +1354664744,1354664751,IT +1354664752,1354664759,DE +1354664760,1354664767,IT +1354664768,1354665215,DE +1354665216,1354665247,ES +1354665248,1354665943,DE +1354665944,1354665951,IT +1354665952,1354666639,DE +1354666640,1354666650,FI +1354666651,1354666687,DE +1354666688,1354666688,FI +1354666689,1354668031,DE +1354668032,1354668159,AT +1354668160,1354673919,DE +1354673920,1354674175,PL +1354674176,1354674719,DE +1354674720,1354674751,CH +1354674752,1354674783,DK +1354674784,1354674815,DE +1354674816,1354674943,IT +1354674944,1354675199,AE +1354675200,1354675327,DE +1354675328,1354675359,DK +1354675360,1354675431,DE +1354675432,1354675439,IT +1354675440,1354676479,DE +1354676480,1354676767,AE +1354676768,1354676783,DE +1354676784,1354676791,PL +1354676792,1354676991,DE +1354676992,1354677023,AE +1354677024,1354677151,DE +1354677152,1354677159,AT +1354677160,1354677247,DE +1354677248,1354677279,AE +1354677280,1354678015,DE +1354678016,1354678031,AE +1354678032,1354678159,DE +1354678160,1354678163,PL +1354678164,1354678335,DE +1354678336,1354678343,RO +1354678344,1354678559,DE +1354678560,1354678575,AE +1354678576,1354678743,DE +1354678744,1354678751,CH +1354678752,1354678759,IT +1354678760,1354679295,DE +1354679296,1354679807,AE +1354679808,1354679839,DE +1354679840,1354679871,DK +1354679872,1354680063,DE +1354680064,1354680079,AE +1354680080,1354680175,DE +1354680176,1354680179,PL +1354680180,1354681247,DE +1354681248,1354681279,DK +1354681280,1354681471,DE +1354681472,1354681487,AE +1354681488,1354682111,DE +1354682112,1354682143,DK +1354682144,1354682175,CH +1354682176,1354682287,DE +1354682288,1354682303,AE +1354682304,1354682771,DE +1354682772,1354682775,RS +1354682776,1354682895,DE +1354682896,1354682911,AE +1354682912,1354682939,DE +1354682940,1354682943,MC +1354682944,1354683095,DE +1354683096,1354683103,IT +1354683104,1354683391,DE +1354683392,1354683903,PL +1354683904,1354684415,DE +1354684416,1354684431,AE +1354684432,1354684671,DE +1354684672,1354684927,AE +1354684928,1354687023,DE +1354687024,1354687031,LU +1354687032,1354687359,DE +1354687360,1354687375,NZ +1354687376,1354687383,DE +1354687384,1354687391,NZ +1354687392,1354687399,DE +1354687400,1354687407,IT +1354687408,1354687455,DE +1354687456,1354687487,IT +1354687488,1354687553,DE +1354687554,1354687554,NZ +1354687555,1354687759,DE +1354687760,1354687763,CH +1354687764,1354688362,DE +1354688363,1354688363,CH +1354688364,1354688815,DE +1354688816,1354688816,IT +1354688817,1354694655,DE +1354694656,1354760191,IR +1354760192,1355022335,GB +1355022336,1355284479,DK +1355284480,1355415551,BE +1355415552,1355546623,NO +1355546624,1355808767,IT +1355808768,1356070911,DK +1356070912,1356201983,NO +1356201984,1356333055,FR +1356333056,1356464127,SE +1356464128,1356595199,CH +1356595200,1356857343,FI +1356857344,1356922879,ES +1356922880,1356988415,GB +1356988416,1357053951,DE +1357053952,1357119487,AE +1357119488,1357126807,DE +1357126808,1357126815,NL +1357126816,1357127063,DE +1357127064,1357127079,NL +1357127080,1357127471,DE +1357127472,1357127487,CH +1357127488,1357177943,DE +1357177944,1357177951,NL +1357177952,1357185023,DE +1357185024,1357250559,GB +1357250560,1357316095,IL +1357316096,1357316607,ES +1357316608,1357317119,LU +1357317120,1357317375,NG +1357317376,1357317631,LB +1357317632,1357318143,LY +1357318144,1357320191,QA +1357320192,1357320703,FR +1357320704,1357320959,RO +1357320960,1357320991,ES +1357320992,1357320999,GB +1357321000,1357321007,FR +1357321008,1357321015,GB +1357321016,1357321023,DK +1357321088,1357321215,LB +1357321216,1357321471,GB +1357321472,1357321503,ES +1357321728,1357321983,CY +1357321984,1357322239,SO +1357322240,1357322751,DE +1357322752,1357323263,BH +1357323264,1357323519,ES +1357323520,1357323775,GB +1357323776,1357324287,DE +1357326336,1357326591,NL +1357326592,1357326847,DE +1357326848,1357327359,GB +1357327360,1357328383,DE +1357328384,1357330176,SA +1357330432,1357330943,DE +1357330944,1357331455,ES +1357332480,1357333247,DE +1357333248,1357333503,GB +1357333504,1357333759,IR +1357333856,1357334527,ES +1357334528,1357335039,FR +1357335040,1357335295,LB +1357335296,1357335807,FR +1357335808,1357336063,KE +1357336064,1357336319,GB +1357336320,1357336575,FR +1357336576,1357337599,NL +1357337600,1357337855,FR +1357337856,1357338111,ES +1357338112,1357338879,FR +1357338880,1357339391,NO +1357339392,1357339647,AT +1357339648,1357339903,DZ +1357339904,1357340415,ES +1357340416,1357340671,LB +1357340672,1357342719,GB +1357348864,1357349119,DE +1357349120,1357349375,LU +1357349376,1357350399,ES +1357350400,1357350911,QA +1357350912,1357351167,SM +1357351168,1357351423,PL +1357351424,1357351679,DE +1357351680,1357351935,PL +1357351936,1357352447,GB +1357356032,1357357567,ES +1357357568,1357358079,DE +1357358080,1357358335,ES +1357358592,1357358847,DE +1357358848,1357359103,PL +1357359104,1357359487,ES +1357359552,1357359999,ES +1357360128,1357360255,GB +1357360384,1357360639,ES +1357360640,1357360895,GB +1357360896,1357361151,DE +1357363200,1357364223,QA +1357364224,1357365247,ES +1357365248,1357365759,DZ +1357365760,1357365791,ES +1357365824,1357365887,GB +1357365888,1357365951,DE +1357365952,1357366015,GB +1357366016,1357366271,KM +1357366272,1357366527,FR +1357366528,1357366591,BE +1357366592,1357366655,FR +1357366656,1357366719,PT +1357366720,1357366783,FR +1357366784,1357366799,MD +1357366816,1357366847,FR +1357366848,1357366863,GB +1357366864,1357366879,ES +1357366880,1357366911,GB +1357366912,1357367039,FR +1357367040,1357367295,GB +1357367296,1357368063,DZ +1357368064,1357368831,GN +1357369344,1357369599,PL +1357369600,1357369855,GB +1357369856,1357370111,KE +1357370112,1357370879,DZ +1357370880,1357371391,LY +1357371392,1357371903,PK +1357371904,1357372159,FR +1357372160,1357372415,GB +1357372928,1357373183,AM +1357373184,1357373439,GB +1357381632,1357391615,NO +1357391616,1357391871,SE +1357391872,1357404311,NO +1357404312,1357404315,SE +1357404316,1357414399,NO +1357414400,1357447167,LV +1357447168,1357479935,DK +1357479936,1357512703,LV +1357512704,1357545471,RU +1357545472,1357578239,GB +1357578240,1357611007,EE +1357611008,1357643775,GB +1357643776,1357676543,FR +1357676544,1357709311,BE +1357709312,1357742079,RU +1357742080,1357759183,DE +1357759184,1357759191,AT +1357759192,1357765823,DE +1357765824,1357765831,AT +1357765832,1357774847,DE +1357774848,1357791231,GB +1357791232,1357807615,PL +1357807616,1357840383,CH +1357840384,1357867735,NO +1357867736,1357867743,SE +1357867744,1357873151,NO +1357873152,1357875199,DE +1357875200,1357875215,AT +1357875216,1357875223,DE +1357875232,1357875247,DE +1357875264,1357875279,AT +1357875280,1357875423,DE +1357875424,1357875439,GB +1357875456,1357875711,DE +1357875712,1357875967,PL +1357875968,1357876143,DE +1357876152,1357876191,DE +1357876208,1357876215,DE +1357876288,1357876303,PL +1357876336,1357876339,PL +1357876392,1357876399,PL +1357876416,1357876479,PL +1357876480,1357876495,SE +1357876608,1357876863,DE +1357876864,1357876927,SE +1357876928,1357877759,DE +1357878272,1357879807,DE +1357879808,1357879871,RU +1357879872,1357879935,DE +1357880448,1357880511,CH +1357880512,1357880543,DE +1357880544,1357880559,AT +1357880560,1357880831,DE +1357880832,1357881087,AT +1357881088,1357881343,DE +1357881344,1357883391,FR +1357883392,1357883407,ES +1357883424,1357883519,FR +1357883536,1357883551,FR +1357883584,1357883719,FR +1357883760,1357883807,FR +1357883840,1357883951,FR +1357884000,1357884031,FR +1357884160,1357884423,FR +1357884440,1357884447,FR +1357884512,1357884927,FR +1357884992,1357885055,FR +1357885120,1357885183,FR +1357885200,1357885215,ES +1357885312,1357885439,DE +1357885440,1357885695,FR +1357885952,1357886463,FR +1357886464,1357887487,US +1357887488,1357888511,FR +1357889536,1357890815,PL +1357890824,1357890895,NL +1357890912,1357890943,DE +1357890944,1357891391,NL +1357891408,1357891423,CA +1357891424,1357891455,NL +1357891456,1357891583,SE +1357891584,1357891679,NL +1357891712,1357891839,NL +1357892096,1357893119,NL +1357893408,1357893439,SE +1357893504,1357893631,DE +1357897856,1357898495,DE +1357898752,1357898879,DE +1357899008,1357899015,DE +1357899024,1357899263,DE +1357899552,1357899567,AT +1357899776,1357900287,DE +1357900416,1357900543,SE +1357900544,1357900799,NL +1357900800,1357901311,DE +1357901568,1357901823,DE +1357901824,1357902335,ES +1357903616,1357903871,SE +1357905920,1357910015,LT +1357910016,1357914111,GR +1357914112,1357922303,RU +1357922304,1357926399,SA +1357926400,1357930495,GB +1357930496,1357942783,RU +1357942784,1357943039,RS +1357943040,1357946879,CS +1357946880,1357955071,PL +1357959168,1357963263,RU +1357963264,1357964199,AT +1357964200,1357964207,DE +1357964208,1357967359,AT +1357967360,1357971455,RU +1357971456,1357975551,KZ +1357975552,1357979647,AT +1357979648,1357983743,KZ +1357983744,1357987839,RU +1357987840,1357991935,GB +1357991936,1357996031,NO +1357996032,1358000127,CH +1358000128,1358004223,LI +1358004224,1358008319,PL +1358008320,1358012415,BH +1358012416,1358016511,IT +1358016512,1358020607,GE +1358020608,1358024703,DE +1358024704,1358028799,EE +1358028800,1358032895,IT +1358032896,1358036991,GE +1358036992,1358041087,IR +1358041088,1358045183,FI +1358045184,1358049279,SK +1358049280,1358061567,RU +1358065664,1358069759,BA +1358069760,1358074719,DE +1358074720,1358074751,CH +1358074752,1358082815,DE +1358082816,1358083071,CH +1358083072,1358086143,DE +1358086144,1358090239,CH +1358094336,1358102527,NL +1358102528,1358106623,RU +1358106624,1358110719,LT +1358110720,1358116895,DE +1358116896,1358116911,IT +1358116912,1358118911,DE +1358118912,1358123007,RU +1358123008,1358127103,PT +1358127104,1358131199,CZ +1358131200,1358135295,DK +1358135296,1358139391,DE +1358139392,1358143487,UA +1358143488,1358144159,AT +1358144160,1358144191,MT +1358144192,1358147519,AT +1358147520,1358147583,MT +1358147584,1358151679,GB +1358151680,1358155775,DE +1358155776,1358159871,CH +1358159872,1358163967,ES +1358163968,1358168063,FR +1358168064,1358172159,GB +1358172160,1358173183,CY +1358173184,1358176255,GR +1358176256,1358180351,RU +1358180352,1358184447,ES +1358184448,1358192639,SE +1358192640,1358196735,HU +1358196736,1358200831,IT +1358200832,1358209023,PL +1358209024,1358213119,IL +1358213120,1358217215,GB +1358217216,1358221311,SE +1358221312,1358223359,DE +1358223360,1358223631,GB +1358223632,1358223735,DE +1358223736,1358223775,GB +1358223776,1358223911,DE +1358223912,1358223927,NL +1358223928,1358223967,DE +1358223968,1358224039,NL +1358224040,1358224511,DE +1358224512,1358224519,BE +1358224520,1358224611,DE +1358224612,1358224651,BE +1358224652,1358224655,DE +1358224656,1358224719,BE +1358224720,1358224927,DE +1358224928,1358224979,IT +1358224980,1358224983,DE +1358224984,1358225055,IT +1358225056,1358225407,DE +1358225408,1358229503,RU +1358229504,1358229631,DE +1358229632,1358229639,LU +1358229640,1358230111,DE +1358230112,1358230115,AT +1358230116,1358230383,DE +1358230384,1358230391,US +1358230392,1358230399,CH +1358230400,1358232863,DE +1358232864,1358232879,IT +1358232880,1358233599,DE +1358233600,1358237695,ES +1358237696,1358241791,FR +1358241792,1358241807,BE +1358241808,1358242591,FR +1358242592,1358242623,BE +1358242624,1358244351,FR +1358244352,1358245375,NL +1358245376,1358245663,FR +1358245664,1358245679,BE +1358245680,1358245695,FR +1358245696,1358245727,BE +1358245728,1358245887,FR +1358245888,1358247935,NL +1358247936,1358249983,FR +1358249984,1358251815,DE +1358251816,1358251823,NL +1358251824,1358254079,DE +1358254080,1358258175,MD +1358258176,1358262271,GB +1358262272,1358266367,UA +1358266368,1358274559,DE +1358274560,1358278655,GR +1358278656,1358282751,PL +1358282752,1358286847,AT +1358286848,1358290943,MT +1358290944,1358295039,SE +1358295040,1358299135,RU +1358303232,1358307327,RU +1358307328,1358315519,DE +1358315520,1358323711,RU +1358323712,1358327807,LU +1358327808,1358328671,DE +1358328672,1358328727,AT +1358328728,1358331903,DE +1358331904,1358335999,IL +1358336000,1358344191,FI +1358344192,1358352383,NL +1358352384,1358356479,RU +1358356480,1358360575,SI +1358360576,1358364671,RU +1358364672,1358372863,GB +1358372864,1358376959,RU +1358376960,1358381055,GB +1358381056,1358383311,IT +1358383312,1358383327,FR +1358383328,1358384127,IT +1358384128,1358384143,FR +1358384144,1358384191,IT +1358384192,1358384199,FR +1358384200,1358385151,IT +1358385152,1358389247,GB +1358389248,1358397439,RU +1358397440,1358397951,GB +1358397952,1358398463,TZ +1358398464,1358399487,GB +1358399488,1358399999,NG +1358400000,1358400007,PK +1358400008,1358400015,GB +1358400016,1358400071,IN +1358400072,1358400255,GB +1358400256,1358400511,AF +1358400512,1358400519,GA +1358400520,1358400527,GB +1358400528,1358400535,TZ +1358400536,1358400543,GB +1358400544,1358400551,GA +1358400552,1358400575,GB +1358400576,1358400591,KE +1358400592,1358400639,GB +1358400640,1358400775,KE +1358400776,1358400783,GB +1358400784,1358400799,KE +1358400800,1358400863,NG +1358400864,1358400895,GA +1358400896,1358401279,NG +1358401280,1358401391,KE +1358401392,1358401407,GB +1358401408,1358401439,KE +1358401440,1358402175,GB +1358402176,1358402303,TZ +1358402304,1358402319,GB +1358402320,1358402343,NG +1358402344,1358402351,KE +1358402352,1358402359,GB +1358402360,1358402363,ID +1358402364,1358402367,GB +1358402368,1358402399,NG +1358402400,1358402415,CG +1358402416,1358402419,ID +1358402420,1358402447,GB +1358402448,1358402463,KE +1358402464,1358402495,GB +1358402496,1358402543,KE +1358402544,1358403103,GB +1358403104,1358403135,ID +1358403136,1358403151,GB +1358403152,1358403167,ID +1358403168,1358403183,GB +1358403184,1358403273,ID +1358403274,1358403327,GB +1358403328,1358403583,NG +1358403584,1358403591,PK +1358403592,1358403631,GB +1358403632,1358403679,PK +1358403680,1358403687,GB +1358403688,1358403711,PK +1358403712,1358403839,GB +1358403840,1358404095,NG +1358404096,1358404607,GB +1358404608,1358404611,NG +1358404612,1358404615,TZ +1358404616,1358404623,NG +1358404624,1358404655,TZ +1358404656,1358404671,NG +1358404672,1358404695,GB +1358404696,1358404703,TZ +1358404704,1358404735,GB +1358404736,1358404751,NG +1358404752,1358404767,GB +1358404768,1358404783,NG +1358404784,1358404863,GB +1358404864,1358405119,NG +1358405120,1358405375,TZ +1358405376,1358405631,NG +1358405632,1358409727,NL +1358409728,1358413823,RU +1358413824,1358422015,NL +1358422016,1358426111,FR +1358426112,1358430207,FI +1358434304,1358438399,IS +1358438400,1358442495,NL +1358442496,1358446591,RU +1358450688,1358454783,RU +1358454784,1358462975,FI +1358462976,1358467071,SE +1358467072,1358471167,RU +1358471168,1358475263,FI +1358475264,1358479359,GB +1358479360,1358483455,LI +1358483456,1358487551,FR +1358487552,1358491647,SE +1358491648,1358495743,FI +1358495744,1358499839,PL +1358499840,1358503935,KZ +1358503936,1358508031,IT +1358508032,1358512127,GB +1358516224,1358520319,BY +1358520320,1358524415,GB +1358524416,1358524671,CH +1358524672,1358524927,DE +1358524928,1358525183,GB +1358525184,1358525215,NL +1358525216,1358525227,DE +1358525228,1358525235,NL +1358525236,1358525327,DE +1358525328,1358525343,NL +1358525344,1358525359,DE +1358525360,1358525391,NL +1358525392,1358525487,DE +1358525488,1358525491,CH +1358525492,1358525535,DE +1358525536,1358525543,CH +1358525544,1358526207,DE +1358526208,1358526463,NL +1358526464,1358526975,DE +1358526976,1358527231,NL +1358527232,1358527487,DE +1358527488,1358527743,NL +1358527744,1358527751,DE +1358527752,1358527759,NL +1358527760,1358528511,DE +1358528512,1358536703,RU +1358536704,1358540799,HU +1358540800,1358544895,RU +1358544896,1358548991,LV +1358548992,1358553087,JO +1358553088,1358557183,UA +1358557184,1358561279,IE +1358561280,1358567439,CZ +1358567440,1358567455,SC +1358567456,1358569471,CZ +1358573568,1358577663,LV +1358577664,1358585855,RU +1358585856,1358589951,GB +1358589952,1358594047,EE +1358594048,1358598143,DE +1358598144,1358602239,IL +1358602240,1358622719,RU +1358622720,1358626815,SK +1358626816,1358635007,GB +1358635008,1358639103,TR +1358639104,1358643199,RU +1358643200,1358647295,ES +1358647296,1358651391,DE +1358651392,1358655487,FR +1358655488,1358667775,RU +1358667776,1358668039,PT +1358668040,1358668047,GB +1358668048,1358668063,PT +1358668064,1358668095,GB +1358668096,1358668211,PT +1358668212,1358668223,GB +1358668224,1358668231,PT +1358668232,1358668239,GB +1358668240,1358668263,PT +1358668264,1358668279,GB +1358668280,1358668359,PT +1358668360,1358668367,GB +1358668368,1358668463,PT +1358668464,1358668479,ES +1358668480,1358668551,PT +1358668552,1358668567,GB +1358668568,1358668575,PT +1358668576,1358668591,GB +1358668592,1358668735,PT +1358668736,1358668807,GB +1358668808,1358668815,PT +1358668816,1358668831,GB +1358668832,1358669351,PT +1358669352,1358669359,GB +1358669360,1358669399,PT +1358669400,1358669407,GB +1358669408,1358669503,PT +1358669504,1358669519,GB +1358669520,1358669543,PT +1358669544,1358669551,GB +1358669552,1358669915,PT +1358669916,1358669919,GB +1358669920,1358669999,PT +1358670000,1358670031,GB +1358670032,1358670079,PT +1358670080,1358670591,GB +1358670592,1358670959,PT +1358670960,1358670975,GB +1358670976,1358671103,PT +1358671104,1358671367,GB +1358671368,1358671375,PT +1358671376,1358671383,GB +1358671384,1358671391,PT +1358671392,1358671407,GB +1358671408,1358671415,PT +1358671416,1358671439,GB +1358671440,1358671615,PT +1358671616,1358675967,GB +1358675968,1358676735,SE +1358676736,1358677759,DK +1358677760,1358679295,SE +1358679296,1358679807,DK +1358679808,1358680063,SE +1358680064,1358688255,RU +1358688256,1358692351,CZ +1358692352,1358696447,PL +1358696448,1358700543,RU +1358700544,1358704639,AT +1358704640,1358708735,HU +1358708736,1358712831,GB +1358712832,1358716927,NL +1358716928,1358721023,DE +1358721024,1358725119,GB +1358725120,1358733311,RU +1358733312,1358733639,SE +1358733640,1358733643,DE +1358733644,1358734003,SE +1358734004,1358734007,NO +1358734008,1358734123,SE +1358734124,1358734127,AN +1358734128,1358734343,SE +1358734344,1358734347,NL +1358734348,1358734715,SE +1358734716,1358734719,NL +1358734720,1358734975,SE +1358734976,1358734979,NL +1358734980,1358735139,SE +1358735140,1358735143,NL +1358735144,1358735319,SE +1358735320,1358735327,DE +1358735328,1358735491,SE +1358735492,1358735495,NL +1358735496,1358735711,SE +1358735712,1358735715,FR +1358735716,1358735743,SE +1358735744,1358735751,FR +1358735752,1358736927,SE +1358736928,1358736943,NL +1358736944,1358737383,SE +1358737384,1358737387,NL +1358737388,1358738103,SE +1358738104,1358738111,FR +1358738112,1358738303,SE +1358738304,1358738307,FR +1358738308,1358738431,SE +1358738432,1358738447,NL +1358738448,1358738687,SE +1358738688,1358738691,DE +1358738692,1358739135,SE +1358739136,1358739151,NL +1358739152,1358739503,SE +1358739504,1358739519,FR +1358739520,1358740159,SE +1358740160,1358740175,FR +1358740176,1358740335,SE +1358740336,1358740351,GB +1358740352,1358740671,SE +1358740672,1358740687,GB +1358740688,1358740883,SE +1358740884,1358740887,NL +1358740888,1358741055,SE +1358741056,1358741071,GB +1358741072,1358741503,SE +1358741504,1358745599,IT +1358745600,1358749695,SE +1358749696,1358753791,IT +1358753792,1358757887,UA +1358757888,1358766079,RU +1358766080,1358770175,IT +1358770176,1358774271,BG +1358774272,1358778367,ES +1358778368,1358782463,CH +1358782464,1358784015,GB +1358784016,1358784039,NL +1358784040,1358784063,DE +1358784064,1358784831,GB +1358784832,1358784863,NL +1358784864,1358784895,DE +1358784896,1358785087,GB +1358785088,1358785151,NL +1358785152,1358786559,GB +1358786560,1358787071,NL +1358787072,1358787335,GB +1358787336,1358787359,IE +1358787360,1358789167,GB +1358789168,1358789183,IE +1358789184,1358799359,GB +1358799360,1358802943,HR +1358802944,1358807039,HU +1358807040,1358811135,RU +1358811136,1358815231,DE +1358815232,1358819327,RU +1358819328,1358823423,TR +1358823424,1358827519,UA +1358827520,1358831615,RU +1358831616,1358835711,NO +1358835712,1358839807,RU +1358839808,1358843903,CH +1358843904,1358847999,MT +1358848000,1358856191,RU +1358856192,1358860287,DE +1358860288,1358861311,GB +1358861312,1358861823,DE +1358861824,1358862335,GB +1358862336,1358862591,US +1358862592,1358863359,GB +1358863360,1358863615,US +1358863616,1358864383,GB +1358864384,1358864399,CH +1358864400,1358864407,IN +1358864408,1358864535,CH +1358864536,1358864543,LI +1358864544,1358872575,CH +1358872576,1358876671,IT +1358876672,1358880767,LV +1358880768,1358884863,GB +1358884864,1358888959,SE +1358888960,1358893055,DE +1358893056,1358897151,RU +1358897152,1358897183,US +1358897184,1358897199,DE +1358897200,1358897215,GB +1358897216,1358897343,US +1358897344,1358897407,DE +1358897408,1358897919,US +1358897920,1358898175,GB +1358898176,1358898239,CA +1358898240,1358898335,US +1358898336,1358898351,DK +1358898352,1358898687,US +1358898688,1358898816,DE +1358898817,1358898943,CG +1358898944,1358898975,DE +1358898976,1358898991,US +1358898992,1358899079,DE +1358899080,1358899087,CD +1358899088,1358899095,DE +1358899096,1358899103,CD +1358899104,1358899111,DE +1358899112,1358899119,ZA +1358899120,1358899127,DE +1358899128,1358899135,NG +1358899136,1358899199,DE +1358899200,1358899207,UG +1358899208,1358899215,LA +1358899216,1358899239,US +1358899240,1358899247,LK +1358899248,1358899263,GB +1358899264,1358899295,PK +1358899296,1358899303,NG +1358899304,1358899311,AE +1358899312,1358899327,NG +1358899328,1358899335,CD +1358899336,1358899343,NG +1358899344,1358899359,MR +1358899360,1358899375,US +1358899376,1358899383,CD +1358899384,1358899391,UG +1358899392,1358899407,GB +1358899408,1358899415,DE +1358899416,1358899423,CD +1358899424,1358899431,US +1358899432,1358899455,NG +1358899456,1358899463,GB +1358899464,1358899471,US +1358899472,1358899479,SV +1358899480,1358899583,GB +1358899584,1358899591,IN +1358899592,1358899599,NG +1358899600,1358899607,LK +1358899608,1358899615,GB +1358899616,1358899631,NG +1358899632,1358899647,NP +1358899648,1358899654,NG +1358899655,1358899711,DE +1358899712,1358899967,US +1358899968,1358899983,GB +1358899984,1358899991,KY +1358899992,1358900223,GB +1358900224,1358900479,US +1358900480,1358900543,DE +1358900544,1358900671,US +1358900672,1358900735,CN +1358900736,1358900767,GB +1358900768,1358900783,BI +1358900784,1358900959,GB +1358900960,1358900975,SL +1358900976,1358900991,GB +1358900992,1358901247,TZ +1358901248,1358901503,DE +1358901504,1358901543,US +1358901544,1358901551,DE +1358901552,1358901615,US +1358901616,1358901729,DE +1358901730,1358901759,US +1358901760,1358901807,DE +1358901808,1358901815,CD +1358901816,1358901935,DE +1358901936,1358901951,NG +1358901952,1358901999,DE +1358902000,1358902039,NG +1358902040,1358902063,GB +1358902064,1358902079,TZ +1358902080,1358902087,NG +1358902088,1358902103,MG +1358902104,1358902143,NG +1358902144,1358902151,GB +1358902152,1358902167,NG +1358902168,1358902175,AU +1358902176,1358902207,GB +1358902208,1358902215,US +1358902216,1358902233,NG +1358902234,1358902263,GB +1358902264,1358902271,ZA +1358902272,1358903807,US +1358903808,1358903951,NG +1358903952,1358903967,GB +1358903968,1358903983,CA +1358903984,1358903999,NG +1358904000,1358904032,ZA +1358904033,1358904063,NG +1358904064,1358904071,DE +1358904072,1358904095,US +1358904096,1358904103,DE +1358904104,1358904119,US +1358904120,1358904127,DE +1358904128,1358904135,US +1358904136,1358904143,DE +1358904144,1358904151,NG +1358904152,1358904167,DE +1358904168,1358904175,US +1358904176,1358904191,DE +1358904192,1358904199,NG +1358904200,1358904262,US +1358904263,1358904295,DE +1358904296,1358904311,NG +1358904312,1358904319,DE +1358904320,1358904551,US +1358904552,1358904559,IL +1358904560,1358904575,US +1358904576,1358904701,NG +1358904702,1358904703,GB +1358904704,1358904719,MU +1358904720,1358904735,KN +1358904736,1358904767,ZA +1358904768,1358904831,NG +1358904832,1358905087,US +1358905088,1358905095,GB +1358905096,1358905103,GH +1358905104,1358905111,GB +1358905112,1358905119,TZ +1358905120,1358905127,GY +1358905128,1358905151,GB +1358905152,1358905159,MG +1358905160,1358905167,GB +1358905168,1358905183,CD +1358905184,1358905215,GH +1358905216,1358905223,US +1358905224,1358905231,GB +1358905232,1358905247,GN +1358905248,1358905279,US +1358905280,1358905295,GB +1358905296,1358905311,LR +1358905312,1358905327,US +1358905328,1358905343,GB +1358905344,1358909439,UA +1358909440,1358913535,RU +1358913536,1358917631,CH +1358917632,1358921727,ES +1358921728,1358929919,RU +1358929920,1358934015,LU +1358934016,1358938111,RU +1358938112,1358946303,GB +1358946304,1358950399,LV +1358950400,1358954495,NL +1358954496,1358970879,ES +1358970880,1358984191,HU +1358984192,1358984703,SK +1358984704,1358986239,HU +1358986240,1358986495,SK +1358986496,1358987263,HU +1358987264,1359003647,NO +1359003648,1359020031,CZ +1359020032,1359036415,FR +1359036416,1359052799,GB +1359052800,1359069183,SE +1359069184,1359101951,RU +1359101952,1359118335,GB +1359118336,1359134719,DE +1359134720,1359150079,CZ +1359150080,1359150591,HU +1359150592,1359151103,CZ +1359151104,1359166175,DE +1359166176,1359166191,HK +1359166192,1359167487,DE +1359167488,1359183871,GB +1359183872,1359200255,RU +1359200256,1359216639,AT +1359233024,1359249407,NL +1359249408,1359263743,CY +1359263744,1359263999,LB +1359264000,1359264767,CY +1359264768,1359265023,LB +1359265024,1359265791,CY +1359265792,1359282175,RU +1359282176,1359298559,IL +1359298560,1359314943,RU +1359314944,1359331327,GB +1359331328,1359347711,AT +1359347712,1359349351,CH +1359349352,1359349359,LB +1359349360,1359364095,CH +1359364096,1359380479,TR +1359380480,1359396863,PL +1359396864,1359413247,GB +1359429632,1359446015,LT +1359446016,1359462399,DK +1359462400,1359467063,DE +1359467064,1359467079,US +1359467080,1359467087,DE +1359467088,1359467095,US +1359467096,1359467103,BR +1359467104,1359467135,US +1359467136,1359467143,MX +1359467144,1359467199,US +1359467200,1359467223,DE +1359467224,1359467231,US +1359467232,1359467239,DE +1359467240,1359467247,US +1359467248,1359467263,DE +1359467264,1359467391,US +1359467392,1359467503,DE +1359467504,1359467647,US +1359467648,1359468583,DE +1359468584,1359468591,SG +1359468592,1359468639,DE +1359468640,1359468655,SG +1359468656,1359468671,JP +1359468672,1359468695,SG +1359468696,1359469943,DE +1359469944,1359469983,AT +1359469984,1359470591,DE +1359470592,1359478783,CH +1359478784,1359511551,TR +1359511552,1359544319,SE +1359544320,1359547391,RU +1359547392,1359547903,US +1359547904,1359548159,RU +1359548160,1359548415,US +1359548416,1359552511,RU +1359552512,1359552767,US +1359552768,1359553599,RU +1359553600,1359553631,US +1359553632,1359577087,RU +1359577088,1359609855,ES +1359642624,1359675391,AT +1359675392,1359708159,DE +1359708160,1359740927,BE +1359740928,1359773695,IR +1359773696,1359806463,RO +1359806464,1359839231,RU +1359839232,1359871999,CH +1359872000,1359904767,GB +1359904768,1359937535,DE +1359937536,1359970303,IS +1359970304,1360003071,PL +1360003072,1360007167,AM +1360007168,1360011263,GB +1360011264,1360015359,AT +1360015360,1360019455,DE +1360019456,1360023551,FI +1360023552,1360027647,RU +1360027648,1360031743,AT +1360031744,1360039935,RU +1360039936,1360043743,AT +1360043744,1360043747,AU +1360043748,1360044031,AT +1360044032,1360048127,SE +1360048128,1360049167,DE +1360049168,1360049183,GB +1360049184,1360049199,DE +1360049200,1360049207,SE +1360049208,1360049215,IT +1360049216,1360049223,ES +1360049224,1360049231,JP +1360049232,1360049239,US +1360049240,1360049247,GB +1360049248,1360052223,DE +1360052224,1360056319,HU +1360056320,1360060415,SA +1360060416,1360064511,LT +1360064512,1360068607,GE +1360068608,1360076799,RU +1360076800,1360084991,NL +1360084992,1360089087,GB +1360089088,1360093183,AZ +1360093184,1360101375,DE +1360101376,1360105471,UA +1360105472,1360109567,RU +1360109568,1360113663,KZ +1360113664,1360117759,HU +1360117760,1360121855,FI +1360121856,1360125951,DE +1360125952,1360126975,SI +1360126976,1360127487,HR +1360127488,1360127999,CS +1360128000,1360128511,MK +1360128512,1360129023,SI +1360129024,1360130047,BA +1360130048,1360130575,IE +1360130576,1360130583,GB +1360130584,1360130815,IE +1360130816,1360130879,GB +1360130880,1360131520,IE +1360131521,1360131583,GB +1360131584,1360131903,IE +1360131904,1360131919,US +1360131920,1360131935,AU +1360131936,1360131951,GB +1360131952,1360134143,IE +1360134144,1360138239,NL +1360138240,1360142335,CH +1360142336,1360146431,NG +1360146432,1360148479,CS +1360148480,1360150527,RS +1360150528,1360158719,RO +1360158720,1360162815,DE +1360162816,1360175103,RU +1360175104,1360179199,NL +1360179200,1360183295,FR +1360183296,1360191487,PL +1360191488,1360195583,FO +1360195584,1360199679,NL +1360199680,1360203775,CZ +1360203776,1360207871,FR +1360207872,1360211967,CZ +1360211968,1360216063,GB +1360216064,1360224255,RU +1360224256,1360225663,ES +1360225664,1360225695,GB +1360225696,1360226079,ES +1360226080,1360226111,IT +1360226112,1360226191,ES +1360226192,1360226199,IT +1360226200,1360227023,ES +1360227024,1360227039,GB +1360227040,1360228351,ES +1360228352,1360232447,FI +1360232448,1360236543,RU +1360236544,1360240639,AT +1360240640,1360244735,ES +1360244736,1360257023,GB +1360257024,1360265215,DK +1360265216,1360269311,GB +1360269312,1360273407,KG +1360273408,1360281599,GB +1360281600,1360285695,NL +1360285696,1360289791,DE +1360289792,1360293887,RU +1360293888,1360302079,DE +1360302080,1360306175,EE +1360306176,1360310271,RU +1360310272,1360314367,GB +1360314368,1360318463,RU +1360318464,1360322559,FR +1360322560,1360326655,FI +1360326656,1360330751,PT +1360330752,1360334847,UA +1360334848,1360338943,AT +1360338944,1360343039,CY +1360343040,1360347135,SA +1360347136,1360351231,GB +1360351232,1360355327,AZ +1360359424,1360363519,AT +1360363520,1360367615,IT +1360367616,1360371711,IE +1360371712,1360375807,TR +1360375808,1360379903,NL +1360379904,1360383999,PL +1360384000,1360388095,SE +1360388096,1360392191,RU +1360392192,1360396287,EE +1360396288,1360400383,RU +1360400384,1360404479,BH +1360404480,1360404735,GB +1360404736,1360404991,DE +1360404992,1360405247,FR +1360405248,1360405503,SE +1360405504,1360408575,GB +1360408576,1360412671,RU +1360420864,1360424959,TR +1360424960,1360429055,RU +1360429056,1360433151,UA +1360433152,1360437247,RO +1360437248,1360441343,FI +1360441344,1360445439,HU +1360445440,1360453631,RU +1360453632,1360457727,DE +1360457728,1360459103,FI +1360459104,1360459135,IL +1360459136,1360461823,FI +1360461824,1360465919,LT +1360465920,1360470015,UA +1360470016,1360474111,FR +1360474112,1360478207,GB +1360478208,1360482303,CH +1360482304,1360486399,IT +1360486400,1360515071,RU +1360515072,1360519167,GB +1360519168,1360524031,NL +1360524032,1360524287,US +1360524288,1360531455,NL +1360531456,1360535551,RO +1360535552,1360539647,DE +1360539648,1360543743,NL +1360543744,1360547839,DE +1360547840,1360551935,RU +1360551936,1360556031,SI +1360556032,1360564223,RU +1360564224,1360568319,AT +1360568320,1360572415,ES +1360572416,1360576511,GR +1360576512,1360580607,GB +1360580608,1360584703,UA +1360584704,1360588799,IT +1360588800,1360592895,GB +1360592896,1360596991,RU +1360596992,1360601087,CZ +1360601088,1360605183,BY +1360605184,1360613375,RU +1360613376,1360617471,SE +1360617472,1360621567,IT +1360621568,1360625663,ES +1360625664,1360628735,DE +1360628736,1360628991,IQ +1360628992,1360629503,DE +1360629504,1360629759,IQ +1360629760,1360633855,SE +1360633856,1360637951,RU +1360637952,1360642047,FO +1360642048,1360646143,FR +1360646144,1360650239,AT +1360650240,1360654335,UA +1360654336,1360658431,EE +1360658432,1360666623,PL +1360666624,1360674815,NO +1360678912,1360683007,RU +1360683008,1360691199,GB +1360691200,1360699391,RU +1360699392,1360703487,DE +1360703488,1360707583,RU +1360707584,1360711679,IT +1360711680,1360715775,NL +1360715776,1360728063,SE +1360728064,1360732159,FR +1360732160,1360736255,NO +1360736256,1360740351,RU +1360740352,1360752639,GB +1360752640,1360756735,DE +1360756736,1360760831,IT +1360760832,1360764927,RU +1360764928,1360769023,DE +1360769024,1360773119,IT +1360773120,1360777215,CZ +1360777216,1360781311,IT +1360781312,1360785407,DE +1360785408,1360793599,RU +1360793600,1360797695,CZ +1360797696,1360805887,IR +1360805888,1360809983,DE +1360809984,1360814079,NL +1360814080,1360818175,FR +1360818176,1360822271,JO +1360822272,1360826367,AT +1360826368,1360830463,GB +1360830464,1360838655,RU +1360838656,1360842751,FR +1360842752,1360846847,RU +1360846848,1360850943,DE +1360850944,1360855039,IT +1360855040,1360855841,NL +1360855842,1360855851,MX +1360855852,1360856075,NL +1360856076,1360856079,AU +1360856080,1360856109,NL +1360856110,1360856113,AU +1360856114,1360856133,NL +1360856134,1360856144,MX +1360856145,1360859135,NL +1360859136,1360863231,LT +1360863232,1360867327,NO +1360867328,1360879615,GB +1360883712,1360887807,RU +1360887808,1360890367,FI +1360890368,1360890623,RU +1360890624,1360890879,FI +1360890880,1360891391,RU +1360891392,1360891647,FI +1360891648,1360891903,RU +1360891904,1360892159,IT +1360892160,1360892671,CH +1360892672,1360892703,IT +1360892704,1360892735,CH +1360892736,1360892739,EE +1360892740,1360892743,GB +1360892744,1360892751,CH +1360892752,1360892771,IT +1360892772,1360892795,CH +1360892796,1360892799,IT +1360892800,1360893191,CH +1360893192,1360893195,IT +1360893196,1360893831,CH +1360893832,1360893835,IT +1360893836,1360893951,CH +1360893952,1360894151,IT +1360894152,1360894975,CH +1360894976,1360895007,IT +1360895008,1360895751,CH +1360895752,1360895755,IT +1360895756,1360895999,CH +1360896000,1360900095,QA +1360900096,1360904335,IT +1360904336,1360904343,GB +1360904344,1360905391,IT +1360905392,1360905407,GB +1360905408,1360906687,IT +1360906688,1360906719,GB +1360906720,1360907679,IT +1360907680,1360907711,GB +1360907712,1360910495,IT +1360910496,1360910511,GB +1360910512,1360910527,IT +1360910528,1360910559,GB +1360910560,1360916479,IT +1360920576,1360932863,IT +1360932864,1360936959,RU +1360936960,1360941055,NL +1360941056,1360945151,BY +1360945152,1360949247,DE +1360949248,1360953343,RU +1360953344,1360957439,DE +1360957440,1360961535,AZ +1360961536,1360965631,UA +1360965632,1360977919,RU +1360977920,1360986111,CZ +1360986112,1360987135,GB +1360987136,1360987535,CZ +1360987536,1360987647,GB +1360987648,1360987935,CZ +1360987936,1360987983,SK +1360987984,1360987999,CZ +1360988000,1360988007,GB +1360988008,1360988031,CZ +1360988032,1360988039,GB +1360988040,1360988047,CZ +1360988048,1360988055,GB +1360988056,1360988063,SK +1360988064,1360988079,CZ +1360988080,1360988159,GB +1360988160,1360988415,SK +1360988416,1360988927,CZ +1360988928,1360989183,GB +1360989184,1360989439,SK +1360989440,1360989695,GB +1360989696,1360990079,CZ +1360990080,1360990207,GB +1360990208,1360990463,CZ +1360990464,1360990719,GB +1360990720,1360990975,CZ +1360990976,1360991231,GB +1360991232,1360991743,CZ +1360991744,1360991999,GB +1360992000,1360992255,SK +1360992256,1360992767,CZ +1360992768,1360994303,GB +1360994304,1360998399,CZ +1360998400,1361002495,FI +1361002496,1361006591,GB +1361006592,1361010687,DK +1361010688,1361018879,GB +1361018880,1361022975,AT +1361022976,1361027071,IT +1361027072,1361035263,IR +1361035264,1361035527,NL +1361035528,1361035535,IT +1361035536,1361035547,ES +1361035548,1361035551,DE +1361035552,1361035559,GB +1361035560,1361035563,IQ +1361035564,1361035567,GB +1361035568,1361035583,ES +1361035584,1361035591,NL +1361035592,1361035599,IQ +1361035600,1361035607,NL +1361035608,1361035615,IQ +1361035616,1361035623,ES +1361035624,1361035627,DE +1361035628,1361035639,DZ +1361035640,1361035643,IQ +1361035644,1361035647,GB +1361035648,1361035651,TR +1361035652,1361035655,DE +1361035656,1361035667,IQ +1361035668,1361035671,DZ +1361035672,1361035679,ES +1361035680,1361035683,IE +1361035684,1361035687,GB +1361035688,1361035691,CS +1361035692,1361035695,IQ +1361035696,1361035711,BA +1361035712,1361035715,DE +1361035716,1361035719,IQ +1361035720,1361035723,ES +1361035724,1361035727,DE +1361035728,1361035735,IQ +1361035736,1361035743,IT +1361035744,1361035751,TR +1361035752,1361035759,KW +1361035760,1361035763,IQ +1361035764,1361035767,DE +1361035768,1361035779,IQ +1361035780,1361035783,KW +1361035784,1361035787,IT +1361035788,1361035791,DZ +1361035792,1361035799,IQ +1361035800,1361035807,TR +1361035808,1361035811,DE +1361035812,1361035815,BA +1361035816,1361035823,IT +1361035824,1361035831,DE +1361035832,1361035839,BE +1361035840,1361035847,ES +1361035848,1361035855,NL +1361035856,1361035863,ES +1361035864,1361035871,BE +1361035872,1361035879,ES +1361035880,1361035887,DE +1361035888,1361035895,GB +1361035896,1361035903,IQ +1361035904,1361035907,DE +1361035908,1361035911,ES +1361035912,1361035915,IQ +1361035916,1361035919,HR +1361035920,1361035923,CH +1361035924,1361035927,IE +1361035928,1361035931,GB +1361035932,1361035935,TR +1361035936,1361035939,IE +1361035940,1361035943,DE +1361035944,1361035951,US +1361035952,1361035955,CS +1361035956,1361035959,GB +1361035960,1361035963,GR +1361035964,1361035967,CH +1361035968,1361035975,DE +1361035976,1361035983,IQ +1361035984,1361035991,DE +1361035992,1361035995,IQ +1361035996,1361035999,IE +1361036000,1361036015,GB +1361036016,1361036019,ES +1361036020,1361036027,IQ +1361036028,1361036031,GB +1361036032,1361036039,IE +1361036040,1361036055,IQ +1361036056,1361036063,NL +1361036064,1361036071,DE +1361036072,1361036079,BE +1361036080,1361036087,FR +1361036088,1361036095,IT +1361036096,1361036103,SE +1361036104,1361036111,NO +1361036112,1361036119,RO +1361036120,1361036127,HU +1361036128,1361036135,CZ +1361036136,1361036143,IQ +1361036144,1361036151,TR +1361036152,1361036167,ES +1361036168,1361036175,IQ +1361036176,1361036191,GB +1361036192,1361036199,KW +1361036200,1361036215,IQ +1361036216,1361036223,TR +1361036224,1361036231,DE +1361036232,1361036239,IQ +1361036240,1361036243,NL +1361036244,1361036247,IT +1361036248,1361036251,TN +1361036252,1361036255,GR +1361036256,1361036259,GB +1361036260,1361036263,IS +1361036264,1361036271,KW +1361036272,1361036287,IQ +1361036288,1361036291,IT +1361036292,1361036295,IE +1361036296,1361036299,IQ +1361036300,1361036303,IT +1361036304,1361036307,ES +1361036308,1361036311,DE +1361036312,1361036315,TR +1361036316,1361036327,DZ +1361036328,1361036335,MA +1361036336,1361036351,DZ +1361036352,1361036359,IQ +1361036360,1361036367,DZ +1361036368,1361036371,GB +1361036372,1361036375,IT +1361036376,1361036379,NL +1361036380,1361036383,IQ +1361036384,1361036387,DZ +1361036388,1361036391,ES +1361036392,1361036395,IQ +1361036396,1361036403,ES +1361036404,1361036407,KW +1361036408,1361036411,IQ +1361036412,1361036415,ES +1361036416,1361036419,IQ +1361036420,1361036423,ES +1361036424,1361036431,IQ +1361036432,1361036435,EG +1361036436,1361036455,IQ +1361036456,1361036459,NL +1361036460,1361036463,TR +1361036464,1361036471,IQ +1361036472,1361036475,IL +1361036476,1361036479,IQ +1361036480,1361036487,KW +1361036488,1361036491,GB +1361036492,1361036495,KW +1361036496,1361036507,IQ +1361036508,1361036511,ES +1361036512,1361036515,TR +1361036516,1361036523,IT +1361036524,1361036527,GB +1361036528,1361036531,IT +1361036532,1361036543,IQ +1361036544,1361036551,DE +1361036552,1361036559,GB +1361036560,1361036567,TR +1361036568,1361036579,IQ +1361036580,1361036583,ES +1361036584,1361036591,IQ +1361036592,1361036595,KW +1361036596,1361036599,ES +1361036600,1361036603,KW +1361036604,1361036607,ES +1361036608,1361036611,TR +1361036612,1361036623,GB +1361036624,1361036631,IQ +1361036632,1361036635,ES +1361036636,1361036639,GB +1361036640,1361036663,IQ +1361036664,1361036667,DZ +1361036668,1361036671,CH +1361036672,1361036675,TR +1361036676,1361036679,ES +1361036680,1361036719,IQ +1361036720,1361036727,DZ +1361036728,1361036735,US +1361036736,1361036815,IQ +1361036816,1361036819,NL +1361036820,1361036823,ES +1361036824,1361036827,DE +1361036828,1361036831,DZ +1361036832,1361036847,IQ +1361036848,1361036851,DZ +1361036852,1361036863,IQ +1361036864,1361036871,TR +1361036872,1361036879,IQ +1361036880,1361036887,US +1361036888,1361036891,GB +1361036892,1361036895,IQ +1361036896,1361036899,NL +1361036900,1361036919,IQ +1361036920,1361036923,IT +1361036924,1361036927,GB +1361036928,1361036935,KW +1361036936,1361036951,IQ +1361036952,1361036959,TR +1361036960,1361036971,IQ +1361036972,1361036979,DZ +1361036980,1361036983,FR +1361036984,1361036999,IQ +1361037000,1361037007,PL +1361037008,1361037015,IQ +1361037016,1361037023,DZ +1361037024,1361037055,KW +1361037056,1361037059,IQ +1361037060,1361037063,ES +1361037064,1361037067,IQ +1361037068,1361037071,TR +1361037072,1361037075,IQ +1361037076,1361037079,HU +1361037080,1361037083,IQ +1361037084,1361037087,DZ +1361037088,1361037091,GB +1361037092,1361037119,IQ +1361037120,1361037127,TR +1361037128,1361037135,DE +1361037136,1361037159,IQ +1361037160,1361037167,KW +1361037168,1361037179,IQ +1361037180,1361037183,GB +1361037184,1361037191,US +1361037192,1361037199,IQ +1361037200,1361037203,GB +1361037204,1361037207,FR +1361037208,1361037215,DZ +1361037216,1361037223,TR +1361037224,1361037231,ES +1361037232,1361037271,IQ +1361037272,1361037279,NL +1361037280,1361037295,IQ +1361037296,1361037311,DZ +1361037312,1361037319,IQ +1361037320,1361037327,GB +1361037328,1361037339,IQ +1361037340,1361037343,TR +1361037344,1361037359,IQ +1361037360,1361037363,ES +1361037364,1361037367,DZ +1361037368,1361037387,IQ +1361037388,1361037391,TR +1361037392,1361037395,IT +1361037396,1361037399,US +1361037400,1361037407,IQ +1361037408,1361037415,TR +1361037416,1361037443,IQ +1361037444,1361037447,DZ +1361037448,1361037455,IQ +1361037456,1361037463,NL +1361037464,1361037471,CH +1361037472,1361037487,NL +1361037488,1361037495,IQ +1361037496,1361037503,DZ +1361037504,1361037515,IQ +1361037516,1361037519,JO +1361037520,1361037527,IQ +1361037528,1361037551,DZ +1361037552,1361037559,QA +1361037560,1361037567,IQ +1361037568,1361037575,TR +1361037576,1361037583,IQ +1361037584,1361037587,GB +1361037588,1361037591,ES +1361037592,1361037599,US +1361037600,1361037611,IQ +1361037612,1361037615,ES +1361037616,1361037619,IQ +1361037620,1361037631,ES +1361037632,1361037639,DZ +1361037640,1361037667,IQ +1361037668,1361037671,DZ +1361037672,1361037683,IQ +1361037684,1361037687,TR +1361037688,1361037695,IQ +1361037696,1361037703,PL +1361037704,1361037771,IQ +1361037772,1361037775,GB +1361037776,1361037783,NL +1361037784,1361037823,IQ +1361037824,1361037827,ES +1361037828,1361037835,IQ +1361037836,1361037839,ES +1361037840,1361037847,TR +1361037848,1361037851,IQ +1361037852,1361037855,ES +1361037856,1361037871,IQ +1361037872,1361037875,ES +1361037876,1361037879,AL +1361037880,1361037883,PT +1361037884,1361037891,IQ +1361037892,1361037895,ES +1361037896,1361037907,IQ +1361037908,1361037911,US +1361037912,1361037919,TR +1361037920,1361038007,IQ +1361038008,1361038015,TR +1361038016,1361038023,IQ +1361038024,1361038031,IT +1361038032,1361038039,IQ +1361038040,1361038047,US +1361038048,1361038095,IQ +1361038096,1361038103,US +1361038104,1361038127,IQ +1361038128,1361038135,MA +1361038136,1361038143,IQ +1361038144,1361038147,KW +1361038148,1361038159,GB +1361038160,1361038163,KW +1361038164,1361038175,GB +1361038176,1361038179,KW +1361038180,1361038191,GB +1361038192,1361038199,IQ +1361038200,1361038211,GB +1361038212,1361038215,NL +1361038216,1361038223,GB +1361038224,1361038231,IQ +1361038232,1361038239,DE +1361038240,1361038247,IQ +1361038248,1361038271,US +1361038272,1361038275,GB +1361038276,1361038279,KW +1361038280,1361038287,GB +1361038288,1361038295,IQ +1361038296,1361038303,DE +1361038304,1361038335,US +1361038336,1361039359,NL +1361039360,1361043455,IT +1361043456,1361051647,NO +1361051648,1362100223,ES +1362100224,1362395135,FR +1362395136,1362395183,CH +1362395184,1362395391,FR +1362395392,1362395519,SG +1362395520,1362395647,FR +1362395648,1362396159,US +1362396160,1362396415,FR +1362396416,1362396927,US +1362396928,1362397183,CM +1362397184,1362397255,GB +1362397256,1362398463,FR +1362398464,1362398719,DE +1362398720,1362399231,FR +1362399232,1362399263,GB +1362399264,1362399487,FR +1362399488,1362400767,GB +1362400768,1362403583,FR +1362403584,1362405887,DZ +1362405888,1362406143,FR +1362406144,1362407167,SV +1362407168,1362411519,FR +1362411520,1362413273,MQ +1362413274,1362413567,FR +1362413568,1362413587,CM +1362413588,1362414079,FR +1362414080,1362414847,US +1362414848,1362415103,GB +1362415104,1362415359,FR +1362415360,1362415615,DE +1362415616,1362417663,GP +1362417664,1362419711,SG +1362419712,1362423039,FR +1362423040,1362423167,SG +1362423168,1362423263,FR +1362423264,1362423295,SG +1362423296,1362423807,VE +1362423808,1362425855,SG +1362425856,1362426623,US +1362426624,1362426879,FR +1362426880,1362427903,MQ +1362427904,1362755583,FR +1362755584,1362817055,NL +1362817056,1362817063,BE +1362817064,1362817071,NL +1362817072,1362817087,BE +1362817088,1362817127,NL +1362817128,1362817143,BE +1362817144,1362817563,NL +1362817564,1362817567,BE +1362817568,1362817743,NL +1362817744,1362817791,BE +1362817792,1362837503,NL +1362837504,1362845695,BE +1362845696,1362870271,NL +1362870272,1362872319,BE +1362872320,1362872351,NL +1362872352,1362873855,BE +1362873856,1362873867,NL +1362873868,1362874367,BE +1362874368,1362874375,NL +1362874376,1362875903,BE +1362875904,1362875907,NL +1362875908,1362876423,BE +1362876424,1362876591,NL +1362876592,1362876607,BE +1362876608,1362876639,NL +1362876640,1362877955,BE +1362877956,1362878023,NL +1362878024,1362878463,BE +1362878464,1362878479,NL +1362878480,1362879999,BE +1362880000,1362880007,NL +1362880008,1362880511,BE +1362880512,1362880967,NL +1362880968,1362880975,BE +1362880976,1362881023,NL +1362881024,1362881055,BE +1362881056,1362881111,NL +1362881112,1362882047,BE +1362882048,1362882207,NL +1362882208,1362882211,BE +1362882212,1362882231,NL +1362882232,1362884095,BE +1362884096,1362884099,NL +1362884100,1362885119,BE +1362885120,1362886399,NL +1362886400,1362886400,BE +1362886401,1362886409,NL +1362886410,1362886413,BE +1362886414,1362886416,NL +1362886417,1362886419,BE +1362886420,1362886421,NL +1362886422,1362886422,BE +1362886423,1362886423,NL +1362886424,1362886655,BE +1362886656,1363017727,ES +1363017728,1363148799,CH +1363148800,1363410943,FR +1363410944,1363673087,NL +1363673088,1363935231,IT +1363935232,1364197375,GB +1364197376,1364204034,FR +1364204035,1364204035,GB +1364204036,1364262911,FR +1364262912,1364328447,IT +1364328448,1364459519,BE +1364459520,1364525055,PT +1364525056,1364526335,NL +1364526336,1364526591,US +1364526592,1364528639,GB +1364528640,1364528895,UA +1364528896,1364530175,GB +1364530176,1364539903,NL +1364539904,1364540159,US +1364540160,1364540671,NL +1364540672,1364540927,US +1364540928,1364582415,NL +1364582416,1364582431,LB +1364582432,1364585983,NL +1364585984,1364586240,LB +1364586241,1364586495,NL +1364586496,1364586752,LB +1364586753,1364590591,NL +1364590592,1364721663,GB +1364721664,1364725759,SE +1364725760,1364733951,DE +1364733952,1364738047,IT +1364738048,1364742143,NO +1364742144,1364746239,RU +1364746240,1364749311,FR +1364749312,1364749374,BE +1364749375,1364749455,FR +1364749456,1364749463,BE +1364749464,1364749471,FR +1364749472,1364749583,BE +1364749584,1364749631,FR +1364749632,1364749663,BE +1364749664,1364749823,FR +1364749824,1364749839,BE +1364749840,1364749847,FR +1364749848,1364749855,BE +1364749856,1364749871,FR +1364749872,1364750079,BE +1364750080,1364750335,FR +1364750336,1364754431,RU +1364754432,1364758527,SK +1364758528,1364762623,KZ +1364762624,1364766719,GB +1364766720,1364770815,CH +1364770816,1364774911,KG +1364774912,1364779007,RU +1364779008,1364787199,IT +1364787200,1364795391,RO +1364795392,1364799487,ES +1364799488,1364803583,SK +1364803584,1364811775,RU +1364811776,1364811807,LU +1364811808,1364815871,DE +1364815872,1364819967,RU +1364819968,1364824063,GB +1364824064,1364828159,IE +1364828160,1364829439,GB +1364829440,1364829487,FR +1364829488,1364829503,GB +1364829504,1364829527,FR +1364829528,1364832255,GB +1364832256,1364836351,RU +1364836352,1364840447,DE +1364840448,1364844543,AM +1364844544,1364852479,DE +1364852480,1364852735,GB +1364852736,1364856831,RU +1364856832,1364860927,IQ +1364860928,1364865023,DE +1364865024,1364869119,PT +1364869120,1364873215,FI +1364873216,1364877311,GB +1364877312,1364881407,ES +1364881408,1364885503,EE +1364885504,1364889599,GB +1364889600,1364893695,IR +1364893696,1364897791,CZ +1364897792,1364901887,SI +1364901888,1364905983,DE +1364905984,1364910079,RU +1364910080,1364914175,UA +1364914176,1364918271,CZ +1364918272,1364922367,NL +1364922368,1364926463,TR +1364926464,1364934655,RU +1364934656,1364938751,FR +1364938752,1364942847,CZ +1364942848,1364946943,GB +1364946944,1364947167,TR +1364947168,1364947199,US +1364947200,1364948479,GB +1364948480,1364949247,TR +1364949248,1364949503,CY +1364949504,1364949759,TR +1364949760,1364950015,CY +1364950016,1364950527,TR +1364950528,1364950783,CY +1364950784,1364950847,TR +1364950848,1364950911,GB +1364950912,1364951039,TR +1364951040,1364959231,IR +1364959232,1364963327,DE +1364963328,1364967423,RU +1364967424,1364971519,GB +1364971520,1364975615,CZ +1364979712,1364983807,GB +1364983808,1364991999,DE +1364992000,1364996095,IT +1364996096,1365000191,GR +1365000192,1365002751,SE +1365002752,1365003263,GB +1365003264,1365004063,SE +1365004064,1365004087,GB +1365004088,1365004095,SE +1365004096,1365004207,GB +1365004208,1365004223,SE +1365004224,1365004287,GB +1365004288,1365008383,FR +1365008384,1365012479,CH +1365012480,1365016575,FR +1365016576,1365020671,ES +1365020672,1365024767,CZ +1365024768,1365027839,DE +1365027840,1365027871,US +1365027872,1365028863,DE +1365028864,1365032959,NL +1365032960,1365041151,PT +1365041152,1365041407,IQ +1365041408,1365042047,LU +1365042048,1365042055,GB +1365042056,1365044895,LU +1365044896,1365044903,FR +1365044904,1365045247,LU +1365045248,1365047295,AT +1365047296,1365047423,SK +1365047424,1365047551,AT +1365047552,1365047647,SK +1365047648,1365047679,AT +1365047680,1365047807,SK +1365047808,1365047871,AT +1365047872,1365047903,SK +1365047904,1365047999,AT +1365048000,1365048191,SK +1365048192,1365048255,AT +1365048256,1365048383,SK +1365048384,1365048511,AT +1365048512,1365048607,SK +1365048608,1365048703,AT +1365048704,1365048887,SK +1365048888,1365048895,AT +1365048896,1365048927,SK +1365048928,1365049343,AT +1365049344,1365057535,FR +1365061632,1365065727,NL +1365065728,1365073919,BA +1365073920,1365078015,NO +1365078016,1365082111,DE +1365082112,1365090303,SE +1365090304,1365094399,NO +1365094400,1365095055,FR +1365095056,1365095071,GB +1365095072,1365095087,FR +1365095088,1365095095,GB +1365095096,1365095575,FR +1365095576,1365095583,GB +1365095584,1365096703,FR +1365096704,1365096711,GB +1365096712,1365096735,FR +1365096736,1365096767,IT +1365096768,1365097215,FR +1365097216,1365097471,ES +1365097472,1365097727,FR +1365097728,1365097983,CH +1365097984,1365098495,FR +1365098496,1365102591,HU +1365102592,1365102911,ES +1365102912,1365102919,GB +1365102920,1365103383,ES +1365103384,1365103391,GB +1365103392,1365103479,ES +1365103480,1365103487,GB +1365103488,1365103519,ES +1365103520,1365103551,GB +1365103552,1365103679,ES +1365103680,1365103743,GB +1365103744,1365103775,ES +1365103776,1365103791,GB +1365103792,1365103871,ES +1365103872,1365104135,GB +1365104136,1365104199,ES +1365104200,1365104207,GB +1365104208,1365104735,ES +1365104736,1365104743,GB +1365104744,1365105151,ES +1365105152,1365105215,GB +1365105216,1365106687,ES +1365106688,1365110783,GB +1365110784,1365114879,FR +1365114880,1365118975,BA +1365118976,1365127167,RU +1365127168,1365129471,AT +1365129472,1365129727,IT +1365129728,1365130271,AT +1365130272,1365130303,IT +1365130304,1365130495,AT +1365130496,1365131007,IT +1365131008,1365131263,AT +1365131264,1365139455,SE +1365139456,1365147647,CH +1365147648,1365155839,RU +1365155840,1365159935,SE +1365159936,1365164031,NO +1365164032,1365172223,GB +1365172224,1365176319,LV +1365176320,1365180415,HU +1365180416,1365183231,DE +1365183232,1365183295,SC +1365183296,1365184511,DE +1365184512,1365192703,RU +1365192704,1365196799,GB +1365196800,1365200895,ES +1365200896,1365204991,IQ +1365204992,1365209087,CZ +1365209088,1365213183,BE +1365213184,1365217279,RU +1365217280,1365221375,GB +1365221376,1365225471,GE +1365225472,1365229567,UA +1365229568,1365233151,PL +1365233152,1365233279,NL +1365233280,1365233311,PL +1365233312,1365233407,NL +1365233408,1365233631,PL +1365233632,1365233647,NL +1365233648,1365233663,PL +1365233664,1365237759,RU +1365237760,1365241855,UZ +1365241856,1365245951,DK +1365245952,1366294527,GB +1366294528,1367343103,IT +1367343104,1369440255,GB +1369440256,1369473023,DE +1369473024,1369505791,HU +1369505792,1369538559,DE +1369538560,1369554943,DK +1369554944,1369559039,PL +1369563136,1369567231,PL +1369567232,1369571327,BG +1369571328,1369636863,SE +1369702400,1369833471,BE +1369833472,1369964543,NO +1369964544,1369997311,GB +1369997312,1370030079,PL +1370030080,1370062847,BE +1370062848,1370095615,DE +1370095616,1370128383,GB +1370128384,1370161151,SE +1370161152,1370187775,NL +1370187776,1370188031,GR +1370188032,1370193919,NL +1370193920,1370226687,GB +1370226688,1370259455,ES +1370259456,1370292223,SE +1370292224,1370299903,NL +1370299904,1370300159,US +1370300160,1370324991,NL +1370324992,1370357759,DE +1370357760,1370390527,IT +1370390528,1370423295,GB +1370423296,1370439679,NO +1370439680,1370456063,NL +1370456064,1370488831,FI +1370488832,1370505855,RU +1370505856,1370505871,CY +1370505872,1370508895,RU +1370508896,1370508911,CY +1370508912,1370555887,RU +1370555888,1370555903,CY +1370555904,1370563967,RU +1370563968,1370564031,US +1370564032,1370619903,RU +1370619904,1370750975,GB +1370750976,1370767359,RO +1370767360,1370771455,MD +1370771456,1370772479,RO +1370772480,1370772991,MD +1370772992,1370882047,RO +1370882048,1371013119,HU +1371013120,1371078655,ES +1371078656,1371144191,FR +1371144192,1371201535,GR +1371201536,1371205631,PL +1371205632,1371209727,SE +1371209728,1371275263,GB +1371275264,1371340799,BE +1371340800,1371374740,AT +1371374741,1371374741,SK +1371374742,1371406335,AT +1371406336,1371471871,PL +1371471872,1371537407,NO +1371602944,1371668479,PT +1371668480,1371734015,FR +1371734016,1371799551,RU +1371799552,1371865087,RO +1371865088,1371930623,FI +1371930624,1371996159,LV +1371996160,1371997183,IL +1371997184,1371997439,KE +1371997440,1371998207,NG +1371998208,1371998463,CD +1371998464,1371998719,NG +1371998720,1371999231,IL +1371999232,1372000255,CM +1372000256,1372004351,UG +1372004352,1372004607,TZ +1372004608,1372004863,GB +1372004864,1372006399,IL +1372006400,1372006407,NG +1372006408,1372006463,IL +1372006464,1372006495,NG +1372006496,1372007167,IL +1372007168,1372007455,NG +1372007456,1372007679,IL +1372007680,1372007935,NG +1372007936,1372008095,IL +1372008096,1372008191,NG +1372008192,1372010239,IL +1372010240,1372010272,NG +1372010273,1372010751,IL +1372010752,1372010967,NG +1372010968,1372011007,TZ +1372011008,1372012543,IL +1372012544,1372014591,ZM +1372014592,1372015615,IL +1372015616,1372015871,NG +1372015872,1372016639,GH +1372016640,1372016831,BW +1372016832,1372016847,BJ +1372016848,1372016895,BW +1372016896,1372017407,IL +1372017408,1372017663,TZ +1372017664,1372018943,IL +1372018944,1372019199,GB +1372019200,1372019455,GA +1372019456,1372020735,IL +1372020736,1372022783,ZM +1372022784,1372023807,IL +1372023808,1372024831,NG +1372024832,1372025343,IL +1372025344,1372025599,CD +1372025600,1372025663,IL +1372025664,1372025695,KE +1372025696,1372025727,TZ +1372025728,1372029439,IL +1372029440,1372029695,NG +1372029696,1372029951,NE +1372029952,1372031999,IL +1372032000,1372032255,CM +1372032256,1372035071,GB +1372035072,1372037887,IL +1372037888,1372038143,NG +1372038144,1372038399,KE +1372038400,1372039167,IL +1372039168,1372040191,CD +1372040192,1372040703,IL +1372040704,1372041215,CD +1372041216,1372041343,IL +1372041344,1372041471,NG +1372041472,1372042239,IL +1372042240,1372042495,LR +1372042496,1372043263,IL +1372043264,1372043519,GB +1372043520,1372043775,NG +1372043776,1372044415,IL +1372044416,1372044447,NG +1372044448,1372044799,IL +1372044800,1372044863,CM +1372044864,1372044927,NG +1372044928,1372045055,IL +1372045056,1372045087,CM +1372045088,1372045119,IL +1372045120,1372045151,NG +1372045152,1372045215,IL +1372045216,1372045247,NG +1372045248,1372045567,IL +1372045568,1372045887,NG +1372045888,1372046559,IL +1372046560,1372046591,NG +1372046592,1372047231,IL +1372047232,1372047295,NG +1372047296,1372047359,IL +1372047360,1372047615,CM +1372047616,1372049663,IL +1372049664,1372050175,NG +1372050176,1372058623,IL +1372058624,1372058879,NG +1372058880,1372061695,IL +1372061696,1372069887,RU +1372069888,1372073983,FR +1372073984,1372078079,CZ +1372078080,1372082175,GB +1372082176,1372086271,RU +1372086272,1372090367,DE +1372090368,1372094463,RU +1372094464,1372098559,IT +1372098560,1372102655,RU +1372102656,1372106751,SE +1372106752,1372110591,FR +1372110592,1372110623,GB +1372110624,1372110655,DE +1372110656,1372110687,IT +1372110688,1372110719,ES +1372110720,1372110751,FR +1372110752,1372110783,NL +1372110784,1372110847,FR +1372110848,1372114943,DE +1372114944,1372119039,RU +1372119040,1372123135,IT +1372123136,1372127231,RU +1372127232,1372131327,IT +1372131328,1372135423,RU +1372135424,1372138255,DE +1372138256,1372138263,GB +1372138264,1372139519,DE +1372139520,1372143615,CZ +1372143616,1372147711,RU +1372147712,1372151807,BE +1372151808,1372152823,DE +1372152824,1372152831,GB +1372152832,1372159999,DE +1372160000,1372164095,GB +1372164096,1372168191,DE +1372168192,1372172287,GB +1372172288,1372176383,FR +1372176384,1372180479,CH +1372180480,1372183999,SE +1372184000,1372184063,ES +1372184064,1372184071,SE +1372184072,1372184079,ES +1372184080,1372184575,SE +1372184576,1372188671,DE +1372188672,1372192767,RU +1372192768,1372323839,ES +1372323840,1372585983,NL +1372585984,1372610047,IT +1372610048,1372610303,VA +1372610304,1372618751,IT +1372618752,1372651519,GB +1372651520,1372684287,FI +1372684288,1372684415,DE +1372684544,1372685631,DE +1372685656,1372685663,DE +1372685696,1372685823,DE +1372685888,1372686335,DE +1372687360,1372687711,DE +1372687720,1372687727,DE +1372687736,1372688199,DE +1372688224,1372689823,DE +1372689920,1372691455,DE +1372691456,1372691711,US +1372691968,1372694015,DE +1372694560,1372694591,DE +1372694624,1372694655,DE +1372694784,1372694815,DE +1372694832,1372695039,DE +1372695168,1372695295,DE +1372695424,1372695551,DE +1372695552,1372695807,CZ +1372695808,1372696007,DK +1372696064,1372696575,DE +1372696832,1372697215,DE +1372697232,1372697239,DE +1372697248,1372697279,DE +1372697344,1372698471,DE +1372698560,1372700159,DE +1372700160,1372700415,SE +1372700672,1372702463,DE +1372702720,1372702735,DE +1372702752,1372702991,DE +1372703232,1372703263,DE +1372703272,1372703323,DE +1372703328,1372703407,DE +1372703424,1372713327,DE +1372713344,1372713375,DE +1372713472,1372714239,DE +1372714496,1372717055,DE +1372717056,1372749823,PL +1372749824,1372782591,DE +1372782592,1372815359,RU +1372815360,1372848127,IT +1372848128,1373110271,TR +1373110272,1373175807,SE +1373175808,1373241343,AT +1373241344,1373306879,IL +1373306880,1373372415,PL +1373372416,1373437951,FR +1373437952,1373503487,CH +1373503488,1373519871,RU +1373519872,1373520895,GB +1373520896,1373569023,RU +1373569024,1373634559,AT +1373634560,1374683135,SE +1374683136,1375207423,BE +1375207424,1375731711,FR +1375731712,1375798335,GB +1375798336,1375798351,IE +1375798352,1375852543,GB +1375852544,1375852799,IE +1375852800,1378877439,GB +1378877440,1379926015,IT +1379926016,1380188159,FR +1380188160,1380450303,GB +1380450304,1380712447,NL +1380712448,1380903935,RO +1380903936,1380904447,SK +1380904448,1380974591,RO +1380974592,1381105663,IL +1381105664,1381236735,DE +1381236736,1381367807,IT +1381367808,1381498879,ES +1381498880,1381761023,IT +1381761024,1382023167,NL +1382023168,1382024959,SE +1382024960,1382025215,DK +1382025216,1382033583,SE +1382033584,1382033599,NL +1382033600,1382035359,SE +1382035360,1382035375,NO +1382035376,1382039007,SE +1382039008,1382039023,FR +1382039024,1382039055,SE +1382039056,1382039071,DE +1382039072,1382039175,SE +1382039176,1382039191,GB +1382039192,1382039551,SE +1382039552,1382055935,DE +1382055936,1382072319,FR +1382072320,1382088703,RU +1382088704,1382091311,FR +1382091312,1382091327,MC +1382091328,1382091375,FR +1382091376,1382091391,MC +1382091392,1382091775,FR +1382091776,1382092031,MC +1382092032,1382092367,FR +1382092368,1382092383,MC +1382092384,1382092815,FR +1382092816,1382092831,MC +1382092832,1382093055,FR +1382093056,1382093087,GB +1382093088,1382105087,FR +1382105088,1382137855,DE +1382137856,1382154239,RU +1382154240,1382170623,FR +1382170624,1382171776,DE +1382171777,1382171791,CH +1382171792,1382179247,DE +1382179248,1382179279,GB +1382179280,1382187007,DE +1382187008,1382203391,ES +1382203392,1382204479,NL +1382204480,1382211327,DE +1382211328,1382211583,NL +1382211584,1382211711,FR +1382211712,1382211839,DE +1382211840,1382212095,FR +1382212096,1382212223,DE +1382212224,1382212239,FR +1382212240,1382212287,DE +1382212288,1382212351,NL +1382212352,1382212479,FR +1382212480,1382212607,DE +1382212608,1382212863,FR +1382212864,1382213183,NL +1382213184,1382213199,DE +1382213200,1382214079,NL +1382214080,1382214111,DE +1382214112,1382214143,NL +1382214144,1382214271,DE +1382214272,1382214335,NL +1382214336,1382214399,DE +1382214400,1382214879,NL +1382214880,1382214895,DE +1382214896,1382216831,NL +1382216832,1382216895,DE +1382216896,1382216959,NL +1382216960,1382217215,FR +1382217216,1382217727,NL +1382217728,1382217983,DE +1382217984,1382218399,NL +1382218400,1382218447,DE +1382218448,1382218455,NL +1382218456,1382218495,DE +1382218496,1382218623,NL +1382218624,1382218751,DE +1382218752,1382218815,NL +1382218816,1382218911,DE +1382218912,1382218959,NL +1382218960,1382218991,DE +1382218992,1382219775,NL +1382219776,1382224287,SE +1382224288,1382224319,NO +1382224320,1382226271,SE +1382226272,1382226303,NO +1382226304,1382227327,SE +1382227328,1382227455,NO +1382227456,1382227583,SE +1382227584,1382227711,DK +1382227712,1382232575,SE +1382232576,1382232639,NO +1382232640,1382232703,DK +1382232704,1382233407,SE +1382233408,1382233423,GB +1382233424,1382252543,SE +1382252544,1382268927,CZ +1382268928,1382285311,IR +1382285312,1382301391,CZ +1382301392,1382301407,SK +1382301408,1382301695,CZ +1382301696,1382318079,SE +1382318080,1382334463,RU +1382334464,1382350847,DE +1382350848,1382367231,FR +1382367232,1382383615,BG +1382400000,1382416383,NL +1382416384,1382419479,PT +1382419480,1382419487,ES +1382419488,1382419967,PT +1382419968,1382419999,ES +1382420000,1382420831,PT +1382420832,1382420863,ES +1382420864,1382420927,PT +1382420928,1382420991,GB +1382420992,1382421247,FR +1382421248,1382422783,PT +1382422784,1382423039,ES +1382423040,1382432767,PT +1382432768,1382449151,CY +1382449152,1382465535,IL +1382465536,1382481919,PS +1382481920,1382498303,AT +1382498304,1382514687,BG +1382514688,1382531071,DK +1382531072,1382547455,FI +1382547456,1382809599,IT +1382809600,1383025663,GB +1383025664,1383025672,DE +1383025673,1383025679,GB +1383025680,1383025711,DE +1383025712,1383025727,GB +1383025728,1383025759,DE +1383025760,1383071743,GB +1383071744,1383073119,RU +1383073120,1383073135,UZ +1383073136,1383073279,RU +1383073280,1383073535,KZ +1383073536,1383079935,RU +1383079936,1383088127,NL +1383088128,1383096319,IS +1383096320,1383103271,GB +1383103272,1383103279,ES +1383103280,1383103471,GB +1383103472,1383103487,NL +1383103488,1383104015,GB +1383104016,1383104023,ES +1383104024,1383104255,GB +1383104256,1383104511,FR +1383104512,1383112703,GB +1383112704,1383120895,GE +1383120896,1383129087,IT +1383129088,1383137279,GB +1383137280,1383145471,MC +1383145472,1383153663,CZ +1383153664,1383161855,GB +1383161856,1383170047,DE +1383170048,1383171743,GB +1383171744,1383171775,NZ +1383171776,1383172559,GB +1383172560,1383172567,ZA +1383172568,1383186431,GB +1383186432,1383194623,IT +1383194624,1383202815,GB +1383202816,1383211007,RU +1383211008,1383219199,CY +1383219200,1383222015,CS +1383222016,1383222527,MK +1383222528,1383222783,RS +1383222784,1383223039,MK +1383223040,1383224863,CS +1383224864,1383224895,RS +1383224896,1383225343,CS +1383225344,1383227391,RS +1383227392,1383239295,RU +1383239296,1383239423,AR +1383239424,1383243775,RU +1383243776,1383251967,YE +1383251968,1383260159,CZ +1383260160,1383268351,RU +1383268352,1383273983,IR +1383273984,1383276543,KW +1383276544,1383284735,KZ +1383284736,1383292927,PL +1383292928,1383301119,DE +1383301120,1383309311,SE +1383309312,1383317503,IT +1383317504,1383321599,SE +1383321600,1383325695,RU +1383325696,1383333887,GB +1383333888,1383350271,RU +1383350272,1383358463,NO +1383358464,1383366911,DE +1383366912,1383367167,SY +1383367168,1383368703,KW +1383368704,1383368831,DE +1383368832,1383368847,GB +1383368848,1383369087,DE +1383369088,1383369119,GB +1383369120,1383369231,DE +1383369232,1383369247,GB +1383369248,1383369535,DE +1383369536,1383369567,GB +1383369568,1383369727,DE +1383369728,1383370751,KW +1383370752,1383371775,DE +1383371776,1383374591,KW +1383374592,1383374847,US +1383374848,1383383039,ES +1383383040,1383391231,CY +1383391232,1383399423,FI +1383399424,1383402015,LI +1383402016,1383402023,CH +1383402024,1383407615,LI +1383407616,1383415807,NO +1383415808,1383423999,RU +1383424000,1383432191,SE +1383432192,1383440383,CZ +1383440384,1383448575,RU +1383448576,1383449343,RS +1383449344,1383449375,CS +1383449376,1383449391,RS +1383449392,1383449395,CS +1383449396,1383449471,RS +1383449472,1383449487,CS +1383449488,1383449495,RS +1383449496,1383449503,CS +1383449504,1383449551,RS +1383449552,1383449599,CS +1383449600,1383450751,RS +1383450752,1383450767,CS +1383450768,1383450783,RS +1383450784,1383450799,CS +1383450800,1383452175,RS +1383452176,1383452191,CS +1383452192,1383452255,RS +1383452256,1383452295,CS +1383452296,1383452351,RS +1383452352,1383452375,CS +1383452376,1383452407,RS +1383452408,1383452415,CS +1383452416,1383456767,RS +1383456768,1383464959,UA +1383464960,1383473151,US +1383473152,1383481343,DE +1383481344,1383481599,GB +1383481600,1383481615,US +1383481616,1383481663,GB +1383481664,1383481695,US +1383481696,1383481703,GB +1383481704,1383481711,US +1383481712,1383481775,GB +1383481776,1383481791,SA +1383481792,1383482367,GB +1383482368,1383482879,NL +1383482880,1383483375,GB +1383483376,1383483383,US +1383483384,1383483887,GB +1383483888,1383483903,JP +1383483904,1383485375,GB +1383485376,1383485407,US +1383485408,1383497727,GB +1383497728,1383499039,RU +1383499040,1383499047,UA +1383499048,1383499775,RU +1383499776,1383501823,AZ +1383501824,1383502335,RU +1383502336,1383502847,CH +1383502848,1383504895,RU +1383504896,1383505919,AZ +1383505920,1383514111,SA +1383514112,1383522303,FI +1383522304,1383530495,BG +1383530496,1383538687,DE +1383538688,1383546879,IT +1383546880,1383555071,BG +1383555072,1383563263,SK +1383563264,1383571455,RU +1383571456,1383579647,DE +1383579648,1383587839,IT +1383587840,1383591935,SK +1383591936,1383592607,CZ +1383592608,1383592623,SK +1383592624,1383592887,CZ +1383592888,1383592895,VC +1383592896,1383593471,CZ +1383593472,1383593727,SK +1383593728,1383594367,CZ +1383594368,1383594495,SK +1383594496,1383595279,CZ +1383595280,1383595295,SK +1383595296,1383595467,CZ +1383595468,1383595471,SK +1383595472,1383596031,CZ +1383596032,1384120319,FR +1384153088,1384185855,FI +1384185856,1384187903,DE +1384187904,1384188031,CH +1384188032,1384188095,DE +1384188096,1384188127,NL +1384188128,1384189055,DE +1384189056,1384189183,CH +1384189184,1384189439,AT +1384189440,1384190463,DE +1384190464,1384190719,NL +1384190720,1384190975,DE +1384190976,1384191231,DK +1384191232,1384191359,DE +1384191360,1384191423,AT +1384191424,1384191999,DE +1384192000,1384192191,NL +1384192192,1384192255,DE +1384192256,1384192511,NL +1384192512,1384193023,DE +1384193024,1384194047,NL +1384194048,1384194191,DE +1384194192,1384194207,AT +1384194208,1384194271,DE +1384194272,1384194303,NL +1384194304,1384194559,DE +1384194560,1384194815,NL +1384194816,1384195711,DE +1384195712,1384195743,NL +1384195744,1384195751,CH +1384195752,1384195775,DE +1384195776,1384195839,SE +1384195840,1384196095,DE +1384196096,1384197119,CZ +1384197120,1384218623,DE +1384251392,1384267775,FI +1384267776,1384284159,CH +1384284160,1384316927,ES +1384316928,1384349695,EE +1384349696,1384382463,HU +1384382464,1384415231,HR +1384415232,1384415743,DE +1384415744,1384419071,GB +1384419072,1384419583,DE +1384419584,1384419839,GB +1384419840,1384420351,DE +1384420352,1384422783,GB +1384422784,1384422911,DE +1384422912,1384435711,GB +1384435712,1384446975,DE +1384446976,1384447231,GB +1384447232,1384447743,DE +1384447744,1384447807,GB +1384447808,1384447999,DE +1384448000,1384480767,GB +1384480768,1384513535,FI +1384513536,1384546303,NO +1384546304,1384579071,NL +1384579072,1384611839,DE +1384611840,1384644607,LT +1384644608,1384660991,GB +1384660992,1384677375,CH +1384677376,1384693759,SE +1384693760,1384710143,NL +1384710144,1384726527,RO +1384726528,1384742911,BG +1384742912,1384759295,RU +1384759296,1384775679,SY +1384775680,1384792063,RU +1384792064,1384792623,FR +1384792624,1384792639,BE +1384792640,1384793663,FR +1384793664,1384793695,BE +1384793696,1384793791,FR +1384793792,1384793823,BE +1384793824,1384794127,FR +1384794128,1384794143,CH +1384794144,1384794271,FR +1384794272,1384794287,CH +1384794288,1384794815,FR +1384794816,1384794847,BE +1384794848,1384794879,FR +1384794880,1384795135,CH +1384795136,1384795279,FR +1384795280,1384795327,BE +1384795328,1384801023,FR +1384801024,1384801087,SM +1384801088,1384802495,FR +1384802496,1384802559,IT +1384802560,1384808447,FR +1384808960,1384808967,DE +1384808968,1384808975,SE +1384808976,1384808991,DE +1384808992,1384809007,FI +1384809008,1384809015,PT +1384809016,1384809023,GB +1384809040,1384809055,FR +1384809056,1384809063,GE +1384809064,1384809071,GB +1384809088,1384809103,FR +1384811008,1384811519,GB +1384811520,1384811647,IR +1384812800,1384813311,GB +1384818464,1384818495,BE +1384824832,1384841215,GB +1384841216,1384857599,PL +1384857600,1384873983,NL +1384873984,1384890367,PL +1384890368,1384923135,DE +1384923136,1384939519,RU +1384939520,1384955903,LT +1384955904,1384972287,PT +1384972288,1384988671,DE +1384988672,1385005055,FI +1385005056,1385006079,HU +1385006080,1385006207,SK +1385006208,1385021439,HU +1385021440,1385037823,IE +1385037824,1385054207,FR +1385054208,1385070591,CZ +1385070592,1385086975,RU +1385086976,1385103359,GB +1385103360,1385119743,IT +1385119744,1385136127,BE +1385136128,1385152511,PL +1385152512,1385168895,DK +1385168896,1385177087,ES +1385177088,1385185279,DE +1385185280,1385193471,RU +1385193472,1385201663,ES +1385201664,1385209855,CZ +1385209856,1385218047,HU +1385218048,1385226239,UA +1385226240,1385234431,GB +1385234432,1385242623,DE +1385242624,1385250815,GB +1385250816,1385259007,PL +1385259008,1385267199,IT +1385267200,1385275391,SE +1385275392,1385283583,IT +1385283584,1385291775,KW +1385291776,1385299967,TR +1385299968,1385308159,BG +1385308160,1385310207,BE +1385310208,1385312255,RU +1385312256,1385314303,US +1385314304,1385316351,RU +1385316352,1385324543,NO +1385324544,1385332735,BE +1385332736,1385340927,GB +1385340928,1385349119,LB +1385349120,1385357311,CH +1385357312,1385365503,PL +1385365504,1385373695,GB +1385373696,1385381887,NO +1385381888,1385398271,RU +1385398272,1385406463,BG +1385406464,1385414655,EE +1385414656,1385422847,SA +1385422848,1385431039,DK +1385431040,1385439231,RU +1385439232,1385447423,GB +1385447424,1385455615,IS +1385455616,1385463807,QA +1385463808,1385480191,NO +1385480192,1385488383,NL +1385488384,1385496575,GB +1385496576,1385504767,SI +1385504768,1385512959,FR +1385512960,1385521151,DE +1385521152,1385529343,AT +1385529344,1385537535,RU +1385537536,1385545727,DE +1385545728,1385553919,RU +1385553920,1385554515,DE +1385554516,1385554519,CH +1385554520,1385554527,DE +1385554528,1385554531,AT +1385554532,1385554719,DE +1385554720,1385554735,AT +1385554736,1385554783,DE +1385554784,1385554791,CH +1385554792,1385557503,DE +1385557504,1385557759,AT +1385557760,1385559039,DE +1385559040,1385559295,SK +1385559296,1385560831,DE +1385560832,1385561087,SK +1385561088,1385562111,DE +1385562624,1385563135,ES +1385563136,1385563391,IE +1385563648,1385563935,IE +1385564032,1385564095,IE +1385564100,1385564127,IE +1385564160,1385564223,HU +1385564384,1385564671,HU +1385565184,1385565439,ES +1385566208,1385566399,FR +1385566432,1385566847,FR +1385566880,1385566911,FR +1385566928,1385566935,FR +1385566944,1385566991,FR +1385566996,1385567007,FR +1385567088,1385567103,FR +1385567120,1385567151,FR +1385567160,1385567215,FR +1385567224,1385567227,FR +1385567232,1385568255,IE +1385569408,1385569487,CZ +1385569488,1385569503,DE +1385569504,1385569511,CZ +1385569528,1385569535,GB +1385569792,1385570303,FR +1385570304,1385578495,HU +1385578496,1385586687,DK +1385586688,1385587967,GB +1385587968,1385588735,US +1385588736,1385589247,HK +1385589248,1385589503,JP +1385589504,1385594879,GB +1385594880,1385603071,NL +1385603072,1385611263,CZ +1385611264,1385619455,AT +1385619456,1385625599,DE +1385625600,1385626111,FR +1385626112,1385627647,DE +1385627648,1385635839,RU +1385635840,1385644031,NL +1385652224,1385660415,RU +1385660416,1385668607,TR +1385668608,1385676799,NL +1385684992,1385824255,GB +1385824256,1385955327,PT +1385955328,1386086399,NL +1386086400,1386217471,ES +1386217472,1386283007,PL +1386283008,1386348543,NL +1386348544,1386414079,RU +1386414080,1386479615,GB +1386479616,1386545151,NO +1386545152,1386577919,DE +1386577920,1386594303,US +1386594304,1386598399,DE +1386598400,1386600447,US +1386600448,1386602495,DE +1386602496,1386610687,US +1386610688,1386676223,IL +1386676224,1386741759,SA +1386741760,1387233623,NL +1387233624,1387233627,BE +1387233628,1387233663,NL +1387233664,1387233727,BE +1387233728,1387233791,NL +1387233792,1387233919,BE +1387233920,1387249663,NL +1387249664,1387251231,BE +1387251232,1387251263,NL +1387251264,1387251727,BE +1387251728,1387251751,NL +1387251752,1387251759,BE +1387251760,1387252223,NL +1387252224,1387252479,BE +1387252480,1387331583,NL +1387331584,1387397119,PL +1387397120,1387462655,OM +1387462656,1387528191,RU +1387528192,1387593727,DK +1387593728,1387659263,FI +1387659264,1387790335,SE +1387790336,1388314623,IT +1388314624,1388322815,AT +1388322816,1388331007,SI +1388331008,1388339199,NL +1388339200,1388347391,GB +1388347392,1388363775,DK +1388363776,1388371967,DE +1388371968,1388380159,CH +1388380160,1388396543,IT +1388396544,1388404735,LV +1388404736,1388412927,UA +1388412928,1388421119,RU +1388421120,1388429311,SE +1388429312,1388437503,HR +1388437504,1388445695,DE +1388445696,1388453887,AZ +1388453888,1388462079,BH +1388462080,1388470271,ES +1388470272,1388478463,DE +1388478464,1388486655,AT +1388486656,1388494847,RU +1388494848,1388503039,NO +1388503040,1388519423,RU +1388519424,1388527615,NL +1388527616,1388535807,DE +1388535808,1388543999,GB +1388544000,1388547583,IE +1388547584,1388547775,GB +1388547776,1388547871,IE +1388547872,1388547903,GB +1388547904,1388552191,IE +1388552192,1388560383,GB +1388560384,1388568575,FI +1388568576,1388576767,CH +1388576768,1388584959,FR +1388584960,1388587487,GB +1388587488,1388587503,FR +1388587504,1388588543,GB +1388588544,1388588799,US +1388588800,1388590079,GB +1388590080,1388590127,FR +1388590128,1388590591,GB +1388590592,1388590719,US +1388590720,1388591103,GB +1388591104,1388591151,SG +1388591152,1388591167,GB +1388591168,1388591187,SG +1388591188,1388591199,GB +1388591200,1388591231,SG +1388591232,1388591295,GB +1388591296,1388591311,SG +1388591312,1388591615,GB +1388591616,1388591631,US +1388591632,1388591647,GB +1388591648,1388591663,US +1388591664,1388593151,GB +1388593152,1388601343,RU +1388601344,1388609535,SE +1388609536,1388617727,RU +1388617728,1388625919,SE +1388625920,1388634111,NO +1388634112,1388642303,GB +1388642304,1388650495,FI +1388650496,1388658687,PL +1388658688,1388666879,GB +1388666880,1388675071,GR +1388675072,1388675327,NL +1388675584,1388677119,DE +1388677120,1388677375,GB +1388677632,1388677663,AT +1388677888,1388679167,DE +1388679168,1388679423,FR +1388679424,1388679455,DE +1388679680,1388682239,DE +1388682752,1388683263,DE +1388683264,1388691455,CH +1388691456,1388699647,NL +1388699648,1388707839,SE +1388707840,1388708863,RU +1388708864,1388709119,LB +1388709120,1388712959,RU +1388712960,1388713215,LB +1388713216,1388713727,TJ +1388713728,1388713983,LB +1388713984,1388714239,AM +1388714240,1388714495,LT +1388714496,1388714751,RU +1388714752,1388715007,IQ +1388715008,1388715263,LT +1388715264,1388715519,LB +1388715520,1388715775,LV +1388715776,1388716031,LT +1388716032,1388724223,ES +1388724224,1388728600,DE +1388728601,1388728608,CZ +1388728609,1388728640,DE +1388728641,1388728673,AT +1388728674,1388728734,DE +1388728735,1388728762,AT +1388728763,1388728783,DE +1388728784,1388728799,AT +1388728800,1388728815,DE +1388728816,1388728820,AT +1388728821,1388729208,DE +1388729209,1388729240,AT +1388729241,1388729280,DE +1388729281,1388729296,AT +1388729297,1388729304,DE +1388729305,1388729320,AT +1388729321,1388729856,DE +1388729857,1388729888,AT +1388729889,1388731136,DE +1388731137,1388731391,AT +1388731392,1388732415,DE +1388732416,1388740607,ES +1388740608,1388748799,IE +1388748800,1388756991,RU +1388756992,1388765183,DE +1388765184,1388773375,GB +1388773376,1388781567,NO +1388781568,1388789759,ES +1388789760,1388797951,NL +1388797952,1388806143,RU +1388806144,1388814335,NL +1388814336,1388815103,AX +1388815104,1388815231,FI +1388815232,1388818687,AX +1388818688,1388818815,FI +1388818816,1388821119,AX +1388821120,1388821150,SE +1388821151,1388821247,AX +1388821248,1388822527,SE +1388822528,1388830719,BG +1388830720,1388838911,FI +1388838912,1388871679,RU +1388871680,1388904447,KZ +1388904448,1388937215,NL +1388969984,1389002751,CZ +1389002752,1389035519,RU +1389035520,1389068287,GB +1389068288,1389101055,FI +1389101056,1389133823,NL +1389133824,1389166591,RU +1389166592,1389199359,PS +1389199360,1389199615,AE +1389199616,1389199647,IR +1389199648,1389199743,AE +1389199744,1389199775,IR +1389199776,1389199871,AE +1389199872,1389200127,IR +1389200128,1389200895,AE +1389200896,1389201023,KW +1389201024,1389201087,AE +1389201088,1389201151,KW +1389201152,1389201791,AE +1389201792,1389201919,KW +1389201920,1389202175,SA +1389202176,1389202191,IR +1389202192,1389202207,AE +1389202208,1389202223,IQ +1389202224,1389202239,SA +1389202240,1389202303,IR +1389202304,1389202343,AE +1389202344,1389202351,IQ +1389202352,1389202367,IR +1389202368,1389202375,IQ +1389202376,1389202383,AE +1389202384,1389202391,IQ +1389202392,1389203391,AE +1389203392,1389203455,IR +1389203456,1389203487,IQ +1389203488,1389203551,AE +1389203552,1389203583,IQ +1389203584,1389204127,AE +1389204128,1389204143,IR +1389204144,1389204147,AE +1389204148,1389204159,TM +1389204160,1389204167,AE +1389204168,1389204175,IR +1389204176,1389204183,IQ +1389204184,1389204287,AE +1389204288,1389204303,SA +1389204304,1389204479,AE +1389204480,1389204543,IR +1389204544,1389205503,AE +1389205504,1389205631,IQ +1389205632,1389205935,IR +1389205936,1389205951,AE +1389205952,1389205967,IR +1389205968,1389205999,AE +1389206000,1389206015,IR +1389206016,1389206079,AE +1389206080,1389206095,IR +1389206096,1389206191,AE +1389206192,1389206199,TM +1389206200,1389206207,SA +1389206208,1389206271,AE +1389206272,1389206656,IR +1389206657,1389206719,AE +1389206720,1389207039,IR +1389207040,1389207295,AE +1389207296,1389207359,IR +1389207360,1389207391,SA +1389207392,1389207487,IR +1389207488,1389207495,AE +1389207496,1389207519,SA +1389207520,1389207551,IR +1389207552,1389207807,LB +1389207808,1389208159,AE +1389208160,1389208191,IR +1389208192,1389208895,AE +1389208896,1389208959,IQ +1389208960,1389209087,AE +1389209088,1389209343,IR +1389209344,1389210623,AE +1389210624,1389210631,IR +1389210632,1389210655,AE +1389210656,1389210751,IR +1389210752,1389210815,AE +1389210816,1389210879,IR +1389210880,1389211135,LB +1389211136,1389211719,AE +1389211720,1389211727,IR +1389211728,1389211743,IQ +1389211744,1389212927,AE +1389212928,1389212991,IR +1389212992,1389213055,AE +1389213056,1389213087,IR +1389213088,1389213183,AE +1389213184,1389213199,IQ +1389213200,1389213439,AE +1389213440,1389213695,LY +1389213696,1389213951,LB +1389213952,1389214207,AE +1389214208,1389214463,LY +1389214464,1389214975,AE +1389214976,1389215039,IQ +1389215040,1389215231,AE +1389215232,1389217791,AF +1389217792,1389218303,AE +1389218304,1389219839,AF +1389219840,1389220095,AE +1389220096,1389220143,SA +1389220144,1389220159,AE +1389220160,1389220223,IQ +1389220224,1389220287,AE +1389220288,1389220479,IR +1389220480,1389220495,IQ +1389220496,1389220511,AE +1389220512,1389220543,SA +1389220544,1389220575,AE +1389220576,1389220591,IQ +1389220592,1389220607,AE +1389220608,1389220655,SA +1389220656,1389220671,AE +1389220672,1389220687,IQ +1389220688,1389220703,SA +1389220704,1389220735,AE +1389220736,1389220751,IQ +1389220752,1389220799,SA +1389220800,1389220895,AE +1389220896,1389220927,SA +1389220928,1389220935,AE +1389220936,1389220943,IR +1389220944,1389220959,AE +1389220960,1389220975,IQ +1389220976,1389221119,AE +1389221120,1389221631,LY +1389221632,1389222431,SA +1389222432,1389222463,IQ +1389222464,1389222495,AE +1389222496,1389222511,IQ +1389222512,1389222528,AE +1389222529,1389222542,SA +1389222543,1389222575,AE +1389222576,1389222591,SA +1389222592,1389222607,IQ +1389222608,1389222623,AE +1389222624,1389222639,IR +1389222640,1389222687,AE +1389222688,1389222703,IR +1389222704,1389222719,SA +1389222720,1389222751,IQ +1389222752,1389222799,AE +1389222800,1389222879,SA +1389222880,1389222911,AE +1389222912,1389223167,SA +1389223168,1389223183,AE +1389223184,1389223215,SA +1389223216,1389223231,AE +1389223232,1389223263,SA +1389223264,1389223327,IQ +1389223328,1389223423,AE +1389223424,1389223471,SA +1389223472,1389223487,IQ +1389223488,1389223519,AE +1389223520,1389223551,IR +1389223552,1389223679,SA +1389223680,1389224191,DE +1389224192,1389224447,SA +1389224448,1389224511,IR +1389224512,1389224543,AE +1389224544,1389224559,IR +1389224560,1389224703,AE +1389224704,1389224959,LY +1389224960,1389225215,AE +1389225216,1389225471,SA +1389225472,1389225535,IR +1389225536,1389225567,IQ +1389225568,1389225727,AE +1389225728,1389225983,IR +1389225984,1389226239,LY +1389226240,1389226751,IR +1389226752,1389227391,AE +1389227392,1389227775,IR +1389227776,1389228031,AE +1389228032,1389228047,IQ +1389228048,1389228063,AE +1389228064,1389228095,IQ +1389228096,1389228127,LB +1389228128,1389228175,IQ +1389228176,1389228287,AE +1389228288,1389228351,IQ +1389228352,1389228415,AE +1389228416,1389228479,LB +1389228480,1389228799,AE +1389228800,1389228863,NG +1389228864,1389228871,SO +1389228872,1389229055,AE +1389229056,1389229311,FR +1389229312,1389229567,AE +1389229568,1389229695,AF +1389229696,1389229823,AE +1389229824,1389230079,DE +1389230080,1389230095,IR +1389230096,1389230111,AE +1389230112,1389230143,IR +1389230144,1389232063,AE +1389232064,1389232095,SA +1389232096,1389232127,AE +1389232128,1389232319,DE +1389232320,1389232327,LT +1389232328,1389264127,DE +1389264128,1389264639,ES +1389264640,1389264911,US +1389264912,1389264927,CD +1389264928,1389264943,GB +1389264944,1389264959,GH +1389264960,1389265039,TZ +1389265040,1389265055,GB +1389265056,1389265071,ZA +1389265072,1389265079,GB +1389265080,1389265087,NG +1389265088,1389265127,GB +1389265128,1389265135,BH +1389265136,1389265151,GB +1389265152,1389265167,NG +1389265168,1389265183,US +1389265184,1389265199,ZA +1389265200,1389265231,ET +1389265232,1389265239,TZ +1389265240,1389265263,GB +1389265264,1389265279,NG +1389265280,1389265407,TD +1389265408,1389265535,US +1389265536,1389265536,GB +1389265537,1389265551,US +1389265552,1389265559,CA +1389265560,1389265567,LR +1389265568,1389265574,GM +1389265575,1389265575,GB +1389265576,1389265591,SC +1389265592,1389265598,CG +1389265599,1389265599,GB +1389265600,1389265663,SO +1389265664,1389265791,ZA +1389265792,1389265807,GB +1389265808,1389265823,CA +1389265824,1389265855,NG +1389265856,1389265863,US +1389265864,1389265919,GB +1389265920,1389266463,US +1389266464,1389266471,CD +1389266472,1389266543,US +1389266544,1389266551,CD +1389266552,1389266559,US +1389266560,1389266569,CD +1389266570,1389266575,US +1389266576,1389266591,NG +1389266592,1389266599,US +1389266600,1389266607,NG +1389266608,1389266663,US +1389266664,1389266687,CD +1389266688,1389266695,ZA +1389266696,1389266943,US +1389266944,1389267199,KE +1389267200,1389267455,CD +1389267456,1389267967,GB +1389267968,1389268096,BI +1389268097,1389268223,GB +1389268224,1389268735,US +1389268736,1389268863,GB +1389268864,1389268871,KE +1389268872,1389268991,GB +1389268992,1389269023,DE +1389269024,1389269031,CD +1389269032,1389269055,DE +1389269056,1389269063,CD +1389269064,1389269151,DE +1389269152,1389269159,NG +1389269160,1389269183,DE +1389269184,1389269215,NG +1389269216,1389269247,DE +1389269248,1389269376,NG +1389269377,1389269759,GB +1389269760,1389269887,CD +1389269888,1389270015,GB +1389270016,1389270271,CD +1389270272,1389270783,GB +1389270784,1389271039,US +1389271040,1389271295,CA +1389271296,1389272063,GB +1389272064,1389272191,NO +1389272192,1389272367,GB +1389272368,1389272383,AE +1389272384,1389272831,GB +1389272832,1389272959,ZA +1389272960,1389273087,FR +1389273088,1389273343,LB +1389273344,1389273599,AE +1389273600,1389273855,MG +1389273856,1389274111,NG +1389274112,1389274367,GB +1389274368,1389274383,US +1389274384,1389274399,SA +1389274400,1389274431,GH +1389274432,1389274494,US +1389274495,1389274495,GB +1389274496,1389274751,ZA +1389274752,1389274815,CD +1389274816,1389274839,LR +1389274840,1389274847,GB +1389274848,1389274879,LR +1389274880,1389275135,AE +1389275136,1389275391,GB +1389275392,1389275471,BD +1389275472,1389275503,GB +1389275504,1389275511,DE +1389275512,1389275839,GB +1389275840,1389275902,SA +1389275903,1389275903,GB +1389275904,1389276415,US +1389276416,1389276671,MX +1389276672,1389277055,GB +1389277056,1389277183,MX +1389277184,1389277439,GB +1389277440,1389277567,NP +1389277568,1389277695,GB +1389277696,1389277951,AE +1389277952,1389278207,GB +1389278208,1389278463,SN +1389278464,1389278719,MX +1389278720,1389278847,DE +1389278848,1389278975,NG +1389278976,1389279103,MX +1389279104,1389279231,NG +1389279232,1389279487,US +1389279488,1389279615,GB +1389279616,1389279743,US +1389279744,1389279999,LR +1389280000,1389280255,CI +1389280256,1389280511,GB +1389280512,1389280767,FR +1389280768,1389281023,VG +1389281024,1389281279,GB +1389281280,1389282047,ZA +1389282048,1389282815,GB +1389282816,1389282943,LR +1389282944,1389283071,SN +1389283072,1389283327,GB +1389283328,1389283583,LR +1389283584,1389283711,GB +1389283712,1389283839,ZA +1389283840,1389284351,GB +1389284352,1389286399,TZ +1389286400,1389287423,GB +1389287424,1389287551,US +1389287552,1389287679,GB +1389287680,1389287935,DK +1389287936,1389288447,US +1389288448,1389289471,GN +1389289472,1389290495,GB +1389290496,1389290751,US +1389290752,1389291007,FR +1389291008,1389291519,GB +1389291520,1389291855,US +1389291856,1389292031,GB +1389292032,1389292799,GH +1389292800,1389293055,MG +1389293056,1389293311,US +1389293312,1389293567,KE +1389293568,1389294335,GB +1389294336,1389295615,US +1389295616,1389295887,ZA +1389295888,1389295935,US +1389295936,1389295967,SN +1389295968,1389296383,US +1389296384,1389296447,AD +1389296448,1389296639,US +1389296640,1389297151,TZ +1389297152,1389297408,US +1389297409,1389297663,GB +1389297664,1389330431,UA +1389330432,1389363199,DE +1389363200,1389379583,CZ +1389379584,1389395967,RU +1389395968,1389412351,RO +1389412352,1389412607,RS +1389412608,1389413375,CS +1389413376,1389413407,RS +1389413408,1389413631,CS +1389413632,1389415427,RS +1389415428,1389415431,CS +1389415432,1389415439,RS +1389415440,1389415679,CS +1389415680,1389416703,RS +1389416704,1389419775,CS +1389419776,1389420543,RS +1389420544,1389421055,CS +1389421056,1389422591,RS +1389422592,1389423359,CS +1389423360,1389423615,RS +1389423616,1389423871,CS +1389423872,1389424383,RS +1389424384,1389426175,CS +1389426176,1389426687,RS +1389426688,1389428735,CS +1389428736,1389445119,CZ +1389445120,1389461503,GB +1389461504,1389477887,SE +1389477888,1389494271,BY +1389494272,1389502239,DE +1389502240,1389502271,CH +1389502272,1389504511,DE +1389504512,1389505023,FR +1389505024,1389505279,DE +1389505280,1389505535,FR +1389505536,1389510655,DE +1389510656,1389527039,NL +1389527040,1389543423,PL +1389543424,1389554023,DE +1389554024,1389554039,FR +1389554040,1389554047,TR +1389554048,1389554087,DE +1389554088,1389554095,ES +1389554096,1389554103,DE +1389554104,1389554111,FR +1389554112,1389554135,IT +1389554136,1389555263,DE +1389555264,1389555327,AT +1389555328,1389556751,DE +1389556752,1389556759,CH +1389556760,1389559039,DE +1389559040,1389559103,CH +1389559104,1389559743,DE +1389559744,1389559807,CH +1389559808,1389562879,DE +1389562880,1389563135,IT +1389563136,1389576191,DE +1389576192,1389592575,GB +1389592576,1389608959,CY +1389608960,1389625343,DK +1389625344,1389641727,DE +1389641728,1389658111,JO +1389658112,1389674495,BE +1389674496,1389690879,DE +1389690880,1389707263,PS +1389707264,1389723647,IT +1389723648,1389756415,ES +1389756416,1389772799,SE +1389772800,1389780991,SI +1389780992,1389782015,HR +1389782016,1389783039,SI +1389783040,1389783295,BA +1389783296,1389784575,SI +1389784576,1389784831,BA +1389784832,1389788671,SI +1389788672,1389788927,CS +1389788928,1389789183,SI +1389789184,1389805567,PL +1389805568,1389821951,DE +1389821952,1389838335,NL +1389838336,1389854719,UZ +1389854720,1389871103,IT +1389871104,1389887487,FI +1389887488,1389953023,FR +1389953024,1390018559,NL +1390018560,1390084095,AT +1390084096,1390149631,GB +1390149632,1390153999,CH +1390154000,1390154015,US +1390154016,1390215167,CH +1390215168,1390280703,IS +1390280704,1390346239,TR +1390346240,1390394367,ES +1390394368,1390394879,PT +1390394880,1390395391,ES +1390395392,1390396415,FR +1390396416,1390397183,PT +1390397184,1390411775,ES +1390411776,1392508927,FR +1392508928,1394606079,PL +1394606080,1396703231,ES +1396703232,1396834303,AT +1396834304,1396899839,TR +1396899840,1396965375,GB +1396965376,1396973567,NL +1396973568,1396981759,RU +1396981760,1396989951,PL +1396989952,1396998143,FR +1396998144,1397006335,AT +1397006336,1397014527,KW +1397014528,1397022719,CH +1397022720,1397030911,SE +1397030912,1397039103,RU +1397039104,1397047295,CZ +1397047296,1397063679,RU +1397063680,1397071871,UZ +1397071872,1397096447,RU +1397096448,1397227519,IE +1397227520,1397489663,DK +1397489664,1397751807,CH +1397751808,1398276095,NL +1398276096,1398800383,DK +1398800384,1398833151,KW +1398833152,1398849535,NL +1398849536,1398850079,BE +1398850080,1398850559,NL +1398850560,1398850687,BE +1398850688,1398850751,NL +1398850752,1398851231,BE +1398851232,1398851263,NL +1398851264,1398852351,BE +1398852352,1398852863,NL +1398852864,1398853119,BE +1398853120,1398865919,NL +1398865920,1398867967,DE +1398867968,1398870015,NL +1398870016,1398872063,PL +1398872064,1398874111,BG +1398874112,1398876159,GB +1398876160,1398880255,DE +1398880256,1398882303,FR +1398882304,1398884351,BG +1398884352,1398886399,DE +1398886400,1398888447,CH +1398888448,1398890495,GB +1398890496,1398892543,DK +1398892544,1398894591,UA +1398894592,1398896639,DE +1398896640,1398898687,CH +1398898688,1398931455,ES +1398931456,1398964223,GB +1398964224,1398965759,NL +1398965760,1398965887,CH +1398965888,1398967871,NL +1398967872,1398967903,IE +1398967904,1398968063,NL +1398968064,1398968319,DE +1398968320,1398969599,NL +1398969600,1398969855,GB +1398969856,1398972319,NL +1398972320,1398972351,US +1398972352,1398972415,NL +1398972416,1398972671,IE +1398972672,1398973695,NL +1398973696,1398973951,DE +1398973952,1398974207,IE +1398974208,1398979583,NL +1398979584,1398979839,GB +1398979840,1398980873,NL +1398980874,1398980881,US +1398980882,1398982143,NL +1398982144,1398982399,US +1398982400,1398983423,NL +1398983424,1398983487,GB +1398983488,1398983519,JE +1398983520,1398983551,GB +1398983552,1398983679,NL +1398983680,1398984191,US +1398984192,1398996991,NL +1398996992,1399029759,LU +1399029760,1399062527,LV +1399062528,1399095295,FI +1399095296,1399128063,GB +1399128064,1399160831,BE +1399160832,1399193599,SA +1399193600,1399226367,FI +1399226368,1399259135,RU +1399259136,1399291903,IT +1399291904,1399324671,RO +1399324672,1399586815,GB +1399586816,1399717887,NO +1399717888,1399848959,AE +1399848960,1400111103,FR +1400111104,1400373247,NL +1400373248,1400716287,DE +1400717312,1400718335,DE +1400718848,1400721407,DE +1400725504,1400730639,DE +1400731136,1400733695,DE +1400897536,1400963071,NL +1400963072,1401028607,DE +1401028608,1401094143,IL +1401094144,1401159679,HR +1401159680,1401225215,PT +1401225216,1401241599,DE +1401241600,1401242623,DK +1401242624,1401243135,DE +1401243648,1401244159,DE +1401246720,1401264903,DE +1401265152,1401265919,DE +1401266176,1401270783,DE +1401271296,1401283583,DE +1401286656,1401290751,DE +1401290752,1401356287,BE +1401356288,1401421823,DE +1401421824,1401423135,GB +1401423136,1401423167,IN +1401423168,1401423199,GB +1401423200,1401423231,US +1401423232,1401423871,GB +1401423872,1401423903,AE +1401423904,1401423967,GR +1401423968,1401423999,SA +1401424000,1401425151,AE +1401425152,1401425407,GR +1401425408,1401425919,AE +1401425920,1401427967,NL +1401427968,1401430015,RU +1401430016,1401432063,AT +1401432064,1401434111,IE +1401434112,1401436159,RU +1401436160,1401438207,BH +1401438208,1401440255,GB +1401440256,1401443487,DE +1401443488,1401443519,GI +1401443520,1401444351,DE +1401444352,1401446399,DK +1401446400,1401448447,DE +1401448448,1401450495,IT +1401450496,1401452543,RU +1401452544,1401454591,GB +1401454592,1401456639,DE +1401456640,1401458687,LV +1401458688,1401460735,IT +1401460736,1401462783,PL +1401462784,1401464831,FR +1401464832,1401466879,IE +1401466880,1401468927,RS +1401468928,1401470975,ES +1401470976,1401473023,NL +1401473024,1401475071,CZ +1401475072,1401477119,FR +1401477120,1401479167,BE +1401479168,1401481215,PL +1401481216,1401485311,RU +1401485312,1401486095,IT +1401486096,1401486111,CH +1401486112,1401487359,IT +1401487360,1401489407,GB +1401489408,1401491455,SE +1401491456,1401493503,NL +1401493504,1401495551,CH +1401495552,1401497599,DK +1401497600,1401499647,AT +1401499648,1401501695,RU +1401501696,1401503743,IT +1401503744,1401505791,DE +1401505792,1401509887,CH +1401509888,1401511935,UA +1401511936,1401513983,DE +1401513984,1401516031,IT +1401516032,1401518079,AT +1401518080,1401520127,IT +1401520128,1401522175,GB +1401522176,1401526271,NL +1401526272,1401528319,DE +1401528320,1401530367,IT +1401530368,1401532415,DE +1401532416,1401534463,GB +1401534464,1401536511,DE +1401536512,1401538559,NL +1401538560,1401540607,NO +1401540608,1401542655,GB +1401542656,1401544703,RU +1401544704,1401546751,GB +1401546752,1401548799,IT +1401548800,1401550847,FR +1401550848,1401552895,GB +1401552896,1401554943,NL +1401554944,1401556991,IE +1401556992,1401563135,GB +1401563136,1401565183,ES +1401565184,1401567231,RU +1401567232,1401569279,GB +1401569280,1401585663,DE +1401585664,1401599167,GB +1401599168,1401599231,IE +1401599232,1401602047,GB +1401602048,1401618431,ES +1401618432,1401634815,AM +1401634816,1401651199,HR +1401651200,1401667583,RU +1401667584,1401683967,IT +1401683968,1401684479,SE +1401684480,1401684511,DK +1401684512,1401684543,SE +1401684544,1401684607,DK +1401684608,1401684731,SE +1401684732,1401684735,DK +1401684736,1401684755,NO +1401684756,1401684799,SE +1401684800,1401684863,NO +1401684864,1401686015,SE +1401686016,1401686055,GB +1401686056,1401686079,SE +1401686080,1401686143,GB +1401686144,1401686267,SE +1401686268,1401686271,GB +1401686272,1401686287,NL +1401686288,1401686335,SE +1401686336,1401686399,NL +1401686400,1401686527,SE +1401686528,1401686543,GB +1401686544,1401686591,SE +1401686592,1401686655,US +1401686656,1401686911,SE +1401686912,1401686927,DE +1401686928,1401691519,SE +1401691520,1401691535,DE +1401691536,1401697815,SE +1401697816,1401697823,DE +1401697824,1401714047,SE +1401714048,1401714063,FR +1401714064,1401717759,SE +1401717760,1401718015,NL +1401718016,1401719935,SE +1401719936,1401719951,DK +1401719952,1401728335,SE +1401728336,1401728351,NL +1401728352,1401728431,SE +1401728432,1401728447,NL +1401728448,1401742847,SE +1401742848,1401742879,GB +1401742880,1401743103,SE +1401743104,1401743119,GB +1401743120,1401745919,SE +1401745920,1401745935,DE +1401745936,1401746175,SE +1401746176,1401746191,DK +1401746192,1401746215,SE +1401746216,1401746223,GB +1401746224,1401746431,SE +1401746432,1401746447,NL +1401746448,1401746471,SE +1401746472,1401746479,GB +1401746480,1401746687,SE +1401746688,1401746703,NO +1401746704,1401746943,SE +1401746944,1401746959,FR +1401746960,1401747199,SE +1401747200,1401747215,IT +1401747216,1401749135,SE +1401749136,1401749151,DE +1401749152,1401749503,SE +1401749504,1401753087,DE +1401753088,1401753343,AT +1401753344,1401759231,DE +1401759232,1401759487,GB +1401759488,1401760255,DE +1401760256,1401760767,SK +1401760768,1401765887,DE +1401765888,1401779679,IE +1401779680,1401779683,GB +1401779684,1401782271,IE +1401782272,1401815039,FR +1401815040,1401817087,SE +1401817088,1401819135,RU +1401819136,1401821183,BG +1401821184,1401825279,GB +1401825280,1401827327,PL +1401827328,1401829375,GB +1401829376,1401831423,PL +1401831424,1401833471,GB +1401833472,1401835519,FI +1401835520,1401837567,DE +1401837568,1401839615,CH +1401839616,1401841663,NO +1401843712,1401847807,PL +1401847808,1401849855,DE +1401849856,1401851903,PL +1401851904,1401853951,FR +1401853952,1401855999,PL +1401856000,1401858047,RU +1401858048,1401868287,PL +1401868288,1401870335,UA +1401870336,1401872383,PL +1401872384,1401874431,GB +1401874432,1401876479,UA +1401876480,1401878527,ES +1401878528,1401880575,MT +1401880576,1401882623,DE +1401882624,1401884671,NG +1401884672,1401886719,FR +1401886720,1401888767,BW +1401890816,1401892863,PL +1401892864,1401894911,RU +1401894912,1401896959,FI +1401896960,1401899007,RU +1401899008,1401901055,PL +1401901056,1401903103,NO +1401903104,1401905151,FI +1401905152,1401907199,PL +1401907200,1401909247,GR +1401909248,1401911295,NO +1401911296,1401913343,DK +1401913344,1401917439,PL +1401917440,1401919487,BG +1401919488,1401921535,RU +1401921536,1401923583,PL +1401923584,1401925631,BE +1401925632,1401927679,BG +1401927680,1401929727,NL +1401929728,1401931775,RU +1401933824,1401935871,PL +1401935872,1401937919,FI +1401937920,1401939967,GB +1401939968,1401942015,UA +1401944064,1401946111,BG +1401946112,1401962495,FR +1401962496,1401978879,PL +1401978880,1401995263,PT +1401995264,1402011647,CH +1402011648,1402025951,SE +1402025952,1402025983,DK +1402025984,1402028031,SE +1402028032,1402044415,FR +1402044416,1402060799,PL +1402060800,1402077183,FI +1402077184,1402093567,GB +1402093568,1402109951,RU +1402109952,1402142719,FI +1402142720,1402159103,ES +1402159104,1402175487,IT +1402175488,1402191871,IE +1402191872,1402208255,IR +1402208256,1402224639,CZ +1402224640,1402241023,BG +1402241024,1402257407,GB +1402257408,1402273791,FI +1402273792,1402277119,RU +1402277120,1402277375,MD +1402277376,1402277631,KG +1402277632,1402277887,TJ +1402277888,1402290175,RU +1402290176,1402306559,NL +1402306560,1402322943,IT +1402322944,1402339327,RU +1402339328,1402355711,CH +1402355712,1402372095,FI +1402372096,1402388479,SE +1402388480,1402404863,ES +1402404864,1402408959,RU +1402408960,1402413055,DE +1402413056,1402417151,PL +1402417152,1402421247,DE +1402421248,1402422783,FR +1402422784,1402423039,LU +1402423040,1402423295,FR +1402423296,1402423807,BE +1402423808,1402424319,FR +1402424320,1402424575,BE +1402424576,1402424831,FR +1402424832,1402425343,GB +1402425344,1402425599,DE +1402425600,1402425855,LU +1402425856,1402426367,FR +1402426368,1402426623,DE +1402426624,1402427135,CH +1402427136,1402429439,GB +1402429440,1402431487,US +1402431488,1402433535,GB +1402433536,1402434047,FR +1402434048,1402434559,GB +1402434560,1402434815,US +1402434816,1402437631,GB +1402437632,1402454015,DK +1402454016,1402470399,GB +1402470400,1402994687,FR +1402994688,1403256831,NL +1403256832,1403322367,AT +1403322368,1403387903,ES +1403387904,1403396095,SE +1403396096,1403400191,EE +1403400192,1403400207,TR +1403400208,1403400215,EE +1403400216,1403400219,US +1403400220,1403400239,EE +1403400240,1403400255,BG +1403400256,1403400263,EE +1403400264,1403400271,US +1403400272,1403404287,EE +1403404288,1403412479,GB +1403412480,1403420671,RU +1403420672,1403428863,NL +1403428864,1403437055,GB +1403437056,1403445247,RO +1403445248,1403461631,RU +1403461632,1403464663,FR +1403464664,1403464671,BE +1403464672,1403469423,FR +1403469424,1403469431,US +1403469432,1403469823,FR +1403469824,1403486207,RU +1403486208,1403494399,FR +1403494400,1403502591,GB +1403502592,1403510783,NL +1403510784,1403518975,CZ +1403518976,1403535359,CY +1403535360,1403551743,PL +1403551744,1403568127,SK +1403568128,1403584511,SE +1403584512,1403600895,DE +1403600896,1403617279,FR +1403617280,1403633663,DE +1403633664,1403650047,RU +1403650048,1403655935,DE +1403655936,1403655943,IR +1403655944,1403656703,DE +1403656704,1403656959,IR +1403656960,1403658495,DE +1403658496,1403658527,IR +1403658528,1403658559,KW +1403658560,1403658847,DE +1403658848,1403658879,IR +1403658880,1403658911,DE +1403658912,1403658975,IR +1403658976,1403660735,DE +1403660736,1403660799,IR +1403660800,1403661183,DE +1403661184,1403661215,IR +1403661216,1403661279,AE +1403661280,1403661310,IR +1403661311,1403661631,DE +1403661632,1403661663,IR +1403661664,1403661727,DE +1403661728,1403661759,IR +1403661760,1403661887,DE +1403661888,1403661919,IR +1403661920,1403661951,DE +1403661952,1403661983,IR +1403661984,1403662015,DE +1403662016,1403662047,IR +1403662048,1403662111,DE +1403662112,1403662143,IR +1403662144,1403662175,DE +1403662176,1403662207,AE +1403662208,1403662271,DE +1403662272,1403662303,AE +1403662304,1403662495,DE +1403662496,1403662527,IR +1403662528,1403662655,DE +1403662656,1403662687,IR +1403662688,1403662815,DE +1403662816,1403662911,IR +1403662912,1403662943,DE +1403662944,1403662975,AE +1403662976,1403663039,IR +1403663040,1403663135,DE +1403663136,1403663199,AE +1403663200,1403663359,DE +1403663360,1403663487,IR +1403663488,1403663511,DE +1403663512,1403663519,IR +1403663520,1403663527,DE +1403663528,1403663535,IQ +1403663536,1403663567,DE +1403663568,1403663575,AE +1403663576,1403663589,DE +1403663590,1403663590,IR +1403663591,1403664895,DE +1403664896,1403664927,TZ +1403664928,1403666431,DE +1403666432,1403672575,GB +1403672576,1403672831,US +1403672832,1403699199,GB +1403699200,1403715583,UA +1403715584,1403731967,LT +1403731968,1403748351,RU +1403748352,1403764735,DE +1403764736,1403781119,GR +1403781120,1403797503,RU +1403797504,1403813887,SE +1403813888,1403830271,NL +1403830272,1403846655,CH +1403846656,1403863039,IS +1403863040,1403879423,FR +1403879424,1403895807,ES +1403895808,1403912191,CH +1403912192,1403928575,PT +1403928576,1403944959,SE +1403944960,1403961343,GR +1403961344,1403977727,RU +1403977728,1403994111,IT +1403994112,1404010495,AT +1404010496,1404026879,PL +1404026880,1404043263,ES +1404043264,1404051455,SE +1404051456,1404059647,CH +1404059648,1404076031,SE +1404076032,1404084223,DE +1404084224,1404088319,BE +1404088320,1404137471,SE +1404137472,1404139519,HU +1404139520,1404184063,SE +1404184064,1404184575,NO +1404184576,1404186623,SE +1404186624,1404187647,NO +1404187648,1404189183,SE +1404189184,1404189695,EE +1404189696,1404190719,RU +1404190720,1404198911,SE +1404198912,1404199935,DK +1404199936,1404200959,RU +1404200960,1404203007,NL +1404203008,1404207103,SE +1404207104,1404208127,RU +1404208128,1404209151,SE +1404209152,1404210175,RU +1404210176,1404221439,SE +1404221440,1404222463,RU +1404222464,1404223487,SE +1404223488,1404227071,RU +1404227072,1404232191,SE +1404232192,1404232703,RU +1404232704,1404234239,SE +1404234240,1404234751,HR +1404234752,1404305407,SE +1404305408,1404321791,NL +1404321792,1404334079,CH +1404334080,1404362751,SE +1404362752,1404370943,CH +1404370944,1404379135,SE +1404379136,1404383231,AT +1404383232,1404387327,SE +1404387328,1404395519,DE +1404395520,1404403711,CH +1404403712,1404411903,NL +1404411904,1404436479,SE +1404436480,1404502015,BE +1404502016,1404698623,SE +1404698624,1404764159,BE +1404764160,1404802047,SE +1404802048,1404802559,EE +1404802560,1404805119,SE +1404805120,1404813311,AT +1404813312,1404829695,SE +1404829696,1404870655,RU +1404870656,1404875775,SE +1404875776,1404876799,LT +1404876800,1404895231,SE +1404895232,1404927999,DE +1404928000,1404940287,CH +1404940288,1404952575,SE +1404952576,1404960767,NL +1404960768,1405050879,SE +1405050880,1405059071,AT +1405059072,1405063167,SE +1405063168,1405065215,NO +1405065216,1405067263,SE +1405067264,1405075455,DE +1405075456,1405083647,FR +1405083648,1405091839,SE +1405091840,1406140415,FR +1406140416,1406205951,CZ +1406205952,1406271487,SE +1406271488,1406337023,IE +1406337024,1406402559,IT +1406402560,1406468095,GR +1406468096,1406533631,ES +1406533632,1406599167,FR +1406599168,1406664703,AT +1406664704,1406672895,FI +1406672896,1406681087,HU +1406681088,1406689279,GB +1406689280,1406697471,SE +1406697472,1406705663,GB +1406705664,1406713855,IT +1406713856,1406717695,AT +1406717696,1406717951,DE +1406717952,1406722047,AT +1406722048,1406730239,DE +1406730240,1406746623,RU +1406746624,1406753023,BE +1406753024,1406753279,GB +1406753280,1406754815,BE +1406754816,1406763007,GB +1406763008,1406771199,BE +1406771200,1406779391,GB +1406779392,1406787583,RU +1406787584,1406795775,AM +1406795776,1406803967,GB +1406803968,1406812159,DE +1406812160,1406820351,SE +1406820352,1406836735,GB +1406836736,1406844927,AT +1406844928,1406853119,MD +1406853120,1406861311,UA +1406861312,1406869503,RU +1406869504,1406877695,GB +1406877696,1406885887,NL +1406885888,1406894079,CH +1406894080,1406902271,RU +1406902272,1406910463,AT +1406910464,1406918655,SE +1406918656,1406926335,RU +1406926336,1406926847,DE +1406926848,1406935039,IT +1406935040,1406951423,RU +1406951424,1406959615,PL +1406959616,1406964287,DE +1406964288,1406964319,CH +1406964320,1406964735,DE +1406964736,1406964927,US +1406964928,1406964991,DE +1406964992,1406965007,US +1406965008,1406966783,DE +1406966784,1406966787,GB +1406966788,1406967295,DE +1406967296,1406967327,GB +1406967328,1406967343,NL +1406967344,1406967347,US +1406967348,1406967807,DE +1406967808,1406975999,RU +1406976000,1406984191,IE +1406984192,1407000575,RU +1407000576,1407016959,DE +1407016960,1407025151,IT +1407025152,1407025663,DK +1407025664,1407025919,US +1407025920,1407033343,DK +1407033344,1407033599,RU +1407033600,1407033855,UZ +1407033856,1407034111,RU +1407034112,1407034367,UZ +1407034368,1407035391,RU +1407035392,1407041535,UZ +1407041536,1407049727,RU +1407049728,1407057919,DE +1407057920,1407066111,RU +1407066112,1407074303,LU +1407074304,1407090687,RU +1407090688,1407098879,CH +1407098880,1407107071,BG +1407107072,1407115263,RU +1407115264,1407123455,GB +1407123456,1407131647,SE +1407131648,1407139839,NL +1407139840,1407148031,DE +1407148032,1407156223,GB +1407156224,1407164415,LV +1407164416,1407172607,PT +1407172608,1407180799,GB +1407180800,1407188991,RU +1407188992,1407320063,IT +1407320064,1407451135,SE +1407451136,1407483903,BG +1407483904,1407516671,CH +1407516672,1407516679,GB +1407516680,1407516687,NG +1407516688,1407516711,GB +1407516712,1407516735,NG +1407516736,1407516743,UG +1407516744,1407516751,LR +1407516752,1407516759,GH +1407516760,1407516767,GB +1407516768,1407516775,AO +1407516776,1407516783,GB +1407516784,1407516791,NG +1407516792,1407516799,GB +1407516800,1407516807,GH +1407516808,1407516831,GB +1407516832,1407516855,NG +1407516856,1407516863,GB +1407516864,1407516871,NG +1407516872,1407516879,GB +1407516880,1407516903,NG +1407516904,1407516911,GB +1407516912,1407516927,NG +1407516928,1407517183,ZW +1407517184,1407517383,GB +1407517384,1407517391,CD +1407517392,1407517415,GB +1407517416,1407517439,NG +1407517440,1407517823,GB +1407517824,1407517887,NG +1407517888,1407517951,GB +1407517952,1407518015,SL +1407518016,1407518031,ZA +1407518032,1407518039,GB +1407518040,1407518047,CD +1407518048,1407518055,NG +1407518056,1407518079,GB +1407518080,1407518111,FR +1407518112,1407518135,NG +1407518136,1407518143,GH +1407518144,1407518159,ZA +1407518160,1407518167,GB +1407518168,1407518175,CD +1407518176,1407518183,GH +1407518184,1407518199,NG +1407518200,1407518207,AE +1407518208,1407518215,GB +1407518216,1407518223,ZA +1407518224,1407518231,GB +1407518232,1407518247,NG +1407518248,1407518255,GB +1407518256,1407518269,GH +1407518270,1407518335,GB +1407518336,1407518343,CG +1407518344,1407518351,GB +1407518352,1407518359,GH +1407518360,1407518391,NG +1407518392,1407518719,GB +1407518720,1407518783,AO +1407518784,1407518847,GB +1407518848,1407518943,NG +1407518944,1407518975,GB +1407518976,1407519000,NG +1407519001,1407519007,GB +1407519008,1407519015,NG +1407519016,1407519023,AO +1407519024,1407519031,NG +1407519032,1407519039,AO +1407519040,1407519063,NG +1407519064,1407519071,BJ +1407519072,1407519079,CD +1407519080,1407519095,NG +1407519096,1407519103,CM +1407519104,1407519111,NG +1407519112,1407519135,SL +1407519136,1407519143,NG +1407519144,1407519151,AO +1407519152,1407519159,GB +1407519160,1407519167,AO +1407519168,1407519175,NG +1407519176,1407519183,SL +1407519184,1407519191,GB +1407519192,1407519199,CD +1407519200,1407519207,AO +1407519208,1407519215,TG +1407519216,1407519223,NG +1407519224,1407519231,GB +1407519232,1407519615,NG +1407519616,1407520263,GB +1407520264,1407520271,NG +1407520272,1407520287,GB +1407520288,1407520295,GH +1407520296,1407520319,NG +1407520320,1407520327,GB +1407520328,1407520335,SL +1407520336,1407520343,GB +1407520344,1407520359,NG +1407520360,1407520367,CD +1407520368,1407520375,GB +1407520376,1407520397,NG +1407520398,1407520439,GB +1407520440,1407520447,CD +1407520448,1407520463,CG +1407520464,1407520511,GB +1407520512,1407520519,ZW +1407520520,1407520527,GB +1407520528,1407520543,NG +1407520544,1407520551,GB +1407520552,1407520559,NG +1407520560,1407520567,SL +1407520568,1407520575,NG +1407520576,1407520599,GB +1407520600,1407520607,FR +1407520608,1407520615,AO +1407520616,1407520623,GB +1407520624,1407520631,NG +1407520632,1407520639,ZM +1407520640,1407520655,NG +1407520656,1407520663,GA +1407520664,1407520671,NG +1407520672,1407520679,CM +1407520680,1407520695,NG +1407520696,1407520703,GN +1407520704,1407520727,NG +1407520728,1407520735,AO +1407520736,1407520751,NG +1407520752,1407520759,CM +1407520760,1407520767,CD +1407520768,1407521279,NG +1407521280,1407522047,GB +1407522048,1407522303,TZ +1407522304,1407522815,NG +1407522816,1407523071,ZW +1407523072,1407523327,TZ +1407523328,1407523343,MW +1407523344,1407523351,NG +1407523352,1407523359,TZ +1407523360,1407523367,ZW +1407523368,1407523375,NG +1407523376,1407523391,GB +1407523392,1407523455,ZW +1407523456,1407523519,MW +1407523520,1407523535,GB +1407523536,1407523551,NG +1407523552,1407523559,CM +1407523560,1407523575,KE +1407523576,1407523583,MW +1407523584,1407523839,SO +1407523840,1407524351,MW +1407524352,1407524863,GB +1407524864,1407527935,MZ +1407527936,1407529023,GB +1407529024,1407529087,NG +1407529088,1407529095,TZ +1407529096,1407529103,ZW +1407529104,1407529111,NG +1407529112,1407529119,MW +1407529120,1407529127,GB +1407529128,1407529135,ZW +1407529136,1407529143,MW +1407529144,1407529151,ZW +1407529152,1407529183,GB +1407529184,1407529191,NG +1407529192,1407529199,MZ +1407529200,1407529207,GB +1407529208,1407529215,NG +1407529216,1407531007,GB +1407531008,1407531775,NG +1407531776,1407532031,GB +1407532032,1407532543,KE +1407532544,1407532551,UG +1407532552,1407532559,AO +1407532560,1407532583,GB +1407532584,1407532591,ZW +1407532592,1407532607,GB +1407532608,1407532615,ZW +1407532616,1407532623,KG +1407532624,1407532631,GB +1407532632,1407532639,MW +1407532640,1407532647,TZ +1407532648,1407532663,GB +1407532664,1407532671,TZ +1407532672,1407532799,ZW +1407532800,1407532927,SO +1407532928,1407533055,GB +1407533056,1407533311,NG +1407533312,1407533327,AO +1407533328,1407533343,GB +1407533344,1407533375,NG +1407533376,1407533407,CD +1407533408,1407533423,GB +1407533424,1407533567,GH +1407533568,1407533599,NG +1407533600,1407533607,GB +1407533608,1407533631,NG +1407533632,1407533663,IQ +1407533664,1407533679,GB +1407533680,1407533695,NG +1407533696,1407533711,CD +1407533712,1407533719,ZW +1407533720,1407533727,SL +1407533728,1407533735,NG +1407533736,1407533743,GN +1407533744,1407533783,NG +1407533784,1407533815,GB +1407533816,1407533823,NG +1407533824,1407534079,GB +1407534080,1407534335,AE +1407534336,1407534343,NG +1407534344,1407534359,GB +1407534360,1407534367,LR +1407534368,1407534383,NG +1407534384,1407534391,CD +1407534392,1407534399,AO +1407534400,1407534407,NG +1407534408,1407534415,CI +1407534416,1407534423,GB +1407534424,1407534431,CD +1407534432,1407534439,GB +1407534440,1407534447,CD +1407534448,1407534463,NG +1407534464,1407534543,GB +1407534544,1407534559,GH +1407534560,1407534567,NG +1407534568,1407534575,GB +1407534576,1407534583,CD +1407534584,1407534591,GB +1407534592,1407534727,NG +1407534728,1407534735,CI +1407534736,1407534775,NG +1407534776,1407534783,ML +1407534784,1407534791,CD +1407534792,1407534839,GB +1407534840,1407534847,NG +1407534848,1407535103,CM +1407535104,1407535615,GA +1407535616,1407536127,CD +1407536128,1407536639,GA +1407536640,1407536895,CD +1407536896,1407536903,GB +1407536904,1407536919,ZW +1407536920,1407536935,GB +1407536936,1407536943,NG +1407536944,1407536951,AO +1407536952,1407536967,GB +1407536968,1407536975,NG +1407536976,1407536983,GB +1407536984,1407536991,IQ +1407536992,1407536999,GB +1407537000,1407537007,GH +1407537008,1407537031,GB +1407537032,1407537039,NG +1407537040,1407537047,GB +1407537048,1407537055,NG +1407537056,1407537071,GH +1407537072,1407537087,NG +1407537088,1407537095,GH +1407537096,1407537103,GB +1407537104,1407537111,NG +1407537112,1407537119,LR +1407537120,1407537135,GB +1407537136,1407537151,NG +1407537152,1407538175,GB +1407538176,1407538431,AT +1407538432,1407538439,GB +1407538440,1407538447,NG +1407538448,1407538463,GB +1407538464,1407538471,ZM +1407538472,1407538479,NG +1407538480,1407538495,GB +1407538496,1407538503,NG +1407538504,1407538527,GB +1407538528,1407538543,CD +1407538544,1407538559,GB +1407538560,1407538623,CD +1407538624,1407538663,GB +1407538664,1407538815,NG +1407538816,1407538847,GB +1407538848,1407538863,NG +1407538864,1407538879,GE +1407538880,1407538887,GB +1407538888,1407538895,NG +1407538896,1407538911,GB +1407538912,1407538919,GH +1407538920,1407538927,GB +1407538928,1407538935,NG +1407538936,1407538943,GH +1407538944,1407538959,GB +1407538960,1407538967,NG +1407538968,1407538975,CM +1407538976,1407538983,NG +1407538984,1407538991,SL +1407538992,1407538999,GB +1407539000,1407539007,NG +1407539008,1407539015,GH +1407539016,1407539055,GB +1407539056,1407539063,NG +1407539064,1407539071,GB +1407539072,1407539079,NG +1407539080,1407539087,GB +1407539088,1407539095,AO +1407539096,1407539103,GB +1407539104,1407539111,NG +1407539112,1407539119,GB +1407539120,1407539127,LR +1407539128,1407539143,GB +1407539144,1407539151,NG +1407539152,1407539167,GB +1407539168,1407539175,TD +1407539176,1407539183,GH +1407539184,1407539199,NG +1407539200,1407539455,GE +1407539456,1407541247,NG +1407541248,1407541471,GB +1407541472,1407541495,NG +1407541496,1407541535,GB +1407541536,1407541543,CM +1407541544,1407541551,GB +1407541552,1407541559,NG +1407541560,1407541567,GH +1407541568,1407541703,GB +1407541704,1407541719,NG +1407541720,1407541727,GB +1407541728,1407541735,NG +1407541736,1407541751,GB +1407541752,1407541759,NG +1407541760,1407541887,GB +1407541888,1407542143,NG +1407542144,1407542527,GB +1407542528,1407542535,NG +1407542536,1407542543,GB +1407542544,1407542551,LR +1407542552,1407542575,GB +1407542576,1407542583,CD +1407542584,1407542591,GB +1407542592,1407542599,NG +1407542600,1407542607,TG +1407542608,1407542623,GB +1407542624,1407542631,BJ +1407542632,1407542639,NG +1407542640,1407542655,GB +1407542656,1407542663,SL +1407542664,1407542671,GB +1407542672,1407542679,CM +1407542680,1407542687,NG +1407542688,1407542695,CD +1407542696,1407542703,NG +1407542704,1407542711,CI +1407542712,1407542719,GB +1407542720,1407542735,NG +1407542736,1407542767,GB +1407542768,1407542775,GA +1407542776,1407542783,NG +1407542784,1407542791,GB +1407542792,1407542799,NG +1407542800,1407542831,GB +1407542832,1407542863,NG +1407542864,1407542879,GB +1407542880,1407542887,NG +1407542888,1407542903,GB +1407542904,1407542911,CD +1407542912,1407543039,AT +1407543040,1407543167,GB +1407543168,1407543183,GH +1407543184,1407543239,NG +1407543240,1407543255,GB +1407543256,1407543263,NG +1407543264,1407543271,CD +1407543272,1407543279,GB +1407543280,1407543287,NG +1407543288,1407545343,GB +1407545344,1407546367,SL +1407546368,1407546495,AE +1407546496,1407546879,GB +1407546880,1407547135,NG +1407547136,1407547143,GB +1407547144,1407547151,GH +1407547152,1407547167,GB +1407547168,1407547175,NG +1407547176,1407547183,GH +1407547184,1407547199,NG +1407547200,1407547207,AO +1407547208,1407547215,TD +1407547216,1407547223,SL +1407547224,1407547231,GB +1407547232,1407547255,SL +1407547256,1407547263,GB +1407547264,1407547271,SL +1407547272,1407547295,NG +1407547296,1407547303,GB +1407547304,1407547311,SL +1407547312,1407547327,NG +1407547328,1407547335,GB +1407547336,1407547343,CI +1407547344,1407547911,NG +1407547912,1407547919,GB +1407547920,1407547927,CG +1407547928,1407547943,GB +1407547944,1407547951,BJ +1407547952,1407547959,LR +1407547960,1407547967,NG +1407547968,1407547983,GB +1407547984,1407547999,BJ +1407548000,1407548007,NG +1407548008,1407548023,GB +1407548024,1407548031,CD +1407548032,1407548047,GB +1407548048,1407548055,GA +1407548056,1407548063,NG +1407548064,1407548111,GB +1407548112,1407548119,CI +1407548120,1407548127,GB +1407548128,1407548143,CM +1407548144,1407548151,GB +1407548152,1407548159,NG +1407548160,1407548415,GB +1407548416,1407548543,GE +1407548544,1407549183,GB +1407549184,1407549439,GE +1407549440,1407582207,RU +1407582208,1407614975,PL +1407614976,1407680511,ES +1407680512,1407681535,GB +1407681536,1407681639,FR +1407681640,1407681983,GB +1407681984,1407681999,ES +1407682000,1407682879,GB +1407682880,1407682911,FI +1407682912,1407695215,GB +1407695216,1407695223,ES +1407695224,1407700271,GB +1407700272,1407700287,DE +1407700288,1407702015,GB +1407702016,1407702271,FR +1407702272,1407702783,GB +1407702784,1407702911,FR +1407702912,1407703039,GB +1407703040,1407703407,FR +1407703408,1407703415,GB +1407703416,1407703455,FR +1407703456,1407703535,GB +1407703536,1407703695,FR +1407703696,1407703711,GB +1407703712,1407703839,FR +1407703840,1407704063,GB +1407704064,1407704127,FR +1407704128,1407704191,GB +1407704192,1407704319,FR +1407704320,1407705207,GB +1407705208,1407705215,ES +1407705216,1407705247,GB +1407705248,1407705295,ES +1407705296,1407705599,GB +1407705600,1407705727,FR +1407705728,1407706367,GB +1407706368,1407706383,FR +1407706384,1407709183,GB +1407709184,1407709439,DE +1407709440,1407713279,GB +1407713280,1407778815,NL +1407778816,1407842303,SE +1407842304,1407842367,NO +1407842368,1407844351,SE +1407844352,1407909887,RU +1407909888,1407975423,GR +1407975424,1408040959,DE +1408040960,1408106495,RU +1408106496,1408172031,PL +1408172032,1408237567,RU +1408237568,1408270335,CZ +1408270336,1408303103,PT +1408303104,1408335871,LV +1408335872,1408336879,SE +1408336880,1408336887,FI +1408336888,1408340047,SE +1408340048,1408340055,NO +1408340056,1408360935,SE +1408360936,1408360943,DK +1408360944,1408360951,SE +1408360952,1408360959,DK +1408360960,1408368639,SE +1408368640,1408376831,NO +1408376832,1408385023,DE +1408385024,1408393215,PL +1408393216,1408401407,NL +1408401408,1408434175,RU +1408434176,1408436223,DE +1408436224,1408438271,LU +1408438272,1408440319,FR +1408440320,1408442367,SE +1408442368,1408444415,PL +1408444416,1408450559,DE +1408450560,1408454655,RU +1408454656,1408456703,DE +1408456704,1408458751,LV +1408458752,1408460799,GB +1408460800,1408462847,PL +1408462848,1408464895,DE +1408464896,1408466943,RO +1408466944,1408499711,NO +1408499712,1408532479,PS +1408532480,1408567919,GB +1408567920,1408567927,IE +1408567928,1408574847,GB +1408574848,1408574911,IE +1408574912,1408575231,GB +1408575232,1408575239,IE +1408575240,1408583167,GB +1408583168,1408583679,IE +1408583680,1408584191,GB +1408584192,1408584703,IE +1408584704,1408585407,GB +1408585408,1408585471,IE +1408585472,1408590847,GB +1408590848,1408591103,BE +1408591104,1408598015,GB +1408598016,1408630783,FI +1408630784,1408634879,RO +1408634880,1408663551,DE +1408663552,1408696319,RU +1408696320,1408729087,NL +1408729088,1408761855,ES +1408761856,1409286143,SE +1409286144,1409362431,HU +1409362432,1409363967,BG +1409363968,1409413119,HU +1409413120,1409415167,BG +1409415168,1409430271,HU +1409430272,1409430783,RO +1409430784,1409548287,HU +1409548288,1409810431,FR +1409810432,1409941503,GB +1409941504,1410007039,PL +1410007040,1410007551,DE +1410007552,1410007807,IR +1410007808,1410008575,DE +1410008576,1410008607,AE +1410008608,1410008831,DE +1410008832,1410008911,US +1410008912,1410009343,DE +1410009344,1410009479,US +1410009480,1410009487,DE +1410009488,1410009535,GI +1410009536,1410010367,DE +1410010368,1410010399,IR +1410010400,1410010431,LY +1410010432,1410010543,DE +1410010544,1410010575,LY +1410010576,1410010591,DE +1410010592,1410010599,LY +1410010600,1410010607,IR +1410010608,1410010623,LY +1410010624,1410010687,DE +1410010688,1410010703,IR +1410010704,1410010719,DE +1410010720,1410010751,LY +1410010752,1410010823,DE +1410010824,1410010831,IR +1410010832,1410010879,DE +1410010880,1410011135,IR +1410011136,1410011903,DE +1410011904,1410011919,US +1410011920,1410012159,DE +1410012160,1410012415,IQ +1410012416,1410013183,DE +1410013184,1410013439,ES +1410013440,1410013471,IR +1410013472,1410013535,AE +1410013536,1410013567,IR +1410013568,1410013631,AE +1410013632,1410013663,IR +1410013664,1410013695,AE +1410013696,1410013727,KW +1410013728,1410013759,AE +1410013760,1410013823,IR +1410013824,1410013887,AF +1410013888,1410013951,DE +1410013952,1410013983,AE +1410013984,1410014015,IR +1410014016,1410014047,KW +1410014048,1410014079,AE +1410014080,1410014207,DE +1410014208,1410014239,AE +1410014240,1410014335,IR +1410014336,1410014399,AE +1410014400,1410014463,ES +1410014464,1410014495,KW +1410014496,1410014591,IR +1410014592,1410014885,DE +1410014886,1410014886,ES +1410014887,1410014895,DE +1410014896,1410014927,IR +1410014928,1410014935,PA +1410014936,1410014943,IR +1410014944,1410014951,AE +1410014952,1410014966,DE +1410014967,1410014967,IR +1410014968,1410014968,DE +1410014969,1410014969,IR +1410014970,1410014972,DE +1410014973,1410014974,AE +1410014975,1410015007,DE +1410015008,1410015103,IR +1410015104,1410015135,ES +1410015136,1410015423,IR +1410015424,1410015487,AE +1410015488,1410015743,AF +1410015744,1410015871,IR +1410015872,1410015935,AE +1410015936,1410016255,IR +1410016256,1410016319,AE +1410016320,1410016383,ES +1410016384,1410016415,IR +1410016416,1410016447,PA +1410016448,1410016543,IR +1410016544,1410016575,DE +1410016576,1410016607,AE +1410016608,1410016639,PA +1410016640,1410016671,IR +1410016672,1410016703,PA +1410016704,1410016767,DE +1410016768,1410016831,IR +1410016832,1410016863,AE +1410016864,1410016895,IR +1410016896,1410017023,AE +1410017024,1410017055,PA +1410017056,1410017119,IR +1410017120,1410017279,DE +1410017280,1410017407,IR +1410017408,1410017791,DE +1410017792,1410018079,IR +1410018080,1410018303,DE +1410018304,1410018559,AE +1410018560,1410018591,DE +1410018592,1410018607,IR +1410018608,1410018623,LY +1410018624,1410020103,DE +1410020104,1410020111,US +1410020112,1410020351,DE +1410020352,1410020863,US +1410020864,1410021375,DE +1410021376,1410021407,IR +1410021408,1410021631,DE +1410021632,1410021663,IR +1410021664,1410021791,DE +1410021792,1410021823,IR +1410021824,1410022527,DE +1410022528,1410022591,AE +1410022592,1410022655,IR +1410022656,1410022911,DE +1410022912,1410023423,IR +1410023424,1410024191,DE +1410024192,1410024223,AE +1410024224,1410024287,DE +1410024288,1410024319,IR +1410024320,1410024447,DE +1410024448,1410025087,IR +1410025088,1410025215,DE +1410025216,1410025247,ES +1410025248,1410025279,DE +1410025280,1410025311,AE +1410025312,1410025343,ES +1410025344,1410025407,IR +1410025408,1410025439,AE +1410025440,1410025503,DE +1410025504,1410025519,AE +1410025520,1410025535,IR +1410025536,1410025567,ES +1410025568,1410025599,DE +1410025600,1410025727,IR +1410025728,1410025759,AE +1410025760,1410025791,DE +1410025792,1410025823,AE +1410025824,1410025855,IR +1410025856,1410025983,DE +1410025984,1410026015,IR +1410026016,1410026047,AE +1410026048,1410026111,ES +1410026112,1410026143,DE +1410026144,1410026175,IR +1410026176,1410026207,AE +1410026208,1410026239,IR +1410026240,1410026367,AE +1410026368,1410026431,IR +1410026432,1410026463,DE +1410026464,1410026751,IR +1410026752,1410026815,CA +1410026816,1410026847,DE +1410026848,1410026911,IR +1410026912,1410026943,DE +1410026944,1410027006,IR +1410027007,1410027007,DE +1410027008,1410027263,KW +1410027264,1410027519,AF +1410027520,1410027711,DE +1410027712,1410027775,IR +1410027776,1410032127,DE +1410032128,1410033151,IQ +1410033152,1410035199,DE +1410035200,1410035231,KW +1410035232,1410035263,DE +1410035264,1410035295,KW +1410035296,1410035367,IR +1410035368,1410035967,DE +1410035968,1410036063,PA +1410036064,1410036079,IQ +1410036080,1410036095,IR +1410036096,1410036111,IQ +1410036112,1410036127,PA +1410036128,1410036143,DE +1410036144,1410036175,PA +1410036176,1410036191,DE +1410036192,1410036223,PA +1410036224,1410036735,DE +1410036736,1410036751,PA +1410036752,1410039807,DE +1410039808,1410041855,AE +1410041856,1410043903,LB +1410043904,1410044415,JO +1410044416,1410072319,DE +1410072320,1410072575,AE +1410072576,1410203647,GB +1410203648,1410212863,FR +1410212864,1410213119,GB +1410213120,1410214495,FR +1410214496,1410214503,PT +1410214504,1410262799,FR +1410262800,1410262815,DE +1410262816,1410267039,FR +1410267040,1410267055,ES +1410267056,1410267071,GB +1410267072,1410267087,IT +1410267088,1410269183,FR +1410269184,1410318335,LT +1410318336,1410319359,LV +1410319360,1410334719,LT +1410334720,1410341887,ES +1410341888,1410342911,MA +1410342912,1410351103,SK +1410351104,1410353039,CH +1410353040,1410353047,NI +1410353048,1410354175,CH +1410354176,1410354431,FR +1410354432,1410359295,CH +1410359296,1410367487,CZ +1410367488,1410375679,RU +1410375680,1410383871,DK +1410383872,1410392063,NO +1410392064,1410392319,DE +1410392320,1410392575,SG +1410392576,1410397183,DE +1410397184,1410397439,PL +1410397440,1410399487,DE +1410399488,1410399743,TR +1410399744,1410400063,DE +1410400064,1410400127,TR +1410400128,1410400255,DE +1410400256,1410408447,RU +1410408448,1410416639,IT +1410416640,1410424831,TR +1410424832,1410433023,DE +1410433024,1410441215,BE +1410441216,1410449407,DE +1410449408,1410457599,SE +1410457600,1410465791,RU +1410465792,1410473983,ES +1410473984,1410490367,JO +1410490368,1410498559,RU +1410498560,1410502803,IT +1410502804,1410502807,US +1410502808,1410506751,IT +1410506752,1410514943,IE +1410514944,1410523135,GB +1410523136,1410531327,PT +1410531328,1410539519,DE +1410539520,1410542591,GB +1410542592,1410543103,IE +1410543104,1410547711,GB +1410547712,1410555903,CZ +1410555904,1410564095,GB +1410564096,1410572287,SE +1410572288,1410572543,DE +1410572544,1410572799,RU +1410572800,1410572863,DE +1410572864,1410572895,RU +1410572896,1410573407,DE +1410573408,1410573439,RU +1410573440,1410573695,DE +1410573696,1410573711,RU +1410573712,1410573759,DE +1410573760,1410573775,RU +1410573776,1410574719,DE +1410574720,1410574727,RU +1410574728,1410575111,DE +1410575112,1410575119,IT +1410575120,1410575295,DE +1410575296,1410575327,IT +1410575328,1410575359,SI +1410575360,1410575551,DE +1410575552,1410575615,IT +1410575616,1410575775,DE +1410575776,1410575791,RU +1410575792,1410575807,DE +1410575808,1410575823,RU +1410575824,1410575839,BG +1410575840,1410575855,IT +1410575856,1410575871,DE +1410575872,1410575999,IE +1410576000,1410576063,DE +1410576064,1410576127,IT +1410576128,1410576255,IE +1410576256,1410576383,IT +1410576384,1410588671,DE +1410588672,1410596863,GB +1410596864,1410597839,ES +1410597840,1410597855,FR +1410597856,1410605055,ES +1410605056,1410613247,CH +1410613248,1410621439,AL +1410621440,1410629631,NO +1410629632,1410637823,FI +1410637824,1410646015,AT +1410646016,1410654207,GB +1410654208,1410662399,SI +1410662400,1410670591,HU +1410670592,1410678783,DE +1410678784,1410686975,RU +1410686976,1410695167,CZ +1410695168,1410703359,GB +1410703360,1410711551,ES +1410711552,1410719743,BG +1410719744,1410727935,RU +1410727936,1410736127,BG +1410736128,1410744319,CS +1410744320,1410745223,FR +1410745224,1410745231,AE +1410745232,1410745247,FR +1410745248,1410745279,US +1410745280,1410752511,FR +1410752512,1410754559,AQ +1410754560,1410754815,DE +1410754816,1410755327,AQ +1410755328,1410755583,DE +1410755584,1410756095,AQ +1410756096,1410756607,US +1410756608,1410756863,NL +1410756864,1410757119,AQ +1410757120,1410758655,NL +1410758656,1410760191,AQ +1410760192,1410760447,BE +1410760448,1410760683,AQ +1410760684,1410760687,US +1410760688,1410760691,AQ +1410760692,1410760695,DE +1410760696,1410760699,AQ +1410760700,1410760703,US +1410760704,1410768895,RU +1410768896,1410777087,GB +1410777088,1410785279,RU +1410785280,1410793471,SA +1410793472,1410801663,GB +1410801664,1410809855,RU +1410809856,1410818047,DE +1410818048,1410826239,SA +1410826240,1410834431,SE +1410834432,1410842623,PL +1410842624,1410850815,PT +1410850816,1410859007,DE +1410859008,1411383295,NL +1411383296,1411448831,LT +1411448832,1411451391,IT +1411451392,1411451903,DE +1411451904,1411452159,IT +1411452160,1411452415,DE +1411452416,1411453439,IT +1411453440,1411453695,DE +1411453696,1411454975,IT +1411454976,1411455743,DE +1411455744,1411456255,IT +1411456256,1411456511,DE +1411456512,1411457279,IT +1411457280,1411457535,DE +1411457536,1411465215,IT +1411465216,1411465471,GB +1411465472,1411465727,US +1411465728,1411481855,IT +1411481856,1411483903,DE +1411483904,1411514367,IT +1411514368,1411579903,FI +1411579904,1411645439,NL +1411710976,1411776511,FR +1411776512,1411780607,GR +1411780608,1411784703,PL +1411784704,1411788799,GB +1411788800,1411792895,IT +1411792896,1411796991,DE +1411796992,1411805183,PL +1411805184,1411809279,AT +1411809280,1411813375,LV +1411813376,1411817471,NO +1411817472,1411821567,PL +1411821568,1411825663,CZ +1411825664,1411829759,DE +1411829760,1411833855,PL +1411833856,1411837951,NL +1411837952,1411842047,BG +1411842048,1411907583,PT +1411908400,1411908479,GB +1411908536,1411908559,GB +1411908560,1411908563,AU +1411911680,1411915775,US +1411915776,1411915839,GB +1411915904,1411915911,GB +1411915936,1411915967,GB +1411916032,1411916095,GB +1411916296,1411916303,GB +1411916800,1411916863,GB +1411917568,1411917639,GB +1411919872,1411923967,DE +1411940352,1411973119,PL +1411973120,1411999759,SI +1411999760,1411999767,BA +1411999768,1411999775,SI +1411999776,1411999799,BA +1411999800,1411999807,SI +1411999808,1411999823,BA +1411999824,1411999831,SI +1411999832,1411999855,BA +1411999856,1411999999,SI +1412000000,1412000767,BA +1412000768,1412001791,SI +1412001792,1412002303,RO +1412002304,1412002559,SI +1412002560,1412002815,MK +1412002816,1412003391,BA +1412003392,1412003399,HR +1412003400,1412003839,BA +1412003840,1412004351,BG +1412004352,1412005887,SI +1412005888,1412038655,NL +1412038656,1412071423,RU +1412071424,1412104191,CZ +1412104192,1412136959,GB +1412136960,1412169727,BG +1412169728,1412202495,TR +1412202496,1412235263,DE +1412235264,1412257535,GB +1412257536,1412257615,NL +1412257616,1412264023,GB +1412264024,1412264031,NL +1412264032,1412300799,GB +1412300800,1412333567,DE +1412333568,1412366335,LT +1412366336,1412399103,SK +1412399104,1412415487,RU +1412415488,1412415743,IR +1412415744,1412415999,AE +1412416000,1412431871,IR +1412431872,1412562943,NO +1412562944,1412628479,EE +1412628480,1412641791,TR +1412641792,1412642815,DE +1412642816,1412644863,TR +1412644864,1412661247,RU +1412661248,1412677631,GB +1412677632,1412685823,RU +1412685824,1412686271,IE +1412686272,1412686335,CA +1412686336,1412686847,GB +1412686848,1412689151,IE +1412689152,1412689407,GB +1412689408,1412690191,IE +1412690192,1412690199,GB +1412690200,1412694015,IE +1412694016,1412710399,EE +1412710400,1412726783,RU +1412726784,1412743167,SI +1412743168,1412775935,NO +1412775936,1412780239,NL +1412780240,1412780247,GB +1412780248,1412792319,NL +1412792320,1412798463,US +1412800512,1412804607,US +1412808704,1412825087,RU +1412825088,1412830463,IQ +1412830464,1412833279,LB +1412833280,1412833535,CI +1412833536,1412841471,LB +1412841472,1412857855,UZ +1412857856,1412874239,BG +1412874240,1412890623,RU +1412890624,1412907007,LT +1412907008,1412923391,SE +1412923392,1412939775,FR +1412939776,1412956159,CH +1412956160,1413480447,DE +1413480448,1414004735,GB +1414004736,1414266879,CH +1414266880,1414529023,ES +1414529024,1415053311,NL +1415053312,1415184383,ES +1415184384,1415315455,PT +1415315456,1415446527,GB +1415446528,1415577599,IL +1415577600,1416101887,FR +1416101888,1416364031,NL +1416364032,1416626175,IL +1416626176,1417150463,AT +1417150464,1417674751,ES +1417674752,1421869055,DE +1421869056,1422393343,BE +1422393344,1422399743,DE +1422399744,1422399999,IT +1422400000,1422462207,DE +1422462208,1422462463,TR +1422462464,1422491647,DE +1422491648,1422508031,GB +1422508032,1422512127,BG +1422512128,1422516223,PL +1422516224,1422520319,BY +1422520320,1422524415,RU +1422524416,1422589951,NO +1422589952,1422655487,IE +1422655488,1422721023,RU +1422721024,1422729215,PL +1422729216,1422737407,NO +1422745600,1422753791,EG +1422753792,1422761983,FR +1422761984,1422770175,PL +1422770176,1422786559,GR +1422786560,1422852095,HU +1422852096,1422853119,FR +1422853120,1422853631,DE +1422853632,1422853919,FR +1422853920,1422854143,DE +1422854144,1422854151,FR +1422854152,1422856319,DE +1422856320,1422856575,FR +1422856576,1422856703,DE +1422856704,1422857855,FR +1422857856,1422857919,DE +1422857920,1422858143,FR +1422858144,1422858239,DE +1422858240,1422858623,FR +1422858624,1422917631,DE +1422917632,1423441919,NO +1423441920,1423704063,SE +1423704064,1423966207,IT +1423966208,1424097279,HU +1424097280,1424228351,CH +1424228352,1424359423,IL +1424359424,1424490495,FI +1424490496,1424523263,ES +1424523264,1424556031,RO +1424588800,1424588839,DE +1424588840,1424588847,GB +1424588848,1424589311,DE +1424589312,1424589567,FR +1424589568,1424590719,GB +1424590720,1424590767,SE +1424590768,1424590783,GB +1424590784,1424590847,CH +1424590848,1424591423,SE +1424591424,1424591439,GB +1424591440,1424591551,SE +1424591552,1424591615,CZ +1424591616,1424591743,GB +1424591744,1424591871,MT +1424591872,1424592639,GB +1424592640,1424593407,FR +1424593408,1424593663,DE +1424593664,1424593727,SK +1424593728,1424593791,HU +1424593792,1424593919,DE +1424593920,1424593967,FR +1424593968,1424593983,GB +1424593984,1424594007,FR +1424594008,1424594015,GB +1424594016,1424594055,FR +1424594056,1424594063,IT +1424594064,1424594175,FR +1424594176,1424595455,GB +1424595456,1424595575,IT +1424595576,1424595583,ES +1424595584,1424595663,IT +1424595664,1424595671,GB +1424595672,1424595839,IT +1424595840,1424595871,GB +1424595872,1424596479,IT +1424596480,1424596991,FR +1424596992,1424597503,CZ +1424597504,1424597759,FR +1424597760,1424598015,IT +1424598016,1424599039,GB +1424599040,1424599231,DK +1424599232,1424599247,GB +1424599248,1424599279,DK +1424599280,1424599295,GB +1424599296,1424599551,DK +1424599552,1424599855,HU +1424599856,1424599871,GB +1424599872,1424599875,HU +1424599876,1424599879,GB +1424599880,1424599887,HU +1424599888,1424599903,GB +1424599904,1424599951,HU +1424599952,1424600063,GB +1424600064,1424600319,CH +1424600320,1424600575,GB +1424600576,1424600831,FR +1424600832,1424601087,BE +1424601088,1424601343,GB +1424601344,1424601599,ES +1424601600,1424601855,CH +1424601856,1424602111,GB +1424602112,1424602623,DE +1424602624,1424602879,GB +1424602880,1424602911,US +1424602912,1424602927,FR +1424602928,1424603007,US +1424603008,1424603023,GB +1424603024,1424603055,US +1424603056,1424603063,NL +1424603064,1424603087,US +1424603088,1424603135,GB +1424603136,1424603391,SK +1424603392,1424603647,DE +1424603648,1424603903,GB +1424603904,1424604159,ES +1424604160,1424604543,NL +1424604544,1424604671,GB +1424604672,1424604799,NL +1424604800,1424604927,GB +1424604928,1424605119,NL +1424605120,1424605151,GB +1424605152,1424605183,NL +1424605184,1424605439,GB +1424605440,1424605583,BG +1424605584,1424605631,GB +1424605632,1424605695,BG +1424605696,1424605951,NL +1424605952,1424605959,CH +1424605960,1424605967,GB +1424605968,1424606015,AT +1424606016,1424606199,GB +1424606200,1424606207,AT +1424606208,1424606455,GB +1424606456,1424606463,AT +1424606464,1424606711,GB +1424606712,1424606719,AT +1424606720,1424606967,GB +1424606968,1424606975,AT +1424606976,1424607103,GB +1424607104,1424607119,SK +1424607120,1424607167,GB +1424607168,1424607199,SK +1424607200,1424607215,GB +1424607216,1424607231,SK +1424607232,1424607487,GB +1424607488,1424607839,DE +1424607840,1424607855,GB +1424607856,1424607871,DE +1424607872,1424608031,GB +1424608032,1424608127,FR +1424608128,1424608279,GB +1424608280,1424608383,FR +1424608384,1424608399,ES +1424608400,1424608511,FR +1424608512,1424608703,ES +1424608704,1424608719,GB +1424608720,1424609023,ES +1424609024,1424609279,DE +1424609280,1424609395,CH +1424609396,1424609399,GB +1424609400,1424609791,CH +1424609792,1424610303,GB +1424610304,1424610559,TZ +1424610560,1424610815,PL +1424610816,1424611071,FR +1424611072,1424611143,BE +1424611144,1424611151,GB +1424611152,1424611167,BE +1424611168,1424611175,GB +1424611176,1424611327,BE +1424611328,1424611583,PL +1424611584,1424612095,GB +1424612096,1424612231,CZ +1424612232,1424612239,CH +1424612240,1424612319,CZ +1424612320,1424612607,GB +1424612608,1424612671,AE +1424612672,1424612863,GB +1424612864,1424613119,FR +1424613120,1424613375,GB +1424613376,1424613631,ES +1424613632,1424614103,IT +1424614104,1424614111,GB +1424614112,1424614135,IT +1424614136,1424614399,GB +1424614400,1424614415,FR +1424614416,1424614439,IT +1424614440,1424614447,GB +1424614448,1424614655,IT +1424614656,1424614911,FR +1424614912,1424615167,RO +1424615168,1424615935,GB +1424615936,1424616191,FR +1424616192,1424616447,IT +1424616448,1424616483,ES +1424616484,1424616487,GB +1424616488,1424616607,ES +1424616608,1424616615,PT +1424616616,1424616647,ES +1424616648,1424616655,GB +1424616656,1424616695,ES +1424616696,1424616703,GB +1424616704,1424616959,US +1424616960,1424617215,FR +1424617216,1424617375,IT +1424617376,1424617391,GB +1424617392,1424617395,IT +1424617396,1424617399,GB +1424617400,1424617407,IT +1424617408,1424617423,ES +1424617424,1424617431,GB +1424617432,1424617439,ES +1424617440,1424617471,IT +1424617472,1424617727,US +1424617728,1424618239,IT +1424618240,1424618495,NL +1424618496,1424618751,GB +1424618752,1424618895,FR +1424618896,1424618911,GB +1424618912,1424619007,FR +1424619008,1424619775,IT +1424619776,1424619811,BE +1424619812,1424619815,GB +1424619816,1424619823,BE +1424619824,1424619839,GB +1424619840,1424620031,BE +1424620032,1424621055,GB +1424621056,1424621567,IT +1424621568,1424625663,PL +1424625664,1424629759,GB +1424629760,1424633855,PL +1424637952,1424642047,FI +1424642048,1424646143,DK +1424646144,1424650239,RO +1424650240,1424654335,PL +1424654336,1424687103,NO +1424687104,1424719871,SA +1424719872,1424722431,IE +1424722432,1424723199,CZ +1424723200,1424724735,DE +1424724736,1424724991,IE +1424724992,1424727039,GB +1424727040,1424727295,IE +1424727296,1424727551,SL +1424727552,1424728063,PL +1424728064,1424728319,IE +1424728320,1424729855,FR +1424729856,1424730367,DE +1424730368,1424730623,ES +1424730624,1424730879,GB +1424730880,1424733183,IE +1424733184,1424733951,NL +1424733952,1424735103,SE +1424735104,1424736127,DE +1424736128,1424736383,AT +1424736384,1424736895,FR +1424736896,1424737151,DE +1424737152,1424737279,GB +1424737280,1424737407,DK +1424737408,1424737535,AT +1424737536,1424738815,DE +1424738816,1424739583,SE +1424739584,1424739839,GB +1424739840,1424740511,DE +1424740512,1424740551,GB +1424740552,1424741119,DE +1424741120,1424741375,IE +1424741376,1424742911,DE +1424742912,1424743167,IE +1424743168,1424743423,IT +1424743424,1424743935,DE +1424743936,1424744191,GB +1424744192,1424744703,DE +1424744704,1424744959,GB +1424744960,1424746495,DE +1424746496,1424749055,IE +1424749056,1424749311,SL +1424749312,1424750079,DE +1424750080,1424750335,FR +1424750336,1424750591,GB +1424750592,1424750847,FR +1424750848,1424751103,IE +1424751104,1424751359,DE +1424751360,1424751615,AT +1424751616,1424752127,IE +1424752128,1424752383,DE +1424752384,1424752639,NL +1424752640,1424785407,HU +1424785408,1424818175,ES +1424818176,1424850943,RU +1424850944,1424883711,LV +1424883712,1424916479,DK +1424916480,1424949247,BG +1424949248,1424982015,GB +1424982016,1425014783,FI +1425014784,1425031167,LT +1425031168,1425047551,FI +1425047552,1425063935,IT +1425063936,1425080319,KZ +1425080320,1425096703,IR +1425096704,1425113087,CH +1425113088,1425145855,NL +1425145856,1425162239,RU +1425162240,1425178623,CZ +1425178624,1425195007,BG +1425195008,1425211391,RU +1425211392,1425227775,SE +1425227776,1425244159,RO +1425244160,1425260543,NO +1425260544,1425276927,NL +1425276928,1425293311,DE +1425293312,1425309695,CZ +1425309696,1425326079,NL +1425326080,1425342463,SE +1425342464,1425358847,NL +1425358848,1425375231,SK +1425375232,1425391615,DE +1425391616,1425407999,LV +1425408000,1425424383,NL +1425424384,1425424639,DE +1425424640,1425424895,IR +1425424896,1425425151,NE +1425425152,1425425663,DE +1425425664,1425425919,NE +1425425920,1425426303,DE +1425426304,1425426319,IR +1425426320,1425426343,DE +1425426344,1425426352,IR +1425426353,1425426431,DE +1425426432,1425428479,KW +1425428480,1425430527,GB +1425430528,1425432575,SE +1425432576,1425434623,IT +1425434624,1425436671,FR +1425436672,1425438719,GB +1425438720,1425439271,DE +1425439272,1425439279,CZ +1425439280,1425439535,DE +1425439536,1425439543,CZ +1425439544,1425439639,DE +1425439640,1425439643,US +1425439644,1425439711,DE +1425439712,1425439727,CZ +1425439728,1425440767,DE +1425440768,1425442815,SE +1425442816,1425444863,GB +1425444864,1425445139,IT +1425445140,1425445141,GB +1425445142,1425446911,IT +1425446912,1425448959,GB +1425448960,1425451007,NL +1425451008,1425458271,GB +1425458272,1425458303,US +1425458304,1425461247,GB +1425461248,1425463295,ES +1425463296,1425467135,FR +1425467136,1425467391,ES +1425467392,1425469439,CH +1425469440,1425471487,DK +1425471488,1425473535,DE +1425473536,1425506303,RO +1425506304,1425522687,NO +1425522688,1425539071,IT +1425539072,1425801215,FI +1425801216,1425817599,BG +1425817600,1425833983,DE +1425833984,1425850367,RU +1425850368,1425866751,GB +1425866752,1425883135,CH +1425883136,1425899519,RU +1425899520,1425915903,IT +1425915904,1425932287,FI +1425932288,1425948671,GR +1425948672,1425965055,DE +1425965056,1425965100,ES +1425965101,1425965112,FR +1425965113,1425965116,ZA +1425965117,1425965120,FR +1425965121,1425965503,IT +1425965504,1425965567,FR +1425965568,1425965568,IT +1425965569,1425965572,NG +1425965573,1425965576,US +1425965577,1425965580,FR +1425965581,1425965584,BJ +1425965585,1425965588,ES +1425965589,1425965592,IT +1425965593,1425965631,FR +1425965632,1425965952,IT +1425965953,1425965992,ZA +1425965993,1425966015,IT +1425966016,1425966079,ZA +1425966080,1425966080,IT +1425966081,1425966088,DE +1425966089,1425966104,IT +1425966105,1425966128,DE +1425966129,1425966144,IT +1425966145,1425966152,DE +1425966153,1425966208,IT +1425966209,1425966224,DE +1425966225,1425966271,IT +1425966272,1425966335,DE +1425966336,1425966592,IT +1425966593,1425966608,FR +1425966609,1425966720,IT +1425966721,1425966728,BJ +1425966729,1425966735,IT +1425966736,1425966751,BJ +1425966752,1425966784,IT +1425966785,1425966808,BJ +1425966809,1425966815,IT +1425966816,1425966847,BJ +1425966848,1425966852,IT +1425966853,1425966896,DE +1425966897,1425966911,IT +1425966912,1425966975,DE +1425966976,1425967039,IT +1425967040,1425967103,DE +1425967104,1425967104,IT +1425967105,1425967120,TR +1425967121,1425967876,IT +1425967877,1425967892,DE +1425967893,1425967896,IT +1425967897,1425967904,DE +1425967905,1425967912,IT +1425967913,1425967924,DE +1425967925,1425967928,IT +1425967929,1425967940,DE +1425967941,1425967999,IT +1425968000,1425968127,DE +1425968128,1425968383,DZ +1425968384,1425968638,GB +1425968639,1425969663,IT +1425969664,1425969727,FR +1425969728,1425969791,IT +1425969792,1425969855,FR +1425969856,1425969919,IT +1425969920,1425969983,ZA +1425969984,1425970047,IT +1425970048,1425970111,DE +1425970112,1425970176,IT +1425970177,1425970180,DE +1425970181,1425970184,IT +1425970185,1425970188,GB +1425970189,1425970192,DE +1425970193,1425970239,GB +1425970240,1425970688,IT +1425970689,1425970751,DE +1425970752,1425971007,IT +1425971008,1425971071,NL +1425971072,1425971199,IT +1425971200,1425971455,NL +1425971456,1425971711,IT +1425971712,1425971727,AE +1425971728,1425971743,US +1425971744,1425971775,IT +1425971776,1425971839,DE +1425971840,1425971903,SE +1425971904,1425972351,IT +1425972352,1425972415,FR +1425972416,1425972607,IT +1425972608,1425972671,FR +1425972672,1425972863,IT +1425972864,1425972927,FR +1425972928,1425973119,IT +1425973120,1425973183,FR +1425973184,1425973248,IT +1425973249,1425973260,PL +1425973261,1425973264,IT +1425973265,1425973268,DE +1425973269,1425973272,FR +1425973273,1425973276,PL +1425973277,1425973280,IT +1425973281,1425973300,PL +1425973301,1425973308,DE +1425973309,1425973332,PL +1425973333,1425973336,DE +1425973337,1425973439,IT +1425973440,1425973503,PL +1425973504,1425973759,IT +1425973760,1425973823,PL +1425973824,1425974847,IT +1425974848,1425974911,SE +1425974912,1425975039,IT +1425975040,1425975103,FR +1425975104,1425975167,IT +1425975168,1425975231,FR +1425975232,1425975296,IT +1425975297,1425975360,PE +1425975361,1425975551,IT +1425975552,1425975679,FR +1425975680,1425976064,IT +1425976065,1425976126,FR +1425976127,1425976191,IT +1425976192,1425976255,FR +1425976256,1425976320,IT +1425976321,1425976328,FR +1425976329,1425976336,GB +1425976337,1425976344,IT +1425976345,1425976352,FR +1425976353,1425976368,GB +1425976369,1425976372,FR +1425976373,1425976380,GB +1425976381,1425976388,FR +1425976389,1425976392,IT +1425976393,1425976432,FR +1425976433,1425976440,GB +1425976441,1425976448,FR +1425976449,1425976464,GB +1425976465,1425976575,IT +1425976576,1425976830,GB +1425976831,1425976831,IT +1425976832,1425977342,GB +1425977343,1425977855,IT +1425977856,1425978111,DE +1425978112,1425978367,BG +1425978368,1425979392,IT +1425979393,1425979400,DE +1425979401,1425979412,IT +1425979413,1425979416,DE +1425979417,1425979436,IT +1425979437,1425979456,DE +1425979457,1425979460,IT +1425979461,1425979464,DE +1425979465,1425979472,IT +1425979473,1425979476,DE +1425979477,1425979480,IT +1425979481,1425979488,DE +1425979489,1425979519,IT +1425979520,1425979583,DE +1425979584,1425979652,IT +1425979653,1425979656,AE +1425979657,1425979660,IT +1425979661,1425979692,AE +1425979693,1425979704,IT +1425979705,1425979708,AE +1425979709,1425979711,IT +1425979712,1425979775,DE +1425979776,1425979839,US +1425979840,1425979904,IT +1425979905,1425979968,AE +1425979969,1425979976,IT +1425979977,1425979984,FR +1425979985,1425979999,IT +1425980000,1425980031,US +1425980032,1425980095,DE +1425980096,1425980159,AE +1425980160,1425980415,IT +1425980416,1425980479,GR +1425980480,1425980543,IT +1425980544,1425980607,GR +1425980608,1425981439,IT +1425981440,1425997823,RU +1425997824,1426014207,MT +1426014208,1426030591,DK +1426030592,1426046975,BH +1426046976,1426063359,SI +1426063360,1426587647,CH +1426587648,1426604031,SE +1426604032,1426620415,DE +1426620416,1426653183,GB +1426653184,1426669567,RO +1426669568,1426685951,IR +1426685952,1426702335,TJ +1426702336,1426703103,LV +1426703104,1426703167,RU +1426703168,1426718719,LV +1426718720,1426731007,SI +1426731008,1426735103,HR +1426735104,1426751487,BE +1426751488,1426767871,FR +1426767872,1426784255,DE +1426784256,1426800639,SE +1426800640,1426817023,PL +1426817024,1426833407,BG +1426833408,1426849791,SE +1426849792,1426850303,NL +1426850304,1426850335,SE +1426850336,1426850367,GB +1426850368,1426850463,NL +1426850464,1426850495,GB +1426850496,1426851519,NL +1426851520,1426851583,PA +1426851584,1426851839,NL +1426851840,1426852095,SE +1426852096,1426852352,NL +1426852353,1426852359,RU +1426852360,1426852367,SE +1426852368,1426852383,US +1426852384,1426852543,GB +1426852544,1426855679,NL +1426855680,1426855807,PA +1426855808,1426855935,AN +1426855936,1426857472,NL +1426857473,1426857500,ES +1426857501,1426859263,NL +1426859264,1426859519,RU +1426859520,1426864511,NL +1426864512,1426864639,PA +1426864640,1426864895,FR +1426864896,1426865151,NL +1426865152,1426865407,BE +1426865408,1426865663,NL +1426865664,1426865919,BE +1426865920,1426866175,ES +1426866176,1426882559,GB +1426882560,1426898943,FR +1426898944,1426915327,RU +1426915328,1426931711,AT +1426931712,1426948095,CZ +1426948096,1426964479,DE +1426964480,1426980863,GB +1426980864,1426997247,BG +1426997248,1427013631,PL +1427013632,1427030015,FR +1427030016,1427031679,DE +1427031680,1427031743,AT +1427031744,1427031807,DE +1427031808,1427032063,AT +1427032064,1427035391,DE +1427035392,1427035519,GB +1427035520,1427046399,DE +1427046400,1427062783,IR +1427062784,1427095551,RU +1427095552,1427111935,LV +1427111936,1427177471,DE +1427177472,1427227135,NL +1427227136,1427227647,US +1427227648,1427227967,NL +1427227968,1427227975,GB +1427227976,1427227983,DE +1427227984,1427227991,IT +1427227992,1427227999,ES +1427228000,1427228007,PL +1427228008,1427228015,RU +1427228016,1427228023,FR +1427228024,1427243007,NL +1427243008,1427308543,IT +1427308544,1427374079,NO +1427374080,1427439615,IT +1427439616,1427505151,RU +1427505152,1427570687,DE +1427570688,1427636223,FI +1427636224,1427668991,DK +1427668992,1427701759,SE +1427701760,1427723391,DE +1427723392,1427723519,LI +1427723520,1427743999,DE +1427744000,1427744031,FI +1427744032,1427744255,DE +1427744256,1427744287,US +1427744288,1427744863,DE +1427744864,1427744895,TR +1427744896,1427746303,DE +1427746304,1427746335,SE +1427746336,1427748447,DE +1427748448,1427748479,TR +1427748480,1427750911,DE +1427750912,1427759103,NL +1427759104,1427759903,DE +1427759904,1427759935,CH +1427759936,1427759967,RO +1427759968,1427760383,DE +1427760384,1427760415,SE +1427760416,1427760799,DE +1427760800,1427760831,NL +1427760832,1427760927,DE +1427760928,1427760959,HU +1427760960,1427760991,CZ +1427760992,1427761023,DE +1427761024,1427761055,CR +1427761056,1427767295,DE +1427767296,1427800063,BE +1427800064,1427823615,RU +1427823616,1427824639,KG +1427824640,1427831807,RU +1427831808,1427832831,MD +1427832832,1427865599,BE +1427865600,1427898367,DK +1427898368,1427914751,RU +1427914752,1427931135,BE +1427931136,1427947519,PL +1427947520,1427963903,RU +1427963904,1427980287,TR +1427980288,1427996671,FI +1427996672,1428013055,KZ +1428013056,1428029439,EE +1428029440,1428045823,GR +1428045824,1428062207,MK +1428062208,1428078591,SE +1428078592,1428094975,RU +1428094976,1428096031,AT +1428096032,1428096039,CH +1428096040,1428103167,AT +1428103168,1428119551,GB +1428119552,1428121599,LV +1428121600,1428123647,FR +1428123648,1428126975,RU +1428126976,1428127231,TR +1428127232,1428127743,RU +1428127744,1428129791,ES +1428129792,1428131839,GB +1428131840,1428133887,FR +1428133888,1428135935,LI +1428135936,1428137983,IT +1428137984,1428140031,GB +1428140032,1428142079,RU +1428142080,1428144127,DE +1428144128,1428146847,FR +1428146848,1428146855,SE +1428146856,1428146883,FR +1428146884,1428146911,SE +1428146912,1428147071,FR +1428147072,1428147119,SE +1428147120,1428147127,FR +1428147128,1428147199,SE +1428147200,1428147359,FR +1428147360,1428147375,IT +1428147376,1428147391,ES +1428147392,1428147775,FR +1428147776,1428147783,CH +1428147784,1428147839,FR +1428147840,1428147847,SE +1428147848,1428147855,DK +1428147856,1428147871,US +1428147872,1428147903,GB +1428147904,1428148031,FR +1428148032,1428148063,SE +1428148064,1428148111,FR +1428148112,1428148127,SE +1428148128,1428148135,IL +1428148136,1428148143,BE +1428148144,1428148151,DE +1428148152,1428148159,NL +1428148160,1428148175,SE +1428148176,1428148191,CH +1428148192,1428148223,SE +1428148224,1428150495,FR +1428150496,1428150511,SE +1428150512,1428150735,FR +1428150736,1428150751,SE +1428150752,1428151007,FR +1428151008,1428151039,SE +1428151040,1428151295,FR +1428151296,1428151551,SE +1428151552,1428152319,FR +1428152320,1428160511,PL +1428160512,1429209087,IT +1429209088,1430257663,ES +1430257664,1430388735,IL +1430388736,1430519807,HU +1430519808,1430650879,FR +1430650880,1430781951,CZ +1430781952,1431044095,GR +1431044096,1431306239,FI +1431306240,1431568383,DK +1431568384,1431830527,ES +1431830528,1431832832,DE +1431832833,1431832846,AT +1431832847,1431837680,DE +1431837681,1431837694,AT +1431837695,1431838719,DE +1431838720,1431839007,BE +1431839008,1431839039,DE +1431839040,1431846911,BE +1431846912,1431855103,NO +1431855104,1431863295,NL +1431863296,1431863559,GB +1431863560,1431863767,PT +1431863768,1431863775,GB +1431863776,1431863863,PT +1431863864,1431863871,GB +1431863872,1431864151,PT +1431864152,1431864159,GB +1431864160,1431864191,PT +1431864192,1431864207,GB +1431864208,1431864287,PT +1431864288,1431864295,GB +1431864296,1431864359,PT +1431864360,1431864367,GB +1431864368,1431864407,PT +1431864408,1431864415,GB +1431864416,1431864455,PT +1431864456,1431864463,GB +1431864464,1431864471,PT +1431864472,1431864479,GB +1431864480,1431864623,PT +1431864624,1431864631,GB +1431864632,1431864671,PT +1431864672,1431864679,GB +1431864680,1431864743,PT +1431864744,1431864751,GB +1431864752,1431864775,PT +1431864776,1431864791,GB +1431864792,1431864807,PT +1431864808,1431864815,GB +1431864816,1431864887,PT +1431864888,1431864895,GB +1431864896,1431864919,PT +1431864920,1431864927,GB +1431864928,1431865111,PT +1431865112,1431865119,GB +1431865120,1431865263,PT +1431865264,1431865295,GB +1431865296,1431865303,PT +1431865304,1431865327,GB +1431865328,1431865335,PT +1431865336,1431865343,ES +1431865344,1431865599,PT +1431865600,1431865631,GB +1431865632,1431865647,ES +1431865648,1431865655,GB +1431865656,1431865663,PT +1431865664,1431865679,ES +1431865680,1431865695,GB +1431865696,1431865711,PT +1431865712,1431865719,ES +1431865720,1431865735,GB +1431865736,1431865743,PT +1431865744,1431865759,GB +1431865760,1431865799,PT +1431865800,1431865807,GB +1431865808,1431865823,PT +1431865824,1431865831,GB +1431865832,1431865855,PT +1431865856,1431865871,GB +1431865872,1431866007,PT +1431866008,1431866015,GB +1431866016,1431866063,PT +1431866064,1431867391,GB +1431867392,1431867647,PT +1431867648,1431871487,GB +1431871488,1431879679,RU +1431879680,1431887871,IT +1431887872,1431896063,GB +1431896064,1431904255,NO +1431904256,1431912447,EE +1431912448,1431920639,SE +1431920640,1431928831,RU +1431928832,1431937023,IT +1431937024,1431945215,PL +1431945216,1431953407,NO +1431953408,1431961599,DK +1431961600,1431969791,CH +1431969792,1431977983,GB +1431977984,1431986175,NL +1431986176,1431994367,RU +1431994368,1432002559,AT +1432002560,1432010751,HU +1432010752,1432018943,UA +1432018944,1432023551,GB +1432023552,1432023567,BG +1432023568,1432027135,GB +1432027136,1432035327,IE +1432035328,1432043519,GB +1432043520,1432051711,ES +1432051712,1432059903,RU +1432059904,1432068095,BG +1432068096,1432076287,BE +1432076288,1432084479,RU +1432084480,1432092671,GB +1432092672,1432100863,RU +1432100864,1432109055,CZ +1432109056,1432117247,GB +1432117248,1432125439,CY +1432125440,1432127487,NL +1432127488,1432127551,BE +1432127552,1432131583,NL +1432131584,1432133631,PH +1432133632,1432150015,GB +1432150016,1432158207,BA +1432158208,1432158463,CH +1432158464,1432159743,DE +1432159744,1432159871,PL +1432159872,1432160255,DE +1432160256,1432160511,CH +1432160512,1432165247,DE +1432165248,1432165375,PL +1432165376,1432166143,DE +1432166144,1432166399,CH +1432166400,1432174591,RU +1432174592,1432182783,DE +1432182784,1432190975,CZ +1432190976,1432199167,RU +1432199168,1432207359,CZ +1432207360,1432215551,LU +1432215552,1432223743,NO +1432223744,1432240127,RU +1432240128,1432248319,HR +1432248320,1432256511,ME +1432256512,1432264703,BA +1432264704,1432272895,AD +1432272896,1432281087,IT +1432281088,1432289279,LU +1432289280,1432297471,GB +1432297472,1432305663,NO +1432305664,1432313855,BG +1432313856,1432322047,GB +1432322048,1432338431,RU +1432338432,1432346623,FR +1432346624,1432346879,DE +1432346880,1432347135,AE +1432347136,1432352767,DE +1432352768,1432353279,AE +1432353280,1432353791,DE +1432353792,1433403391,TR +1433403392,1433407711,ES +1433407712,1433408255,NL +1433408256,1433409023,ES +1433409024,1433409279,NL +1433409280,1433409535,ES +1433409536,1433409791,NL +1433409792,1433411583,ES +1433411584,1433419775,RU +1433419776,1433427967,LB +1433427968,1433436159,RU +1433436160,1433444351,NO +1433444352,1433452543,SE +1433452544,1433460735,PL +1433460736,1433468927,DE +1433468928,1433477119,KG +1433477120,1433485311,RU +1433485312,1433493503,GB +1433493504,1433501695,PS +1433501696,1433509887,RU +1433509888,1433518079,NO +1433518080,1433526271,RU +1433526272,1433534463,NL +1433534464,1433542655,RU +1433542656,1433550847,HR +1433550848,1433559039,RU +1433559040,1433567231,PS +1433567232,1433575423,DE +1433575424,1433583615,RU +1433583616,1433591807,UA +1433591808,1433599999,GE +1433600000,1433602303,DE +1433602304,1433602319,LU +1433602320,1433608191,DE +1433608192,1433608959,GB +1433608960,1433609215,DE +1433609216,1433609727,GB +1433609728,1433610239,CH +1433610240,1433612287,US +1433612288,1433614335,GB +1433614336,1433615359,DE +1433615360,1433615871,FR +1433615872,1433616383,GB +1433616384,1433624575,AE +1433624576,1433632767,LV +1433632768,1433640959,GI +1433640960,1433649151,RU +1433649152,1433657343,KG +1433657344,1433665535,RU +1433665536,1433673727,GB +1433673728,1433681919,FR +1433681920,1433690111,IS +1433690112,1433698303,RU +1433698304,1433706495,IT +1433706496,1433714687,GB +1433714688,1433721687,DE +1433721688,1433721695,US +1433721696,1433722879,DE +1433722880,1433731071,IT +1433731072,1433739263,PL +1433739264,1433747455,GE +1433747456,1433755647,RU +1433755648,1433763839,EE +1433763840,1433765887,CZ +1433765888,1433766911,DE +1433766912,1433769983,RU +1433769984,1433771007,SK +1433771008,1433772031,RU +1433772032,1433788415,SE +1433788416,1433796607,UZ +1433796608,1433804799,GB +1433804800,1433812991,FR +1433812992,1433820159,BG +1433820160,1433821183,HR +1433821184,1433829375,GE +1433829376,1433833471,RU +1433833472,1433835519,IT +1433835520,1433837567,GB +1433837568,1433839615,DE +1433839616,1433841663,GB +1433841664,1433843711,RU +1433843712,1433843839,SE +1433843840,1433843967,NL +1433843968,1433843983,CS +1433843984,1433845759,NL +1433845760,1433847807,BG +1433847808,1433849855,SE +1433849856,1433851903,BE +1433851904,1433853951,CH +1433853952,1433855999,RU +1433856000,1433858047,GB +1433858048,1433860095,ES +1433860096,1433862143,BA +1433862144,1433863039,CH +1433863040,1433863167,US +1433863168,1433864191,CH +1433864192,1433866239,HU +1433866240,1433867263,NL +1433867264,1433867295,GB +1433867296,1433867519,NL +1433867520,1433867647,GB +1433867648,1433867775,NL +1433867776,1433867839,GB +1433867840,1433868031,NL +1433868032,1433870335,GB +1433870336,1433872383,TR +1433872384,1433874431,IT +1433874432,1433876479,NL +1433876480,1433878527,GB +1433878528,1433880575,TR +1433880576,1433882623,RU +1433882624,1433884671,FR +1433884672,1433886719,CZ +1433886720,1433888767,GB +1433888768,1433890815,SA +1433890816,1433892863,GB +1433892864,1433894911,MT +1433894912,1433896959,SE +1433896960,1433899007,NO +1433899008,1433901055,RU +1433901056,1433905151,DE +1433905152,1433907199,FR +1433907200,1433909247,IT +1433909248,1433911295,BE +1433911296,1433913343,ES +1433913344,1433914879,DE +1433914880,1433915135,NL +1433915136,1433917439,DE +1433917440,1433919487,BE +1433919488,1433921535,GB +1433921536,1433923583,CH +1433923584,1433923711,BE +1433923712,1433924479,NL +1433924480,1433925631,BE +1433925632,1433927679,GB +1433927680,1434189823,RO +1434189824,1434451967,AT +1434451968,1434517503,PL +1434517504,1434550271,DK +1434550272,1434583039,SA +1434583040,1434615807,BG +1434615808,1434648575,IL +1434648576,1434681343,FI +1434681344,1434714111,DE +1434714112,1434746879,AZ +1434746880,1434779647,CZ +1434779648,1434812415,GB +1434812416,1434845183,IR +1434845184,1434877951,FI +1434877952,1434910719,IE +1434910720,1434943487,CZ +1434943488,1434976255,SK +1434976256,1435107327,ES +1435107328,1435238399,PT +1435238400,1435500543,RU +1435500544,1436024831,NL +1436024832,1436090367,ES +1436090368,1436155903,TR +1436155904,1436221439,OM +1436221440,1436286975,ES +1436286976,1436418047,FI +1436418048,1436420095,DE +1436420096,1436422143,GB +1436422144,1436424191,FR +1436424192,1436426239,CH +1436426240,1436428287,BA +1436428288,1436430335,GB +1436430336,1436432383,RU +1436432384,1436436479,GB +1436436480,1436438527,LV +1436438528,1436440575,IT +1436440576,1436442623,RU +1436442624,1436444671,TR +1436444672,1436446591,BE +1436446592,1436446655,NL +1436446656,1436446719,BE +1436446720,1436450815,FR +1436450816,1436452863,BH +1436452864,1436453119,NL +1436453120,1436453631,DE +1436453632,1436453887,NL +1436453888,1436454399,GB +1436454400,1436454655,NL +1436454656,1436454911,DE +1436454912,1436456959,AZ +1436456960,1436459007,GB +1436459008,1436461055,NL +1436461056,1436463103,ES +1436463104,1436465151,DE +1436465152,1436467199,RU +1436467200,1436469247,DE +1436469248,1436471295,NL +1436471296,1436471551,BE +1436471552,1436471615,NL +1436471616,1436471679,FR +1436471680,1436471743,BE +1436471744,1436471807,BR +1436471808,1436473343,BE +1436473344,1436475391,RO +1436475392,1436477439,AT +1436477440,1436481535,CH +1436481536,1436483583,NL +1436483584,1436485631,UA +1436485632,1436487471,DE +1436487472,1436487487,AT +1436487488,1436487623,DE +1436487624,1436487631,AT +1436487632,1436487679,DE +1436487680,1436489727,IE +1436489728,1436491775,KZ +1436491776,1436495871,RU +1436495872,1436497919,HU +1436497920,1436499967,GB +1436499968,1436504063,TR +1436504064,1436508159,GB +1436508160,1436510207,NL +1436510208,1436512255,SK +1436512256,1436514303,NL +1436514304,1436516351,GI +1436516352,1436520447,GB +1436520448,1436522495,IT +1436522496,1436524543,GB +1436524544,1436526591,IL +1436526592,1436528639,GB +1436528640,1436530687,IT +1436530688,1436532735,GB +1436532736,1436535839,IT +1436535840,1436535855,ET +1436535856,1436535943,IT +1436535944,1436535951,ET +1436535952,1436535999,IT +1436536000,1436536007,MO +1436536008,1436536831,IT +1436536832,1436538879,GB +1436538880,1436540927,JO +1436540928,1436542975,RU +1436545024,1436547071,DE +1436547072,1436549119,GB +1436549120,1436811263,CZ +1436811264,1437073407,NO +1437073408,1437335551,FR +1437335552,1437597695,RU +1437597696,1438121983,DE +1438121984,1438127103,NL +1438127104,1438127359,GB +1438127360,1438142463,NL +1438142464,1438142719,GB +1438142720,1438187519,NL +1438187520,1438253055,IR +1438253056,1438318591,RO +1438318592,1438384127,BG +1438384128,1438400511,FI +1438400512,1438433279,SE +1438433280,1438515199,GB +1438515200,1438519007,DE +1438519008,1438519039,SI +1438519040,1438523391,DE +1438523392,1438524947,NL +1438524948,1438524951,DE +1438524952,1438525335,NL +1438525336,1438525343,DE +1438525344,1438525471,NL +1438525472,1438525695,DE +1438525696,1438526463,NL +1438526464,1438580735,DE +1438580736,1438646271,NL +1438646272,1438662655,RU +1438662656,1438679039,ES +1438679040,1438695423,RU +1438695424,1438711807,FR +1438711808,1438728191,CZ +1438728192,1438744575,RU +1438744576,1438760959,AT +1438760960,1438777343,PL +1438777344,1438793727,SE +1438793728,1438810111,SA +1438810112,1438826495,SE +1438826496,1438842879,FI +1438842880,1438859263,SE +1438859264,1438861823,DE +1438861824,1438862079,CH +1438862080,1438874411,DE +1438874412,1438874413,GB +1438874414,1438874623,DE +1438874624,1438874647,GB +1438874648,1438875223,DE +1438875224,1438875255,GB +1438875256,1438875257,CH +1438875258,1438875647,DE +1438875648,1438875903,RU +1438875904,1438876159,SE +1438876160,1438876415,LB +1438876416,1438876927,RU +1438876928,1438877183,SE +1438877184,1438877439,LT +1438877440,1438877695,RU +1438877696,1438877951,LT +1438877952,1438878719,LB +1438878720,1438878975,LT +1438878976,1438880511,RU +1438880512,1438880767,LT +1438880768,1438881791,LB +1438881792,1438882303,RU +1438882304,1438882559,LT +1438882560,1438883583,RU +1438883584,1438883839,AM +1438883840,1438884351,RU +1438884352,1438884607,LB +1438884608,1438884863,IQ +1438884864,1438885887,RU +1438885888,1438889983,LT +1438889984,1438890239,LB +1438890240,1438890495,RU +1438890496,1438890751,IQ +1438890752,1438892031,RU +1438892032,1438892287,AQ +1438892288,1438900223,CH +1438900224,1438908415,AQ +1438908416,1438924799,GR +1438924800,1438941183,NO +1438941184,1438957567,BG +1438957568,1438973951,EE +1438973952,1438994175,DE +1438994176,1438994431,SE +1438994432,1438994619,DE +1438994620,1438994623,SE +1438994624,1438994751,DE +1438994752,1438994759,GB +1438994760,1438994763,SE +1438994764,1438995039,DE +1438995040,1438995047,GB +1438995048,1438995067,DE +1438995068,1438995071,SE +1438995072,1438999098,DE +1438999099,1438999103,CH +1438999104,1438999167,DE +1438999168,1438999185,IT +1438999186,1438999261,DE +1438999262,1438999295,NL +1438999296,1438999475,DE +1438999476,1438999487,PT +1438999488,1438999517,DE +1438999518,1438999518,CH +1438999519,1438999533,DE +1438999534,1438999534,CH +1438999535,1438999791,DE +1438999792,1438999807,GB +1438999808,1439000575,DE +1439000576,1439002623,NL +1439002624,1439006567,DE +1439006568,1439006575,AT +1439006576,1439006671,DE +1439006672,1439006675,PL +1439006676,1439006719,DE +1439006720,1439023103,SE +1439023104,1439039487,IS +1439039488,1439055871,IR +1439055872,1439072255,RU +1439072256,1439088639,UA +1439088640,1439105023,PL +1439105024,1439121407,AT +1439121408,1439154175,DE +1439154176,1439170559,GB +1439170560,1439236095,NO +1439236096,1439301631,BE +1439301632,1439305727,RU +1439305728,1439309823,DK +1439309824,1439318015,PL +1439318016,1439322111,DK +1439322112,1439326207,RO +1439326208,1439330303,PL +1439330304,1439338495,RU +1439338496,1439342591,PL +1439342592,1439346687,UA +1439346688,1439350783,RU +1439350784,1439354879,UA +1439354880,1439358975,PL +1439358976,1439367167,RU +1439367168,1439432703,NL +1439432704,1439498239,RO +1439498240,1439514623,DE +1439514624,1439516671,IT +1439516672,1439518207,DE +1439518208,1439518719,IT +1439518720,1439529983,DE +1439529984,1439530239,EG +1439530240,1439535103,DE +1439535104,1439538175,IT +1439538176,1439538687,DE +1439538688,1439539199,IT +1439539200,1439549439,DE +1439549440,1439551487,IT +1439551488,1439556095,DE +1439556096,1439556607,IT +1439556608,1439558143,DE +1439558144,1439558911,IT +1439558912,1439560191,DE +1439560192,1439560447,IT +1439560448,1439560703,DE +1439560704,1439561215,IT +1439561216,1439561727,DE +1439561728,1439562239,GB +1439562240,1439562751,IE +1439562752,1439562879,DE +1439562880,1439563199,GB +1439563200,1439563775,DE +1439563776,1439629311,LT +1439629312,1439694847,CZ +1439694848,1439825919,SA +1439825920,1439956991,GB +1439956992,1440251903,DE +1440251904,1440284671,SK +1440284672,1440317439,FI +1440317440,1440350207,BG +1440350208,1440382975,CH +1440382976,1440415743,DK +1440415744,1440448511,ES +1440448512,1440481279,PL +1440481280,1440514047,IS +1440514048,1440546815,DE +1440546816,1440579583,NO +1440579584,1440645119,PL +1440645120,1440654591,CS +1440654592,1440656383,RS +1440656384,1440656639,CS +1440656640,1440658431,RS +1440658432,1440668671,CS +1440668672,1440669695,RS +1440669696,1440677887,CS +1440677888,1440710655,NL +1440710656,1440743423,UA +1440743424,1441267711,SE +1441267712,1441275903,DE +1441275904,1441284095,GB +1441284096,1441292287,AT +1441292288,1441300479,RU +1441300480,1441308671,LT +1441308672,1441316863,CH +1441316864,1441325055,MT +1441325056,1441333247,PL +1441333248,1441349631,DE +1441349632,1441357823,RU +1441357824,1441366015,AT +1441366016,1441374207,RU +1441374208,1441382399,GB +1441382400,1441384511,FR +1441384512,1441384543,US +1441384544,1441384591,FR +1441384592,1441384599,AU +1441384600,1441384607,FR +1441384608,1441384639,CN +1441384640,1441385103,FR +1441385104,1441385119,ES +1441385120,1441390591,FR +1441390592,1441398783,DK +1441398784,1441415167,RU +1441415168,1441423359,GB +1441423360,1441431551,RU +1441431552,1441439743,GB +1441439744,1441447935,LV +1441447936,1441456127,BE +1441456128,1441464319,NL +1441464320,1441468671,SE +1441468672,1441470719,DK +1441470720,1441472511,SE +1441472512,1441480703,RU +1441480704,1441488895,TR +1441488896,1441492223,GB +1441492224,1441492479,BE +1441492480,1441497087,GB +1441497088,1441505279,IT +1441505280,1441521663,RU +1441521664,1441529855,DK +1441529856,1441538047,RU +1441538048,1441542975,DE +1441542976,1441543039,AT +1441543040,1441543151,DE +1441543152,1441543167,LI +1441543168,1441543567,DE +1441543568,1441543583,CH +1441543584,1441544063,DE +1441544064,1441544127,TR +1441544128,1441544143,DE +1441544144,1441544159,CH +1441544160,1441545535,DE +1441545536,1441545599,AT +1441545600,1441546239,DE +1441546240,1441554431,DK +1441554432,1441554687,GB +1441554688,1441554943,NL +1441554944,1441557759,GB +1441557760,1441558015,NL +1441558016,1441562623,GB +1441562624,1441564671,OM +1441564672,1441566719,PK +1441566720,1441570815,IR +1441570816,1441579007,RU +1441579008,1441582975,DE +1441582976,1441583103,US +1441583104,1441587199,DE +1441587200,1441594879,AT +1441594880,1441595135,DE +1441595136,1441596159,AT +1441596160,1441602815,SK +1441602816,1441603071,AT +1441603072,1441603583,SK +1441603584,1441611775,RU +1441611776,1441619967,DE +1441619968,1441620271,FR +1441620272,1441620287,ES +1441620288,1441620407,FR +1441620408,1441620411,ES +1441620412,1441628159,FR +1441628160,1441636351,SA +1441636352,1441644543,PL +1441644544,1441652735,GB +1441652736,1441660927,SK +1441660928,1441669119,ES +1441669120,1441677311,GE +1441677312,1441685503,HU +1441685504,1441693695,UA +1441693696,1441694719,BR +1441694720,1441695743,DE +1441695744,1441696767,US +1441696768,1441697791,SG +1441697792,1441698815,US +1441698816,1441701887,DE +1441701888,1441710079,AT +1441710080,1441718271,SE +1441718272,1441726463,DE +1441726464,1441729023,KW +1441729024,1441729535,SG +1441729536,1441734655,KW +1441734656,1441742847,RU +1441742848,1441751039,CZ +1441751040,1441759231,DE +1441759232,1441767423,BG +1441767424,1441775615,IT +1441775616,1441783807,ES +1441783808,1441791999,CZ +1441792000,1442316287,PT +1442316288,1442316583,SK +1442316584,1442316591,DE +1442316592,1442321455,SK +1442321456,1442321463,DE +1442321464,1442332927,SK +1442332928,1442333055,BE +1442333056,1442381823,SK +1442381824,1442447359,RU +1442447360,1442512895,IL +1442512896,1442578431,ES +1442578432,1442643967,NO +1442643968,1442709503,EE +1442709504,1442775039,LV +1442775040,1442779135,PL +1442779136,1442783231,DE +1442783232,1442787327,NO +1442787328,1442791423,LT +1442791424,1442795519,LV +1442795520,1442799615,DE +1442799616,1442803711,LT +1442803712,1442807807,UA +1442807808,1442811903,BG +1442811904,1442815999,AT +1442816000,1442820095,BG +1442820096,1442824191,PL +1442824192,1442828287,BE +1442828288,1442832383,NL +1442832384,1442836479,GB +1442836480,1442840575,PL +1442840576,1444937727,GB +1444937728,1445068799,AT +1445068800,1445199871,RO +1445199872,1445330943,QA +1445330944,1445396479,LT +1445396480,1445462015,BE +1445462016,1445986303,IE +1445986304,1446051839,DK +1446051840,1446117375,CZ +1446117376,1446182911,FI +1446182912,1446248447,SA +1446248448,1446313983,DK +1446313984,1446445055,GB +1446445056,1446510591,RO +1446510592,1446543359,DE +1446543360,1446576127,AT +1446576128,1446608895,LV +1446608896,1446641663,BY +1446641664,1446674431,SI +1446674432,1446707175,DK +1446707176,1446707179,NO +1446707180,1446707183,FI +1446707184,1446707199,DK +1446707200,1446739967,AT +1446739968,1446764543,RU +1446764544,1446765055,CZ +1446765056,1446772735,RU +1446772736,1446805503,SA +1446805504,1446838271,FI +1446838272,1446862079,SI +1446862080,1446862591,HR +1446862592,1446871039,SI +1446871040,1446903807,CZ +1446903808,1446904071,AE +1446904072,1446904079,CY +1446904080,1446904095,BH +1446904096,1446904111,SA +1446904112,1446904119,BH +1446904120,1446904127,AE +1446904128,1446904135,SA +1446904136,1446904143,IQ +1446904144,1446904151,SA +1446904152,1446904159,IR +1446904160,1446904167,ES +1446904168,1446904175,IQ +1446904176,1446904831,AE +1446904832,1446904835,LY +1446904836,1446920191,AE +1446920192,1446936575,RU +1446936576,1446952959,NO +1446952960,1446969343,QA +1446969344,1446985727,GB +1446985728,1447010303,PL +1447010304,1447018495,LV +1447018496,1447019007,CZ +1447019008,1447019023,BZ +1447019024,1447026687,CZ +1447026688,1447169375,FR +1447169376,1447169391,TN +1447169392,1448083455,FR +1448083456,1449132031,NL +1449132032,1449394175,AE +1449394176,1449459711,LT +1449459712,1449525247,HU +1449525248,1449590783,RU +1449590784,1449656319,DE +1449656320,1449717759,RO +1449717760,1449718783,MD +1449718784,1449840639,RO +1449840640,1449852927,MD +1449852928,1449918463,RO +1449918464,1449951231,JO +1449951232,1449983999,TR +1449984000,1449992191,NL +1449992192,1450000383,IR +1450000384,1450008575,HU +1450008576,1450016767,ES +1450016768,1450024959,IT +1450024960,1450033151,ES +1450033152,1450041343,RU +1450041344,1450049535,DE +1450049536,1450057727,RU +1450057728,1450065919,EE +1450065920,1450074111,DE +1450074112,1450082303,RU +1450082304,1450090495,IT +1450090496,1450106879,RU +1450106880,1450115071,SK +1450115072,1450123263,RU +1450123264,1450131455,AT +1450131456,1450139647,UA +1450139648,1450147839,PL +1450147840,1450156031,RU +1450156032,1450164223,GB +1450164224,1450166271,SA +1450166272,1450168319,PL +1450170368,1450172415,GB +1450172416,1450174463,UA +1450174464,1450176511,DE +1450176512,1450178559,PL +1450178560,1450180607,DE +1450180608,1450311679,GB +1450311680,1450442751,FI +1450442752,1450704895,CH +1450704896,1451173887,RO +1451173888,1451175935,HU +1451175936,1451229183,RO +1451229184,1455423487,GB +1455423488,1459617791,FR +1459617792,1461714943,IT +1461714944,1462763519,IE +1462763520,1463812095,DK +1463812096,1464074239,BE +1464074240,1464336383,IL +1464336384,1464467455,DK +1464467456,1464598527,GB +1464664064,1464801791,DE +1464801792,1464801855,GB +1464801856,1464860671,DE +1464860672,1465384959,GB +1465384960,1465647103,FR +1465647104,1465909247,FI +1465909248,1465942015,PL +1465942016,1465974783,SE +1465974784,1466007551,HU +1466007552,1466040319,BG +1466040320,1466073087,EE +1466073088,1466097663,FR +1466097664,1466099711,ES +1466099712,1466101759,PL +1466101760,1466103807,DE +1466103808,1466104831,GB +1466104832,1466105343,BE +1466105344,1466105855,GB +1466105856,1466122239,PL +1466122240,1466130431,LV +1466130432,1466138623,PL +1466138624,1466171391,SE +1466171392,1466204159,FR +1466204160,1466236927,FI +1466236928,1466241023,NL +1466241024,1466249215,PL +1466249216,1466253311,GR +1466253312,1466257407,PL +1466257408,1466261503,GR +1466261504,1466265599,GB +1466265600,1466269695,HU +1466269696,1466302463,SA +1466302464,1466335231,GB +1466335232,1466367999,CH +1466368000,1466400767,PT +1466400768,1466433535,RU +1466433536,1466499071,DK +1466499072,1466564607,PL +1466564608,1466589183,DE +1466589184,1466590207,FR +1466590208,1466592255,GB +1466592256,1466592511,FR +1466592512,1466592639,GB +1466592640,1466593279,FR +1466593280,1466606847,DE +1466606848,1466607103,FR +1466607104,1466613759,DE +1466613760,1466615807,ES +1466615808,1466616575,GB +1466616576,1466617343,ES +1466617344,1466617471,FR +1466617472,1466617599,GB +1466617600,1466617855,ES +1466617856,1466630143,DE +1466630144,1466695679,IR +1466695680,1466761215,FI +1466761216,1466826751,SA +1466826752,1466886399,LV +1466886400,1466886655,LT +1466886656,1466892287,LV +1466892288,1466957823,ES +1466957824,1467219967,GB +1467219968,1467236351,DK +1467236352,1467252735,BG +1467252736,1467269119,RS +1467269120,1467285503,PL +1467285504,1467301887,RU +1467301888,1467318271,GB +1467318272,1467334655,RU +1467334656,1467344127,GB +1467344128,1467344383,CA +1467344384,1467351039,GB +1467351040,1467367423,NO +1467367424,1467367615,DE +1467367616,1467367647,SE +1467367648,1467367679,DE +1467367680,1467367695,IT +1467367696,1467367871,DE +1467367872,1467367903,SE +1467367904,1467367935,DE +1467367936,1467368191,SI +1467368192,1467368319,DK +1467368320,1467368447,DE +1467368448,1467369471,RU +1467369472,1467369599,DE +1467369600,1467369663,IT +1467369664,1467369727,AT +1467369728,1467369759,DE +1467369760,1467369791,HR +1467369792,1467369855,SE +1467369856,1467369887,GB +1467369888,1467369903,RU +1467369904,1467369919,DE +1467369920,1467369951,RU +1467369952,1467370495,DE +1467370496,1467371007,IE +1467371008,1467371775,DE +1467371776,1467372031,RU +1467372032,1467383807,DE +1467383808,1467400191,BG +1467400192,1467416575,RU +1467416576,1467432959,PL +1467432960,1467449343,BG +1467449344,1467457535,SI +1467457536,1467465727,EE +1467465728,1467465759,NL +1467465760,1467465791,AT +1467465792,1467465799,NL +1467465800,1467465807,AT +1467465808,1467465823,NL +1467465824,1467465855,AT +1467465856,1467466015,NL +1467466016,1467466023,DE +1467466024,1467466031,AT +1467466032,1467466111,NL +1467466112,1467466143,DE +1467466144,1467466175,NL +1467466176,1467466191,DE +1467466192,1467466207,NL +1467466208,1467466271,DE +1467466272,1467466751,NL +1467466752,1467467071,DE +1467467072,1467467103,CH +1467467104,1467467903,DE +1467467904,1467468031,CH +1467468032,1467468111,DE +1467468112,1467468119,BR +1467468120,1467473919,DE +1467473920,1467482111,RU +1467482112,1467613183,BG +1467613184,1467744255,DE +1467744256,1467875327,GB +1467875328,1467940863,BG +1467940864,1468006399,GB +1468006400,1472200703,DE +1472200704,1472226463,IE +1472226464,1472226479,GB +1472226480,1472259207,IE +1472259208,1472259231,GB +1472259232,1472259247,IE +1472259248,1472259255,GB +1472259256,1472264799,IE +1472264800,1472264807,GB +1472264808,1472266239,IE +1472266240,1472331775,DE +1472331776,1472397311,GB +1472397312,1472462847,NL +1472462848,1472528383,PT +1472528384,1472593919,SK +1472593920,1472659455,IE +1472659456,1472724991,PL +1472724992,1472856063,AE +1472856064,1472987135,GR +1472987136,1473249279,PL +1473249280,1473724415,NL +1473724416,1473740799,BE +1473740800,1473773567,NL +1473773568,1474297855,ES +1474297856,1474330623,GB +1474330624,1474396159,RU +1474396160,1474428927,DE +1474428928,1474461695,LV +1474461696,1474494463,RU +1474494464,1474527231,SE +1474527232,1474559999,BG +1474560000,1474592767,RU +1474592768,1474625535,CY +1474625536,1474658303,HU +1474658304,1474691071,RU +1474691072,1474723839,DE +1474723840,1474756607,SA +1474756608,1474822143,FR +1474822144,1474887679,IE +1474887680,1474953215,NL +1474953216,1475018751,DE +1475018752,1475084287,ES +1475084288,1475086335,NL +1475086336,1475092479,RU +1475092480,1475094527,CY +1475094528,1475096575,RU +1475096576,1475098623,BH +1475098624,1475101695,GB +1475101696,1475102207,ZA +1475102208,1475102719,GB +1475102720,1475104767,FR +1475104768,1475106815,RU +1475106816,1475108863,GB +1475108864,1475110911,NL +1475110912,1475112959,DE +1475112960,1475115007,MT +1475115008,1475117055,KW +1475117056,1475119103,GB +1475119104,1475121151,BH +1475121152,1475121919,GB +1475121920,1475122175,US +1475122176,1475123199,GB +1475123200,1475125247,FI +1475125248,1475127295,NO +1475127296,1475129343,FI +1475129344,1475131391,BE +1475131392,1475133439,RU +1475133440,1475135487,CZ +1475135488,1475137535,CH +1475137536,1475139583,SE +1475139584,1475141631,BE +1475141632,1475143679,UA +1475143680,1475145727,JO +1475145728,1475147775,ES +1475147776,1475149823,GB +1475149824,1475151871,NL +1475151872,1475153919,BE +1475153920,1475155967,GB +1475155968,1475158015,NL +1475158016,1475160063,IS +1475160064,1475162111,RU +1475162112,1475170303,GB +1475170304,1475172351,ES +1475172352,1475174399,DE +1475174400,1475175047,NL +1475175048,1475175055,US +1475175056,1475176447,NL +1475176448,1475178495,RO +1475178496,1475180543,RU +1475180544,1475184639,DE +1475184640,1475186687,RU +1475186688,1475188735,ES +1475188736,1475190783,SE +1475190784,1475192831,GB +1475192832,1475194879,CH +1475194880,1475196927,DE +1475196928,1475197071,FR +1475197072,1475197079,DZ +1475197080,1475197791,FR +1475197792,1475197807,ES +1475197808,1475198975,FR +1475198976,1475201023,BH +1475201024,1475203071,RS +1475203072,1475205119,SE +1475205120,1475205887,DE +1475205888,1475206143,US +1475206144,1475206207,JP +1475206208,1475206271,US +1475206272,1475206383,DE +1475206384,1475206399,NL +1475206400,1475206655,HK +1475206656,1475206911,DE +1475206912,1475206927,NL +1475206928,1475206943,FR +1475206944,1475206959,PT +1475206960,1475206975,GB +1475206976,1475206991,IT +1475206992,1475207007,SE +1475207008,1475207023,RU +1475207024,1475207039,ES +1475207040,1475207055,AU +1475207056,1475207071,KR +1475207072,1475207087,CH +1475207088,1475207103,JP +1475207104,1475207135,KR +1475207136,1475207147,DE +1475207148,1475207167,US +1475207168,1475207263,AE +1475207264,1475207295,US +1475207296,1475207423,AE +1475207424,1475207679,GR +1475207680,1475208191,SA +1475208192,1475209215,AE +1475209216,1475211263,UZ +1475211264,1475213311,DE +1475213312,1475215359,FR +1475215360,1475223551,IT +1475223552,1475229695,NO +1475229696,1475229759,SE +1475229760,1475229951,NO +1475229952,1475229967,SE +1475229968,1475233791,NO +1475233792,1475234303,GB +1475234304,1475234559,IE +1475234560,1475235839,GB +1475235840,1475237887,IE +1475237888,1475239935,ES +1475239936,1475241983,RU +1475241984,1475244031,MC +1475244032,1475244543,DE +1475244544,1475244799,RU +1475244800,1475245055,DE +1475245056,1475245183,IR +1475245184,1475245215,DE +1475245216,1475245247,IQ +1475245248,1475245311,DE +1475245312,1475245567,CV +1475245568,1475246078,SA +1475246080,1475248127,DE +1475248128,1475250175,JO +1475250176,1475252223,DE +1475252224,1475254271,FR +1475254272,1475256319,UA +1475256320,1475257120,BE +1475257121,1475257121,NL +1475257122,1475257136,BE +1475257137,1475257137,FR +1475257138,1475257275,BE +1475257276,1475257276,NL +1475257277,1475257277,GB +1475257278,1475257278,BE +1475257279,1475257280,GB +1475257281,1475257282,NL +1475257283,1475257286,BE +1475257287,1475257287,NL +1475257288,1475257290,BE +1475257291,1475257291,DE +1475257292,1475257295,BE +1475257296,1475257296,GB +1475257297,1475257297,NL +1475257298,1475257298,BE +1475257299,1475257299,ES +1475257300,1475258175,BE +1475258176,1475258207,NL +1475258208,1475258239,DE +1475258240,1475258367,BE +1475258368,1475260415,NL +1475260416,1475262463,FR +1475262464,1475266559,DE +1475266560,1475268607,GB +1475268608,1475270655,CS +1475270656,1475272703,GB +1475272704,1475274751,BE +1475274752,1475276799,IT +1475276800,1475278847,ES +1475278848,1475280895,DK +1475280896,1475282943,PL +1475282944,1475284991,NL +1475284992,1475287039,GB +1475287040,1475289087,RU +1475291136,1475293183,PL +1475293184,1475295231,GB +1475295232,1475297279,PL +1475297280,1475299327,DK +1475299328,1475301375,PL +1475301376,1475303423,LT +1475303424,1475305471,PL +1475305472,1475307519,NL +1475307520,1475309567,RU +1475309568,1475311615,LT +1475311616,1475313663,FI +1475313664,1475317759,DE +1475317760,1475319807,RU +1475319808,1475321855,BG +1475321856,1475323903,RO +1475323904,1475327999,PL +1475328000,1475330047,NL +1475330048,1475332095,PL +1475332096,1475334143,LI +1475334144,1475336191,CH +1475336192,1475338239,PL +1475338240,1475340287,RO +1475340288,1475342335,GR +1475342336,1475344383,PL +1475344384,1475346431,RO +1475346432,1475362815,RU +1475362816,1475379199,FR +1475379200,1475395583,GB +1475395584,1475411967,LU +1475411968,1475412471,IT +1475412472,1475412479,ES +1475412480,1475421239,IT +1475421240,1475421247,FR +1475421248,1475428351,IT +1475428352,1475444735,SE +1475444736,1475461119,AM +1475461120,1475477503,RU +1475477504,1475493887,HU +1475493888,1475510271,RU +1475510272,1475543039,GB +1475543040,1475559423,DE +1475559424,1475575807,GR +1475575808,1475592191,AT +1475592192,1475608575,GB +1475608576,1475624959,RU +1475624960,1475639263,GB +1475639264,1475639271,BB +1475639272,1475641343,GB +1475641344,1475657727,UA +1475657728,1475664263,SK +1475664264,1475664271,UA +1475664272,1475674111,SK +1475674112,1475690495,DE +1475690496,1475706879,CH +1475706880,1475723263,RU +1475723264,1475725311,GB +1475725312,1475725951,RU +1475725952,1475729407,GB +1475729408,1475731455,UA +1475731456,1475739647,GB +1475739648,1475756031,BG +1475756032,1475772415,GB +1475772416,1475788799,LV +1475788800,1475805183,PL +1475805184,1475821567,KZ +1475821568,1475837951,LT +1475837952,1475846143,GB +1475846144,1475854335,IR +1475854336,1475862527,AT +1475862528,1475866623,IT +1475866624,1475868671,GB +1475868672,1475870719,BG +1475870720,1475878911,NO +1475878912,1475887103,IT +1475887104,1475895295,PL +1475895296,1475895551,GB +1475895552,1475897343,IE +1475897344,1475899903,GB +1475899904,1475901439,IE +1475901440,1475903487,CH +1475903488,1475911679,IR +1475911680,1475919871,MD +1475919872,1475928063,GB +1475928064,1475952639,RU +1475952640,1475953151,AE +1475953152,1475955199,GB +1475955200,1475955839,NG +1475955840,1475955967,GH +1475955968,1475956223,GB +1475956224,1475956607,NG +1475956608,1475956735,GH +1475956736,1475957503,GB +1475957504,1475957759,IN +1475957760,1475958015,AF +1475958016,1475959039,GB +1475959040,1475959047,US +1475959048,1475960831,GB +1475960832,1475969023,NL +1475969024,1475977215,CZ +1475977216,1475985407,SE +1475985408,1475993599,PL +1475993600,1476009983,RU +1476009984,1476016127,CS +1476016128,1476016383,RS +1476016384,1476018175,CS +1476018176,1476026367,IT +1476026368,1476034559,BA +1476034560,1476042751,NL +1476042752,1476050943,PL +1476050944,1476067327,RU +1476067328,1476075519,TR +1476075520,1476083711,NL +1476083712,1476116479,RU +1476116480,1476124671,SE +1476124672,1476132863,PL +1476132864,1476141055,FR +1476141056,1476149247,GB +1476149248,1476157439,NO +1476157440,1476165375,BH +1476165376,1476165631,JO +1476165632,1476173823,HR +1476173824,1476182015,BG +1476182016,1476190207,IE +1476190208,1476198399,BY +1476198400,1476206591,RU +1476206592,1476214783,GE +1476214784,1476222975,SE +1476222976,1476231167,IT +1476231168,1476239359,NL +1476239360,1476247551,DE +1476247552,1476263935,RU +1476263936,1476272127,GB +1476272128,1476280319,NO +1476280320,1476288511,GB +1476288512,1476296703,LU +1476296704,1476304895,RU +1476304896,1476313087,BG +1476313088,1476315135,FI +1476315136,1476316159,US +1476316160,1476321279,FI +1476321280,1476329471,MC +1476329472,1476337663,RU +1476337664,1476345855,NL +1476345856,1476354047,MD +1476354048,1476357119,KE +1476358144,1476362239,KE +1476362240,1476370431,FR +1476370432,1476378623,SE +1476378624,1476386815,KZ +1476386816,1476395007,RU +1476395008,1478492159,ES +1478492160,1480589311,IT +1480589312,1481637887,DE +1481637888,1481646079,SE +1481646080,1481654271,RU +1481654272,1481662463,IT +1481662464,1481678847,BG +1481678848,1481679743,SE +1481679744,1481679775,GB +1481679776,1481680639,SE +1481680640,1481680643,GB +1481680644,1481687039,SE +1481687040,1481690591,DE +1481690592,1481690623,MA +1481690624,1481695231,DE +1481695232,1481703423,SK +1481703424,1481711615,SA +1481711616,1481719807,AT +1481719808,1481727999,CZ +1481728000,1481736191,IE +1481736192,1481744383,GB +1481744384,1481752575,IT +1481752576,1481760767,RU +1481760768,1481768959,UA +1481768960,1481777151,GB +1481777152,1481785343,BE +1481785344,1481793535,RU +1481793536,1481801727,LI +1481801728,1481809919,GB +1481809920,1481818111,RU +1481818112,1481826303,ES +1481826304,1481834495,DE +1481834496,1481842687,GL +1481842688,1481850879,SE +1481850880,1481859071,DK +1481859072,1481867263,GB +1481867264,1481875455,SE +1481875456,1481883647,CZ +1481883648,1481891839,RU +1481891840,1481893119,CZ +1481893120,1481893375,SK +1481893376,1481893631,CZ +1481893632,1481893887,SK +1481893888,1481900031,CZ +1481900032,1481908223,CH +1481908224,1481916415,NO +1481916416,1481924607,ES +1481924608,1481932799,SA +1481932800,1481940991,DE +1481940992,1481949183,NO +1481949184,1481957375,RU +1481957376,1481965567,SE +1481965568,1481973759,CH +1481973760,1481981951,FO +1481981952,1481984127,NL +1481984128,1481984255,PA +1481984256,1481984383,NL +1481984384,1481984511,GI +1481984512,1481984639,CY +1481984640,1481985023,NL +1481985024,1481985279,MT +1481985280,1481987967,NL +1481987968,1481988031,PA +1481988032,1481988095,NL +1481988096,1481988159,GI +1481988160,1481988167,RU +1481988168,1481988319,NL +1481988320,1481988335,BZ +1481988336,1481988351,NL +1481988352,1481988607,GB +1481988608,1481990143,NL +1481990144,1481998335,MK +1481998336,1482006527,FI +1482006528,1482022911,RU +1482022912,1482031103,SA +1482031104,1482039295,SY +1482039296,1482047487,SE +1482047488,1482055679,RU +1482055680,1482063871,CZ +1482063872,1482072063,FI +1482072064,1482076159,IT +1482076160,1482076223,CH +1482076224,1482076383,IT +1482076384,1482076415,MT +1482076416,1482080255,IT +1482080256,1482088447,RU +1482088448,1482096639,FR +1482096640,1482104831,BG +1482104832,1482113023,NO +1482113024,1482121215,RU +1482121216,1482127123,IT +1482127124,1482127127,TR +1482127128,1482129407,IT +1482129408,1482137599,ES +1482137600,1482145791,IE +1482145792,1482153983,ES +1482153984,1482162175,HU +1482162176,1482686463,NO +1482686464,1482948607,GB +1482948608,1483210751,CZ +1483210752,1483735039,GB +1483735040,1483997183,FI +1483997184,1484038223,AT +1484038224,1484038227,SA +1484038228,1484038243,AT +1484038244,1484038247,AE +1484038248,1484038251,AT +1484038252,1484038255,IQ +1484038256,1484038391,AT +1484038392,1484038399,IQ +1484038400,1484128255,AT +1484128256,1484259327,LT +1484259328,1484783615,FR +1484783616,1484849151,DE +1484849152,1484914687,SE +1484914688,1484980223,DE +1484980224,1485045759,SE +1485045760,1485111295,HU +1485111296,1485242367,DE +1485242368,1485307903,GB +1485307904,1485832191,FR +1485832192,1485963263,GB +1485963264,1486028799,CZ +1486028800,1486061567,BE +1486061568,1486094335,RU +1486094336,1486127103,ES +1486127104,1486159871,FI +1486159872,1486192639,IS +1486192640,1486211687,IT +1486211688,1486211695,GB +1486211696,1486225407,IT +1486225408,1486258175,DE +1486258176,1486290943,CS +1486290944,1486290959,IE +1486290960,1486291071,GB +1486291072,1486291103,IE +1486291104,1486291199,GB +1486291200,1486291215,IE +1486291216,1486291455,GB +1486291456,1486291487,IE +1486291488,1486292991,GB +1486292992,1486295039,RU +1486295040,1486297087,ES +1486297088,1486299135,IE +1486299136,1486301183,NL +1486301184,1486301951,DK +1486301952,1486302719,SE +1486302720,1486302863,DK +1486302864,1486302879,SE +1486302880,1486303231,DK +1486303232,1486305023,IS +1486305024,1486305279,GB +1486305280,1486307327,NO +1486307328,1486309375,DE +1486309376,1486311423,AT +1486311424,1486313471,IE +1486313472,1486317567,HU +1486317568,1486320383,RU +1486320384,1486320639,US +1486320640,1486321663,RU +1486321824,1486321855,US +1486321856,1486321887,NL +1486321888,1486321919,US +1486323200,1486323215,US +1486323216,1486323231,NL +1486323232,1486323239,GB +1486323712,1486325759,RU +1486325760,1486327807,SA +1486327808,1486329855,GB +1486329856,1486331903,FR +1486331904,1486331919,NL +1486331920,1486333951,NO +1486333952,1486335999,SE +1486336000,1486338047,KZ +1486338048,1486340095,RU +1486340096,1486342143,AZ +1486342144,1486344191,RU +1486344192,1486346239,NO +1486346240,1486348287,GB +1486348288,1486350335,US +1486350336,1486352383,TR +1486352384,1486353535,BE +1486353536,1486353663,NL +1486353664,1486354431,BE +1486354432,1486356479,RU +1486356480,1486487551,DE +1486487552,1486618623,UA +1486618624,1486684159,PL +1486684160,1486749695,PT +1486749696,1486815231,RO +1486815232,1486880767,NL +1486880768,1488977919,FR +1488977920,1489240063,FI +1489240064,1489305599,EE +1489305600,1489338367,GR +1489338368,1489371135,BE +1489371136,1489402239,DE +1489402240,1489402367,TR +1489402368,1489436671,DE +1489436672,1489502207,PL +1489502208,1489534975,SI +1489534976,1489567743,RU +1489567744,1489600511,BH +1489600512,1489633279,RU +1489633280,1489635327,IT +1489635328,1489635838,GB +1489635839,1489636863,IT +1489636864,1489637119,FR +1489637120,1489637887,IT +1489637888,1489638399,GB +1489638400,1489638655,IT +1489638656,1489638911,FR +1489638912,1489640703,IT +1489640704,1489640959,FR +1489640960,1489642495,IT +1489642496,1489642751,FR +1489642752,1489644543,IT +1489644544,1489645055,GB +1489645056,1489645567,IT +1489645568,1489646335,GB +1489646336,1489646591,IT +1489646592,1489646847,GB +1489646848,1489647103,IT +1489647104,1489647359,GB +1489647360,1489648639,IT +1489648640,1489648895,GB +1489648896,1489649407,IT +1489649408,1489650687,FR +1489650688,1489661951,IT +1489661952,1489662719,GB +1489662720,1489662975,ZA +1489662976,1489663487,FR +1489663488,1489663999,ES +1489664000,1489664511,LY +1489664512,1489665023,IT +1489665024,1489665279,ZA +1489665280,1489666047,IT +1489666048,1489698815,GB +1489698816,1489731583,MT +1489731584,1489764351,BG +1489764352,1489797119,RU +1489797120,1489829887,KZ +1489829888,1489862655,DE +1489862656,1489928191,RU +1489928192,1489960959,SE +1489960960,1489993727,HR +1489993728,1490026495,LU +1490026496,1490028543,US +1490028544,1490029055,UA +1490029056,1490041855,NL +1490041856,1490049879,CZ +1490049880,1490049887,AT +1490049888,1490049919,CZ +1490049920,1490049983,PL +1490049984,1490050031,CZ +1490050032,1490050047,SK +1490050048,1490053375,CZ +1490053376,1490054143,PL +1490054144,1490059263,CZ +1490059264,1490075647,DE +1490075648,1490092031,GB +1490092032,1490108415,DE +1490108416,1490124799,MC +1490124800,1490157567,HU +1490157568,1490173951,RU +1490173952,1490190335,PT +1490190336,1490196479,GB +1490196480,1490196735,AL +1490196736,1490196991,CZ +1490196992,1490197247,IE +1490197248,1490206719,GB +1490206720,1490223103,GE +1490223104,1490255871,GB +1490255872,1490272255,NL +1490272256,1490288639,GB +1490288640,1490305023,SK +1490305024,1490321407,DK +1490321408,1490337791,GB +1490337792,1490354175,RU +1490354176,1490386943,SA +1490386944,1490403327,IT +1490403328,1490419711,BG +1490419712,1490436095,DE +1490436096,1490452479,UA +1490452480,1490468863,PT +1490468864,1490472447,GB +1490472448,1490472703,US +1490472704,1490473983,GB +1490473984,1490474239,US +1490474240,1490484223,GB +1490484224,1490484479,US +1490484480,1490501631,GB +1490501632,1490518015,DE +1490518016,1490534399,RU +1490534400,1490550783,DE +1490550784,1490616319,LT +1490616320,1490681855,DE +1490681856,1490747391,GR +1490747392,1490812927,FR +1490812928,1490878463,PL +1490878464,1490879487,DE +1490879488,1490880511,US +1490880512,1490881535,FR +1490882560,1490883583,US +1490885632,1490886655,US +1490904064,1490905087,US +1490909184,1490910207,US +1490913280,1490915327,US +1490915328,1490917375,IT +1490917376,1490919423,IL +1490927616,1490929663,FR +1490931712,1490933759,DE +1490934528,1490934783,IL +1490935040,1490935295,ES +1490944000,1491075071,LT +1491075072,1493172223,TR +1493303296,1493434367,FR +1493434368,1493565439,SA +1493565440,1493696511,ES +1493696512,1493958655,NO +1493958656,1494220799,DE +1494220800,1494228991,FR +1494228992,1494237183,RU +1494237184,1494245375,IE +1494245376,1494253567,RU +1494253568,1494261759,DE +1494261760,1494269951,GB +1494269952,1494278143,AT +1494278144,1494286335,GB +1494286336,1494294527,HR +1494294528,1494302719,RU +1494302720,1494310911,FI +1494310912,1494319103,GB +1494319104,1494327295,MT +1494327296,1494335487,IT +1494335488,1494343679,ES +1494343680,1494351871,PL +1494351872,1494360063,RO +1494360064,1494368255,HR +1494368256,1494376447,IE +1494376448,1494384639,SE +1494384640,1494392831,RU +1494392832,1494399487,NL +1494399488,1494399743,US +1494399744,1494401023,NL +1494401024,1494409215,LV +1494409216,1494417407,FI +1494417408,1494425599,TR +1494425600,1494433791,RU +1494433792,1494441983,IE +1494441984,1494450175,UA +1494450176,1494458367,DK +1494458368,1494474751,RU +1494474752,1494477471,DE +1494477472,1494477503,IL +1494477504,1494482943,DE +1494482944,1494499327,RU +1494499328,1494507519,NL +1494507520,1494523903,RU +1494523904,1494532095,NL +1494532096,1494540287,GB +1494540288,1494548479,NO +1494548480,1494556671,GB +1494556672,1494564863,DE +1494564864,1494573055,UA +1494573056,1494581247,RO +1494581248,1494589439,RU +1494589440,1494589695,NL +1494589696,1494589723,IQ +1494589724,1494596351,NL +1494596352,1494596607,US +1494596608,1494597119,NL +1494597120,1494597375,US +1494597376,1494597631,NL +1494597632,1494605823,RU +1494605824,1494614015,GB +1494745088,1494810623,CZ +1494810624,1494843391,BG +1494843392,1494876159,PL +1494876160,1494908927,AT +1494908928,1494941695,PT +1494941696,1494974463,FI +1494974464,1495007231,DE +1495007232,1495039999,MD +1495040000,1495042047,KZ +1495042048,1495044095,DE +1495044096,1495046143,FR +1495046144,1495048191,BH +1495048192,1495050239,RU +1495050240,1495052287,GB +1495052288,1495054335,IE +1495054336,1495056383,GB +1495056384,1495058431,RU +1495058432,1495060479,UA +1495060480,1495062527,GB +1495062528,1495064575,JO +1495064576,1495066623,DE +1495066624,1495068671,GB +1495068672,1495070719,DE +1495070720,1495072767,RU +1495072768,1495105535,CZ +1495105536,1495138303,ES +1495138304,1495139327,FR +1495139584,1495139591,GB +1495139712,1495139839,GB +1495139840,1495140095,ES +1495140352,1495150847,FR +1495150848,1495151103,GB +1495151104,1495151359,NL +1495151360,1495154687,FR +1495162368,1495162879,US +1495162880,1495163903,FR +1495164416,1495164671,FR +1495164928,1495165055,FR +1495165184,1495165199,FR +1495165208,1495165215,ES +1495165440,1495168383,FR +1495168512,1495168767,FR +1495168768,1495169023,GB +1495169024,1495170079,FR +1495170160,1495170175,FR +1495170304,1495170335,FR +1495170560,1495170815,FR +1495170816,1495171071,GB +1495171072,1495203839,NL +1495203840,1495205887,DE +1495205888,1495207935,CZ +1495207936,1495209983,RU +1495209984,1495212031,KZ +1495212032,1495214079,DE +1495214080,1495216127,CZ +1495216128,1495218175,GB +1495218176,1495220223,IT +1495220224,1495222271,PL +1495222272,1495224319,IT +1495224320,1495228415,RU +1495228416,1495230463,NL +1495230464,1495234559,RU +1495234560,1495236607,CH +1495236608,1495237711,AT +1495237712,1495237727,NL +1495237728,1495238655,AT +1495238656,1495240703,DE +1495240704,1495240751,FR +1495240752,1495240759,BE +1495240760,1495240767,CH +1495240768,1495242751,FR +1495242752,1495244799,MK +1495244800,1495246847,CZ +1495246848,1495248895,IE +1495248896,1495250943,GR +1495250944,1495252991,RU +1495252992,1495255039,BH +1495255040,1495257087,IT +1495257088,1495259135,GB +1495259136,1495261183,BE +1495261184,1495263231,PT +1495263232,1495265279,GB +1495265280,1495265791,DE +1495265792,1495267327,RU +1495267328,1495269375,SE +1495269376,1495326719,RO +1495326720,1495330815,MD +1495330816,1495334911,RO +1495334912,1495335935,MD +1495335936,1495399935,RO +1495399936,1495400191,MD +1495400192,1495623679,RO +1495623680,1495623935,MD +1495623936,1495647743,RO +1495647744,1495648255,MD +1495648256,1495752703,RO +1495752704,1495754751,ES +1495754752,1495801855,RO +1495801856,1495802879,GB +1495802880,1495875583,RO +1495875584,1495891967,MD +1495891968,1495937023,RO +1495937024,1495937535,ES +1495937536,1496078335,RO +1496078336,1496079359,MD +1496079360,1496121343,RO +1496121344,1496122367,MD +1496122368,1496178943,RO +1496178944,1496179199,AE +1496179200,1496317951,RO +1496317952,1497366527,DE +1497366528,1498415103,PL +1498415104,1499463679,FR +1499463680,1499594751,IT +1499594752,1499725823,NL +1499725824,1499856895,IE +1499856896,1499987967,CZ +1499987968,1499996159,AT +1499996160,1500004351,GB +1500004352,1500020735,RU +1500020736,1500028927,IS +1500028928,1500037119,NL +1500037120,1500045311,DK +1500045312,1500061695,GB +1500061696,1500069887,NO +1500069888,1500078079,IT +1500078080,1500086271,GB +1500086272,1500094463,RU +1500094464,1500102655,AT +1500102656,1500103935,NL +1500103936,1500103967,VG +1500103968,1500104063,NL +1500104064,1500104071,DE +1500104072,1500110847,NL +1500110848,1500119039,UA +1500119040,1500127231,TR +1500127232,1500135423,RU +1500135424,1500135555,DE +1500135556,1500135559,CH +1500135560,1500140560,DE +1500140561,1500140564,AT +1500140565,1500140568,CH +1500140569,1500143615,DE +1500143616,1500151807,BG +1500151808,1500153855,GB +1500153856,1500155903,IE +1500155904,1500157951,GB +1500157952,1500159999,DE +1500160000,1500162047,NL +1500162048,1500164095,RU +1500164096,1500166143,GB +1500166144,1500168191,FR +1500168192,1500170239,RU +1500170240,1500172287,LU +1500172288,1500174335,AT +1500174336,1500176383,DE +1500176384,1500178431,GB +1500178432,1500180479,KZ +1500180480,1500182527,BE +1500182528,1500184575,RU +1500184576,1500186623,GB +1500186624,1500188671,KW +1500188672,1500190719,GB +1500190720,1500194815,RU +1500194816,1500196863,GB +1500196864,1500198911,ES +1500198912,1500200959,GB +1500200960,1500203007,DE +1500203008,1500205055,GB +1500205056,1500207103,RU +1500207104,1500209151,IT +1500209152,1500211199,KZ +1500211200,1500211711,RU +1500211712,1500212223,JO +1500212224,1500217343,RU +1500217344,1500217599,CZ +1500217600,1500218111,DE +1500218112,1500218367,CZ +1500218368,1500219391,DE +1500221440,1500223487,SK +1500223488,1500225535,PL +1500225536,1500227583,DE +1500227584,1500229631,FR +1500229632,1500231679,ES +1500231680,1500233727,DE +1500233728,1500237823,RU +1500237824,1500241919,SE +1500241920,1500243008,TR +1500243009,1500243038,GB +1500243039,1500243967,TR +1500243968,1500246015,GB +1500246016,1500248063,ES +1500248064,1500250111,HU +1500250112,1500266495,SA +1500266496,1500282879,RU +1500282880,1500299263,LB +1500299264,1500315647,PL +1500315648,1500332031,RU +1500332032,1500348415,PT +1500348416,1500397567,RU +1500397568,1500399615,UA +1500399616,1500413951,RU +1500413952,1500430335,DE +1500430336,1500430847,RS +1500430848,1500431359,CS +1500431360,1500433407,RS +1500433408,1500433919,CS +1500433920,1500434447,RS +1500434448,1500434463,CS +1500434464,1500434567,RS +1500434568,1500434623,CS +1500434624,1500435199,RS +1500435200,1500435455,CS +1500435456,1500435967,RS +1500435968,1500436479,CS +1500436480,1500437055,RS +1500437056,1500437087,CS +1500437088,1500437183,RS +1500437184,1500437247,CS +1500437248,1500438527,RS +1500438528,1500446719,CS +1500446720,1500463103,LV +1500463104,1500479487,CZ +1500479488,1500495871,RU +1500495872,1500512255,BA +1500512256,1500643327,RU +1500643328,1500774399,RO +1500774400,1500905471,LT +1500905472,1501036543,IT +1501036544,1501298687,RO +1501298688,1501560831,IE +1501560832,1501822975,ES +1501822976,1502085119,HU +1502085120,1502216191,RO +1502216192,1502347263,IL +1502347264,1502478335,ES +1502478336,1502609407,SI +1502609408,1502610175,AT +1502610176,1502625791,DE +1502625792,1502642175,SA +1502642176,1502658559,IR +1502658560,1502674943,AT +1502674944,1502691327,DE +1502691328,1502692415,GB +1502692416,1502692479,ES +1502692480,1502707711,GB +1502707712,1502724095,RU +1502724096,1502740479,GB +1502740480,1502756863,NL +1502756864,1502773247,UZ +1502773248,1502789631,BA +1502789632,1502791551,DE +1502791552,1502791679,PL +1502791680,1502793503,DE +1502793504,1502793511,NL +1502793512,1502794239,DE +1502794240,1502794495,NL +1502794496,1502806015,DE +1502806016,1502822399,SA +1502822400,1502838783,HU +1502838784,1502855167,SE +1502855168,1502871551,AZ +1502871552,1502887935,BH +1502887936,1502904319,HU +1502904320,1502920703,IT +1502920704,1502937087,RU +1502937088,1502953471,RO +1502953472,1502969855,MD +1502969856,1502975231,US +1502975232,1502975247,DE +1502975248,1502975263,IE +1502975264,1502975311,DE +1502975312,1502975319,IE +1502975320,1502975327,DE +1502975328,1502975375,IE +1502975376,1502975383,DE +1502975384,1502975391,ES +1502975392,1502975423,DE +1502975424,1502975455,GB +1502975456,1502975487,IE +1502975488,1502975743,ES +1502975744,1502975775,IE +1502975776,1502975999,DE +1502976000,1502977055,US +1502977056,1502979103,DE +1502979104,1502979111,ES +1502979112,1502979119,DE +1502979120,1502979215,ES +1502979216,1502980095,DE +1502980096,1502980159,US +1502980160,1502980351,DE +1502980352,1502980871,US +1502980872,1502981119,DE +1502981120,1502981887,US +1502981888,1502982143,NL +1502982144,1502986255,DE +1502986256,1502986495,TR +1502986496,1502986511,DE +1502986512,1502986751,PL +1502986752,1502987775,DE +1502987776,1502988031,TR +1502988032,1502989055,DE +1502989056,1502989567,TR +1502989568,1502990847,DE +1502990848,1502991103,PL +1502991104,1502991359,DE +1502991360,1502991615,PL +1502991616,1502993919,DE +1502993920,1502994431,PL +1502994432,1502994687,DE +1502994688,1502994943,PL +1502994944,1502995967,DE +1502995968,1502996479,PL +1502996480,1502996735,DE +1502996736,1502997247,PL +1502997248,1502997503,LT +1502997504,1502997759,CN +1502997760,1503000063,DE +1503000064,1503000319,PL +1503000320,1503000831,DE +1503000832,1503001343,PL +1503001344,1503002623,DE +1503002624,1503019007,GE +1503019008,1503051775,DK +1503051776,1503068159,SE +1503068160,1503084543,PL +1503084544,1503100927,GB +1503100928,1503117311,RU +1503117312,1503133695,NO +1503133696,1503395839,PT +1503395840,1503657983,FR +1503657984,1503690751,SE +1503690752,1503723519,IS +1503723520,1503789055,PL +1503789056,1503821823,NO +1503821824,1503854591,UA +1503854592,1503887359,RU +1503887360,1503902975,DE +1503902976,1503903231,FI +1503903232,1503908351,DE +1503908352,1503909375,IT +1503909376,1503920127,DE +1503920128,1503985663,HR +1503985664,1504018431,IR +1504018432,1504051199,RO +1504051200,1504083967,FI +1504083968,1504116735,DE +1504116736,1504149503,PL +1504149504,1504152127,GB +1504152128,1504152191,IE +1504152192,1504152447,GB +1504152448,1504152575,IE +1504152576,1504153855,GB +1504153856,1504154111,IE +1504154112,1504154623,GB +1504154624,1504155647,IE +1504155648,1504156927,GB +1504156928,1504157183,IE +1504157184,1504160255,GB +1504160256,1504161023,IE +1504161024,1504161279,GB +1504161280,1504161535,IE +1504161536,1504164607,GB +1504164608,1504164863,IE +1504164864,1504169983,GB +1504169984,1504170239,IE +1504170240,1504171007,GB +1504171008,1504171263,PT +1504171264,1504171775,GB +1504171776,1504172031,US +1504172032,1504173055,GB +1504173056,1504173311,IE +1504173312,1504174591,GB +1504174592,1504175103,IE +1504175104,1504175615,GB +1504175616,1504175871,IE +1504175872,1504176383,GB +1504176384,1504176639,IE +1504176640,1504178431,GB +1504178432,1504178687,IE +1504178688,1504247807,GB +1504247808,1504313343,RU +1504313344,1504378879,FR +1504378880,1504444415,PL +1504444416,1504509951,HR +1504509952,1504575487,SK +1504575488,1504641023,PL +1504641024,1504706559,RU +1504706560,1504837631,CZ +1504837632,1504968703,RU +1504968704,1505099775,PT +1505099776,1505230847,DE +1505230848,1505239039,RU +1505239040,1505247231,IE +1505247232,1505255423,UA +1505255424,1505263615,IT +1505263616,1505271807,DK +1505271808,1505273087,NL +1505273088,1505273095,NZ +1505273096,1505279999,NL +1505280000,1505296383,RU +1505296384,1505304575,UA +1505304576,1505306303,FR +1505306304,1505306319,ES +1505306320,1505306335,DE +1505306336,1505306351,GB +1505306352,1505306367,IT +1505306368,1505312767,FR +1505312768,1505320959,RU +1505320960,1505329151,AT +1505329152,1505337343,GB +1505337344,1505345535,FR +1505345536,1505353727,MK +1505353728,1505359663,CZ +1505359664,1505359671,SK +1505359672,1505359675,CZ +1505359676,1505359679,SK +1505359680,1505359759,CZ +1505359760,1505359775,SK +1505359776,1505361919,CZ +1505361920,1505370111,PL +1505370112,1505378303,SM +1505378304,1505386495,IT +1505386496,1505394687,HU +1505394688,1505402879,DE +1505402880,1505411071,DK +1505411072,1505419263,BG +1505419264,1505427455,RU +1505427456,1505435647,UA +1505435648,1505443839,MD +1505443840,1505454367,GB +1505454368,1505454375,US +1505454376,1505454383,GB +1505454384,1505454391,US +1505454392,1505454399,SG +1505454400,1505454463,GB +1505454464,1505454495,AU +1505454496,1505454511,GB +1505454512,1505454527,DE +1505454528,1505454543,NZ +1505454544,1505454911,GB +1505454912,1505454943,CZ +1505454944,1505454975,GB +1505454976,1505455102,US +1505455103,1505456127,GB +1505456128,1505456255,US +1505456256,1505456639,GB +1505456640,1505456895,US +1505456896,1505460223,GB +1505460224,1505476607,CZ +1505476608,1505484799,RU +1505484800,1505492991,PL +1505492992,1505501183,NL +1505501184,1505505279,ME +1505505280,1505509375,CS +1505509376,1505517567,SA +1505517568,1505525759,RU +1505525760,1505533951,IT +1505533952,1505542143,RU +1505542144,1505550335,PL +1505550336,1505566719,RU +1505566720,1505574911,IT +1505574912,1505583103,YE +1505583104,1505591295,HU +1505591296,1505607679,RU +1505607680,1505615871,SE +1505615872,1505624063,SA +1505624064,1505632255,FI +1505632256,1505648639,CZ +1505648640,1505656831,LT +1505656832,1505665023,BH +1505665024,1505668263,IT +1505668264,1505668267,DE +1505668268,1505670615,IT +1505670616,1505670623,US +1505670624,1505673215,IT +1505673216,1505681407,BG +1505681408,1505689599,RU +1505689600,1505697791,NO +1505697792,1505705983,IE +1505705984,1505714175,DE +1505714176,1505722367,LV +1505722368,1505738751,PL +1505738752,1505746943,GB +1505746944,1505755135,RU +1505755136,1506017279,GB +1506017280,1506279423,DE +1506279424,1506312191,NL +1506312192,1506316287,GB +1506316288,1506322431,PL +1506322432,1506324479,DE +1506324480,1506328575,RU +1506328576,1506330623,FI +1506330624,1506332671,NL +1506332672,1506334719,PL +1506334720,1506336767,GB +1506336768,1506338815,PL +1506338816,1506340863,UA +1506340864,1506342911,RO +1506342912,1506344959,UA +1506344960,1506377727,LV +1506377728,1506410495,HR +1506410496,1506427663,DE +1506427664,1506427679,GB +1506427680,1506438911,DE +1506438912,1506439039,US +1506439040,1506439935,DE +1506439936,1506440191,US +1506440192,1506440447,DE +1506440448,1506440575,US +1506440576,1506440703,DE +1506440704,1506440711,US +1506440712,1506440719,FR +1506440720,1506440735,US +1506440736,1506440767,GB +1506440768,1506440799,US +1506440800,1506440831,DE +1506440832,1506440959,US +1506440960,1506440991,FR +1506440992,1506440999,US +1506441000,1506441007,GB +1506441008,1506441023,US +1506441024,1506441087,HK +1506441088,1506441215,CA +1506441216,1506441343,US +1506441344,1506441407,HK +1506441408,1506441495,DE +1506441496,1506441503,GB +1506441504,1506441535,US +1506441536,1506441599,DE +1506441600,1506441631,US +1506441632,1506441655,DE +1506441656,1506441663,GB +1506441664,1506441671,NL +1506441672,1506441679,CA +1506441680,1506441695,DE +1506441696,1506441727,CA +1506441728,1506442239,MU +1506442240,1506442383,US +1506442384,1506442399,GB +1506442400,1506442415,FR +1506442416,1506442427,US +1506442428,1506442431,DE +1506442432,1506442463,HK +1506442464,1506442623,DE +1506442624,1506442655,GB +1506442656,1506442687,US +1506442688,1506442703,GB +1506442704,1506442711,US +1506442712,1506442715,NL +1506442716,1506442719,US +1506442720,1506442735,GB +1506442736,1506442743,DE +1506442744,1506442751,US +1506442752,1506442879,DE +1506442880,1506442911,GB +1506442912,1506442919,DE +1506442920,1506442923,GB +1506442924,1506442927,NL +1506442928,1506442975,US +1506442976,1506442991,DE +1506442992,1506442999,GB +1506443000,1506443003,IE +1506443004,1506443151,DE +1506443152,1506443159,US +1506443160,1506443167,DE +1506443168,1506443183,NL +1506443184,1506443199,DE +1506443200,1506443263,US +1506443264,1506444287,GB +1506444288,1506445311,DE +1506445312,1506445519,FR +1506445520,1506445527,GB +1506445528,1506445703,FR +1506445704,1506445711,NL +1506445712,1506445719,GB +1506445720,1506445791,FR +1506445792,1506445807,GB +1506445808,1506446335,FR +1506446336,1506447359,NL +1506447360,1506448383,IT +1506448384,1506448639,AT +1506448640,1506448647,GB +1506448648,1506448663,AT +1506448664,1506448671,GB +1506448672,1506448719,AT +1506448720,1506448727,GB +1506448728,1506448735,AT +1506448736,1506448895,GB +1506448896,1506449167,BE +1506449168,1506449171,GB +1506449172,1506449391,BE +1506449392,1506449407,GB +1506449408,1506449663,NL +1506449664,1506449919,SK +1506449920,1506449927,CH +1506449928,1506449951,GB +1506449952,1506450431,CH +1506450432,1506450767,CZ +1506450768,1506450775,GB +1506450776,1506450783,CZ +1506450784,1506450847,GB +1506450848,1506450943,CZ +1506450944,1506451007,DK +1506451008,1506451199,GB +1506451200,1506451895,ES +1506451896,1506451903,GB +1506451904,1506451967,ES +1506451968,1506452031,GB +1506452032,1506452223,ES +1506452224,1506452479,GB +1506452480,1506452735,US +1506452736,1506452767,RO +1506452768,1506452991,GB +1506452992,1506453247,AT +1506453248,1506453391,SE +1506453392,1506453399,ES +1506453400,1506453439,SE +1506453440,1506453503,GB +1506453504,1506453759,DE +1506453760,1506454015,FR +1506454016,1506454271,GB +1506454272,1506454527,ES +1506454528,1506455039,US +1506455040,1506455295,GB +1506455296,1506455551,IT +1506455552,1506455807,US +1506455808,1506456063,AE +1506456064,1506456319,HU +1506456320,1506456575,IT +1506456576,1506456831,GB +1506456832,1506457087,IT +1506457088,1506458239,GB +1506458240,1506458623,CH +1506458624,1506459135,GB +1506459136,1506459647,BE +1506459648,1506460339,FR +1506460340,1506460343,GB +1506460344,1506460671,FR +1506460672,1506460927,AT +1506460928,1506461311,IT +1506461312,1506461327,FR +1506461328,1506461351,IT +1506461352,1506461359,FR +1506461360,1506461695,IT +1506461696,1506462207,FR +1506462208,1506462463,ES +1506462464,1506462719,FR +1506462720,1506463231,IT +1506463232,1506463487,SE +1506463488,1506463999,DE +1506464000,1506464895,GB +1506464896,1506465087,NL +1506465088,1506465151,DE +1506465152,1506465279,NL +1506465280,1506465791,GB +1506465792,1506466047,DE +1506466048,1506466303,BE +1506466304,1506466351,DE +1506466352,1506466367,GB +1506466368,1506466559,DE +1506466560,1506467071,GB +1506467072,1506467327,DE +1506467328,1506467583,GB +1506467584,1506468351,IT +1506468352,1506468607,GB +1506468608,1506468863,TZ +1506468864,1506469383,IT +1506469384,1506469391,GB +1506469392,1506469399,IT +1506469400,1506469407,GB +1506469408,1506469439,IT +1506469440,1506469503,GB +1506469504,1506470143,IT +1506470144,1506470399,GB +1506470400,1506470655,DE +1506470656,1506471679,IT +1506471680,1506471935,GB +1506471936,1506471975,NL +1506471976,1506472191,GB +1506472192,1506472447,IT +1506472448,1506472959,GB +1506472960,1506473215,IT +1506473216,1506473471,GB +1506473472,1506474271,IT +1506474272,1506474303,SE +1506474304,1506474495,IT +1506474496,1506474751,FR +1506474752,1506475519,IT +1506475520,1506476031,AT +1506476032,1506508799,KW +1506508800,1506541567,CZ +1506541568,1506574335,RU +1506574336,1506582527,DE +1506582528,1506607103,IE +1506607104,1506639871,MK +1506639872,1506672639,NL +1506672640,1506689023,PL +1506689024,1506705407,CH +1506705408,1506740223,GB +1506740224,1506742271,FI +1506742272,1506743167,SE +1506743168,1506743183,DE +1506743184,1506743199,FR +1506743200,1506743215,IE +1506743216,1506743232,GB +1506743233,1506744319,SE +1506744320,1506746367,NL +1506746368,1506750463,RU +1506750464,1506752511,GB +1506752512,1506754559,IE +1506754560,1506758655,RU +1506758656,1506760703,IT +1506760704,1506764799,RU +1506764800,1506766847,IT +1506766848,1506766903,NO +1506766904,1506768895,GE +1506768896,1506770943,AT +1506770944,1506772991,NL +1506772992,1506775039,GB +1506775040,1506777087,AT +1506777088,1506781695,GB +1506781696,1506781951,IE +1506781952,1506783231,GB +1506783232,1506785279,RU +1506785280,1506787327,UA +1506787328,1506789375,KW +1506789376,1506791423,DE +1506791424,1506793471,GB +1506793472,1506795519,RU +1506795520,1506797567,IE +1506797568,1506799615,ES +1506799616,1506801663,LV +1506801664,1506803135,DE +1506803136,1506803151,CH +1506803152,1506803711,DE +1506803712,1506869247,RU +1506869248,1506934783,UA +1506934784,1507000319,GR +1507000320,1507065855,QA +1507065856,1507131391,SI +1507131392,1507196927,GB +1507196928,1507262463,PT +1507262464,1507327999,BG +1507328000,1507336191,RS +1507336192,1507336511,CS +1507336512,1507336959,RS +1507336960,1507337727,SR +1507337728,1507341727,RS +1507341728,1507341743,CS +1507341744,1507342959,RS +1507342960,1507342967,CS +1507342968,1507343071,RS +1507343072,1507343103,CS +1507343104,1507360767,RS +1507360768,1507377151,CS +1507377152,1507393535,RS +1507393536,1507459071,CH +1507459072,1507524607,KZ +1507524608,1507590143,EE +1507590144,1507655679,NL +1507655680,1507659775,DE +1507659776,1507663871,RU +1507663872,1507664127,IT +1507664128,1507664383,GR +1507664384,1507664767,DE +1507664768,1507664895,US +1507664896,1507665407,GR +1507665408,1507665663,IT +1507665664,1507666431,US +1507666432,1507666559,GR +1507666560,1507666591,FR +1507666592,1507666623,GR +1507666624,1507666687,IT +1507666688,1507666943,GB +1507666944,1507667455,IT +1507667456,1507667711,DE +1507667712,1507667967,US +1507667968,1507672063,RU +1507672064,1507676159,EE +1507676160,1507680255,IR +1507680256,1507684351,NO +1507684352,1507688447,LV +1507688448,1507696639,IT +1507696640,1507700735,DK +1507700736,1507704831,NL +1507704832,1507708927,RU +1507708928,1507713023,CZ +1507713024,1507717119,RU +1507717120,1507717631,SE +1507717632,1507718911,NO +1507718912,1507721215,SE +1507721216,1507753983,GB +1507753984,1507819519,RU +1507819520,1507852287,HU +1507852288,1508114431,FR +1508114432,1508376575,PL +1508376576,1508392959,GE +1508392960,1508442111,RU +1508442112,1508458495,DK +1508458496,1508474879,RU +1508474880,1508479263,CZ +1508479264,1508479295,GB +1508479296,1508486463,CZ +1508486464,1508486527,DE +1508486528,1508491263,CZ +1508491264,1508507647,SE +1508507648,1508521535,GB +1508521536,1508521551,IE +1508521552,1508524031,GB +1508524032,1508540415,IE +1508540416,1508556799,FR +1508556800,1508573183,PL +1508573184,1508573255,CZ +1508573256,1508573259,SK +1508573260,1508589567,CZ +1508589568,1508605951,IR +1508605952,1508622335,RU +1508622336,1508638719,EE +1508638720,1508639231,SE +1508639232,1508640767,DK +1508640768,1508641279,SE +1508641280,1508641535,DK +1508641536,1508642175,SE +1508642176,1508642303,DK +1508642304,1508642559,SE +1508642560,1508642815,DK +1508642816,1508646911,SE +1508646912,1508646927,DK +1508646928,1508648447,SE +1508648448,1508648703,DK +1508648704,1508651007,SE +1508651008,1508651135,DK +1508651136,1508652543,SE +1508652544,1508654079,DK +1508654080,1508655103,SE +1508655104,1508671487,FI +1508671488,1508687871,CH +1508687872,1508704255,UZ +1508704256,1508720639,RU +1508720640,1508737023,FR +1508737024,1508753407,SA +1508753408,1508769791,KG +1508769792,1508786175,PL +1508786176,1508787199,DE +1508787200,1508787455,ES +1508787456,1508788031,DE +1508788032,1508788063,BE +1508788064,1508802559,DE +1508802560,1508803183,GB +1508803184,1508803199,FR +1508803200,1508804783,GB +1508804784,1508804791,DE +1508804792,1508805119,GB +1508805120,1508805375,NL +1508805376,1508818943,GB +1508818944,1508835327,RO +1508835328,1508851711,CZ +1508851712,1508868095,PL +1508868096,1508884479,RU +1508884480,1508900863,DK +1508900864,1509163007,GB +1509163008,1509425151,DE +1509425152,1509429247,NO +1509429248,1509433343,GB +1509433344,1509437439,CH +1509437440,1509445631,GB +1509445632,1509449727,LV +1509449728,1509453823,ES +1509453824,1509457919,RU +1509457920,1509462015,GB +1509462016,1509465599,LI +1509465600,1509466111,CH +1509466112,1509466302,NL +1509466303,1509466366,BZ +1509466367,1509466879,NL +1509466880,1509466911,IN +1509466912,1509467055,NL +1509467056,1509467103,SE +1509467104,1509467399,NL +1509467400,1509467407,PL +1509467408,1509467423,NL +1509467424,1509467455,PL +1509467456,1509467487,NL +1509467488,1509467519,PL +1509467520,1509467583,BE +1509467584,1509467839,NL +1509467840,1509467871,PL +1509467872,1509469439,NL +1509469440,1509469567,SE +1509469568,1509469887,NL +1509469888,1509469919,MY +1509469920,1509469951,NL +1509469952,1509470079,RU +1509470080,1509470207,NL +1509470208,1509478399,RU +1509478400,1509482495,FR +1509482496,1509486591,RU +1509486592,1509490687,CZ +1509490688,1509494783,DK +1509494784,1509498879,RU +1509498880,1509501151,CH +1509501152,1509501159,GB +1509501160,1509502975,CH +1509502976,1509507071,RU +1509507072,1509511167,GB +1509511168,1509515263,LT +1509515264,1509519359,HR +1509519360,1509531647,RU +1509531648,1509535743,GB +1509535744,1509539839,RU +1509539840,1509543935,AM +1509543936,1509548031,LB +1509548032,1509564415,RU +1509564416,1509568511,GB +1509568512,1509572607,FI +1509572608,1509576703,NL +1509576704,1509580799,KZ +1509580800,1509584895,CZ +1509584896,1509588479,NO +1509588480,1509588607,GB +1509588608,1509588751,NO +1509588752,1509588767,GB +1509588768,1509588991,NO +1509588992,1509593087,DE +1509593088,1509601279,RU +1509601280,1509605375,NL +1509605376,1509609471,PL +1509609472,1509617663,RU +1509617664,1509621759,CZ +1509621760,1509624319,NL +1509624320,1509624831,US +1509624832,1509625855,NL +1509625856,1509629951,UA +1509629952,1509634047,HU +1509634048,1509638143,FR +1509638144,1509642239,RU +1509642240,1509644351,KW +1509644352,1509644383,GB +1509644384,1509646335,KW +1509646336,1509650431,RU +1509650432,1509654527,GB +1509654528,1509658623,DE +1509658624,1509666815,RU +1509666816,1509670911,IT +1509670912,1509675007,GB +1509675008,1509679103,NO +1509679104,1509683199,ES +1509683200,1509687295,CH +1509687296,1509703679,UA +1509703680,1509720063,RU +1509720064,1509736447,TR +1509736448,1509752831,BG +1509752832,1509769215,RU +1509769216,1509785599,SE +1509785600,1509801983,BG +1509801984,1509818367,RU +1509818368,1509851135,NO +1509851136,1509867519,LV +1509867520,1509883903,RU +1509883904,1509900287,NL +1509900288,1509916671,RU +1509916672,1509933055,GB +1509933056,1509949439,US +1509949440,1515467007,FR +1515467008,1515467263,ES +1515467264,1515519743,FR +1515519744,1515519871,ES +1515519872,1518338047,FR +1518338048,1518370815,DE +1518370816,1518403583,NL +1518403584,1518419967,LU +1518419968,1518436351,PL +1518436352,1518437375,BE +1518437376,1518452735,SE +1518452736,1518460927,AT +1518460928,1518469119,PL +1518469120,1518501887,SE +1518501888,1518502911,EE +1518502912,1518503935,SE +1518503936,1518504959,LT +1518504960,1518505983,SE +1518505984,1518508031,LT +1518508032,1518510079,SE +1518510080,1518514175,LV +1518514176,1518731263,SE +1518731264,1518927871,DE +1518927872,1518944255,RU +1518944256,1518961663,SE +1518961664,1518962175,EE +1518962176,1518962687,LV +1518962688,1518964735,NO +1518964736,1518966783,HR +1518966784,1518993407,SE +1518993408,1519124479,RU +1519124480,1519222783,PL +1519222784,1519321087,SE +1519321088,1519386623,RU +1519386624,1519452159,FR +1519452160,1519517695,NL +1519517696,1519583231,AT +1519583232,1519648767,IT +1519648768,1519714303,SA +1519714304,1519779839,NO +1519779840,1519910911,RU +1519910912,1519927295,GB +1519927296,1519927311,FR +1519927312,1519927319,BE +1519927320,1519927327,FR +1519927328,1519927335,ES +1519927336,1519927343,CH +1519927344,1519927351,AT +1519927352,1519927375,NL +1519927376,1519927383,CH +1519927384,1519927399,NL +1519927400,1519927407,FR +1519927408,1519927415,AT +1519927416,1519927423,BE +1519927424,1519927431,LU +1519927432,1519927439,NL +1519927440,1519927447,CH +1519927448,1519927463,FR +1519927464,1519927471,IT +1519927472,1519927479,NL +1519927480,1519927503,FR +1519927504,1519927511,NL +1519927512,1519927527,ES +1519927528,1519927535,NL +1519927536,1519927543,FR +1519927544,1519927551,IE +1519927552,1519927559,SE +1519927560,1519927567,IT +1519927568,1519927575,GB +1519927576,1519927583,FR +1519927584,1519927591,AT +1519927592,1519927607,BE +1519927608,1519927615,FR +1519927616,1519927631,NL +1519927632,1519927639,CH +1519927640,1519927647,BE +1519927648,1519927655,FR +1519927656,1519927663,NL +1519927664,1519927671,IT +1519927672,1519927679,FI +1519927680,1519927687,IE +1519927688,1519927695,IT +1519927696,1519927719,NL +1519927720,1519927727,ES +1519927728,1519927735,FR +1519927736,1519927743,NL +1519927744,1519927751,ES +1519927752,1519927759,IT +1519927760,1519927767,ES +1519927768,1519927775,NL +1519927776,1519927783,FR +1519927784,1519927823,GB +1519927824,1519927831,BE +1519927832,1519927855,GB +1519927856,1519927863,DK +1519927864,1519927871,FI +1519927872,1519927879,NL +1519927880,1519927895,GB +1519927896,1519927903,NL +1519927904,1519928119,GB +1519928120,1519928143,NO +1519928144,1519928151,NL +1519928152,1519928183,DK +1519928184,1519928191,GB +1519928192,1519928199,SE +1519928200,1519928247,GB +1519928248,1519928255,DK +1519928256,1519929279,GB +1519929280,1519929287,NL +1519929288,1519929343,GB +1519929344,1519929471,NL +1519929472,1519929503,FI +1519929504,1519929567,NL +1519929568,1519929599,FI +1519929600,1519929759,NL +1519929760,1519929791,CZ +1519929792,1519929792,GB +1519929793,1519929823,SE +1519929824,1519929855,DK +1519929856,1519929951,SE +1519929952,1519930111,BE +1519930112,1519930207,NL +1519930208,1519930239,BE +1519930240,1519930271,NL +1519930272,1519930335,DK +1519930336,1519930367,SE +1519930368,1519930399,DK +1519930400,1519930527,NL +1519930528,1519930559,NO +1519930560,1519930591,SE +1519930592,1519930655,NO +1519930656,1519930751,NL +1519930752,1519930783,BE +1519930784,1519930911,NL +1519930912,1519930943,CZ +1519930944,1519930975,BE +1519930976,1519931007,NL +1519931008,1519931039,BE +1519931040,1519931071,DK +1519931072,1519931103,NO +1519931104,1519931135,SE +1519931136,1519931231,NL +1519931232,1519931263,NO +1519931264,1519931391,GB +1519931392,1519934463,NL +1519934464,1519934975,GB +1519934976,1519935487,NL +1519935488,1519935615,FR +1519935616,1519935743,NL +1519935744,1519935935,FI +1519935936,1519936191,BE +1519936192,1519936255,DK +1519936256,1519936383,NL +1519936384,1519936447,BE +1519936448,1519936511,NO +1519936512,1519936575,SK +1519936576,1519936767,DK +1519936768,1519936895,SE +1519936896,1519937023,BE +1519937024,1519937279,DK +1519937280,1519937343,NL +1519937344,1519937407,SE +1519937408,1519937471,NO +1519937472,1519937535,GB +1519937536,1519937727,NL +1519937728,1519938559,GB +1519938560,1519939583,NL +1519939584,1519939615,NO +1519939616,1519939647,NL +1519939648,1519939679,SE +1519939680,1519939711,SK +1519939712,1519939743,NL +1519939744,1519939807,BE +1519939808,1519939839,NL +1519939840,1519940095,GB +1519940096,1519940159,NL +1519940160,1519940191,FI +1519940192,1519940223,SE +1519940224,1519943679,GB +1519943680,1519976447,AT +1519976448,1520009215,DE +1520009216,1520041983,SY +1520041984,1520074751,RU +1520074752,1520107519,BG +1520107520,1520140287,GB +1520140288,1520173055,RU +1520173056,1520205823,PL +1520205824,1520230399,RU +1520230400,1520230911,NL +1520230912,1520231423,RU +1520231424,1520232191,NL +1520232192,1520232447,RU +1520232448,1520233471,NL +1520233472,1520271359,RU +1520271360,1520304127,SI +1520304128,1520435199,TR +1520435200,1521483775,ES +1521483776,1522008063,CZ +1522008064,1522139135,DK +1522139136,1522270207,DE +1522270208,1522401279,RU +1522401280,1522532351,EE +1522532352,1524629503,GB +1524629504,1525678079,SE +1525678080,1526726655,GB +1526726656,1531183103,DE +1531183104,1531445247,FR +1531445248,1531707391,AE +1531707392,1531969535,RU +1531969536,1532100607,IT +1532100608,1532231679,HU +1532231680,1532362751,GB +1532362752,1532493823,BE +1532493824,1532559359,FR +1532559360,1532624895,DE +1532624896,1532626943,ES +1532626944,1532631039,UA +1532631040,1532633087,SE +1532633088,1532635135,RU +1532635136,1532637183,NO +1532637184,1532639231,FI +1532639232,1532641279,PL +1532641280,1532643327,NO +1532643328,1532645375,PL +1532645376,1532647423,RU +1532647424,1532649471,PL +1532649472,1532651519,FR +1532651520,1532653567,NO +1532653568,1532655615,PL +1532655616,1532657663,RO +1532657664,1532661759,IL +1532661760,1532665855,DE +1532665856,1532674047,PL +1532674048,1532682239,UA +1532682240,1532690431,LV +1532690432,1532755967,FR +1532755968,1532821503,BG +1532821504,1532887039,TR +1532887040,1532952575,PL +1532952576,1533018111,SE +1533018112,1533149183,DE +1533149184,1533280255,IR +1533280256,1533411327,DK +1533411328,1533413375,GB +1533413376,1533415423,NO +1533415424,1533417471,SA +1533417472,1533419519,NO +1533419520,1533419775,KW +1533419776,1533420031,SA +1533420032,1533420287,KW +1533420288,1533420543,AE +1533420544,1533421567,KW +1533423616,1533425663,IT +1533425664,1533428479,GB +1533428480,1533428735,US +1533428736,1533429759,GB +1533429760,1533431807,IT +1533431808,1533433855,IE +1533433856,1533435903,DK +1533435904,1533437951,CZ +1533437952,1533439999,RU +1533440000,1533441519,PL +1533441520,1533441535,CH +1533441536,1533442047,PL +1533442048,1533444095,AE +1533444096,1533446143,IT +1533446144,1533448191,DE +1533448192,1533450239,KW +1533450240,1533452287,RU +1533452288,1533454335,TR +1533454336,1533456383,CS +1533456384,1533458431,UA +1533458432,1533460479,GB +1533460480,1533462527,NL +1533462528,1533464575,RU +1533464576,1533466623,NL +1533466624,1533468671,RU +1533468672,1533470719,CS +1533470720,1533472767,KW +1533472768,1533474815,ES +1533474816,1533476863,FR +1533476864,1533478911,IE +1533478912,1533480959,CS +1533480960,1533483007,NL +1533483008,1533485055,AM +1533485056,1533485567,GB +1533485568,1533485823,DE +1533485824,1533486335,SE +1533486336,1533486591,NO +1533486592,1533486847,DK +1533486848,1533487103,FI +1533487104,1533487359,FR +1533487360,1533487615,US +1533487616,1533487871,JP +1533487872,1533489151,FR +1533489152,1533491199,IT +1533491200,1533493247,AM +1533493248,1533499391,RU +1533499392,1533501439,MT +1533501440,1533503487,LT +1533503488,1533505535,RU +1533505536,1533507583,DE +1533507584,1533509631,UA +1533509632,1533511679,GB +1533511680,1533512383,FR +1533512384,1533512447,DE +1533512448,1533513215,FR +1533513216,1533513471,GB +1533513472,1533513727,DE +1533513728,1533515775,KW +1533515776,1533517823,RU +1533517824,1533519871,CZ +1533519872,1533526015,GB +1533526016,1533532159,RU +1533532160,1533534207,GB +1533534208,1533536255,RU +1533536256,1533538303,FR +1533538304,1533540351,DE +1533540352,1533542399,AT +1533542400,1534066687,GB +1534066688,1534129151,AT +1534129152,1534129407,AE +1534129408,1534328831,AT +1534328832,1534459903,ES +1534459904,1534590975,AT +1534590976,1534656511,HU +1534656512,1534711807,FR +1534711808,1534712831,BE +1534712832,1534713903,FR +1534713904,1534713919,BE +1534713920,1534714015,FR +1534714016,1534714031,DE +1534714032,1534714047,BE +1534714048,1534714063,FR +1534714064,1534714111,BE +1534714112,1534714127,ES +1534714128,1534714143,BE +1534714144,1534714223,FR +1534714224,1534714239,ES +1534714240,1534714255,FR +1534714256,1534714271,DE +1534714272,1534714303,FR +1534714304,1534714319,PL +1534714320,1534714335,FR +1534714336,1534714351,ES +1534714352,1534714367,GB +1534714368,1534714383,ES +1534714384,1534714399,FR +1534714400,1534714415,ES +1534714416,1534714431,GB +1534714432,1534714447,FR +1534714448,1534714463,DE +1534714464,1534714495,GB +1534714496,1534714511,FR +1534714512,1534714527,PL +1534714528,1534714559,FR +1534714560,1534714575,BE +1534714576,1534714703,FR +1534714704,1534714719,CH +1534714720,1534714751,BE +1534714752,1534714767,DE +1534714768,1534714783,FR +1534714784,1534714799,PL +1534714800,1534714879,FR +1534714880,1534714895,PL +1534714896,1534714911,FR +1534714912,1534714927,DE +1534714928,1534715039,FR +1534715040,1534715055,GB +1534715056,1534715071,PL +1534715072,1534715135,FR +1534715136,1534715151,PL +1534715152,1534715167,FR +1534715168,1534715183,GB +1534715184,1534715263,FR +1534715264,1534715279,ES +1534715280,1534715295,FR +1534715296,1534715327,ES +1534715328,1534715375,FR +1534715376,1534715391,ES +1534715392,1534715407,PL +1534715408,1534715423,ES +1534715424,1534715487,FR +1534715488,1534715503,ES +1534715504,1534715519,CH +1534715520,1534715551,FR +1534715552,1534715599,ES +1534715600,1534715615,BE +1534715616,1534715631,FR +1534715632,1534715647,ES +1534715648,1534715663,PL +1534715664,1534715679,ES +1534715680,1534715743,FR +1534715744,1534715759,PL +1534715760,1534715791,ES +1534715792,1534715807,FR +1534715808,1534715839,PL +1534715840,1534715871,FR +1534715872,1534715887,DE +1534715888,1534715919,FR +1534715920,1534715935,ES +1534715936,1534716047,FR +1534716048,1534716063,GB +1534716064,1534716175,FR +1534716176,1534716191,GB +1534716192,1534716239,FR +1534716240,1534716255,GB +1534716256,1534716511,FR +1534716512,1534716527,DE +1534716528,1534716543,FR +1534716544,1534716559,GB +1534716560,1534716591,FR +1534716592,1534716607,PL +1534716608,1534716671,FR +1534716672,1534716687,PL +1534716688,1534716703,FR +1534716704,1534716735,ES +1534716736,1534716847,FR +1534716848,1534716863,PL +1534716864,1534716879,FR +1534716880,1534716895,BE +1534716896,1534716927,FR +1534716928,1534716943,DE +1534716944,1534716991,FR +1534716992,1534717007,DE +1534717008,1534717023,FR +1534717024,1534717055,PL +1534717056,1534717071,ES +1534717072,1534717119,FR +1534717120,1534717135,IT +1534717136,1534717199,FR +1534717200,1534717215,DE +1534717216,1534717231,PL +1534717232,1534717263,FR +1534717264,1534717279,ES +1534717280,1534717311,FR +1534717312,1534717327,BE +1534717328,1534717343,FR +1534717344,1534717359,GB +1534717360,1534717375,DE +1534717376,1534717503,FR +1534717504,1534717519,DE +1534717520,1534717535,FR +1534717536,1534717551,DE +1534717552,1534717567,FR +1534717568,1534717583,PL +1534717584,1534717663,FR +1534717664,1534717679,GB +1534717680,1534717695,FR +1534717696,1534717759,PL +1534717760,1534717839,ES +1534717840,1534717855,GB +1534717856,1534717871,DE +1534717872,1534717919,FR +1534717920,1534717935,ES +1534717936,1534717951,FR +1534717952,1534717967,BE +1534717968,1534717983,IT +1534717984,1534717999,FR +1534718000,1534718015,ES +1534718016,1534718031,BE +1534718032,1534718063,FR +1534718064,1534718095,ES +1534718096,1534718127,FR +1534718128,1534718143,ES +1534718144,1534718207,FR +1534718208,1534718271,ES +1534718272,1534718399,FR +1534718400,1534718415,ES +1534718416,1534718431,FR +1534718432,1534718447,GB +1534718448,1534718559,FR +1534718560,1534718575,BE +1534718576,1534718623,FR +1534718624,1534718639,GB +1534718640,1534718751,FR +1534718752,1534718767,GB +1534718768,1534718783,ES +1534718784,1534718799,FR +1534718800,1534718815,ES +1534718816,1534718847,GB +1534718848,1534718911,FR +1534718912,1534718927,IT +1534718928,1534718943,FR +1534718944,1534718959,PL +1534718960,1534718975,ES +1534718976,1534719039,FR +1534719040,1534719167,BE +1534719168,1534719215,PL +1534719216,1534719311,FR +1534719312,1534719327,GB +1534719328,1534719359,FR +1534719360,1534719391,ES +1534719392,1534719423,FR +1534719424,1534719455,ES +1534719456,1534719471,FR +1534719472,1534719487,GB +1534719488,1534719647,FR +1534719648,1534719663,GB +1534719664,1534719679,PL +1534719680,1534719695,GB +1534719696,1534719759,FR +1534719760,1534719775,IT +1534719776,1534719871,FR +1534719872,1534719887,PL +1534719888,1534719903,ES +1534719904,1534719951,FR +1534719952,1534719967,GB +1534719968,1534719999,FR +1534720000,1534720015,PL +1534720016,1534720031,GB +1534720032,1534720047,DE +1534720048,1534720063,ES +1534720064,1534720079,IT +1534720080,1534720095,GB +1534720096,1534720111,FR +1534720112,1534720127,ES +1534720128,1534720175,FR +1534720176,1534720191,BE +1534720192,1534720207,FR +1534720208,1534720223,GB +1534720224,1534720255,BE +1534720256,1534720287,PL +1534720288,1534720367,FR +1534720368,1534720415,GB +1534720416,1534720447,FR +1534720448,1534720463,GB +1534720464,1534720479,FR +1534720480,1534720495,GB +1534720496,1534720511,PL +1534720512,1534720575,FR +1534720576,1534720591,ES +1534720592,1534720607,CH +1534720608,1534720639,FR +1534720640,1534720655,GB +1534720656,1534720671,PL +1534720672,1534720703,FR +1534720704,1534720735,PL +1534720736,1534720751,FR +1534720752,1534720767,GB +1534720768,1534720783,ES +1534720784,1534720799,BE +1534720800,1534720815,PL +1534720816,1534720831,FR +1534720832,1534720863,PL +1534720864,1534720959,FR +1534720960,1534720975,ES +1534720976,1534721119,FR +1534721120,1534721135,IT +1534721136,1534721151,CH +1534721152,1534721231,FR +1534721232,1534721247,DE +1534721248,1534721263,FR +1534721264,1534721279,ES +1534721280,1534721311,FR +1534721312,1534721327,GB +1534721328,1534721343,FR +1534721344,1534721359,ES +1534721360,1534721375,FR +1534721376,1534721391,ES +1534721392,1534721407,GB +1534721408,1534721439,DE +1534721440,1534721455,BE +1534721456,1534721503,FR +1534721504,1534721519,CH +1534721520,1534721535,DE +1534721536,1534721567,FR +1534721568,1534721583,GB +1534721584,1534721615,FR +1534721616,1534721647,GB +1534721648,1534721663,CH +1534721664,1534721679,ES +1534721680,1534721759,FR +1534721760,1534721775,GB +1534721776,1534721791,ES +1534721792,1534721807,BE +1534721808,1534721855,FR +1534721856,1534721887,ES +1534721888,1534721903,FR +1534721904,1534721919,DE +1534721920,1534721935,FR +1534721936,1534721951,PL +1534721952,1534721983,FR +1534721984,1534721999,PL +1534722000,1534722015,FR +1534722016,1534722031,ES +1534722032,1534722047,BE +1534722048,1534787583,RU +1534787584,1534791679,RO +1534791680,1534795775,RU +1534795776,1534803967,NO +1534803968,1534808063,LV +1534808064,1534812159,RU +1534812160,1534816255,CH +1534816256,1534820351,FR +1534820352,1534824447,FI +1534824448,1534828543,UA +1534828544,1534836735,PL +1534836736,1534840831,SE +1534840832,1534844927,PL +1534844928,1534849023,IE +1534849024,1534853119,NL +1534853120,1534918655,UA +1534918656,1534984191,GB +1534984192,1535018231,SE +1535018232,1535018239,ES +1535018240,1535018487,SE +1535018488,1535018495,ES +1535018496,1535018743,SE +1535018744,1535018751,ES +1535018752,1535018971,SE +1535018972,1535019519,ES +1535019520,1535033343,SE +1535033344,1535043583,ES +1535043584,1535049727,SE +1535049728,1535115263,SK +1535115264,1535377407,AT +1535377408,1535442943,GR +1535442944,1535508479,FI +1535508480,1535574015,BG +1535574016,1535578111,GB +1535578112,1535582207,LV +1535582208,1535590399,NO +1535590400,1535594495,CH +1535594496,1535598591,LV +1535598592,1535602687,IL +1535602688,1535606783,HU +1535606784,1535610879,NO +1535610880,1535614975,RU +1535614976,1535619071,AT +1535619072,1535623167,FR +1535623168,1535627263,KZ +1535627264,1535631359,RU +1535631360,1535635455,GB +1535635456,1535639551,AZ +1535639552,1535672319,CA +1535672320,1535705087,DE +1535705088,1535737855,CH +1535737856,1535769855,HU +1535769856,1535770623,SR +1535770624,1535803391,CH +1535803392,1535836159,GR +1535836160,1535868927,HU +1535868928,1535901695,BG +1535901696,1535934463,GR +1535934464,1535967231,KW +1535967232,1535999999,AT +1536000000,1536032767,NL +1536032768,1536036863,LV +1536036864,1536040959,AT +1536040960,1536045055,GB +1536045056,1536045567,DE +1536045568,1536046079,IQ +1536046080,1536046591,DE +1536046592,1536046847,IQ +1536046848,1536046975,DE +1536046976,1536047039,SA +1536047040,1536047103,IQ +1536047104,1536047615,LB +1536047616,1536047871,IQ +1536047872,1536047999,DE +1536048000,1536048127,SA +1536048128,1536048255,AE +1536048256,1536048319,DE +1536048320,1536048383,IQ +1536048384,1536048639,DE +1536048640,1536048671,FR +1536048672,1536048703,LU +1536048704,1536048719,IQ +1536048720,1536048720,LB +1536048721,1536049151,DE +1536049152,1536053247,NL +1536053248,1536057343,RU +1536057344,1536061439,IE +1536061440,1536065535,SE +1536065536,1536069631,LU +1536069632,1536073727,RU +1536073728,1536077823,UA +1536077824,1536081919,SE +1536081920,1536086015,PL +1536086016,1536090111,ES +1536090112,1536094207,IE +1536094208,1536098303,NL +1536098304,1536114687,RU +1536114688,1536118783,GB +1536118784,1536122879,DE +1536122880,1536126975,AT +1536126976,1536131071,DK +1536131072,1536143359,RU +1536143360,1536147455,GB +1536147456,1536151551,IT +1536151552,1536155647,CS +1536155648,1536159743,IL +1536159744,1536163839,DE +1536163840,1536180223,SY +1536180224,1536196607,HU +1536196608,1536212991,RU +1536212992,1536229375,DK +1536229376,1536245759,SE +1536245760,1536262143,FI +1536262144,1536278527,PL +1536278528,1536294911,UA +1536294912,1536327679,RU +1536327680,1536344063,HU +1536344064,1536360447,PL +1536360448,1536376831,RU +1536376832,1536393215,KZ +1536393216,1536409599,SA +1536409600,1536425983,HU +1536425984,1536442367,SK +1536442368,1536453903,CS +1536453904,1536454655,RS +1536454656,1536455679,CS +1536455680,1536455935,RS +1536455936,1536458751,CS +1536458752,1536475135,BG +1536475136,1536491519,NL +1536491520,1536499711,NO +1536499712,1536503807,SE +1536503808,1536507903,NO +1536507904,1536524287,RU +1536524288,1536540671,BY +1536540672,1536557055,PL +1536557056,1536573439,FI +1536573440,1536574719,CS +1536574720,1536574975,RS +1536574976,1536575615,CS +1536575616,1536575727,RS +1536575728,1536575743,CS +1536575744,1536576511,RS +1536576512,1536580607,CS +1536580608,1536580767,RS +1536580768,1536580775,CS +1536580776,1536580807,RS +1536580808,1536580815,CS +1536580816,1536580863,RS +1536580864,1536589823,CS +1536589824,1536614399,PL +1536614400,1536622591,DK +1536622592,1536626687,GB +1536626688,1536630783,IT +1536630784,1536634879,RU +1536634880,1536643071,FR +1536643072,1536647167,TR +1536647168,1536647434,ES +1536647435,1536647435,PT +1536647436,1536651263,ES +1536651264,1536655359,FR +1536655360,1536659455,GE +1536659456,1536659743,DE +1536659744,1536659751,IQ +1536659752,1536659759,NG +1536659760,1536659775,BI +1536659776,1536659807,IQ +1536659808,1536659823,SD +1536659824,1536659839,IQ +1536659840,1536659935,DE +1536659936,1536659967,MR +1536659968,1536659975,EG +1536659976,1536659991,DE +1536659992,1536660003,EG +1536660004,1536660007,SO +1536660008,1536660015,DE +1536660016,1536660019,KW +1536660020,1536660023,DE +1536660024,1536660031,IR +1536660032,1536660039,MR +1536660040,1536660223,DE +1536660224,1536660479,AE +1536660480,1536660735,DE +1536660736,1536660991,SA +1536660992,1536662015,MR +1536662016,1536662271,AE +1536662272,1536662303,SO +1536662304,1536662311,IR +1536662312,1536662335,LB +1536662336,1536662351,AE +1536662352,1536662359,TD +1536662360,1536662367,IR +1536662368,1536662399,IQ +1536662400,1536662431,DE +1536662432,1536662527,IQ +1536662528,1536662783,AE +1536662784,1536663039,SA +1536663040,1536663295,AE +1536663296,1536663319,DE +1536663320,1536663327,LB +1536663328,1536663335,CV +1536663336,1536663359,DE +1536663360,1536663391,IQ +1536663392,1536663551,DE +1536663552,1536667647,SA +1536667648,1536675839,RU +1536675840,1536679935,GB +1536679936,1536684031,LB +1536684032,1536688127,RU +1536688128,1537212415,FI +1537212416,1538260991,FR +1538260992,1538785279,BE +1538785280,1538793471,NL +1538793472,1538797567,DE +1538797568,1538799551,NL +1538799552,1538799615,DE +1538799616,1538801663,NL +1538801664,1538809855,IR +1538809856,1538818047,GE +1538818048,1538826239,NO +1538826240,1538834431,DE +1538834432,1538842623,CY +1538842624,1538850815,RU +1538850816,1538859007,KZ +1538859008,1538875391,RU +1538875392,1538875719,CS +1538875720,1538875903,RS +1538875904,1538875967,CS +1538875968,1538876159,RS +1538876160,1538878207,CS +1538878208,1538878463,RS +1538878464,1538879487,CS +1538879488,1538883583,RS +1538883584,1538891775,BE +1538891776,1538899967,DE +1538899968,1538901167,SI +1538901168,1538901175,IT +1538901176,1538902063,SI +1538902064,1538902079,NZ +1538902080,1538908159,SI +1538908160,1538916351,RU +1538916352,1538924543,GB +1538924544,1538932735,DE +1538932736,1538940927,NO +1538940928,1538949119,RU +1538949120,1538957311,AT +1538957312,1538961535,DE +1538961536,1538961599,IT +1538961600,1538965503,DE +1538965504,1538973695,IR +1538973696,1538981887,JO +1538981888,1538990079,BY +1538990080,1538998271,CZ +1538998272,1539006463,AD +1539006464,1539022847,CS +1539022848,1539031039,LT +1539031040,1539039231,IT +1539039232,1539047423,PL +1539047424,1539048447,IT +1539048448,1539048455,LY +1539048456,1539048463,IT +1539048464,1539048471,AT +1539048472,1539048511,IT +1539048512,1539048519,LY +1539048520,1539048543,IT +1539048544,1539048575,LY +1539048576,1539048639,IT +1539048640,1539048687,IQ +1539048688,1539049223,IT +1539049224,1539049231,IQ +1539049232,1539049239,LY +1539049240,1539049255,IT +1539049256,1539049263,LY +1539049264,1539049279,IT +1539049280,1539049295,LY +1539049296,1539049311,GL +1539049312,1539049335,LY +1539049336,1539050367,IT +1539050368,1539050375,FR +1539050376,1539050383,IT +1539050384,1539050399,FR +1539050400,1539050407,IT +1539050408,1539050415,AL +1539050416,1539055471,IT +1539055472,1539055487,FR +1539055488,1539055615,IT +1539055616,1539063807,LV +1539063808,1539071999,FR +1539072000,1539080191,PL +1539080192,1539088383,UZ +1539088384,1539096575,RU +1539096576,1539112959,TR +1539112960,1539115007,PL +1539115008,1539117055,CH +1539117056,1539123199,PL +1539123200,1539125247,SE +1539125248,1539127295,RU +1539127296,1539129343,PL +1539129344,1539131391,IE +1539131392,1539133439,PL +1539133440,1539135487,RU +1539135488,1539137535,GB +1539137536,1539139583,NL +1539139584,1539141631,FR +1539141632,1539143679,RU +1539143680,1539145727,NO +1539145728,1539147775,UA +1539147776,1539149823,PL +1539149824,1539151871,GB +1539151872,1539155967,RU +1539155968,1539160063,NO +1539160064,1539162111,RU +1539162112,1539164159,DE +1539164160,1539166207,DK +1539166208,1539168255,FI +1539168256,1539170303,PL +1539170304,1539172351,NL +1539172352,1539176447,RU +1539176448,1539178495,PL +1539178496,1539186687,CH +1539186688,1539194879,LV +1539194880,1539203071,RU +1539203072,1539207167,NL +1539207168,1539211263,RU +1539211264,1539211527,CZ +1539211528,1539211531,GB +1539211532,1539211775,CZ +1539211776,1539212031,DE +1539212032,1539212287,CZ +1539212288,1539212543,DE +1539212544,1539213311,CZ +1539213312,1539215359,SE +1539215360,1539219455,DE +1539219456,1539221503,DK +1539221504,1539222271,FR +1539222272,1539222303,HK +1539222304,1539223551,FR +1539223552,1539225599,DE +1539225600,1539227647,HU +1539227648,1539229695,KW +1539229696,1539231743,DE +1539231744,1539233791,BE +1539233792,1539235839,GR +1539235840,1539237887,DE +1539237888,1539239935,RU +1539239936,1539244031,DE +1539244032,1539260415,BA +1539260416,1539276799,SK +1539276800,1539280895,SE +1539280896,1539284991,FR +1539284992,1539287039,DE +1539287040,1539289087,TR +1539289088,1539293183,RU +1539293184,1539297279,AZ +1539297280,1539301375,BG +1539301376,1539309567,RU +1539309568,1539310591,PL +1539310592,1539311615,UA +1539311616,1539312639,NL +1539312640,1539314687,DE +1539314688,1539315711,RU +1539315712,1539316735,UA +1539316736,1539317759,SE +1539317760,1539318783,RU +1539318784,1539319807,NL +1539319808,1539320831,DE +1539320832,1539321855,UA +1539321856,1539322879,EG +1539323904,1539324927,PL +1539324928,1539325951,RU +1539325952,1539326975,KG +1539326976,1539329023,RU +1539329024,1539330047,PL +1539330048,1539331071,RU +1539331072,1539332095,UA +1539332096,1539333119,PL +1539333120,1539335167,RU +1539335168,1539336191,CH +1539336192,1539336703,UA +1539336704,1539337215,EE +1539337216,1539338239,ES +1539338240,1539339263,RU +1539339264,1539340287,NL +1539340288,1539341311,PL +1539341312,1539342335,IT +1539342336,1539345407,UA +1539345408,1539346431,RO +1539346432,1539347455,PL +1539347456,1539348479,RU +1539348480,1539351551,UA +1539351552,1539352575,PL +1539352576,1539354623,RU +1539354624,1539355647,PL +1539355648,1539357695,UA +1539357696,1539358719,RU +1539358720,1539359743,GB +1539359744,1539360767,PL +1539360768,1539361791,IL +1539361792,1539362815,PL +1539362816,1539363839,GB +1539363840,1539364863,DK +1539364864,1539365887,UA +1539365888,1539366911,NO +1539366912,1539368959,PL +1539368960,1539369983,GB +1539369984,1539371007,BG +1539371008,1539373055,RU +1539373056,1539374079,PL +1539374080,1539375103,SE +1539375104,1539376127,NO +1539376128,1539377151,IL +1539377152,1539378175,UA +1539378176,1539379199,PL +1539380224,1539381247,CH +1539381248,1539382271,RS +1539382272,1539383295,PL +1539383296,1539384319,UA +1539384320,1539385343,RU +1539385344,1539385855,PL +1539385856,1539386367,BE +1539386368,1539387391,IT +1539387392,1539388415,IL +1539388416,1539389439,PL +1539389440,1539389951,FR +1539389952,1539390463,RU +1539390464,1539391487,RO +1539391488,1539392511,LV +1539392512,1539393535,UA +1539393536,1539394559,RU +1539394560,1539396607,UA +1539396608,1539397631,PL +1539397632,1539398143,RU +1539398144,1539398655,PL +1539398656,1539399679,ES +1539399680,1539401727,PL +1539401728,1539402751,UA +1539402752,1539403775,RU +1539403776,1539404799,GR +1539404800,1539405823,LV +1539405824,1539406847,PL +1539406848,1539407871,UA +1539407872,1539408895,DE +1539408896,1539409919,CZ +1539409920,1539410943,DK +1539410944,1539411967,RU +1539411968,1539412991,PL +1539412992,1539414015,RU +1539414016,1539415039,UA +1539415040,1539416063,BG +1539416064,1539417087,PL +1539417088,1539418111,UA +1539418112,1539419135,RU +1539419136,1539420159,UA +1539420160,1539421183,RU +1539421184,1539422207,GB +1539422208,1539423231,PL +1539423232,1539424255,IE +1539424256,1539425279,RU +1539425280,1539426303,PL +1539426304,1539427327,BG +1539427328,1539428351,UA +1539428352,1539429375,PL +1539429376,1539434495,RU +1539434496,1539435519,UA +1539435520,1539437567,RU +1539437568,1539439615,GB +1539439616,1539440639,UA +1539440640,1539441663,RU +1539441664,1539442175,US +1539442176,1539442687,DE +1539442688,1539443199,NL +1539443200,1539444223,RU +1539444224,1539444735,FR +1539444736,1539445247,RU +1539445248,1539445759,PL +1539445760,1539446271,FI +1539446272,1539446783,SE +1539446784,1539447295,RU +1539447296,1539447807,SE +1539447808,1539448831,RO +1539448832,1539449343,AT +1539449344,1539449855,UA +1539449856,1539450367,DK +1539450368,1539450879,SE +1539450880,1539451391,NL +1539451392,1539452415,RO +1539452416,1539452927,GB +1539452928,1539453439,CH +1539453440,1539453951,UA +1539453952,1539454463,GB +1539454464,1539454975,RU +1539454976,1539455487,UA +1539455488,1539455999,RU +1539456000,1539456511,FR +1539456512,1539457023,ES +1539457024,1539457535,RU +1539457536,1539458047,SE +1539458048,1539459071,GB +1539459072,1539459583,UA +1539459584,1539460095,GB +1539460096,1539460607,LV +1539460608,1539461631,UA +1539461632,1539462143,RS +1539462144,1539462655,DE +1539462656,1539463167,BE +1539463168,1539463679,UA +1539463680,1539464191,DE +1539464192,1539464703,RO +1539464704,1539465215,DK +1539465216,1539466751,FR +1539466752,1539467263,KW +1539467264,1539467775,RU +1539467776,1539468287,PL +1539468288,1539468799,DE +1539468800,1539469823,RU +1539469824,1539470335,IL +1539470336,1539470847,GB +1539470848,1539471359,SE +1539471360,1539471871,RU +1539471872,1539472383,PL +1539472384,1539472895,UA +1539472896,1539473407,GB +1539473408,1539473919,FR +1539473920,1539474431,KW +1539474432,1539474943,DE +1539474944,1539475455,UA +1539475456,1539475967,NL +1539475968,1539476479,PL +1539476480,1539476991,CZ +1539476992,1539477503,IT +1539477504,1539478015,PL +1539478016,1539478527,CH +1539478528,1539479039,RO +1539479040,1539479551,DK +1539479552,1539480063,GB +1539480064,1539480575,DK +1539480576,1539481087,PL +1539481088,1539481599,GB +1539481600,1539482111,RU +1539482112,1539482623,UA +1539482624,1539483135,RU +1539483136,1539483647,ES +1539483648,1539484159,NL +1539484160,1539484671,GB +1539484672,1539485695,RU +1539485696,1539486207,RO +1539486208,1539486719,FR +1539486720,1539487231,DE +1539487232,1539488255,RU +1539488256,1539488767,SE +1539488768,1539489279,PL +1539489280,1539490815,RU +1539490816,1539491327,CH +1539491328,1539491839,PL +1539491840,1539492351,RU +1539492352,1539492863,BE +1539492864,1539493375,KR +1539493376,1539493887,RU +1539493888,1539494399,FR +1539494400,1539494911,PL +1539494912,1539495423,RU +1539495424,1539495935,UA +1539495936,1539496447,RS +1539496448,1539496959,NL +1539496960,1539497471,GB +1539497472,1539497983,DE +1539497984,1539498495,NL +1539498496,1539499007,RU +1539499008,1539499519,PL +1539499520,1539500543,DE +1539500544,1539501055,RO +1539501056,1539501567,BE +1539501568,1539502079,UA +1539502080,1539502591,PL +1539502592,1539503103,HR +1539503104,1539504127,RU +1539504128,1539504639,AT +1539504640,1539505151,UA +1539505152,1539506175,RU +1539506176,1539506687,NL +1539507200,1539508223,RO +1539508224,1539508735,NO +1539508736,1539509759,UA +1539509760,1539510271,RO +1539510272,1539510783,RU +1539510784,1539511295,LU +1539511296,1539511807,UA +1539511808,1539512319,RU +1539512320,1539512831,BG +1539512832,1539513343,PL +1539513344,1539513855,RO +1539513856,1539514367,RU +1539514368,1539514879,SE +1539514880,1539515391,ES +1539515392,1539515903,FR +1539515904,1539516415,CS +1539516416,1539516927,AT +1539516928,1539517439,PL +1539517440,1539517951,RO +1539517952,1539518463,GB +1539518464,1539518975,DE +1539518976,1539519487,RU +1539519488,1539519999,UA +1539520000,1539520511,DE +1539520512,1539521023,PL +1539521024,1539521535,DK +1539521536,1539522047,RU +1539522048,1539522559,RO +1539522560,1539523071,RU +1539523072,1539523583,RO +1539523584,1539524095,UA +1539524096,1539524607,GR +1539524608,1539525119,FR +1539525120,1539525631,UA +1539525632,1539526143,SE +1539526144,1539526655,DE +1539526656,1539527167,NL +1539527168,1539527679,GB +1539527680,1539528191,RO +1539528192,1539528703,UA +1539528704,1539529215,SA +1539529216,1539529727,UA +1539529728,1539530239,PL +1539530240,1539530751,AT +1539530752,1539531263,UA +1539531264,1539531775,RO +1539531776,1539532799,RU +1539532800,1539533311,DE +1539533312,1539533823,CZ +1539533824,1539534335,PL +1539534336,1539534847,RU +1539534848,1539535359,GB +1539535360,1539535871,RU +1539535872,1539536383,AT +1539536384,1539536895,NL +1539536896,1539537407,UA +1539537408,1539537919,GB +1539537920,1539540479,RU +1539540480,1539540991,PL +1539540992,1539541503,RU +1539541504,1539542015,TR +1539542016,1539542527,DE +1539542528,1539543039,CH +1539543040,1539543551,RO +1539543552,1539544063,SI +1539544064,1539544575,RU +1539544576,1539545087,CH +1539545088,1539545599,GR +1539545600,1539546111,SE +1539546112,1539546623,UA +1539546624,1539547135,PL +1539547136,1539547647,NL +1539547648,1539548159,IL +1539548160,1539548671,FR +1539549184,1539549695,GB +1539549696,1539550207,RU +1539550208,1539550719,UA +1539550720,1539551231,ES +1539551232,1539551743,RS +1539551744,1539552255,RU +1539552256,1539552767,RO +1539552768,1539553279,GB +1539553280,1539553791,UA +1539553792,1539554303,GB +1539554304,1539554815,CH +1539554816,1539555327,PL +1539555328,1539555839,GB +1539555840,1539556863,RO +1539556864,1539557375,AT +1539557376,1539557887,NL +1539557888,1539558399,CZ +1539558400,1539558911,RU +1539558912,1539559423,FR +1539559424,1539560447,RU +1539560448,1539560959,GB +1539560960,1539561471,UA +1539561472,1539561983,RO +1539561984,1539563007,DE +1539563008,1539563519,RU +1539563520,1539564031,SE +1539564032,1539564543,KZ +1539564544,1539565055,GB +1539565056,1539565567,UA +1539565568,1539566079,PL +1539566080,1539567103,NL +1539567104,1539567615,CH +1539567616,1539568127,DE +1539568128,1539568639,NL +1539568640,1539569151,UA +1539569152,1539569663,EE +1539569664,1539570175,UA +1539570176,1539570687,PL +1539570688,1539571711,RU +1539571712,1539572735,UA +1539572736,1539573759,RU +1539573760,1539575807,PL +1539575808,1539576831,LV +1539576832,1539577855,GB +1539577856,1539578879,RU +1539578880,1539579903,PL +1539579904,1539580927,RU +1539580928,1539581951,AM +1539581952,1539582975,RU +1539582976,1539583999,RO +1539584000,1539585023,PL +1539585024,1539586047,UA +1539586048,1539587071,PL +1539587072,1539588095,UA +1539588096,1539589119,BG +1539589120,1539590143,GB +1539590144,1539591167,RU +1539591168,1539592191,UZ +1539592192,1539593215,UA +1539593216,1539594239,IL +1539594240,1539598335,UA +1539598336,1539599359,NL +1539599360,1539600383,PL +1539600384,1539601407,HU +1539601408,1539602431,DE +1539602432,1539603455,UA +1539603456,1539604479,BG +1539604480,1539605503,ES +1539605504,1539606527,UA +1539606528,1539607551,RU +1539607552,1539609599,DE +1539609600,1539610623,UA +1539610624,1539611647,RU +1539611648,1539614719,UA +1539614720,1539615743,NL +1539615744,1539616767,DK +1539616768,1539617791,UA +1539617792,1539618815,FR +1539618816,1539619839,GB +1539619840,1539620863,RU +1539620864,1539623935,UA +1539624960,1539625983,RU +1539625984,1539627007,PL +1539627008,1539628031,RU +1539628032,1539629055,UA +1539629056,1539630079,BG +1539630080,1539631103,UA +1539631104,1539632127,CN +1539632128,1539633151,RU +1539633152,1539634175,SE +1539634176,1539638271,RU +1539638272,1539639295,UA +1539639296,1539640319,RU +1539640320,1539641343,PL +1539641344,1539642367,UA +1539642368,1539643391,RU +1539643392,1539644415,UA +1539644416,1539645439,DE +1539645440,1539646463,GB +1539646464,1539647487,IE +1539647488,1539648511,RU +1539648512,1539650559,UA +1539650560,1539651583,RU +1539651584,1539652607,UA +1539652608,1539653631,IL +1539653632,1539655679,RU +1539655680,1539656703,NL +1539656704,1539657727,RU +1539657728,1539658751,UA +1539658752,1539659775,FI +1539659776,1539660799,PL +1539660800,1539661823,GB +1539661824,1539662847,RU +1539662848,1539663871,IL +1539663872,1539664895,RU +1539664896,1539665919,BE +1539665920,1539666943,RU +1539666944,1539667967,CZ +1539667968,1539668991,UA +1539668992,1539670015,RU +1539670016,1539672063,UA +1539672064,1539673087,FR +1539673088,1539674111,GB +1539674112,1539675135,UA +1539675136,1539677183,PL +1539677184,1539678207,UA +1539678208,1539679231,RU +1539679232,1539680255,FR +1539680256,1539681279,UA +1539681280,1539684351,RU +1539684352,1539685375,UA +1539685376,1539688447,RU +1539688448,1539689471,SA +1539689472,1539690495,RU +1539690496,1539691519,FI +1539691520,1539692543,RU +1539692544,1539694591,UA +1539694592,1539695615,PL +1539695616,1539696639,GB +1539696640,1539697663,RU +1539697664,1539698687,UA +1539698688,1539699711,GE +1539699712,1539700735,RO +1539700736,1539701759,DK +1539701760,1539702783,UA +1539702784,1539703039,SI +1539703040,1539703295,UA +1539703296,1539703551,DE +1539703552,1539704063,GB +1539704064,1539704319,IL +1539704320,1539704575,CH +1539704576,1539704831,HU +1539704832,1539705087,CH +1539705088,1539705343,GB +1539705344,1539705599,UA +1539705600,1539706111,CH +1539706112,1539706367,GB +1539706368,1539706623,RU +1539706624,1539707135,PL +1539707136,1539707391,LT +1539707392,1539707647,GB +1539707648,1539707903,RO +1539707904,1539708159,UA +1539708160,1539708415,DE +1539708416,1539708671,GB +1539708672,1539708927,RO +1539708928,1539709183,IE +1539709184,1539709439,AT +1539709440,1539709695,BE +1539709696,1539709951,NL +1539709952,1539710207,DE +1539710208,1539710463,GB +1539710464,1539710719,FR +1539710720,1539710975,UA +1539710976,1539711231,DE +1539711232,1539711487,RU +1539711488,1539711743,UA +1539711744,1539711999,DE +1539712000,1539712255,UA +1539712256,1539712511,NL +1539712512,1539712767,RU +1539712768,1539713023,RO +1539713024,1539713279,UA +1539713280,1539713535,FR +1539713536,1539713791,DK +1539713792,1539714047,DE +1539714048,1539714303,FR +1539714304,1539714559,AT +1539714560,1539714815,RU +1539714816,1539715071,PT +1539715072,1539715327,SE +1539715328,1539715583,TR +1539715584,1539715839,UA +1539715840,1539716095,RU +1539716096,1539716351,SI +1539716352,1539716607,PL +1539716608,1539716863,RU +1539716864,1539717375,PL +1539717376,1539717631,DE +1539717632,1539717887,CH +1539717888,1539718143,MK +1539718144,1539718399,DE +1539718400,1539718655,TR +1539718656,1539718911,SA +1539718912,1539719167,KZ +1539719168,1539719423,IE +1539719424,1539719679,PL +1539719680,1539719935,IE +1539719936,1539720191,DE +1539720192,1539720703,RU +1539720704,1539720959,IL +1539720960,1539721215,RU +1539721216,1539721727,CH +1539721728,1539721983,PL +1539721984,1539722239,RU +1539722240,1539722495,PL +1539722496,1539722751,GB +1539722752,1539723007,DE +1539723008,1539723263,CH +1539723264,1539723519,PL +1539723520,1539723775,GB +1539723776,1539724031,DE +1539724032,1539724287,UA +1539724288,1539724543,IT +1539724544,1539724799,RU +1539724800,1539725055,UA +1539725056,1539725311,NL +1539725312,1539725567,FR +1539725568,1539725823,PL +1539725824,1539726079,PT +1539726080,1539726335,RU +1539726336,1539726591,SE +1539726592,1539726847,AT +1539726848,1539727103,PL +1539727104,1539727359,SE +1539727360,1539727615,SI +1539727616,1539727871,PL +1539727872,1539728127,RU +1539728128,1539728383,BE +1539728384,1539728639,PL +1539728640,1539728895,UA +1539728896,1539729151,SA +1539729152,1539729407,NL +1539729408,1539729663,RU +1539729664,1539729919,FR +1539729920,1539730175,NL +1539730176,1539730431,GB +1539730432,1539730687,GR +1539730688,1539730943,UA +1539730944,1539731455,PL +1539731456,1539731711,SI +1539731712,1539732223,DE +1539732224,1539732479,FR +1539732480,1539732735,UA +1539732736,1539732991,DK +1539732992,1539733247,PL +1539733248,1539733503,BG +1539733504,1539733759,FI +1539733760,1539734015,PL +1539734016,1539734271,FR +1539734272,1539734527,NO +1539734528,1539734783,TR +1539734784,1539735039,DE +1539735040,1539735295,BE +1539735296,1539735551,DE +1539735552,1539735807,AT +1539735808,1539736063,IL +1539736064,1539736319,RU +1539736320,1539736575,HU +1539736576,1539736831,BG +1539736832,1539737087,UA +1539737088,1539737343,KW +1539737344,1539737599,RU +1539737600,1539737855,RO +1539737856,1539738111,RU +1539738112,1539738367,DK +1539738368,1539738623,DE +1539738624,1539738879,UA +1539738880,1539739135,NL +1539739136,1539739391,AT +1539739392,1539739647,UA +1539739648,1539739903,DK +1539739904,1539740415,PL +1539740416,1539740671,RO +1539740672,1539740927,AT +1539740928,1539741183,RU +1539741184,1539741439,PL +1539741440,1539741695,NL +1539741696,1539741951,DE +1539741952,1539742207,UA +1539742208,1539742463,CH +1539742464,1539742719,RU +1539742720,1539742975,LV +1539742976,1539743231,DE +1539743232,1539743487,GR +1539743488,1539743743,FR +1539743744,1539743999,RO +1539744000,1539744255,HR +1539744256,1539744511,RO +1539744512,1539744767,DE +1539744768,1539745023,SE +1539745024,1539745535,GB +1539745536,1539745791,CH +1539745792,1539746303,DK +1539746304,1539746815,RU +1539746816,1539747071,DK +1539747072,1539747327,CH +1539747328,1539747583,NL +1539747584,1539747839,UA +1539747840,1539748095,NO +1539748096,1539748351,PL +1539748352,1539748607,NL +1539748608,1539748863,PL +1539748864,1539749119,GB +1539749376,1539749631,PT +1539749632,1539749887,GR +1539749888,1539750143,RU +1539750144,1539750399,TR +1539750400,1539750655,PL +1539750656,1539750911,DE +1539750912,1539751167,UA +1539751168,1539751423,TR +1539751424,1539751679,SI +1539751680,1539751935,FR +1539751936,1539752191,DE +1539752192,1539752447,SE +1539752448,1539752703,PL +1539752704,1539752959,AT +1539752960,1539753215,RO +1539753216,1539753471,DE +1539753472,1539753727,HU +1539753728,1539754239,FR +1539754240,1539754495,NO +1539754496,1539754751,SE +1539754752,1539755007,BE +1539755008,1539755263,DK +1539755264,1539755519,IL +1539755520,1539755775,EE +1539755776,1539756031,MT +1539756032,1539756543,PL +1539756544,1539756799,DE +1539756800,1539757055,BE +1539757056,1539757311,RU +1539757312,1539757567,GB +1539757568,1539757823,SI +1539757824,1539758079,UA +1539758080,1539758335,HR +1539758336,1539758591,DE +1539758592,1539758847,NL +1539758848,1539759103,BA +1539759104,1539759359,DK +1539759360,1539759615,RU +1539759616,1539759871,PL +1539759872,1539760127,SE +1539760128,1539760383,DE +1539760384,1539760639,RU +1539760640,1539760895,PL +1539760896,1539761151,DK +1539761152,1539761407,DE +1539761408,1539761663,CH +1539761664,1539761919,PL +1539761920,1539762175,RU +1539762176,1539762431,PL +1539762432,1539762687,UA +1539762688,1539762943,PL +1539762944,1539763199,UA +1539763200,1539763455,MD +1539763456,1539763711,DK +1539763712,1539763967,DE +1539763968,1539764223,PT +1539764224,1539764479,AT +1539764480,1539764735,GB +1539764736,1539764991,RO +1539764992,1539765247,BE +1539765248,1539765503,IE +1539765504,1539766015,PL +1539766016,1539766271,AM +1539766272,1539766527,PL +1539766528,1539766783,UA +1539766784,1539767039,DE +1539767040,1539767295,SA +1539767296,1539767551,DK +1539767552,1539767807,DE +1539767808,1539768063,IL +1539768064,1539768319,GB +1539768320,1539768575,FR +1539768576,1539768831,GB +1539768832,1539769087,IT +1539769088,1539769599,BE +1539769600,1539769855,AT +1539769856,1539770111,FR +1539770112,1539770367,GR +1539770368,1539770623,DE +1539770624,1539770879,FR +1539770880,1539771135,RU +1539771136,1539771391,FR +1539771392,1539771647,PL +1539771648,1539771903,UA +1539771904,1539772159,RU +1539772160,1539772415,BE +1539772416,1539772671,RU +1539772672,1539772927,RS +1539772928,1539773183,RU +1539773184,1539773439,GB +1539773440,1539773695,KZ +1539773696,1539773951,DE +1539773952,1539774207,PL +1539774208,1539774463,SI +1539774464,1539774719,RU +1539774720,1539774975,PL +1539774976,1539775231,RU +1539775232,1539775487,CH +1539775488,1539775743,UA +1539775744,1539775999,IL +1539776000,1539776255,PL +1539776256,1539776511,SK +1539776512,1539776767,HU +1539776768,1539777023,UA +1539777024,1539777279,RU +1539777280,1539777535,UA +1539777536,1539777791,BG +1539777792,1539778047,UA +1539778048,1539778303,AM +1539778304,1539778559,LB +1539778560,1539778815,RU +1539778816,1539779071,RO +1539779072,1539779327,GB +1539779328,1539779583,CH +1539779584,1539779839,PL +1539779840,1539780095,NL +1539780096,1539780351,RU +1539780352,1539780607,AT +1539780608,1539780863,PL +1539780864,1539781119,RO +1539781120,1539781375,NL +1539781376,1539781631,GB +1539781632,1539781887,HU +1539781888,1539782143,IL +1539782144,1539782399,UA +1539782400,1539782655,LT +1539782656,1539782911,GI +1539782912,1539783167,PL +1539783168,1539783679,NL +1539783680,1539783935,DE +1539783936,1539784191,SI +1539784192,1539784447,RU +1539784448,1539784703,NO +1539784704,1539784959,SE +1539784960,1539785215,DE +1539785216,1539785471,CH +1539785472,1539785727,RU +1539785728,1539785983,SE +1539785984,1539786239,IL +1539786240,1539786495,AT +1539786496,1539786751,GB +1539786752,1539787007,HU +1539787008,1539787263,TR +1539787264,1539787519,IE +1539787520,1539787775,UA +1539787776,1539788031,CH +1539788032,1539788287,HR +1539788288,1539788543,GB +1539788544,1539788799,HR +1539788800,1539789055,IL +1539789056,1539789311,RU +1539789312,1539789567,UA +1539789568,1539789823,DE +1539789824,1539790079,NL +1539790080,1539790335,CH +1539790336,1539790591,LV +1539790592,1539790847,PL +1539790848,1539791103,DE +1539791104,1539791359,PL +1539791360,1539791615,RU +1539791616,1539792383,UA +1539792384,1539792639,IL +1539792640,1539792895,PL +1539792896,1539793151,GR +1539793152,1539793407,PL +1539793408,1539793663,CH +1539793664,1539794175,IL +1539794176,1539794431,PL +1539794432,1539794687,DK +1539794688,1539794943,FR +1539794944,1539795199,RO +1539795200,1539795455,PL +1539795456,1539795711,UA +1539795712,1539795967,SA +1539795968,1539796223,NL +1539796224,1539796479,MC +1539796480,1539796735,GB +1539796736,1539796991,TR +1539796992,1539797247,CY +1539797248,1539797503,DK +1539797504,1539797759,RU +1539797760,1539798015,UA +1539798016,1539798271,HU +1539798272,1539798527,PL +1539798528,1539798783,GB +1539798784,1539799039,IL +1539799040,1539799295,ES +1539799296,1539799551,DK +1539799552,1539799807,ES +1539799808,1539800063,RO +1539800064,1539800319,SI +1539800320,1539800575,GB +1539800576,1539800831,LV +1539800832,1539801087,PL +1539801088,1539801343,BG +1539801344,1539801855,GB +1539801856,1539802111,SI +1539802112,1539802367,PL +1539802368,1539802623,RO +1539802624,1539802879,IS +1539802880,1539803135,NL +1539803136,1539803391,GB +1539803392,1539803647,NL +1539803648,1539804159,UA +1539804160,1539804671,PL +1539804672,1539804927,SI +1539804928,1539805439,UA +1539805440,1539805695,AT +1539805696,1539805951,CH +1539805952,1539806207,RU +1539806208,1539806463,FI +1539806464,1539806719,RU +1539806720,1539806975,BG +1539806976,1539807231,GB +1539807232,1539807487,FR +1539807488,1539807999,GB +1539808000,1539808255,HU +1539808256,1539808511,RU +1539808512,1539808767,RO +1539808768,1539809023,DE +1539809024,1539809279,GB +1539809536,1539809791,SI +1539809792,1539810047,DE +1539810048,1539810303,UA +1539810304,1539810559,CZ +1539810560,1539810815,DE +1539810816,1539811071,TR +1539811072,1539811327,NL +1539811328,1539811583,CZ +1539811584,1539811839,DE +1539811840,1539812095,SE +1539812096,1539812351,RU +1539812352,1539812607,CH +1539812608,1539812863,IT +1539812864,1539813119,SI +1539813120,1539813375,AT +1539813376,1539813631,PL +1539813632,1539813887,NL +1539813888,1539814143,RU +1539814144,1539814399,NL +1539814400,1539814911,GB +1539814912,1539815167,UA +1539815168,1539815423,GB +1539815424,1539815935,RU +1539815936,1539816191,CH +1539816192,1539816447,SA +1539816448,1539816703,UA +1539816704,1539816959,RU +1539816960,1539817215,DK +1539817216,1539817471,TR +1539817472,1539817727,DE +1539817728,1539817983,PL +1539817984,1539818239,UA +1539818240,1539818495,NO +1539818496,1539819007,RU +1539819008,1539819263,CH +1539819264,1539819519,RO +1539819520,1539819775,AT +1539819776,1539820031,SI +1539820032,1539820287,VG +1539820288,1539820543,PL +1539820544,1539820799,ES +1539820800,1539821055,RU +1539821056,1539821311,UA +1539821312,1539821567,CZ +1539821568,1539821823,DK +1539821824,1539822079,DE +1539822080,1539822335,RO +1539822336,1539822591,RU +1539822592,1539822847,GB +1539822848,1539823103,IE +1539823104,1539823359,DE +1539823360,1539823615,CY +1539823616,1539823871,RO +1539823872,1539824127,DK +1539824128,1539824383,CH +1539824384,1539824639,NL +1539824640,1539824895,HU +1539824896,1539825151,UZ +1539825152,1539825407,UA +1539825408,1539825919,RU +1539825920,1539826175,DE +1539826176,1539826431,AM +1539826432,1539826687,BE +1539826688,1539826943,CH +1539826944,1539827199,DE +1539827200,1539827455,RU +1539827456,1539827711,MK +1539827968,1539828479,FR +1539828480,1539828735,SI +1539828736,1539828991,NL +1539828992,1539829247,BG +1539829248,1539829503,SE +1539829504,1539829759,DE +1539829760,1539830015,PL +1539830016,1539830271,DE +1539830272,1539830527,FR +1539830528,1539830783,RO +1539830784,1539831039,RU +1539831040,1539831295,UA +1539831296,1539831551,PL +1539831552,1539831807,DE +1539831808,1539832063,RU +1539832064,1539832319,GB +1539832320,1539832575,PL +1539832576,1539832831,RU +1539832832,1539833087,GB +1539833088,1539833343,RU +1539833344,1539833855,FR +1539833856,1539837951,UA +1539837952,1539838975,NL +1539838976,1539839999,GR +1539840000,1539841023,PL +1539841024,1539842047,RU +1539842048,1539844095,PL +1539844096,1539846143,UA +1539846144,1539847167,NL +1539847168,1539849215,UA +1539849216,1539850239,RU +1539850240,1539851263,LV +1539851264,1539852287,PL +1539852288,1539853311,UA +1539853312,1539854335,PL +1539854336,1539855359,UA +1539855360,1539856383,RU +1539856384,1539857407,UA +1539857408,1539858431,PL +1539858432,1539859455,RO +1539859456,1539860479,DE +1539860480,1539861503,UA +1539861504,1539862527,DE +1539862528,1539863551,UA +1539863552,1539864575,MD +1539864576,1539865599,RO +1539865600,1539866623,UA +1539866624,1539867647,IT +1539867648,1539869695,UA +1539869696,1539870719,ES +1539870720,1539871743,IL +1539871744,1539872767,ES +1539872768,1539873791,SE +1539873792,1539876863,UA +1539876864,1539877887,ES +1539877888,1539878911,PL +1539878912,1539880959,UA +1539880960,1539881983,PL +1539881984,1539884031,UA +1539884032,1539885055,MT +1539885056,1539886079,UA +1539886080,1539887103,FR +1539887104,1539888127,IT +1539888128,1539889151,UA +1539889152,1539890175,RU +1539890176,1539891199,UA +1539891200,1539893247,RU +1539893248,1539894271,UA +1539894272,1539895295,PL +1539895296,1539899391,UA +1539899392,1539900415,RU +1539900416,1539901439,UA +1539901440,1539902463,RU +1539902464,1539903487,LV +1539903488,1539904511,PL +1539904512,1539905535,CZ +1539905536,1539910655,UA +1539910656,1539911679,PL +1539911680,1539913727,RU +1539913728,1539914751,CH +1539914752,1539915775,SE +1539916800,1539917823,UA +1539917824,1539918847,RU +1539918848,1539920895,RO +1539920896,1539921919,UA +1539921920,1539922943,PL +1539922944,1539923967,SE +1539923968,1539924991,RU +1539924992,1539926015,DE +1539926016,1539927039,RU +1539927040,1539928063,UA +1539928064,1539930111,RU +1539930112,1539931135,PL +1539931136,1539932159,UA +1539932160,1539933183,DE +1539933184,1539934207,ES +1539934208,1539935231,RS +1539935232,1539936255,LV +1539936256,1539937279,UA +1539937280,1539938303,CH +1539938304,1539939327,PL +1539939328,1539940351,UA +1539940352,1539941375,GB +1539941376,1539942399,NL +1539942400,1539943423,UA +1539943424,1539944447,BG +1539944448,1539946495,UA +1539946496,1539947519,RU +1539947520,1539948543,UA +1539948544,1539949567,RO +1539949568,1539950591,UA +1539950592,1539951615,KZ +1539951616,1539953663,RU +1539953664,1539954687,UA +1539954688,1539956735,RO +1539956736,1539957759,UA +1539957760,1539958783,RU +1539958784,1539962879,UA +1539962880,1539964927,RU +1539964928,1539965951,UA +1539965952,1539966975,RU +1539966976,1539967999,UA +1539968000,1539972095,RU +1539972096,1539973119,GB +1539973120,1539975167,RU +1539975168,1539976191,DE +1539976192,1539977215,RU +1539977216,1539978239,DE +1539978240,1539980287,UA +1539980288,1539981311,VG +1539981312,1539982335,SI +1539982336,1539983359,RU +1539983360,1539984383,UA +1539984384,1539985407,RU +1539985408,1539986431,SE +1539986432,1539987455,RU +1539987456,1539988479,RO +1539988480,1539990527,RU +1539990528,1539991551,PL +1539991552,1539993599,UA +1539993600,1539994623,FI +1539994624,1539995647,AT +1539995648,1539996671,CH +1539996672,1539997695,PL +1539997696,1539999743,UA +1539999744,1540000767,GB +1540000768,1540001791,RU +1540001792,1540002815,UA +1540002816,1540003839,RU +1540003840,1540004863,PL +1540004864,1540005887,SE +1540005888,1540006911,UA +1540006912,1540007935,RU +1540007936,1540008959,IL +1540008960,1540011007,PL +1540011008,1540014079,RU +1540014080,1540015103,PL +1540016128,1540017151,KR +1540017152,1540018175,RU +1540018176,1540020223,UA +1540020224,1540022271,RU +1540022272,1540023295,GB +1540023296,1540024319,PL +1540024320,1540025343,RU +1540025344,1540026367,GB +1540026368,1540028415,UA +1540028416,1540029439,ES +1540029440,1540030463,RU +1540030464,1540031487,DE +1540031488,1540032511,UA +1540032512,1540033535,RU +1540033536,1540034559,UA +1540034560,1540035583,PL +1540035584,1540036607,RU +1540036608,1540037631,UA +1540037632,1540038655,EE +1540038656,1540039679,FR +1540039680,1540040703,RU +1540040704,1540041727,SE +1540041728,1540042751,RU +1540042752,1540043775,UA +1540043776,1540044799,PL +1540044800,1540045823,GB +1540045824,1540046847,UA +1540046848,1540047871,RU +1540047872,1540048895,LV +1540048896,1540049919,GB +1540049920,1540050943,UA +1540050944,1540052991,RU +1540052992,1540054052,UA +1540054053,1540054062,MD +1540054063,1540055039,UA +1540055040,1540056063,NO +1540056064,1540057087,NL +1540057088,1540058111,GB +1540058112,1540059135,DE +1540059136,1540060159,UA +1540060160,1540061183,NO +1540061184,1540062207,NG +1540062208,1540063231,RU +1540063232,1540064255,NL +1540064256,1540065279,PL +1540065280,1540068351,UA +1540068352,1540069375,FR +1540069376,1540071423,RU +1540071424,1540072447,SE +1540072448,1540073471,UA +1540073472,1540074495,RU +1540074496,1540075519,UZ +1540075520,1540077567,RU +1540077568,1540078591,FR +1540078592,1540081663,RU +1540081664,1540082687,DE +1540082688,1540083711,NO +1540083712,1540084735,RU +1540084736,1540085759,LU +1540085760,1540087807,PL +1540087808,1540092927,RU +1540092928,1540094975,PL +1540094976,1540095999,GB +1540096000,1540097023,SE +1540097024,1540098047,DE +1540099072,1540100095,UA +1540100096,1540103167,RU +1540103168,1540105215,DE +1540105216,1540110335,UA +1540110336,1540111359,RU +1540111360,1540112383,UA +1540112384,1540113407,LV +1540113408,1540114431,RU +1540114432,1540115455,LT +1540115456,1540116479,UA +1540116480,1540117503,CH +1540117504,1540118527,UA +1540118528,1540119551,PL +1540119552,1540120575,UA +1540120576,1540124671,RU +1540124672,1540125695,NO +1540125696,1540126719,FR +1540126720,1540127743,UA +1540127744,1540128767,GB +1540128768,1540129791,RU +1540129792,1540130815,UA +1540130816,1540131839,RU +1540131840,1540132863,PL +1540132864,1540134911,RU +1540134912,1540135935,PL +1540135936,1540136959,BG +1540136960,1540137983,PL +1540137984,1540139007,RU +1540139008,1540140031,DE +1540140032,1540141055,GB +1540141056,1540142079,RU +1540142080,1540143103,UA +1540143104,1540144127,RU +1540144128,1540145151,AM +1540145152,1540146175,AT +1540146176,1540147199,UA +1540147200,1540148223,RU +1540148224,1540149247,PL +1540149248,1540150271,GB +1540150272,1540151295,UA +1540151296,1540152319,AT +1540152320,1540153343,SE +1540153344,1540156415,RU +1540156416,1540157439,UZ +1540157440,1540158463,RU +1540158464,1540159487,GB +1540159488,1540160511,UA +1540160512,1540162559,RU +1540162560,1540163583,UA +1540163584,1540164607,RU +1540164608,1540165631,DE +1540165632,1540166655,UA +1540166656,1540167679,PL +1540167680,1540168703,RU +1540168704,1540169727,DE +1540169728,1540170751,HU +1540170752,1540171775,DE +1540171776,1540172799,GB +1540172800,1540173823,RU +1540173824,1540174847,KG +1540174848,1540175871,RU +1540175872,1540176895,DE +1540176896,1540177919,SE +1540177920,1540178943,UA +1540178944,1540179967,BA +1540179968,1540180991,PL +1540180992,1540182015,DE +1540182016,1540183039,UA +1540183040,1540184063,RU +1540184064,1540185087,PL +1540185088,1540186111,RU +1540186112,1540187135,GB +1540187136,1540188159,US +1540188160,1540189183,KZ +1540189184,1540190207,GB +1540190208,1540191231,PT +1540191232,1540192255,FR +1540192256,1540195327,RU +1540195328,1540198399,AM +1540198400,1540199423,RU +1540199424,1540200447,CH +1540200448,1540201471,IL +1540201472,1540202495,UA +1540202496,1540203519,RU +1540203520,1540204543,UA +1540204544,1540205567,RU +1540205568,1540206591,DE +1540206592,1540208639,RU +1540208640,1540209663,NO +1540209664,1540211711,RU +1540211712,1540212735,DE +1540212736,1540213759,GB +1540213760,1540214783,UA +1540214784,1540215807,RU +1540215808,1540216831,NL +1540216832,1540217855,UA +1540217856,1540218879,GB +1540218880,1540219903,RU +1540219904,1540220927,PL +1540220928,1540221951,NL +1540221952,1540223999,RU +1540224000,1540225023,PL +1540225024,1540226047,GB +1540226048,1540227071,RU +1540227072,1540227583,GB +1540227584,1540228095,RU +1540228096,1540228607,UA +1540228608,1540229119,PL +1540229120,1540229631,AT +1540229632,1540230143,NL +1540230144,1540232191,RU +1540232192,1540232703,BG +1540232704,1540233215,RU +1540233216,1540233727,CH +1540233728,1540234239,PL +1540234240,1540234751,DE +1540234752,1540235775,UA +1540235776,1540236287,NO +1540236288,1540236799,RO +1540236800,1540237311,PL +1540237312,1540238847,RO +1540238848,1540239359,DE +1540239360,1540239871,UA +1540239872,1540240383,NL +1540240384,1540240895,CH +1540240896,1540242431,RU +1540242432,1540242943,DE +1540242944,1540243455,RU +1540243456,1540243967,PL +1540243968,1540244479,RU +1540244480,1540244991,CH +1540244992,1540245503,DE +1540245504,1540246015,RU +1540246016,1540246527,IT +1540246528,1540247551,RO +1540247552,1540248063,NL +1540248064,1540248575,RO +1540248576,1540249087,GB +1540249088,1540249599,PL +1540249600,1540250111,KZ +1540250112,1540250623,DK +1540250624,1540251135,RU +1540251136,1540251647,GB +1540251648,1540252159,PL +1540252160,1540252671,DE +1540252672,1540253183,RU +1540253184,1540253695,AT +1540253696,1540254207,CH +1540254208,1540254719,RU +1540254720,1540255231,PL +1540255232,1540255743,UA +1540255744,1540256255,AT +1540256256,1540256767,PL +1540256768,1540257279,RU +1540257280,1540257791,GB +1540257792,1540258303,RU +1540258304,1540258815,IR +1540258816,1540259327,UA +1540259328,1540259839,RU +1540259840,1540260351,IT +1540260352,1540260863,RU +1540260864,1540261375,LT +1540261376,1540261887,SA +1540261888,1540262399,NL +1540262400,1540262911,BG +1540262912,1540263423,RO +1540263424,1540263935,DE +1540263936,1540264447,GB +1540264448,1540265983,RU +1540265984,1540266495,DE +1540266496,1540267007,PL +1540267008,1540267519,FR +1540267520,1540268543,RO +1540268544,1540269055,RU +1540269056,1540269567,DK +1540269568,1540270079,RU +1540270080,1540270591,GB +1540270592,1540271103,IL +1540271104,1540271615,PL +1540271616,1540272127,SE +1540272128,1540272639,GB +1540272640,1540273663,PL +1540273664,1540274175,GB +1540274176,1540274687,DE +1540274688,1540275199,UA +1540275200,1540275711,DE +1540275712,1540276223,GR +1540276224,1540276735,AT +1540276736,1540277247,RO +1540277248,1540277759,RU +1540277760,1540278271,FR +1540278272,1540278783,UA +1540278784,1540279807,RU +1540279808,1540280319,RO +1540280320,1540280831,MD +1540280832,1540281343,PL +1540281344,1540281855,UA +1540281856,1540282367,DE +1540282368,1540282879,RU +1540282880,1540283391,UA +1540283392,1540284415,RU +1540284416,1540284927,AT +1540284928,1540285439,UA +1540285440,1540285951,DE +1540285952,1540286463,RU +1540286464,1540286975,NL +1540286976,1540287487,GB +1540287488,1540288511,AT +1540288512,1540289535,RU +1540289536,1540290047,PL +1540290048,1540290559,NL +1540290560,1540291071,RU +1540291072,1540291583,BE +1540291584,1540292095,UA +1540292096,1540292607,RU +1540292608,1540293119,FR +1540293120,1540293631,DK +1540293632,1540295167,UA +1540295168,1540295679,PL +1540295680,1540296191,SA +1540296192,1540296703,PL +1540296704,1540297215,DE +1540297216,1540298239,FR +1540298240,1540298751,HR +1540298752,1540299263,RU +1540299264,1540299775,UA +1540299776,1540300287,KZ +1540300288,1540300799,RU +1540300800,1540301311,DK +1540301312,1540301823,IL +1540301824,1540302847,GB +1540302848,1540303871,RU +1540303872,1540304895,UA +1540304896,1540305407,PL +1540305408,1540305919,GB +1540305920,1540306431,RU +1540306432,1540306943,UA +1540306944,1540307455,GB +1540307456,1540307967,RU +1540307968,1540308479,UA +1540308480,1540308991,RS +1540308992,1540309503,PL +1540309504,1540310015,UA +1540310016,1540310527,PL +1540310528,1540313087,RU +1540313088,1540313599,SE +1540313600,1540315135,RU +1540315136,1540315647,UA +1540315648,1540316159,IL +1540316160,1540316671,DE +1540316672,1540317183,RO +1540317184,1540317695,KG +1540317696,1540318207,UA +1540318208,1540318719,RU +1540318720,1540319231,RO +1540319232,1540320255,UA +1540320256,1540320767,RU +1540320768,1540321279,FR +1540321280,1540321791,SE +1540321792,1540322303,RU +1540322816,1540323327,DE +1540323328,1540323839,RO +1540323840,1540324351,UA +1540324352,1540324863,RO +1540324864,1540325375,PL +1540325376,1540325887,DE +1540325888,1540326399,LI +1540326400,1540326911,RU +1540326912,1540327423,AT +1540327424,1540329983,RU +1540329984,1540330495,UA +1540330496,1540331007,PL +1540331008,1540331519,IT +1540331520,1540332031,GB +1540332032,1540332543,RU +1540332544,1540333055,PL +1540333056,1540333567,NO +1540333568,1540334079,RO +1540334080,1540334591,DE +1540334592,1540335103,RU +1540335104,1540336127,PL +1540336128,1540336639,RU +1540336640,1540337663,MC +1540337664,1540338175,FR +1540338176,1540339199,RU +1540339200,1540339711,UA +1540339712,1540340735,PL +1540340736,1540341247,CZ +1540341248,1540341759,BG +1540341760,1540342271,GB +1540342272,1540342783,UA +1540342784,1540343295,ES +1540343296,1540343807,GB +1540343808,1540344831,PL +1540344832,1540345343,UA +1540345344,1540345855,IL +1540345856,1540346367,FR +1540346368,1540346879,UA +1540346880,1540347391,GB +1540347392,1540347903,DK +1540347904,1540348415,RO +1540348416,1540348927,UA +1540348928,1540349439,GB +1540349440,1540349951,AT +1540349952,1540350463,UA +1540350464,1540350975,NO +1540350976,1540351487,DK +1540351488,1540351999,RO +1540352000,1540352511,NL +1540352512,1540353023,RU +1540353024,1540353535,GR +1540353536,1540354047,RU +1540354048,1540354559,IL +1540354560,1540355071,PL +1540355072,1540355583,UA +1540355584,1540356607,RU +1540356608,1540357119,DE +1540357120,1540357631,RU +1540357632,1540358143,FR +1540358144,1540358399,RU +1540358400,1540358655,GB +1540358656,1540358911,SE +1540358912,1540359167,GB +1540359168,1540359423,SA +1540359424,1540359679,DE +1540359680,1540359935,GB +1540359936,1540360191,AT +1540360192,1540360447,NO +1540360448,1540360703,FR +1540360704,1540360959,PL +1540360960,1540361215,GB +1540361216,1540361471,BE +1540361472,1540361727,DE +1540361728,1540361983,IT +1540361984,1540362239,EE +1540362240,1540362495,DK +1540362496,1540363007,DE +1540363008,1540363263,FR +1540363264,1540363519,RU +1540363520,1540363775,GB +1540363776,1540364031,IS +1540364032,1540364287,RU +1540364288,1540364543,NO +1540364544,1540364799,UA +1540364800,1540365055,EE +1540365056,1540365311,SI +1540365312,1540365567,GB +1540365568,1540365823,RU +1540365824,1540366079,CH +1540366080,1540366335,IE +1540366336,1540366591,PL +1540366592,1540366847,RU +1540366848,1540367103,AT +1540367104,1540367359,UA +1540367360,1540367615,HU +1540367616,1540367871,BE +1540367872,1540368127,DE +1540368128,1540368383,RU +1540368384,1540368639,FR +1540368640,1540368895,SK +1540368896,1540369407,RU +1540369408,1540369663,IE +1540369664,1540369919,DE +1540369920,1540370175,UA +1540370176,1540370431,DE +1540370432,1540370687,LB +1540370688,1540370943,NL +1540370944,1540371199,PL +1540371200,1540371455,BE +1540371456,1540371711,UA +1540371712,1540371967,GB +1540371968,1540372223,NO +1540372224,1540372479,PL +1540372736,1540372991,GR +1540372992,1540373247,DE +1540373248,1540373503,UA +1540373504,1540373759,NL +1540373760,1540374015,TR +1540374016,1540374271,NL +1540374272,1540374527,HU +1540374528,1540374783,RU +1540374784,1540375039,UA +1540375040,1540375295,DE +1540375296,1540375551,GB +1540375552,1540375807,DE +1540375808,1540376063,NL +1540376064,1540376319,TR +1540376320,1540376575,DK +1540376576,1540376831,PL +1540376832,1540377087,RU +1540377088,1540377343,DE +1540377344,1540377599,RO +1540377600,1540377855,AM +1540377856,1540378111,ES +1540378112,1540378367,RU +1540378368,1540378623,CH +1540378624,1540378879,AT +1540378880,1540379135,SE +1540379136,1540379391,CH +1540379392,1540379647,DE +1540379648,1540379903,RU +1540380160,1540380415,IL +1540380416,1540380671,NL +1540380672,1540380927,SI +1540380928,1540381183,RS +1540381184,1540381439,RO +1540381440,1540381695,AT +1540381696,1540381951,RO +1540381952,1540382207,PL +1540382208,1540382463,UA +1540382464,1540382719,GB +1540382720,1540382975,LB +1540382976,1540383231,UA +1540383232,1540383487,AT +1540383488,1540383743,GB +1540383744,1540383999,RO +1540384000,1540384255,SI +1540384256,1540384511,FR +1540384512,1540384767,SE +1540384768,1540385023,HR +1540385024,1540385279,GB +1540385280,1540385535,PL +1540385536,1540385791,DE +1540385792,1540386303,FR +1540386304,1540386559,NL +1540386560,1540386815,GB +1540386816,1540387071,NL +1540387072,1540387327,RU +1540387328,1540387583,GB +1540387584,1540388095,UA +1540388096,1540388351,GB +1540388352,1540388607,IL +1540388608,1540388863,RU +1540388864,1540389119,RO +1540389120,1540389375,RU +1540389376,1540389631,GB +1540389632,1540389887,RO +1540389888,1540390143,GB +1540390144,1540390399,SI +1540390400,1540390655,RU +1540390656,1540390911,UA +1540390912,1540391167,SA +1540391168,1540391423,IL +1540391424,1540391679,CH +1540391680,1540391935,NL +1540391936,1540392191,RU +1540392192,1540392447,PL +1540392448,1540392703,RU +1540392704,1540392959,PL +1540392960,1540393471,GB +1540393472,1540393727,UA +1540393728,1540394239,IL +1540394240,1540394495,GB +1540394496,1540394751,RO +1540394752,1540395007,DK +1540395008,1540395263,GE +1540395264,1540395519,UA +1540395776,1540396031,IL +1540396032,1540396287,NO +1540396288,1540396543,AM +1540396544,1540396799,PL +1540396800,1540397055,RU +1540397056,1540397311,IT +1540397312,1540397823,UA +1540397824,1540398079,DE +1540398080,1540398335,SA +1540398336,1540398591,DK +1540398592,1540398847,IT +1540398848,1540399359,DE +1540399360,1540399615,IL +1540399616,1540399871,RU +1540399872,1540400127,GB +1540400128,1540400383,NL +1540400384,1540400639,IR +1540400640,1540400895,RU +1540400896,1540401151,NL +1540401152,1540401407,SI +1540401408,1540401663,AT +1540401664,1540401919,GB +1540401920,1540402175,RU +1540402176,1540402431,FR +1540402432,1540402687,CH +1540402688,1540402943,SE +1540402944,1540403199,NL +1540403200,1540403455,AT +1540403456,1540403711,GB +1540403712,1540404223,RO +1540404224,1540404479,CH +1540404480,1540404735,FR +1540404736,1540404991,PL +1540404992,1540405247,RU +1540405248,1540405503,GB +1540405504,1540405759,RU +1540405760,1540406015,PL +1540406016,1540406271,RU +1540406272,1540406527,SE +1540406528,1540407039,PL +1540407040,1540407807,DE +1540407808,1540408063,UA +1540408064,1540408319,IT +1540408320,1540408575,NL +1540408576,1540408831,HR +1540408832,1540409087,UA +1540409088,1540409343,TR +1540409344,1540409599,SI +1540409600,1540409855,AT +1540409856,1540410111,DE +1540410112,1540410367,KW +1540410368,1540410623,CH +1540410624,1540410879,RU +1540410880,1540411135,TR +1540411136,1540411391,SG +1540411392,1540411647,RU +1540411648,1540411903,FR +1540411904,1540412159,RU +1540412160,1540412415,BE +1540412416,1540412671,DE +1540412672,1540412927,RO +1540412928,1540413183,FR +1540413184,1540413439,RO +1540413440,1540413695,RU +1540413696,1540413951,AT +1540413952,1540414207,IL +1540414208,1540414463,GB +1540414464,1540414719,BE +1540414720,1540414975,SE +1540414976,1540415231,FR +1540415232,1540415487,RO +1540415488,1540415743,FR +1540415744,1540415999,SI +1540416000,1540416255,FR +1540416256,1540416511,CH +1540416512,1540416767,RU +1540416768,1540417023,NL +1540417024,1540417279,RU +1540417280,1540417535,FR +1540417536,1540417791,RU +1540417792,1540418047,HR +1540418048,1540418559,RO +1540418560,1540418815,AT +1540418816,1540419071,FR +1540419072,1540419327,RU +1540419328,1540419839,GB +1540419840,1540420095,NL +1540420096,1540420607,GB +1540420608,1540420863,DE +1540420864,1540421119,GB +1540421120,1540421375,RU +1540421376,1540421631,PL +1540421632,1540422143,RU +1540422144,1540422399,PL +1540422400,1540422655,UA +1540422656,1540422911,GB +1540422912,1540423423,RU +1540423424,1540423679,BA +1540423680,1540423935,SE +1540423936,1540424191,NL +1540424192,1540424447,IT +1540424448,1540424703,ES +1540424704,1540424959,PL +1540424960,1540425215,RO +1540425216,1540425471,US +1540425472,1540425727,NL +1540425728,1540425983,BG +1540425984,1540426239,DE +1540426240,1540426495,IE +1540426496,1540426751,UA +1540426752,1540427263,NL +1540427264,1540427519,RU +1540427520,1540427775,FR +1540427776,1540428287,RU +1540428288,1540428543,RO +1540428544,1540428799,FR +1540428800,1540429055,PL +1540429056,1540429311,BG +1540429312,1540429823,RO +1540429824,1540430079,UA +1540430080,1540430335,FR +1540430336,1540430591,DE +1540430592,1540430847,PL +1540430848,1540431103,CH +1540431104,1540431359,FI +1540431360,1540431615,NO +1540431616,1540431871,GB +1540431872,1540432127,HR +1540432128,1540432383,AT +1540432384,1540432639,GB +1540432640,1540432895,FR +1540432896,1540433151,UA +1540433152,1540433407,GB +1540433408,1540433663,AM +1540433664,1540433919,DK +1540433920,1540434175,GB +1540434176,1540434431,CH +1540434432,1540434687,DE +1540434688,1540434943,GB +1540434944,1540435199,FR +1540435200,1540435455,RO +1540435456,1540435967,GR +1540435968,1540436223,RU +1540436224,1540436479,SI +1540436480,1540436735,GB +1540436736,1540436991,UA +1540436992,1540437247,DE +1540437248,1540437503,CH +1540437504,1540438015,UA +1540438016,1540438271,PL +1540438272,1540438527,LB +1540438528,1540439039,RU +1540439040,1540439295,NO +1540439296,1540439551,RO +1540439552,1540440063,PL +1540440064,1540440319,UA +1540440320,1540440575,RU +1540440576,1540440831,MD +1540440832,1540441087,FR +1540441088,1540441343,PL +1540441344,1540441855,RU +1540441856,1540442111,GB +1540442112,1540442367,RU +1540442368,1540442623,GB +1540442624,1540442879,IE +1540442880,1540443135,AT +1540443136,1540443647,RU +1540443648,1540443903,NL +1540443904,1540444159,GB +1540444160,1540444415,RU +1540444416,1540444671,DE +1540444672,1540445183,GB +1540445184,1540445439,CH +1540445440,1540445695,RU +1540445696,1540445951,GB +1540445952,1540446207,DE +1540446208,1540446463,NO +1540446464,1540446719,AT +1540446720,1540446975,UA +1540446976,1540447231,RU +1540447232,1540447487,DE +1540447488,1540447743,PL +1540447744,1540447999,RU +1540448000,1540448255,PL +1540448256,1540448511,UA +1540448512,1540448767,IT +1540448768,1540449023,CH +1540449024,1540449279,DE +1540449280,1540449535,UA +1540449536,1540449791,CZ +1540449792,1540450047,RO +1540450048,1540450303,DE +1540450304,1540450559,GB +1540450560,1540450815,AM +1540450816,1540451071,IE +1540451072,1540451327,FR +1540451328,1540451583,ES +1540451584,1540451839,RO +1540451840,1540452095,GB +1540452096,1540452351,CH +1540452352,1540452607,AT +1540452608,1540452863,IL +1540452864,1540453119,HU +1540453120,1540453375,RU +1540453376,1540453631,PL +1540453632,1540453887,FR +1540453888,1540454143,UA +1540454144,1540454399,RU +1540454400,1540454911,DE +1540454912,1540455167,RU +1540455168,1540455423,RO +1540455424,1540455679,RU +1540455680,1540455935,GB +1540455936,1540456191,UA +1540456192,1540457215,RU +1540457216,1540457471,GE +1540457472,1540457727,SI +1540457728,1540457983,BE +1540457984,1540458239,CH +1540458240,1540458495,ES +1540458496,1540458751,HR +1540458752,1540459007,NL +1540459008,1540459519,UA +1540459520,1540459775,GB +1540459776,1540460031,PL +1540460032,1540460543,NL +1540460544,1540460799,GB +1540460800,1540461055,SI +1540461056,1540461311,BG +1540461312,1540461823,RU +1540461824,1540462079,RO +1540462080,1540462335,SI +1540462336,1540462591,UA +1540462592,1540463103,PL +1540463104,1540463359,FR +1540463360,1540463615,PL +1540463616,1540463871,DK +1540463872,1540464127,UA +1540464128,1540464383,CH +1540464384,1540464895,DE +1540464896,1540465407,GB +1540465408,1540465663,ES +1540465664,1540465919,IE +1540465920,1540466175,UA +1540466176,1540466431,DK +1540466432,1540466687,RU +1540466688,1540466943,NL +1540466944,1540467455,CH +1540467456,1540467711,RO +1540467712,1540467967,KW +1540467968,1540468223,GR +1540468224,1540468735,FR +1540468736,1540468991,UA +1540468992,1540469247,PL +1540469248,1540469503,GB +1540469504,1540469759,RO +1540469760,1540470015,PL +1540470016,1540470271,SI +1540470272,1540470527,IL +1540470528,1540471039,RU +1540471040,1540471295,DE +1540471296,1540471551,RU +1540471552,1540471807,GB +1540471808,1540472063,SI +1540472064,1540472319,RO +1540472576,1540472831,FR +1540472832,1540473087,NL +1540473088,1540473343,UA +1540473344,1540473599,IT +1540473600,1540473855,RO +1540473856,1540474367,GB +1540474368,1540474623,RO +1540474624,1540474879,PL +1540474880,1540475135,GB +1540475136,1540475903,UA +1540475904,1540476159,CH +1540476160,1540476415,DE +1540476416,1540476671,UA +1540476672,1540476927,SI +1540476928,1540477183,NL +1540477184,1540477439,RO +1540477440,1540477695,UA +1540477696,1540477951,DE +1540477952,1540478207,NO +1540478208,1540478463,NL +1540478464,1540478719,UA +1540478720,1540478975,SA +1540478976,1540479231,HR +1540479232,1540479487,GB +1540479488,1540479743,RU +1540479744,1540479999,AT +1540480000,1540480255,GB +1540480256,1540480767,PL +1540480768,1540481023,DE +1540481024,1540481279,LT +1540481280,1540481535,GB +1540481536,1540481791,UA +1540481792,1540482047,RU +1540482048,1540482303,DK +1540482304,1540482559,FR +1540482560,1540482815,CH +1540482816,1540483071,DE +1540483072,1540483327,SE +1540483328,1540483839,RU +1540483840,1540484095,UA +1540484096,1540484351,DK +1540484352,1540484607,SI +1540484608,1540485119,UA +1540485120,1540485375,IT +1540485376,1540485631,RO +1540485632,1540485887,IR +1540485888,1540486143,ES +1540486144,1540486399,GB +1540486400,1540486655,FR +1540486656,1540486911,GB +1540486912,1540487167,SK +1540487168,1540487423,PS +1540487424,1540487679,UA +1540487680,1540487935,DE +1540487936,1540488447,GB +1540488448,1540488703,SA +1540488704,1540488959,DE +1540488960,1540489215,RO +1540489216,1540491263,RU +1540491264,1540493311,UA +1540493312,1540494335,CZ +1540494336,1540495359,UA +1540495360,1540496383,RU +1540496384,1540499455,UA +1540499456,1540500479,AM +1540500480,1540501503,RU +1540501504,1540502527,PL +1540502528,1540503551,RU +1540503552,1540504575,NL +1540504576,1540505599,SE +1540505600,1540506623,RU +1540506624,1540507647,GB +1540507648,1540508671,RU +1540508672,1540509695,UA +1540509696,1540510719,RO +1540510720,1540511743,RU +1540511744,1540512767,BG +1540512768,1540514815,UA +1540514816,1540515839,GB +1540515840,1540516863,RU +1540516864,1540517887,UA +1540517888,1540518911,RU +1540518912,1540520959,UA +1540520960,1540521983,RU +1540521984,1540523007,PL +1540523008,1540524031,RU +1540524032,1540525055,AL +1540525056,1540526079,AT +1540526080,1540528127,UA +1540528128,1540529151,RU +1540529152,1540530175,UA +1540530176,1540531199,RU +1540531200,1540532223,UA +1540532224,1540533247,RU +1540533248,1540534271,KZ +1540534272,1540535295,UA +1540535296,1540536319,SK +1540536320,1540537343,RU +1540537344,1540538367,UA +1540538368,1540542463,RU +1540542464,1540543487,PL +1540543488,1540544511,DE +1540544512,1540545535,RU +1540545536,1540546559,AT +1540546560,1540548607,RU +1540548608,1540549631,IE +1540549632,1540552703,PL +1540552704,1540553727,UA +1540553728,1540555775,RU +1540555776,1540556799,UZ +1540556800,1540557823,GB +1540557824,1540559871,UA +1540559872,1540562943,RU +1540562944,1540563967,AT +1540563968,1540564991,RU +1540564992,1540566015,DE +1540566016,1540567039,RU +1540567040,1540568063,MD +1540568064,1540572159,RU +1540572160,1540573183,UA +1540573184,1540574207,NL +1540574208,1540576255,RU +1540576256,1540577279,PL +1540577280,1540579327,RU +1540579328,1540580351,IE +1540580352,1540581375,PL +1540581376,1540582399,RU +1540582400,1540583423,BG +1540583424,1540584447,DE +1540584448,1540586495,UA +1540586496,1540588543,RU +1540588544,1540589567,UA +1540589568,1540593663,RU +1540593664,1540594687,GB +1540594688,1540595711,IT +1540595712,1540596735,KZ +1540596736,1540597759,FR +1540597760,1540598783,SE +1540598784,1540600831,UA +1540600832,1540602879,RU +1540602880,1540603903,BG +1540603904,1540605951,RU +1540605952,1540606975,MD +1540606976,1540607999,UA +1540608000,1540609023,RU +1540609024,1540610047,UA +1540610048,1540611071,RU +1540611072,1540612095,PL +1540612096,1540613119,TR +1540613120,1540614143,RU +1540614144,1540615167,BG +1540615168,1540616191,RU +1540616192,1540617215,AT +1540617216,1540618239,LT +1540618240,1540619263,UA +1540619264,1540620287,PL +1540620288,1540620543,NL +1540620544,1540620799,LB +1540620800,1540621055,PL +1540621056,1540621311,DE +1540621312,1540621567,BA +1540621568,1540621823,PL +1540621824,1540622335,RU +1540622336,1540622591,KW +1540622592,1540622847,PL +1540622848,1540623103,RU +1540623104,1540623359,SE +1540623360,1540623615,GB +1540623616,1540623871,BG +1540623872,1540624127,RO +1540624128,1540624383,CS +1540624384,1540624639,IR +1540624640,1540624895,BG +1540624896,1540625151,GB +1540625152,1540625407,IR +1540625408,1540625663,RU +1540625664,1540625919,FR +1540625920,1540626175,UA +1540626176,1540626431,RO +1540626432,1540626687,SI +1540626688,1540626943,PL +1540626944,1540627199,FR +1540627200,1540627455,PL +1540627456,1540627711,DK +1540627712,1540627967,CH +1540627968,1540628223,PL +1540628224,1540628479,HR +1540628480,1540628735,KW +1540628736,1540628991,PL +1540628992,1540629247,UA +1540629248,1540629503,RO +1540629504,1540629759,DK +1540629760,1540630015,BG +1540630016,1540630271,DE +1540630272,1540630527,RO +1540630528,1540630783,CH +1540630784,1540631039,RU +1540631040,1540631295,NL +1540631296,1540631551,CH +1540631552,1540631807,HR +1540631808,1540632063,LV +1540632064,1540632319,AT +1540632320,1540632575,RU +1540632576,1540632831,DK +1540632832,1540633087,GB +1540633088,1540633343,RU +1540633344,1540633599,CH +1540633600,1540633855,RO +1540633856,1540634367,GB +1540634368,1540634623,FR +1540634624,1540634879,UA +1540634880,1540635135,RU +1540635136,1540635391,FR +1540635392,1540635647,RO +1540635648,1540636159,RU +1540636160,1540636415,RO +1540636416,1540636671,LV +1540636672,1540636927,RU +1540636928,1540637183,UA +1540637184,1540637439,RO +1540637440,1540637695,SA +1540637696,1540637951,RU +1540637952,1540638207,RS +1540638208,1540638463,RO +1540638464,1540638719,AM +1540638720,1540638975,UA +1540638976,1540639487,RO +1540639488,1540639743,CH +1540639744,1540639999,IL +1540640000,1540640255,CH +1540640256,1540640511,FR +1540640512,1540640767,ES +1540640768,1540641023,UA +1540641024,1540641535,RU +1540641536,1540641791,DE +1540641792,1540642047,PL +1540642048,1540642303,DE +1540642304,1540642559,PL +1540642560,1540642815,DE +1540642816,1540643071,IE +1540643072,1540643327,UZ +1540643584,1540643839,CH +1540643840,1540644095,NO +1540644096,1540644607,GB +1540644608,1540644863,DE +1540644864,1540645119,NL +1540645120,1540645375,RU +1540645376,1540645631,BE +1540645632,1540645887,NL +1540645888,1540646143,PL +1540646144,1540646399,RO +1540646400,1540646655,PS +1540646656,1540646911,SE +1540646912,1540647167,RU +1540647168,1540647423,GB +1540647424,1540647679,RU +1540647680,1540647935,CY +1540647936,1540648191,GB +1540648192,1540648447,CH +1540648448,1540648959,RO +1540648960,1540649215,FR +1540649216,1540649471,DE +1540649472,1540649727,IL +1540649728,1540649983,GB +1540649984,1540650239,FR +1540650240,1540650495,CH +1540650496,1540650751,RU +1540650752,1540651007,FR +1540651008,1540651263,RO +1540651264,1540651519,CH +1540651520,1540651775,MK +1540651776,1540652031,RU +1540652032,1540652543,UA +1540652544,1540652799,TR +1540652800,1540653055,LV +1540653056,1540653311,FR +1540653312,1540653567,DK +1540653568,1540653823,DE +1540653824,1540654079,GB +1540654080,1540654335,RS +1540654336,1540654591,RU +1540654592,1540654847,DE +1540654848,1540655103,RU +1540655104,1540655359,AT +1540655360,1540655615,RU +1540655616,1540655871,GB +1540655872,1540656383,NL +1540656384,1540656895,RU +1540656896,1540657151,RO +1540657152,1540657407,DE +1540657408,1540657663,CY +1540657664,1540657919,RU +1540657920,1540658175,FR +1540658176,1540658431,RO +1540658432,1540659199,RU +1540659200,1540659455,FR +1540659456,1540659967,UA +1540659968,1540660223,PL +1540660224,1540660479,UA +1540660480,1540660735,FR +1540660736,1540660991,UA +1540660992,1540661247,RO +1540661248,1540661503,GB +1540661504,1540662015,RO +1540662016,1540662271,BG +1540662272,1540662527,RO +1540662528,1540662783,PL +1540662784,1540663039,GB +1540663040,1540663295,IT +1540663296,1540663551,RU +1540663552,1540664063,PL +1540664064,1540664319,RU +1540664320,1540664575,PL +1540664576,1540665087,UA +1540665088,1540665343,ES +1540665344,1540665599,NL +1540665600,1540665855,UA +1540665856,1540666111,TR +1540666112,1540666367,RU +1540666368,1540666623,UZ +1540666624,1540666879,DE +1540666880,1540667135,GB +1540667136,1540667647,NL +1540667648,1540668159,BE +1540668160,1540668415,AT +1540668416,1540668671,SE +1540668672,1540668927,IL +1540668928,1540669695,RO +1540669696,1540669951,KZ +1540669952,1540670207,UA +1540670208,1540670463,RU +1540670464,1540670719,CH +1540670720,1540671231,RU +1540671232,1540671487,SI +1540671488,1540671743,CH +1540671744,1540671999,BG +1540672000,1540672255,FR +1540672256,1540672511,UA +1540672512,1540672767,DE +1540672768,1540673023,FR +1540673024,1540673279,DE +1540673280,1540673535,SE +1540673536,1540673791,SI +1540673792,1540674047,SE +1540674048,1540674303,GB +1540674304,1540674559,FR +1540674560,1540674815,GB +1540674816,1540675071,GE +1540675072,1540675327,UA +1540675328,1540675583,NL +1540675584,1540675839,GB +1540675840,1540676351,RU +1540676352,1540676607,IT +1540676608,1540677119,RU +1540677120,1540677375,GB +1540677376,1540677631,PL +1540677632,1540677887,DK +1540677888,1540678143,DE +1540678144,1540678399,RU +1540678400,1540678655,RO +1540678656,1540678911,SE +1540678912,1540679167,RO +1540751360,1540752383,PL +1540752384,1540753407,GB +1540753408,1540754431,DE +1540754432,1540755455,RO +1540755456,1540756479,UA +1540756480,1540757503,DK +1540757504,1540758527,PL +1540758528,1540760575,UA +1540760576,1540761599,PL +1540761600,1540762623,RU +1540762624,1540763647,BZ +1540763648,1540764671,UA +1540764672,1540765695,PL +1540765696,1540766719,RU +1540766720,1540767743,IT +1540767744,1540768767,GB +1540769792,1540770815,IT +1540770816,1540771839,RU +1540771840,1540773887,UA +1540773888,1540774911,SE +1540774912,1540775935,GB +1540775936,1540776959,RU +1540776960,1540777983,IL +1540777984,1540779007,HR +1543503872,1545601023,GB +1545601024,1545863167,SE +1545863168,1545895935,RU +1545895936,1545928703,BA +1545928704,1545961471,SI +1545961472,1545994239,RU +1545994240,1546027007,CZ +1546027008,1546059775,RU +1546059776,1546063871,SE +1546063872,1546067967,DE +1546067968,1546072063,SE +1546072064,1546076159,MD +1546076160,1546080255,RU +1546080256,1546084351,AZ +1546084352,1546088447,RU +1546088448,1546088575,SN +1546088576,1546088703,TM +1546088704,1546088831,BA +1546088832,1546088959,TJ +1546088960,1546089087,SD +1546089088,1546089215,DE +1546089216,1546089343,MW +1546089344,1546089471,ZW +1546089472,1546089599,BI +1546089600,1546089727,GW +1546089728,1546089855,LS +1546089856,1546089983,NE +1546089984,1546090111,DE +1546090112,1546090239,MR +1546090240,1546090367,ZM +1546090368,1546090495,MG +1546090496,1546090623,BW +1546090624,1546090751,GH +1546090752,1546090879,ER +1546090880,1546091007,AO +1546091008,1546091135,NA +1546091136,1546091263,KM +1546091264,1546091391,GN +1546091392,1546091519,HT +1546091520,1546091647,AF +1546091648,1546091775,TD +1546091776,1546091903,BF +1546091904,1546092031,RW +1546092032,1546092159,TG +1546092160,1546092287,SD +1546092288,1546092415,RW +1546092416,1546092543,NG +1546092544,1546096639,RU +1546096640,1546100735,IT +1546100736,1546104831,RU +1546104832,1546108927,IE +1546108928,1546113023,GB +1546113024,1546121215,RU +1546121216,1546125311,GR +1546125312,1546256383,GB +1546256384,1546264575,RU +1546266624,1546268671,RU +1546268672,1546270719,IR +1546270720,1546272767,GB +1546272768,1546274815,NO +1546274816,1546276863,SE +1546276864,1546278399,GB +1546278400,1546278911,BZ +1546278912,1546280959,RU +1546280960,1546283007,IT +1546283008,1546285055,CH +1546285056,1546287103,PL +1546287104,1546289151,GB +1546289152,1546291199,RU +1546291200,1546293247,AT +1546293248,1546295295,GB +1546295296,1546297343,SE +1546297344,1546299391,RU +1546299392,1546301439,GB +1546301440,1546303487,LU +1546303488,1546305535,CH +1546305536,1546307583,DE +1546309632,1546311679,RU +1546311680,1546313727,FR +1546313728,1546315775,DE +1546315776,1546317823,NL +1546317824,1546319871,CH +1546319872,1546320383,RS +1546320384,1546320387,SR +1546320388,1546320391,CS +1546320392,1546321919,RS +1546321920,1546323967,RU +1546323968,1546324479,GE +1546324480,1546326015,NO +1546326016,1546328063,ES +1546328064,1546330111,CZ +1546330112,1546332159,SE +1546332160,1546334207,GB +1546334208,1546336255,DE +1546336256,1546338303,CZ +1546338304,1546340351,GB +1546340352,1546342399,DK +1546342400,1546344447,TR +1546344448,1546346495,DK +1546346496,1546348543,AT +1546348544,1546350399,DE +1546350400,1546350431,JP +1546350432,1546350591,DE +1546350592,1546352639,PL +1546352640,1546354687,DK +1546354688,1546356735,FR +1546356736,1546358783,AM +1546358784,1546360831,PL +1546360832,1546364927,RU +1546364928,1546366975,SA +1546366976,1546369023,DK +1546369024,1546371071,RU +1546371072,1546373119,IS +1546373120,1546375167,HU +1546375168,1546377215,GB +1546377216,1546379263,CH +1546379264,1546381311,ES +1546381312,1546383359,DK +1546383360,1546385407,IT +1546385408,1546387455,FR +1546387456,1546518527,TR +1546518528,1546649599,KZ +1546649600,1546665983,SA +1546665984,1546673823,GB +1546673824,1546673839,RS +1546673840,1546677503,GB +1546677504,1546677759,IN +1546677760,1546678863,GB +1546678864,1546678871,RS +1546678872,1546680831,GB +1546680832,1546680895,RS +1546680896,1546681407,GB +1546681408,1546681439,RS +1546681440,1546681455,GB +1546681456,1546681471,RS +1546681472,1546682367,GB +1546682368,1546698751,BE +1546698752,1546715135,NL +1546715136,1546731519,LV +1546731520,1546747903,FR +1546747904,1546764287,RU +1546764288,1546780671,UA +1546780672,1546797055,IR +1546797056,1546813439,DE +1546813440,1546862591,RU +1546862592,1546878975,GE +1546878976,1546895359,DE +1546895360,1546911743,IE +1546911744,1546928127,SK +1546928128,1546944511,GB +1546944512,1546960895,UA +1546960896,1546977279,HU +1546977280,1546993663,MK +1546993664,1547010047,RU +1547010048,1547026431,SI +1547026432,1547042815,NL +1547042816,1547059199,ES +1547059200,1547075583,RU +1547075584,1547091967,GB +1547091968,1547108351,GE +1547108352,1547124735,RU +1547124736,1547141119,MK +1547141120,1547157503,RO +1547157504,1547173887,PL +1547173888,1547436031,ES +1547436032,1547440127,AT +1547440128,1547444223,AL +1547444224,1547448319,IT +1547448320,1547452415,SK +1547452416,1547456511,IT +1547456512,1547460607,RU +1547460608,1547468799,GB +1547468800,1547472895,PL +1547472896,1547476991,DK +1547476992,1547481087,ES +1547481088,1547485183,UA +1547485184,1547489279,IE +1547489280,1547493375,DE +1547493376,1547497471,RS +1547497472,1547501567,GB +1547501568,1547505663,TR +1547505664,1547509759,RU +1547509760,1547513855,LT +1547513856,1547517951,AT +1547517952,1547522047,RU +1547522048,1547526143,CZ +1547526144,1547534335,HU +1547534336,1547538431,FR +1547538432,1547542527,DE +1547542528,1547546623,FR +1547546624,1547550719,IR +1547550720,1547554815,IE +1547554816,1547558911,AT +1547558912,1547563007,IL +1547563008,1547564287,NL +1547564288,1547564311,CH +1547564312,1547564315,BG +1547564316,1547564335,NL +1547564336,1547564415,US +1547564416,1547564439,NZ +1547564440,1547564543,NL +1547564544,1547564799,US +1547564800,1547565055,NL +1547565056,1547565823,US +1547565824,1547567103,NL +1547567104,1547571199,GB +1547571200,1547575295,AT +1547575296,1547579391,NO +1547579392,1547583487,RU +1547583488,1547587583,KG +1547587584,1547591679,IT +1547591680,1547595775,EE +1547595776,1547599871,JO +1547599872,1547603967,LT +1547603968,1547608063,RU +1547608064,1547612159,LB +1547612160,1547616255,IR +1547616256,1547620351,DK +1547620352,1547620359,JE +1547620360,1547620367,NG +1547620368,1547620375,JE +1547620376,1547620383,NG +1547620384,1547620399,JE +1547620400,1547620407,NG +1547620408,1547620415,JE +1547620416,1547620423,NG +1547620424,1547620439,JE +1547620440,1547620551,NG +1547620552,1547620559,JE +1547620560,1547620615,NG +1547620616,1547620639,JE +1547620640,1547620647,NG +1547620648,1547620863,JE +1547620864,1547620871,NG +1547620872,1547620879,JE +1547620880,1547620887,NG +1547620888,1547620895,JE +1547620896,1547620903,NG +1547620904,1547620911,JE +1547620912,1547620935,NG +1547620936,1547620951,JE +1547620952,1547620959,NG +1547620960,1547620967,JE +1547620968,1547620983,NG +1547620984,1547621007,JE +1547621008,1547621031,NG +1547621032,1547621047,JE +1547621048,1547621063,NG +1547621064,1547621071,JE +1547621072,1547621087,NG +1547621088,1547621103,JE +1547621104,1547621119,NG +1547621120,1547621127,JE +1547621128,1547621135,NG +1547621136,1547621143,JE +1547621144,1547621151,NG +1547621152,1547621167,JE +1547621168,1547621175,NG +1547621176,1547621247,JE +1547621248,1547621263,NG +1547621264,1547624447,JE +1547624448,1547628543,CZ +1547628544,1547632639,BG +1547632640,1547636735,TR +1547636736,1547640831,SI +1547644928,1547649023,CZ +1547649024,1547653119,RU +1547653120,1547657215,LV +1547657216,1547660287,RU +1547660288,1547661311,BE +1547661312,1547665407,LV +1547665408,1547667807,GB +1547667808,1547667815,LT +1547667816,1547669503,GB +1547669504,1547672575,AT +1547672576,1547672831,HR +1547672832,1547673599,AT +1547673600,1547685887,RU +1547685888,1547689983,AT +1547689984,1547694079,IT +1547694080,1547698175,HU +1547698176,1548222463,NL +1548222464,1548746751,DE +1548746752,1549271039,RO +1549271040,1549795327,FR +1549795328,1550057471,AE +1550057472,1550188543,RU +1550188544,1550319615,FR +1550319616,1550581759,CH +1550581760,1550843903,NL +1550843904,1550974975,UA +1550974976,1551007743,RO +1551007744,1551106047,MD +1551106048,1551237119,DE +1551237120,1551368191,GR +1551368192,1551499263,NL +1551503360,1551504383,GB +1551504384,1551505407,FR +1551507456,1551508479,DE +1551508480,1551509503,IT +1551511552,1551512575,GB +1551516672,1551517695,IT +1551517696,1551518719,ES +1551528960,1551529983,FR +1551544320,1551547391,DE +1551548416,1551551487,DE +1551555584,1551558655,FR +1551564800,1551572991,FR +1551572992,1551576063,NL +1551577088,1551580159,NL +1551630336,1551892479,RU +1551892480,1556086783,FR +1556086784,1558708223,DE +1558708224,1559232511,GB +1559232512,1559240703,IL +1559240704,1559248895,BA +1559248896,1559257087,LV +1559257088,1559265279,UA +1559265280,1559273471,RU +1559273472,1559281663,CZ +1559281664,1559289855,RU +1559289856,1559298047,SK +1559298048,1559306239,RU +1559306240,1559314431,JO +1559314432,1559322623,GE +1559322624,1559330815,RU +1559330816,1559339007,BA +1559339008,1559339711,RU +1559339712,1559339775,CY +1559339776,1559347199,RU +1559347200,1559351295,SE +1559351296,1559355391,DK +1559355392,1559388159,RU +1559388160,1559396351,UA +1559396352,1559404543,GB +1559404544,1559412735,FI +1559412736,1559420927,IR +1559420928,1559429119,HR +1559429120,1559437311,FR +1559437312,1559445503,AT +1559445504,1559461887,RU +1559461888,1559470079,IT +1559470080,1559478271,RU +1559478272,1559486463,CZ +1559486464,1559494655,DK +1559494656,1559502847,SE +1559502848,1559511039,PL +1559511040,1559519231,SI +1559519232,1559527423,UA +1559527424,1559529471,RS +1559529472,1559530495,CS +1559530496,1559531519,RS +1559531520,1559532543,CS +1559532544,1559535615,RS +1559535616,1559543807,GB +1559543808,1559551999,SE +1559552000,1559560191,RU +1559560192,1559568383,SK +1559568384,1559576575,RU +1559576576,1559584767,HU +1559584768,1559592959,KG +1559592960,1559601151,FR +1559601152,1559609343,IT +1559609344,1559617535,SK +1559617536,1559625727,GB +1559625728,1559633919,DK +1559633920,1559642111,IT +1559642112,1559650303,RU +1559650304,1559658495,IT +1559658496,1559674879,RU +1559674880,1559683071,ES +1559683072,1559691263,CH +1559691264,1559756799,BG +1559756800,1559789567,AT +1559789568,1559838719,RU +1559838720,1559855103,UA +1559855104,1559887871,HU +1559887872,1559920639,PT +1559920640,1559932927,LU +1559932928,1559934975,DE +1559934976,1559937023,LU +1559937024,1559943167,DE +1559943168,1559950335,LU +1559950336,1559953407,DE +1559953408,1559986175,MT +1559986176,1560018943,IE +1560018944,1560051711,DE +1560051712,1560084479,RU +1560084480,1560117247,GR +1560117248,1560150015,CZ +1560150016,1560182783,NL +1560182784,1560215551,SE +1560215552,1560281087,RU +1560281088,1562378239,FR +1562378240,1564999679,IT +1564999680,1565523967,UA +1565523968,1565655039,RU +1565655040,1565786111,AT +1565786112,1565917183,BY +1565917184,1565983863,RS +1565983864,1565983871,CS +1565983872,1565984255,RS +1565984256,1565984511,CS +1565984512,1565985279,RS +1565985280,1565985791,CS +1565985792,1565986159,RS +1565986160,1565986175,CS +1565986176,1565986239,RS +1565986240,1565986271,CS +1565986272,1565986295,RS +1565986296,1565986303,CS +1565986304,1565987119,RS +1565987120,1565987135,CS +1565987136,1565987531,RS +1565987532,1565987535,CS +1565987536,1566048255,RS +1566048256,1566056447,RU +1566056448,1566060543,IT +1566060544,1566064639,UA +1566064640,1566068735,RU +1566068736,1566072831,AZ +1566072832,1566081023,IT +1566081024,1566085119,RU +1566085120,1566089215,NL +1566089216,1566097407,RU +1566097408,1566101503,GB +1566101504,1566105599,RU +1566105600,1566109695,DE +1566109696,1566113791,CH +1566113792,1566117887,DE +1566117888,1566121983,TR +1566121984,1566126079,NO +1566126080,1566130175,IT +1566130176,1566134271,TR +1566134272,1566138367,GB +1566138368,1566142463,CZ +1566142464,1566146559,NO +1566146560,1566150655,GB +1566150656,1566154751,CZ +1566154752,1566158847,HU +1566158848,1566162943,RU +1566162944,1566167039,PL +1566167040,1566171135,UA +1566171136,1566175231,HU +1566175232,1566179327,IE +1566179328,1566183423,DK +1566183424,1566187519,ES +1566187520,1566191615,RU +1566191616,1566195711,FI +1566195712,1566199807,AL +1566199808,1566207999,RU +1566208000,1566212095,DK +1566212096,1566216191,DE +1566216192,1566220287,SE +1566220288,1566224383,CZ +1566224384,1566228479,DE +1566228480,1566232575,GB +1566232576,1566248959,RU +1566248960,1566257151,GB +1566257152,1566261247,CZ +1566261248,1566265343,TR +1566265344,1566269439,DE +1566269440,1566271487,NO +1566271488,1566271999,FI +1566272000,1566272511,SE +1566272512,1566273023,DK +1566273024,1566273535,NO +1566273536,1566277631,RU +1566277632,1566281727,IT +1566281728,1566285823,CZ +1566285824,1566289919,RU +1566289920,1566294015,FI +1566294016,1566298111,IQ +1566298112,1566302207,PL +1566302208,1566306303,RU +1566306304,1566310399,CZ +1566310400,1566312447,SE +1566312448,1566314495,IE +1566314496,1566316543,BE +1566316544,1566318591,NO +1566318592,1566320639,RU +1566320640,1566321151,GB +1566321152,1566321407,DE +1566321408,1566321663,UA +1566321664,1566321919,BZ +1566321920,1566322431,GB +1566322432,1566322687,BS +1566322688,1566324735,CZ +1566324736,1566326783,HU +1566326784,1566328831,RU +1566328832,1566330879,IT +1566330880,1566334975,RU +1566334976,1566337023,NL +1566337024,1566339071,FR +1566339072,1566341119,RU +1566341120,1566343167,GB +1566343168,1566345215,DE +1566345216,1566347263,RU +1566347264,1566349311,DE +1566349312,1566351359,IT +1566351360,1566353407,AT +1566353408,1566355455,ES +1566355456,1566357503,RU +1566357504,1566359551,IT +1566359552,1566363647,RU +1566363648,1566365695,GB +1566365696,1566367743,RU +1566367744,1566371839,ES +1566371840,1566373887,RU +1566373888,1566375935,RS +1566375936,1566377983,DE +1566377984,1566380031,BG +1566380032,1566382079,IT +1566382080,1566384127,TR +1566384128,1566386175,RU +1566386176,1566388223,FR +1566388224,1566388735,HU +1566388736,1566389247,PT +1566389248,1566389759,HU +1566389760,1566390271,US +1566390272,1566392319,LT +1566392320,1566394367,ES +1566394368,1566396415,NO +1566396416,1566398463,GB +1566398464,1566400511,RU +1566400512,1566400575,NO +1566400576,1566400607,NL +1566400608,1566400639,GB +1566400640,1566400671,NO +1566400672,1566400703,DE +1566400704,1566400735,NL +1566400736,1566401023,NO +1566401024,1566401055,US +1566401056,1566401087,NO +1566401088,1566401215,US +1566401216,1566401471,NO +1566401472,1566401535,US +1566401536,1566401599,IN +1566401600,1566401663,CN +1566401664,1566401727,SG +1566401728,1566401791,AU +1566401792,1566401983,NO +1566401984,1566402047,AU +1566402048,1566402559,NO +1566402560,1566404607,IT +1566404608,1566406655,ES +1566406656,1566408703,NL +1566408704,1566410751,GB +1566410752,1566414847,RU +1566414848,1566416895,SE +1566416896,1566418943,IT +1566418944,1566420991,RU +1566420992,1566423039,ES +1566423040,1566425087,FR +1566425088,1566427135,RS +1566427136,1566429183,IT +1566429184,1566435327,GB +1566435328,1566437375,IT +1566437376,1566439423,BE +1566439424,1566443519,DE +1566443520,1566445567,NO +1566445568,1566447615,CY +1566447616,1566451711,IT +1566451712,1566453759,IL +1566453760,1566455807,IQ +1566455808,1566457855,PT +1566457856,1566459903,CH +1566459904,1566461951,GB +1566461952,1566463999,DE +1566464000,1566466047,IT +1566466048,1566468095,ES +1566468096,1566470143,BE +1566470144,1566472191,IE +1566472192,1566474239,GB +1566474240,1566476287,DE +1566476288,1566478335,BG +1566478336,1566482431,RU +1566482432,1566484479,FR +1566484480,1566486527,SE +1566486528,1566488575,RU +1566488576,1566490623,PL +1566490624,1566492671,TR +1566492672,1566494719,NL +1566494720,1566496767,SE +1566496768,1566498815,AM +1566498816,1566500863,NL +1566500864,1566502911,RU +1566502912,1566504959,CH +1566504960,1566507007,TR +1566507008,1566509055,NL +1566509056,1566511103,GB +1566511104,1566511359,FR +1566511360,1566513151,BE +1566513152,1566515199,BH +1566515200,1566517247,CZ +1566517248,1566519295,RU +1566519296,1566521343,BE +1566521344,1566523391,FR +1566523392,1566525439,MK +1566525440,1566527487,IS +1566527488,1566529535,IE +1566529536,1566531583,PL +1566531584,1566533631,RU +1566533632,1566535679,GB +1566535680,1566537727,NL +1566537728,1566539775,GB +1566539776,1566541823,DE +1566541824,1566543871,RU +1566543872,1566545919,NL +1566545920,1566552063,RU +1566552064,1566554111,TR +1566554112,1566556159,UA +1566556160,1566558207,RU +1566558208,1566560255,JO +1566560256,1566564351,IT +1566564352,1566566399,IS +1566566400,1566568447,FR +1566568448,1566570495,KZ +1566570496,1566572543,NL +1566572544,1566703615,GB +1566703616,1566769151,SA +1566769152,1566773759,CZ +1566773760,1566774015,SK +1566774016,1566834687,CZ +1566834688,1566900223,RU +1566900224,1566965759,IT +1566965760,1567031295,PT +1567031296,1567096831,SI +1567096832,1567162367,DE +1567162368,1567227903,PL +1567227904,1567293439,FI +1567293440,1567358975,IE +1567358976,1567424511,PT +1567424512,1567490047,CY +1567490048,1567555583,IR +1567555584,1567621119,AT +1567621120,1567696383,RO +1567696384,1567696895,MD +1567696896,1567705087,RO +1567705088,1567707135,MD +1567707136,1567715327,RO +1567715328,1567717375,MD +1567717376,1567752191,RO +1567752192,1567756287,MD +1567756288,1567775743,RO +1567775744,1567776767,MD +1567776768,1567830015,RO +1567830016,1567831039,MD +1567831040,1567883263,RO +1567883264,1567948799,MD +1567948800,1568178175,RO +1568178176,1568243711,RU +1568243712,1568276479,FR +1568276480,1568293135,DE +1568293136,1568293151,SA +1568293152,1568294223,DE +1568294224,1568294239,IT +1568294240,1568309247,DE +1568309248,1568342015,RO +1568342016,1568374783,BG +1568374784,1568440319,RU +1568440320,1568473087,NO +1568473088,1568505855,BY +1568505856,1568538623,NL +1568538624,1568555007,GB +1568555008,1568571391,UA +1568571392,1568579583,RO +1568579584,1568581631,BG +1568581632,1568604159,RO +1568604160,1568636927,UA +1568636928,1568665599,DE +1568665600,1568667391,MD +1568667392,1568667399,PA +1568667400,1568667647,MD +1568667648,1568667655,AF +1568667656,1568669695,MD +1568669696,1569193983,DE +1569193984,1569718271,HR +1569718272,1570242559,IT +1570242560,1570275327,GB +1570275328,1570308095,BG +1570308096,1570340863,CZ +1570340864,1570439167,RU +1570439168,1570471935,TR +1570471936,1570504703,BG +1570504704,1570570239,ES +1570570240,1570572287,NL +1570572288,1570574335,UA +1570574336,1570576383,RU +1570576384,1570578431,UA +1570578432,1570580479,CH +1570580480,1570582527,RU +1570582528,1570584575,DE +1570584576,1570586623,RU +1570586624,1570590719,PL +1570590720,1570592767,IL +1570592768,1570596863,PL +1570596864,1570598911,UA +1570598912,1570600959,PL +1570600960,1570605055,RU +1570605056,1570607103,NL +1570607104,1570609151,RU +1570609152,1570611199,PL +1570611200,1570613247,RU +1570615296,1570619391,RU +1570619392,1570621439,BA +1570621440,1570625535,RU +1570625536,1570627583,GB +1570627584,1570635775,RU +1570635776,1570652159,FR +1570652160,1570652543,SE +1570652544,1570652551,FR +1570652552,1570652891,SE +1570652892,1570652895,DE +1570652896,1570655631,SE +1570655632,1570655635,DE +1570655636,1570655999,SE +1570656000,1570656003,DE +1570656004,1570656119,SE +1570656120,1570656127,GB +1570656128,1570665343,SE +1570665344,1570665351,GB +1570665352,1570666495,SE +1570666496,1570666499,ES +1570666500,1570666751,SE +1570666752,1570666755,ES +1570666756,1570667007,SE +1570667008,1570667011,ES +1570667012,1570667263,SE +1570667264,1570667267,ES +1570667268,1570667519,SE +1570667520,1570667523,NL +1570667524,1570667527,IT +1570667528,1570667775,SE +1570667776,1570667779,NL +1570667780,1570668031,SE +1570668032,1570668035,NL +1570668036,1570668287,SE +1570668288,1570668291,NL +1570668292,1570668543,SE +1570668544,1570701311,RU +1570701312,1570717695,PL +1570717696,1570725887,HR +1570734080,1570750463,PL +1570750464,1570752511,NO +1570752512,1570754559,GB +1570754560,1570756607,ES +1570756608,1570764799,RU +1570764800,1570766847,DE +1570766848,1571291135,DK +1571291136,1571422207,RO +1571422208,1571426303,RU +1571426304,1571430399,CZ +1571430400,1571434495,UA +1571434496,1571438591,RU +1571438592,1571442687,UA +1571442688,1571450879,RU +1571450880,1571454975,CZ +1571454976,1571459071,RU +1571459072,1571553279,CZ +1571553280,1571684351,IL +1571684352,1571686399,ES +1571686400,1571688447,GB +1571688448,1571690495,CH +1571690496,1571692543,GE +1571692544,1571694591,FR +1571694592,1571696639,LU +1571696640,1571700735,RU +1571700736,1571702783,IT +1571702784,1571704831,RU +1571704832,1571706879,GB +1571706880,1571708927,NL +1571708928,1571709439,GB +1571709440,1571709567,DE +1571709568,1571709695,GB +1571709696,1571709823,FR +1571709824,1571709951,GB +1571709952,1571710079,NL +1571710080,1571710207,GB +1571710208,1571710335,ES +1571710336,1571710463,GB +1571710464,1571710591,IT +1571710592,1571710975,GB +1571710976,1571713023,NL +1571713024,1571715071,RU +1571715072,1571717119,GR +1571717120,1571719167,RU +1571719168,1571721215,GB +1571721216,1571723263,FR +1571723264,1571723775,GB +1571723776,1571724031,SE +1571724032,1571725311,GB +1571725312,1571727359,RO +1571727360,1571729407,IE +1571729408,1571731455,SK +1571731456,1571732479,CH +1571732480,1571732495,LI +1571732496,1571733503,CH +1571733504,1571735551,FI +1571735552,1571737599,NL +1571737600,1571737855,GB +1571738112,1571738367,NL +1571739648,1571741695,GB +1571741696,1571743743,RU +1571743744,1571745791,GB +1571745792,1571747839,RU +1571747840,1571749887,GB +1571749888,1571758079,RU +1571758080,1571766271,IL +1571766272,1571786751,PL +1571790848,1571794943,PL +1571794944,1571799039,NL +1571799040,1571815423,UA +1571815424,1571831807,FR +1571831808,1571848191,DK +1571848192,1571864575,RU +1571864576,1571880959,PL +1571880960,1571897343,RU +1571897344,1571913727,NO +1571913728,1571930111,GE +1571930112,1571946495,LV +1571946496,1571962879,SA +1571962880,1571979263,RU +1571979264,1571995647,DK +1571995648,1572012031,UA +1572012032,1572016127,NO +1572016128,1572028415,SE +1572028416,1572044799,RU +1572044800,1572061183,IT +1572061184,1572077567,PL +1572077568,1572093951,RU +1572093952,1572110335,BG +1572110336,1572126719,RU +1572126720,1572143103,UA +1572143104,1572159487,DE +1572159488,1572175871,CZ +1572175872,1572192255,PL +1572192256,1572225023,RU +1572225024,1572241407,TR +1572241408,1572257791,SE +1572257792,1572274175,FR +1572274176,1572290559,US +1572290560,1572306943,RU +1572306944,1572323327,BG +1572323328,1572339711,UA +1572339712,1572343807,PS +1572343808,1572347903,CH +1572347904,1572351999,FR +1572352000,1572356095,DE +1572356096,1572360191,SK +1572360192,1572362751,CS +1572362752,1572364287,RS +1572364288,1572368383,NL +1572368384,1572372479,NO +1572372480,1572376575,DE +1572376576,1572380671,TR +1572380672,1572384767,RU +1572384768,1572388863,DE +1572388864,1572392959,DK +1572392960,1572397055,US +1572397056,1572401151,AZ +1572401152,1572405247,GB +1572405248,1572409343,CZ +1572409344,1572413439,RU +1572413440,1572417535,AM +1572417536,1572421631,CZ +1572421632,1572425727,KZ +1572425728,1572429823,LB +1572429824,1572433919,CZ +1572433920,1572438015,IT +1572438016,1572442111,AT +1572442112,1572446207,RU +1572446208,1572450303,NO +1572450304,1572458495,RU +1572458496,1572462591,UA +1572462592,1572466687,LB +1572466688,1572470783,EE +1572470784,1572474879,DE +1572474880,1572483071,GB +1572483072,1572487167,RU +1572487168,1572491263,RS +1572491264,1572495359,IT +1572495360,1572499455,RU +1572499456,1572503551,TR +1572503552,1572504063,IT +1572504064,1572504319,US +1572504320,1572504575,DE +1572504576,1572507647,IT +1572507648,1572511743,GB +1572511744,1572515839,DE +1572515840,1572517759,NL +1572517760,1572517775,CA +1572517776,1572519935,NL +1572519936,1572524031,DE +1572524032,1572528127,GE +1572528128,1572532223,RU +1572532224,1572536319,IT +1572536320,1572538367,GB +1572538368,1572540415,NL +1572540416,1572542463,GB +1572542464,1572544511,IT +1572544512,1572546559,HR +1572546560,1572548607,FR +1572548608,1572550655,GB +1572550656,1572552703,DE +1572552704,1572554751,TR +1572554752,1572556799,CH +1572556800,1572558847,NO +1572558848,1572560895,IT +1572560896,1572562943,RU +1572562944,1572564991,CZ +1572564992,1572567039,DE +1572567040,1572569087,RU +1572569088,1572571135,NL +1572571136,1572573183,RO +1572573184,1572575231,GB +1572575232,1572577279,RU +1572577280,1572579327,AM +1572579328,1572581375,GB +1572581376,1572585471,RU +1572585472,1572587519,CH +1572587520,1572589567,TR +1572589568,1572591615,CH +1572591616,1572593663,NL +1572593664,1572595711,GB +1572595712,1572597759,DE +1572597760,1572599807,RS +1572599808,1572601855,DE +1572601856,1572603903,SE +1572603904,1572605951,GE +1572605952,1572607999,RU +1572608000,1572610047,DE +1572610048,1572612095,UA +1572612096,1572614143,RU +1572614144,1572616191,ES +1572616192,1572618239,CH +1572618240,1572620287,RS +1572620288,1572620559,CH +1572620560,1572620567,NL +1572620568,1572622335,CH +1572622336,1572624383,RU +1572624384,1572626431,NO +1572626432,1572628479,RU +1572628480,1572630527,DE +1572630528,1572632575,IT +1572632576,1572634623,RU +1572634624,1572636671,US +1572636672,1572638719,ES +1572638720,1572640767,FR +1572640768,1572642815,RU +1572642816,1572644863,UA +1572644864,1572646911,FR +1572646912,1572648959,GB +1572648960,1572651007,RU +1572651008,1572653055,BH +1572653056,1572657151,RU +1572657152,1572659199,DE +1572659200,1572661247,IT +1572661248,1572663295,NO +1572663296,1572665343,DE +1572665344,1572667391,NL +1572667392,1572669439,GB +1572669440,1572673535,RU +1572673536,1572675583,AT +1572675584,1572677631,ES +1572677632,1572681727,RU +1572681728,1572681983,DE +1572681984,1572682239,RU +1572682240,1572682751,DE +1572682752,1572683775,RU +1572683776,1572685823,CH +1572685824,1572689919,RU +1572689920,1572691967,ES +1572691968,1572694015,BG +1572694016,1572694214,GB +1572694215,1572694217,US +1572694218,1572694655,GB +1572694656,1572694783,SG +1572694784,1572696063,GB +1572696064,1572698111,HU +1572698112,1572700159,RU +1572700160,1572702207,NL +1572702208,1572704255,IT +1572704256,1572706303,RU +1572706304,1572708351,DE +1572708352,1572710399,GB +1572710400,1572712447,DE +1572712448,1572714495,ES +1572714496,1572716543,IT +1572716544,1572718591,SA +1572718592,1572720639,RU +1572720640,1572722687,IT +1572722688,1572726783,RU +1572726784,1572728831,CH +1572728832,1572730879,SE +1572730880,1572732927,RU +1572732928,1572734975,HU +1572734976,1572739071,RU +1572739072,1572741119,IR +1572741120,1572743167,FI +1572743168,1572745215,UA +1572745216,1572749311,CZ +1572749312,1572751359,DE +1572751360,1572753407,CH +1572753408,1572755455,NO +1572755456,1572757503,DE +1572757504,1572759551,FI +1572759552,1572761599,RU +1572761600,1572763647,GB +1572763648,1572765695,TR +1572765696,1572767743,CZ +1572767744,1572769740,NL +1572769741,1572769790,KY +1572769792,1572770047,RO +1572770048,1572770111,RS +1572770112,1572771839,RO +1572771840,1572773887,ES +1572773888,1572775935,RS +1572775936,1572777983,GB +1572777984,1572780031,UA +1572780032,1572782079,NL +1572782080,1572784127,SE +1572784128,1572786175,RU +1572786176,1572788223,FR +1572788224,1572790271,TR +1572790272,1572792319,RU +1572792320,1572794367,DE +1572794368,1572796415,RU +1572796416,1572798463,DE +1572798464,1572800511,NL +1572800512,1572804607,RU +1572804608,1572808703,GB +1572808704,1572810751,FR +1572810752,1572812799,DE +1572812800,1572814847,RU +1572814848,1572816895,KW +1572816896,1572818943,RU +1572818944,1572820991,FR +1572820992,1572823039,GB +1572823040,1572825087,BY +1572825088,1572827135,RU +1572827136,1572829183,NO +1572829184,1572831231,FI +1572831232,1572833279,BH +1572833280,1572835327,ES +1572835328,1572837375,IE +1572837376,1572839423,AM +1572839424,1572841471,DE +1572842240,1572842495,LV +1572843520,1572845567,JO +1572845568,1572847615,FR +1572847616,1572849663,GI +1572849664,1572851711,GB +1572851712,1572853759,DE +1572853760,1572854271,BE +1572855552,1572855807,LU +1572855808,1572857855,KZ +1572857856,1572859903,SE +1572859904,1572861951,IT +1572861952,1572863999,CH +1572864000,1577058303,DE +1577058304,1578106879,GB +1578106880,1578172415,DE +1578172416,1578237951,MT +1578237952,1578303487,DK +1578303488,1578369023,RU +1578369024,1578434559,AZ +1578434560,1578500095,HU +1578500096,1578565631,FI +1578565632,1578582015,FR +1578582016,1578584575,IT +1578584576,1578586111,PT +1578586112,1578588159,ES +1578588160,1578590207,PL +1578590208,1578590287,FR +1578590288,1578590303,PL +1578590304,1578590319,GB +1578590320,1578590335,CH +1578590336,1578590367,FR +1578590368,1578590399,BE +1578590400,1578590415,FR +1578590416,1578590431,PL +1578590432,1578590447,BE +1578590448,1578590479,FR +1578590480,1578590495,IT +1578590496,1578590511,PL +1578590512,1578590543,FR +1578590544,1578590575,ES +1578590576,1578590591,CH +1578590592,1578590623,FR +1578590624,1578590687,GB +1578590688,1578590703,FR +1578590704,1578590719,PL +1578590720,1578590799,FR +1578590800,1578590847,GB +1578590848,1578590879,FR +1578590880,1578590895,PL +1578590896,1578590911,GB +1578590912,1578590927,ES +1578590928,1578590943,GB +1578590944,1578590959,CH +1578590960,1578590975,FR +1578590976,1578590991,GB +1578590992,1578591007,ES +1578591008,1578591023,FR +1578591024,1578591039,PL +1578591040,1578591055,NL +1578591056,1578591087,FR +1578591088,1578591103,ES +1578591104,1578591119,DE +1578591120,1578591135,CH +1578591136,1578591151,FR +1578591152,1578591167,ES +1578591168,1578591183,FR +1578591184,1578591199,ES +1578591200,1578591247,FR +1578591248,1578591263,PL +1578591264,1578591295,FR +1578591296,1578591343,PL +1578591344,1578591359,ES +1578591360,1578591375,PL +1578591376,1578591391,FR +1578591392,1578591407,CH +1578591408,1578591423,GB +1578591424,1578591471,FR +1578591472,1578591487,PL +1578591488,1578591503,FR +1578591504,1578591551,ES +1578591552,1578591567,FR +1578591568,1578591583,CH +1578591584,1578591599,IT +1578591600,1578591647,FR +1578591648,1578591663,GB +1578591664,1578591679,PL +1578591680,1578591711,FR +1578591712,1578591743,PL +1578591744,1578591759,ES +1578591760,1578591791,FR +1578591792,1578591807,PL +1578591808,1578591823,DE +1578591824,1578591887,FR +1578591888,1578591919,PL +1578591920,1578591951,ES +1578591952,1578591967,PT +1578591968,1578591983,FR +1578591984,1578592031,PL +1578592032,1578592047,IT +1578592048,1578592111,FR +1578592112,1578592127,GB +1578592128,1578592143,FR +1578592144,1578592159,PL +1578592160,1578592175,ES +1578592176,1578592223,FR +1578592224,1578592255,ES +1578592256,1578592271,FR +1578592272,1578592287,PL +1578592288,1578592351,ES +1578592352,1578592367,FR +1578592368,1578592383,GB +1578592384,1578592415,PL +1578592416,1578592479,FR +1578592480,1578592495,PL +1578592496,1578592511,FR +1578592512,1578592575,GB +1578592576,1578592591,FR +1578592592,1578592607,PL +1578592608,1578592687,FR +1578592688,1578592719,ES +1578592720,1578592735,CH +1578592736,1578592751,DE +1578592752,1578592767,GB +1578592768,1578592783,FR +1578592784,1578592799,DE +1578592800,1578592831,FR +1578592832,1578592847,PL +1578592848,1578592895,FR +1578592896,1578592959,IT +1578592960,1578593007,FR +1578593008,1578593023,GB +1578593024,1578593279,DE +1578593280,1578593295,PL +1578593296,1578593311,FR +1578593312,1578593327,PL +1578593328,1578593359,FR +1578593360,1578593375,GB +1578593376,1578593391,FR +1578593392,1578593407,BE +1578593408,1578593439,FR +1578593440,1578593455,PL +1578593456,1578593503,FR +1578593504,1578593535,PL +1578593536,1578593615,FR +1578593616,1578593631,BE +1578593632,1578593663,FR +1578593664,1578593679,DE +1578593680,1578593727,FR +1578593728,1578593743,GB +1578593744,1578593759,IT +1578593760,1578593775,ES +1578593776,1578593823,FR +1578593824,1578593839,GB +1578593840,1578593935,FR +1578593936,1578593967,PL +1578593968,1578594015,FR +1578594016,1578594031,BE +1578594032,1578594047,PL +1578594048,1578594063,FR +1578594064,1578594079,PL +1578594080,1578594095,IT +1578594096,1578594111,GB +1578594112,1578594127,PL +1578594128,1578594143,GB +1578594144,1578594191,FR +1578594192,1578594207,IT +1578594208,1578594223,PL +1578594224,1578594239,CH +1578594240,1578594319,FR +1578594320,1578594335,PL +1578594336,1578594399,FR +1578594400,1578594431,PL +1578594432,1578594447,FR +1578594448,1578594463,PL +1578594464,1578594479,FR +1578594480,1578594495,ES +1578594496,1578594527,PL +1578594528,1578594559,FR +1578594560,1578594591,PL +1578594592,1578594607,ES +1578594608,1578594623,FR +1578594624,1578594687,DE +1578594688,1578594703,FR +1578594704,1578594719,GB +1578594720,1578594751,FR +1578594752,1578594767,ES +1578594768,1578594799,FR +1578594800,1578594815,DE +1578594816,1578595039,FR +1578595040,1578595055,GB +1578595056,1578595071,FR +1578595072,1578595103,CH +1578595104,1578595119,GB +1578595120,1578595135,DE +1578595136,1578595151,FR +1578595152,1578595167,PL +1578595168,1578595183,FR +1578595184,1578595199,DE +1578595200,1578595327,GB +1578595328,1578595343,IT +1578595344,1578595359,PL +1578595360,1578595455,FR +1578595456,1578595487,CH +1578595488,1578595503,DE +1578595504,1578595519,PL +1578595520,1578595599,FR +1578595600,1578595647,PL +1578595648,1578595663,FR +1578595664,1578595679,ES +1578595680,1578595695,BE +1578595696,1578595711,PL +1578595712,1578595983,FR +1578595984,1578596111,DE +1578596112,1578596127,ES +1578596128,1578596143,PL +1578596144,1578596159,GB +1578596160,1578596191,PL +1578596192,1578596207,ES +1578596208,1578596255,FR +1578596256,1578596287,GB +1578596288,1578596319,PL +1578596320,1578596335,FR +1578596336,1578596351,ES +1578596352,1578596863,GB +1578596864,1578600191,FR +1578600192,1578600255,BE +1578600256,1578602495,FR +1578602496,1578604543,NL +1578604544,1578606591,GB +1578606592,1578608639,DE +1578608640,1578631167,FR +1578631168,1578663935,RO +1578663936,1578762239,RU +1578762240,1578795007,BG +1578795008,1578827775,RU +1578827776,1578860543,UA +1578860544,1578893311,HU +1578893312,1578991615,RU +1578991616,1579024383,KW +1579024384,1579057151,GB +1579057152,1579089919,LV +1579089920,1579090463,NL +1579090464,1579090495,GB +1579090496,1579090559,NL +1579090560,1579104511,GB +1579104512,1579104767,NL +1579104768,1579105023,GB +1579105024,1579105087,NL +1579105088,1579105279,GB +1579105280,1579105343,NL +1579105344,1579105535,GB +1579105536,1579105599,NL +1579105600,1579106303,GB +1579106304,1579106559,FR +1579106560,1579114495,GB +1579114496,1579115007,DE +1579115008,1579122687,GB +1579122688,1579155455,RU +1579155456,1579679743,IT +1579679744,1579745279,PL +1579745280,1579810815,RU +1579810816,1579876351,PL +1579876352,1579941887,GE +1579941888,1580007423,HU +1580007424,1580015615,RU +1580015616,1580048383,UA +1580048384,1580064767,RU +1580064768,1580072959,DE +1580072960,1580134399,PT +1580134400,1580136447,ES +1580136448,1580138495,PT +1580138496,1580204031,IT +1580204032,1580335103,RO +1580335104,1580466175,RU +1580466176,1580597247,RO +1580597248,1580728319,TR +1580728320,1580990463,AE +1580990464,1581252607,RO +1581252608,1581776895,GR +1581776896,1581793279,RU +1581793280,1581809663,PL +1581809664,1581826047,BG +1581826048,1581842431,GB +1581842432,1581858815,BG +1581858816,1581875199,IT +1581875200,1581891583,TR +1581891584,1581907967,RU +1581907968,1581924351,IT +1581924352,1581940735,UA +1581940736,1581957119,IR +1581957120,1581973503,CZ +1581973504,1581989887,RU +1581989888,1582006271,PL +1582006272,1582022655,RU +1582022656,1582039039,NL +1582039040,1582055423,RU +1582055424,1582071807,UA +1582071808,1582088191,ES +1582088192,1582104575,GB +1582104576,1582153727,RU +1582153728,1582170111,SA +1582170112,1582186495,CH +1582186496,1582202879,TR +1582202880,1582219263,PL +1582219264,1582252031,RU +1582252032,1582268415,TR +1582268416,1582284799,DE +1582284800,1582301183,BH +1582301184,1583349759,IT +1583349760,1583611903,SA +1583611904,1583615999,LV +1583616000,1583620095,NL +1583620096,1583624191,IT +1583624192,1583628287,RS +1583628288,1583632383,DE +1583632384,1583636479,RU +1583636480,1583640575,MK +1583640576,1583644671,NL +1583644672,1583648767,DE +1583648768,1583652863,CH +1583652864,1583656959,FR +1583656960,1583665151,RU +1583665152,1583669247,UA +1583669248,1583673343,GE +1583673344,1583673991,DE +1583673992,1583673999,GB +1583674000,1583674015,DE +1583674016,1583674039,NL +1583674040,1583677439,DE +1583677440,1583681535,FI +1583681536,1583685631,PL +1583685632,1583689727,DE +1583689728,1583693823,IT +1583693824,1583697919,RU +1583697920,1583702015,TR +1583702016,1583706111,RU +1583706112,1583710207,GI +1583710208,1583712255,IR +1583712256,1583714303,AE +1583714304,1583722495,GB +1583722496,1583726591,IR +1583726592,1583730687,BG +1583730688,1583732383,DK +1583732384,1583732399,DE +1583732400,1583734783,DK +1583734784,1583738879,LV +1583738880,1583742975,IR +1583742976,1583747071,TR +1583747072,1583751167,RU +1583751168,1583755263,NO +1583755264,1583757311,NL +1583757312,1583757567,PA +1583757568,1583758847,NL +1583758848,1583759103,KY +1583759104,1583759359,NL +1583759360,1583763455,TR +1583763456,1583767551,RU +1583767552,1583771647,AT +1583771648,1583775743,RU +1583775744,1583779839,IT +1583779840,1583783935,GB +1583788032,1583792127,TM +1583792128,1583796223,IE +1583796224,1583800319,DE +1583800320,1583804415,ME +1583804416,1583808511,GB +1583808512,1583812607,MD +1583812608,1583813679,NL +1583813680,1583813683,GB +1583813684,1583816703,NL +1583816704,1583820799,TR +1583820800,1583824895,LV +1583824896,1583828991,SI +1583828992,1583833087,RU +1583833088,1583837183,CH +1583837184,1583841279,GB +1583841280,1583845375,FR +1583845376,1583849471,NL +1583849472,1583853567,DE +1583853568,1583857663,RU +1583857664,1583861759,SE +1583861760,1583865855,LU +1583865856,1583869951,RU +1583869952,1583874047,KZ +1583874048,1584398335,BE +1584398336,1584660479,CZ +1584660480,1584922623,GB +1584922624,1585184767,TR +1585184768,1585190911,PL +1585190912,1585192959,ES +1585192960,1585195007,IT +1585195008,1585197055,CZ +1585197056,1585199103,IT +1585199104,1585201151,NL +1585201152,1585205247,IT +1585205248,1585207295,FR +1585207296,1585209855,NL +1585209856,1585210111,IQ +1585210112,1585210879,IR +1585210880,1585211391,NL +1585211392,1585213439,CZ +1585213440,1585214463,GB +1585214464,1585217535,NL +1585217536,1585219583,FR +1585219584,1585221631,NL +1585221632,1585223679,SK +1585223680,1585225727,FR +1585225728,1585227775,UA +1585227776,1585231871,RU +1585231872,1585233919,CZ +1585233920,1585235967,LB +1585235968,1585238015,RU +1585238016,1585240063,DE +1585240064,1585242111,MQ +1585242112,1585244159,RU +1585244160,1585246207,FR +1585246208,1585248255,RU +1585248256,1585250303,CZ +1585250304,1585254399,RU +1585254400,1585256447,GB +1585256448,1585258495,DE +1585258496,1585262591,GB +1585262592,1585264639,RU +1585264640,1585265663,MT +1585265664,1585266687,IM +1585266688,1585270783,DE +1585270784,1585272831,IT +1585272832,1585274879,RU +1585274880,1585276927,ES +1585276928,1585278975,FR +1585278976,1585281023,AL +1585281024,1585283071,UA +1585283072,1585285119,GB +1585285120,1585287167,ES +1585287168,1585289215,CY +1585289216,1585291263,DE +1585291264,1585295359,FR +1585295360,1585297407,HU +1585297408,1585299455,RU +1585299456,1585301503,GB +1585301504,1585303551,LU +1585303552,1585305599,DE +1585305600,1585307647,CZ +1585307648,1585309695,QA +1585309696,1585311743,IT +1585311744,1585313791,RU +1585313792,1585315839,HU +1585315840,1585317887,DK +1585317888,1585319935,IT +1585319936,1585321983,CH +1585321984,1585324031,RU +1585324032,1585326079,NL +1585326080,1585328127,GB +1585328128,1585330175,BE +1585330176,1585332223,IT +1585332224,1585334271,NL +1585334272,1585336319,DE +1585336320,1585338367,SE +1585338368,1585340415,RU +1585340416,1585342463,AT +1585342464,1585344511,GB +1585344512,1585346559,FR +1585346560,1585348607,GB +1585348608,1585350655,CH +1585350656,1585352703,IT +1585352704,1585354751,PT +1585354752,1585356799,RU +1585356800,1585358847,FI +1585358848,1585360895,PT +1585360896,1585362943,GB +1585362944,1585363455,IT +1585363456,1585363583,ES +1585363584,1585364991,IT +1585364992,1585367039,GB +1585367040,1585369087,RU +1585369088,1585371135,GB +1585371136,1585375231,SE +1585375232,1585377279,GB +1585377280,1585379327,ES +1585379328,1585381375,CH +1585381376,1585383423,GB +1585383424,1585385471,FR +1585385472,1585387519,DE +1585387520,1585389567,SI +1585389568,1585391615,SE +1585391616,1585393663,IT +1585393664,1585395711,DK +1585395712,1585397759,NO +1585397760,1585399807,RU +1585399808,1585400063,NL +1585400064,1585400319,IL +1585400320,1585400575,GB +1585400576,1585401855,US +1585401856,1585403903,IT +1585403904,1585405951,RU +1585405952,1585407999,GB +1585408000,1585410047,PL +1585410048,1585412095,GB +1585412096,1585414143,NO +1585414144,1585416191,CZ +1585416192,1585422335,RU +1585422336,1585424383,ES +1585424384,1585428479,RU +1585428480,1585432575,ES +1585432576,1585434623,RU +1585434624,1585436671,JO +1585436672,1585438719,RU +1585438720,1585440767,DE +1585440768,1585442815,IT +1585442816,1585446911,RU +1585446912,1585577983,KW +1585577984,1585709055,UA +1585709056,1585840127,PT +1585840128,1585971199,DE +1585971200,1585979391,AT +1585979392,1585987583,GB +1585987584,1585988095,SE +1585988096,1585988103,IT +1585988104,1585988351,SE +1585988352,1585988359,DE +1585988360,1585990399,SE +1585990400,1585990655,NL +1585990656,1585995775,SE +1585995776,1586003967,AT +1586003968,1586012159,SK +1586012160,1586020351,DE +1586020352,1586028543,RU +1586028544,1586036735,GB +1586036736,1586061311,RU +1586061312,1586069503,HR +1586069504,1586077695,DE +1586077696,1586085887,GE +1586094080,1586110463,RU +1586110464,1586118655,IT +1586118656,1586126847,DK +1586126848,1586128383,CZ +1586128384,1586128639,SK +1586128640,1586135039,CZ +1586135040,1586143231,RU +1586143232,1586151423,IT +1586151424,1586159615,TR +1586159616,1586167807,MT +1586167808,1586175999,DE +1586176000,1586184191,BE +1586184192,1586192383,NO +1586192384,1586200575,RU +1586200576,1586208767,MD +1586208768,1586216959,IR +1586216960,1586225151,BG +1586225152,1586233343,RU +1586233344,1586241535,FR +1586241536,1586249727,SE +1586249728,1586257919,SI +1586257920,1586266111,LV +1586266112,1586274303,RU +1586274304,1586282495,BE +1586290688,1586298879,RU +1586298880,1586307071,IT +1586307072,1586315263,RU +1586315264,1586323455,UZ +1586323456,1586331647,RU +1586331648,1586339839,PL +1586339840,1586348031,RU +1586348032,1586356223,SY +1586356224,1586372607,RU +1586372608,1586380799,JO +1586380800,1586388991,GB +1586388992,1586397183,ES +1586397184,1586399231,LV +1586399232,1586401279,RU +1586401280,1586403327,IT +1586403328,1586405375,IS +1586405376,1586407423,AT +1586407424,1586409471,GB +1586409472,1586411519,IT +1586411520,1586411775,GB +1586411776,1586412287,US +1586412288,1586412543,HK +1586412544,1586413567,GB +1586413568,1586415615,IT +1586415616,1586417663,ES +1586417664,1586419711,NL +1586419712,1586421759,DE +1586421760,1586423807,SE +1586423808,1586425855,CZ +1586425856,1586427903,NL +1586427904,1586428159,CH +1586428160,1586429951,FR +1586429952,1586431999,CH +1586432000,1586434047,DK +1586434048,1586436095,BE +1586436096,1586438143,ES +1586438144,1586446335,RU +1586446336,1586448383,NO +1586448384,1586450431,ES +1586450432,1586452479,RU +1586452480,1586454527,CH +1586454528,1586456575,IT +1586456576,1586458623,GB +1586458624,1586460671,FR +1586460672,1586462719,GB +1586462720,1586464767,RU +1586464768,1586466815,ES +1586466816,1586468863,RU +1586468864,1586470911,IT +1586470912,1586472959,GB +1586472960,1586475007,CZ +1586475008,1586477055,GR +1586477056,1586479103,BE +1586479104,1586481151,KG +1586481152,1586483199,ES +1586483200,1586485247,NL +1586485248,1586487295,FR +1586487296,1586489343,SA +1586489344,1586491391,CZ +1586491392,1586493439,RU +1586493440,1586495487,GB +1586495488,1587019775,DK +1587019776,1587085311,PL +1587085312,1587183615,UA +1587183616,1587199999,RU +1587200000,1587216383,UA +1587216384,1587347455,BG +1587347456,1587412991,NL +1587412992,1587417087,RU +1587417088,1587425279,UA +1587425280,1587429375,UZ +1587429376,1587437567,UA +1587437568,1587445759,RU +1587445760,1587449855,PL +1587449856,1587453951,UA +1587453952,1587470335,RU +1587470336,1587474431,PL +1587478528,1587511295,RU +1587511296,1587544063,IL +1587544064,1588068351,IT +1588068352,1588592639,GB +1588592640,1588621311,RO +1588621312,1588625407,MD +1588625408,1588723711,RO +1588723712,1588854783,UA +1588854784,1588985855,RU +1588985856,1589149695,IR +1589182464,1589215231,RU +1589215232,1589247999,GB +1589248000,1589280767,NO +1589280768,1589313535,DE +1589313536,1589346303,LB +1589346304,1589379071,KW +1589379072,1589411839,RU +1589411840,1589444607,IL +1589444608,1589477375,DK +1589477376,1589510143,RS +1589510144,1589542911,RU +1589542912,1589575679,BG +1589575680,1589608447,RU +1589608448,1589628927,SE +1589628928,1589641215,DK +1589641216,1590034431,GB +1590034432,1590036479,RU +1590036480,1590038527,GB +1590038528,1590048767,RU +1590048768,1590050815,DE +1590050816,1590052863,SE +1590052864,1590054911,IT +1590054912,1590056959,GB +1590056960,1590059007,ES +1590059008,1590060223,IT +1590060224,1590060255,CH +1590060256,1590061055,IT +1590061056,1590063103,RU +1590063104,1590065151,CZ +1590065152,1590067199,IE +1590067200,1590069247,RU +1590069248,1590071295,AT +1590071296,1590073343,MT +1590073344,1590075391,NL +1590075392,1590077247,BE +1590077248,1590077279,NL +1590077280,1590077439,BE +1590077440,1590079487,GB +1590079488,1590081535,FR +1590081536,1590083583,GB +1590083584,1590085631,RU +1590085632,1590087679,FR +1590087680,1590089727,IT +1590089728,1590091775,RU +1590091776,1590093823,CZ +1590093824,1590095871,RU +1590095872,1590097919,CZ +1590097920,1590099967,CH +1590099968,1590102015,RU +1590102016,1590104063,IT +1590104064,1590106111,TJ +1590106112,1590108159,FI +1590108160,1590110207,TR +1590110208,1590112255,CZ +1590112256,1590114303,HU +1590114304,1590116351,FI +1590116352,1590120447,RU +1590120448,1590122495,IT +1590122496,1590124543,DE +1590124544,1590126591,CH +1590126592,1590128639,RU +1590128640,1590130687,FI +1590130688,1590132735,FR +1590132736,1590134783,NO +1590134784,1590136831,ES +1590136832,1590138879,GB +1590138880,1590140927,CZ +1590140928,1590142975,UA +1590142976,1590145023,AT +1590145024,1590147071,HU +1590147072,1590149119,GB +1590149120,1590151167,CZ +1590151168,1590153215,TR +1590153216,1590157311,RU +1590157312,1590159359,IE +1590159360,1590161407,GB +1590161408,1590163455,DE +1590163456,1590165503,NL +1590165504,1590689791,AE +1590689792,1591214079,NL +1591214080,1591738367,DE +1591738368,1592000511,BE +1592000512,1592004607,ES +1592004608,1592008703,AM +1592008704,1592012799,GB +1592012800,1592016895,CH +1592016896,1592020991,GB +1592020992,1592025087,SK +1592025088,1592029183,DE +1592029184,1592033279,RU +1592033280,1592037375,NL +1592037376,1592041471,CH +1592041472,1592045567,RU +1592045568,1592049663,FR +1592049664,1592053759,RU +1592053760,1592054015,NL +1592054016,1592054271,AE +1592054272,1592054527,NL +1592054528,1592054783,US +1592054784,1592057855,NL +1592057856,1592061951,RS +1592061952,1592066047,RU +1592066048,1592066815,US +1592066816,1592069887,CY +1592069888,1592069951,RU +1592069952,1592070143,CY +1592070144,1592074239,RU +1592074240,1592078335,SK +1592078336,1592082431,NL +1592082432,1592082847,GB +1592082848,1592082879,RU +1592082880,1592083327,GB +1592083328,1592083455,RU +1592083456,1592085023,GB +1592085024,1592085039,ES +1592085040,1592086527,GB +1592086528,1592087295,CZ +1592087296,1592088063,PL +1592088064,1592090623,CZ +1592090624,1592094719,RU +1592094720,1592098815,RS +1592098816,1592102911,GB +1592102912,1592107007,PT +1592107008,1592111103,GB +1592111104,1592115199,DE +1592115200,1592119295,ES +1592119296,1592123391,PL +1592123392,1592135679,RU +1592135680,1592139775,PL +1592139776,1592143871,RU +1592143872,1592147967,DE +1592147968,1592152063,IT +1592152064,1592156159,IL +1592156160,1592160255,IE +1592160256,1592168447,RU +1592168448,1592172543,CZ +1592172544,1592176639,RU +1592176640,1592180735,CS +1592180736,1592184831,UA +1592184832,1592188927,CH +1592188928,1592193023,UZ +1592197120,1592201215,PL +1592201216,1592205311,RU +1592205312,1592209407,UA +1592209408,1592213503,PL +1592213504,1592217599,UA +1592217600,1592221695,CH +1592221696,1592225791,DK +1592225792,1592242175,RU +1592242176,1592246271,UA +1592262656,1592270847,RU +1592270848,1592272895,PL +1592272896,1592281087,RU +1592281088,1592283135,UA +1592283136,1592285183,GR +1592285184,1592287231,RU +1592287232,1592289279,RO +1592289280,1592291327,RU +1592291328,1592293375,NL +1592293376,1592299519,RU +1592299520,1592303615,PL +1592303616,1592305663,NL +1592305664,1592307711,IR +1592307712,1592309759,UA +1592309760,1592311807,RU +1592311808,1592313855,DE +1592313856,1592315903,RU +1592315904,1592317951,UA +1592317952,1592319999,PL +1592320000,1592322047,LT +1592322048,1592324095,RU +1592324096,1592326143,KZ +1592326144,1592328191,UA +1592328192,1592393727,RU +1592393728,1592459263,SE +1592459264,1592524799,GE +1592524800,1592557567,GB +1592557568,1592590335,BG +1592590336,1592623103,FI +1592623104,1592655871,RU +1592655872,1592786943,FR +1592786944,1592803327,PL +1592803328,1592819711,RU +1592819712,1592836095,UA +1592836096,1592852479,GE +1592852480,1592868863,RU +1592868864,1592885247,CZ +1592885248,1592901631,IR +1592901632,1592934399,RU +1592934400,1592950783,CZ +1592950784,1592967167,RU +1592967168,1592983551,LU +1592983552,1592999935,RU +1592999936,1593016319,MD +1593016320,1593049087,RU +1593049088,1593065471,UA +1593081856,1593098239,UA +1593114624,1593131007,SE +1593131008,1593147391,GB +1593147392,1593163775,RU +1593163776,1593180159,AT +1593180160,1593196543,NO +1593196544,1593210879,SE +1593210880,1593211391,NO +1593211392,1593212415,SE +1593212416,1593212927,NO +1593212928,1593229311,PL +1593229312,1593245695,EE +1593245696,1593247743,LV +1593247744,1593249791,IT +1593249792,1593251839,RU +1593251840,1593253887,FR +1593253888,1593255935,CZ +1593255936,1593257983,DE +1593257984,1593260031,IE +1593260032,1593262079,RU +1593262080,1593264127,KZ +1593264128,1593266175,NL +1593266176,1593268223,GB +1593268224,1593270271,HU +1593270272,1593272319,GB +1593272320,1593274367,RU +1593274368,1593276415,DE +1593276416,1593278463,RU +1593278464,1593280511,KZ +1593280512,1593282559,EE +1593282560,1593284607,AT +1593284608,1593286655,GB +1593286656,1593288703,FR +1593288704,1593290751,SE +1593290752,1593292799,FR +1593292800,1593294847,IT +1593294848,1593296895,NL +1593296896,1593298943,RS +1593298944,1593300991,RU +1593300992,1593303039,CH +1593303040,1593305087,UA +1593305088,1593307135,FR +1593307136,1593311231,RU +1593311232,1593343999,UA +1593344000,1593376767,HU +1593376768,1593409535,JO +1593409536,1593442303,DE +1593442304,1593475071,BA +1593475072,1593540607,RU +1593540608,1593573375,PL +1593573376,1593606143,LU +1593606144,1593638911,SY +1593638912,1593671679,RU +1593671680,1593704447,HR +1593704448,1593704959,SE +1593704960,1593705471,NO +1593705472,1593737215,SE +1593737216,1593769983,PL +1593769984,1593802751,RU +1593802752,1593835519,SE +1593835520,1594884095,TR +1594884096,1595408383,ES +1595408384,1595998207,RU +1595998208,1596063743,DE +1596063744,1596129279,NO +1596129280,1596194815,IL +1596194816,1596260351,NL +1596260352,1596325887,RU +1596325888,1596391423,IR +1596391424,1596456959,ES +1596456960,1596588031,PL +1596588032,1596719103,BG +1596719104,1596850175,IE +1596850176,1596981247,CZ +1596981248,1597243391,PL +1597243392,1597505535,RU +1597505536,1597767679,KZ +1597767680,1598029823,ES +1598029824,1598062591,RO +1598062592,1598095359,RU +1598095360,1598128127,MD +1598128128,1598160895,TR +1598160896,1598193663,KW +1598193664,1598226431,RU +1598226432,1598259199,UA +1598259200,1598291967,RU +1598291968,1598324735,LV +1598324736,1598357503,RU +1598357504,1598390271,PT +1598390272,1598423039,UA +1598423040,1598455807,RU +1598455808,1598488575,TR +1598488576,1598685183,RU +1598685184,1598816255,IT +1598816256,1598947327,RO +1598947328,1599078399,RU +1599078400,1599094783,SE +1599094784,1599111167,RU +1599111168,1599127551,IR +1599127552,1599143935,CZ +1599143936,1599160319,UA +1599176704,1599193087,FR +1599193088,1599209471,RU +1599209472,1599242239,IR +1599242240,1599258623,CZ +1599258624,1599324159,RU +1599324160,1599340543,IE +1599340544,1599356927,RU +1599356928,1599373311,BH +1599373312,1599389695,RU +1599406080,1599438847,RU +1599438848,1599455231,RS +1599455232,1599471615,CZ +1599471616,1599487999,MK +1599488000,1599504383,IL +1599504384,1599520767,AZ +1599520768,1599537151,RU +1599537152,1599553535,BG +1599553536,1599569919,RU +1599569920,1599586303,SI +1599586304,1599602687,BG +1599602688,1599864831,DE +1599864832,1600126975,PT +1600126976,1600389119,NL +1600520192,1600651263,SK +1600651264,1600684031,GE +1600684032,1600716799,RU +1600716800,1600749567,UA +1600749568,1600782335,SK +1600782336,1600880639,RU +1600880640,1600913407,AL +1600913408,1600946175,PL +1600946176,1600963167,RU +1600963168,1600963175,UA +1600963176,1600963183,RU +1600963184,1600963191,BY +1600963192,1600963199,KZ +1600963200,1600978943,RU +1600978944,1601011711,SE +1601011712,1601044479,UA +1601044480,1601077247,RU +1601077248,1601110015,IT +1601110016,1601142783,BG +1601142784,1601175551,UA +1601175552,1602224127,DE +1602224128,1602226175,NL +1602226176,1602228223,GB +1602228224,1602230271,DE +1602230272,1602232319,DK +1602232320,1602234367,CH +1602234368,1602234495,GB +1602234496,1602234527,FR +1602234528,1602234639,GB +1602234640,1602234655,FR +1602234656,1602238463,GB +1602238464,1602240511,TR +1602240512,1602242559,BY +1602242560,1602244607,FR +1602244608,1602246655,CH +1602246656,1602248703,NL +1602248704,1602250751,BE +1602250752,1602252799,NO +1602252800,1602254847,SE +1602254848,1602255103,US +1602255104,1602255359,HU +1602255360,1602255615,US +1602255616,1602256895,HU +1602256896,1602258943,GB +1602258944,1602260991,RU +1602260992,1602263039,FR +1602263040,1602265087,ES +1602265088,1602267135,RU +1602267136,1602269183,RO +1602269184,1602271231,RU +1602271232,1602273279,MK +1602273280,1602273535,RU +1602273536,1602275327,IE +1602275328,1602279423,DE +1602279424,1602281471,GB +1602281472,1602283519,RU +1602283520,1602285567,HR +1602285568,1602287615,RU +1602287616,1602289663,DE +1602289664,1602291711,LB +1602291712,1602293759,SA +1602293760,1602295807,RU +1602295808,1602297855,NL +1602297856,1602298367,IL +1602298368,1602298879,MT +1602298880,1602299903,IL +1602299904,1602301951,DK +1602301952,1602303999,DE +1602304000,1602306047,RU +1602306048,1602308095,GB +1602308096,1602310143,RU +1602310144,1602312191,NL +1602312192,1602314239,RU +1602314240,1602316287,CZ +1602316288,1602318335,GB +1602318336,1602320383,ES +1602320384,1602324479,NL +1602324480,1602326527,RU +1602326528,1602328575,GB +1602328576,1602330623,ES +1602330624,1602336767,RU +1602336768,1602338815,GB +1602338816,1602340863,EE +1602340864,1602342911,AT +1602342912,1602344959,DE +1602344960,1602347007,ES +1602347008,1602349055,PL +1602349056,1602351103,RU +1602351104,1602353151,CZ +1602353152,1602355199,RU +1602355200,1602357247,GB +1602357248,1602359295,FR +1602359296,1602361343,DE +1602361344,1602363391,FI +1602363392,1602365439,LV +1602365440,1602367487,BE +1602369536,1602371583,IR +1602371584,1602373631,SE +1602373632,1602375679,GB +1602375680,1602377727,BY +1602377728,1602379775,PS +1602379776,1602383871,GB +1602383872,1602384383,DE +1602385920,1602387967,AT +1602387968,1602390015,RU +1602390016,1602392063,IT +1602392064,1602394111,PL +1602394112,1602396159,FR +1602396160,1602398207,DE +1602398208,1602400255,TR +1602400256,1602402303,RU +1602402304,1602404351,LU +1602404352,1602406399,GB +1602406400,1602408447,DE +1602408448,1602410495,DK +1602410496,1602412543,NO +1602412544,1602414591,GB +1602414592,1602416639,NL +1602416640,1602418687,IR +1602418688,1602420735,DE +1602420736,1602424831,RU +1602424832,1602426879,BG +1602426880,1602428927,RU +1602428928,1602430975,PL +1602430976,1602433023,IT +1602433024,1602435071,HU +1602435072,1602437119,LU +1602437120,1602439167,GB +1602439168,1602441215,RU +1602441216,1602443263,GB +1602443264,1602445311,RU +1602445312,1602447359,DE +1602447360,1602447871,GB +1602447872,1602448383,DE +1602448384,1602448895,NL +1602448896,1602449407,GB +1602449408,1602451455,LV +1602451456,1602453503,DE +1602453504,1602455551,SK +1602455552,1602457599,FR +1602457600,1602459647,RU +1602459648,1602461695,GB +1602461696,1602465791,ES +1602465792,1602467839,RU +1602467840,1602469887,GI +1602469888,1602471935,AT +1602471936,1602473983,SE +1602473984,1602476031,RU +1602476032,1602478079,GB +1602478080,1602482175,RU +1602482176,1602484223,FR +1602484224,1602486271,GB +1602486272,1602748415,UA +1602748416,1602781183,PT +1602781184,1602813951,FR +1602813952,1602846719,RU +1602846720,1602879487,GE +1602879488,1602912255,FR +1602912256,1603010559,RU +1603010560,1603014655,FR +1603014656,1603018751,RU +1603018752,1603022847,HU +1603022848,1603026943,GB +1603026944,1603031039,SE +1603031040,1603035135,RU +1603035136,1603039231,SY +1603039232,1603043327,RS +1603043328,1603047423,IT +1603047424,1603051519,RU +1603051520,1603055615,JO +1603059712,1603063807,AM +1603063808,1603067903,BG +1603067904,1603071999,GB +1603076096,1603080191,RU +1603080192,1603084287,DE +1603084288,1603088383,IT +1603272704,1603796991,GB +1603796992,1603813375,RU +1603813376,1603829759,CH +1603829760,1603846143,NL +1603846144,1603862527,GB +1603862528,1603878911,EE +1603878912,1603895295,MD +1603895296,1603911679,RU +1603928064,1603944447,DK +1603944448,1603977215,RU +1603977216,1603980463,GB +1603980464,1603980479,CH +1603980480,1603981823,GB +1603981824,1603982079,IE +1603982080,1603982655,GB +1603982656,1603982687,DK +1603982688,1603982719,AN +1603982720,1603982783,GB +1603982784,1603982847,AN +1603982848,1603993599,GB +1603993600,1604009983,ME +1604009984,1604026367,PL +1604026368,1604042751,NL +1604042752,1604059135,SE +1604059136,1604075519,MK +1604075520,1604091903,RU +1604091904,1604108287,BA +1604108288,1604141055,DE +1604141056,1604157439,RO +1604157440,1604190207,FR +1604190208,1604206591,UA +1604206592,1604222975,PL +1604222976,1604239359,BG +1604239360,1604255743,RU +1604255744,1604272127,SY +1604272128,1604288511,IQ +1604288512,1604304895,RU +1604304896,1604321279,SI +1604321280,1604386815,PL +1604386816,1604452351,RU +1604452352,1604517887,RO +1604517888,1604583423,RU +1604583424,1604648959,UA +1604648960,1604714495,RU +1604714496,1604780031,DK +1604845568,1604853759,FR +1604853760,1604861951,HU +1604861952,1604870143,RS +1604870144,1604878335,HR +1604878336,1604886655,DE +1604886656,1604886783,RU +1604886784,1604887039,US +1604887040,1604887295,KZ +1604887296,1604887807,DE +1604887808,1604888063,BY +1604888064,1604889599,TR +1604889600,1604889855,DE +1604889856,1604890111,BY +1604890112,1604890239,RU +1604890240,1604890367,US +1604890368,1604890879,TR +1604890880,1604891391,BY +1604891392,1604891647,DE +1604891648,1604891903,BY +1604891904,1604892031,DE +1604892032,1604892159,RU +1604892160,1604894719,DE +1604894720,1604902911,CZ +1604902912,1604911103,BG +1604911104,1604919295,UA +1604919296,1604927487,NO +1604927488,1604935679,IT +1604935680,1604952063,RU +1604952064,1604959743,DE +1604959744,1604960255,RU +1604960256,1604968447,BG +1604968448,1604976639,ES +1604976640,1604993023,FR +1604993024,1605001215,NL +1605001216,1605025791,RU +1605025792,1605033983,IQ +1605033984,1605042175,SK +1605042176,1605050367,RU +1605050368,1605058559,IT +1605058560,1605066751,HU +1605074944,1605083135,FR +1605083136,1605091327,BE +1605091328,1605099519,PL +1605099520,1605107711,RU +1605107712,1605115903,GB +1605115904,1605124095,RU +1605124096,1605124351,US +1605124352,1605132287,GB +1605132288,1605148671,RU +1605148672,1605156863,PT +1605156864,1605165055,JO +1605165056,1605173247,GB +1605173248,1605181439,TR +1605181440,1605189631,LT +1605189632,1605189663,SK +1605189664,1605197823,CZ +1605197824,1605206015,DE +1605206016,1605214207,RU +1605214208,1605222399,TR +1605222400,1605230591,CZ +1605230592,1605238783,TR +1605238784,1605246975,IT +1605246976,1605255167,PL +1605255168,1605263359,HU +1605263360,1605271551,RU +1605271552,1605279743,DE +1605279744,1605287935,FR +1605287936,1605296127,RU +1605296128,1605304319,CH +1605304320,1605312511,PL +1605312512,1605320703,IL +1605320704,1605328895,KW +1605328896,1605337087,FI +1605337088,1605345279,GB +1605345280,1605353471,FR +1605353472,1605361663,GB +1605361664,1605369855,RU +1605369856,1605402623,FR +1605402624,1605435391,SI +1605435392,1605468159,GB +1605468160,1605500927,RO +1605500928,1605533695,PL +1605533696,1605566463,HR +1605566464,1605599231,RU +1605599232,1605631999,GR +1605632000,1605664767,RS +1605664768,1605697535,MK +1605697536,1605795839,RU +1605795840,1605828607,BE +1605828608,1605861375,RU +1605861376,1605894143,TR +1605894144,1606156287,RO +1606156288,1606418431,RU +1606418432,1607467007,SE +1607467008,1607532543,DE +1607532544,1607588863,SE +1607588864,1607598079,DK +1607598080,1607663615,IT +1607663616,1607729151,NL +1607729152,1607761919,EG +1607761920,1607766015,SY +1607766016,1607794687,EG +1607860224,1607925759,ES +1607925760,1607926783,RU +1607926784,1607927807,PL +1607927808,1607929855,RU +1607929856,1607930879,SE +1607930880,1607933951,PL +1607933952,1607934975,DE +1607934976,1607935999,UA +1607936000,1607937023,RU +1607937024,1607938047,LV +1607938048,1607939071,UA +1607939072,1607940095,PL +1607940096,1607941119,RU +1607941120,1607942143,PL +1607942144,1607944191,RU +1607944192,1607945215,FR +1607945216,1607946239,GB +1607946240,1607948287,UA +1607948288,1607949311,GB +1607949312,1607950335,UA +1607950336,1607951359,RU +1607951360,1607954431,UA +1607954432,1607956479,RU +1607956480,1607957503,PL +1607957504,1607958527,UA +1607958528,1607959551,FR +1607959552,1607960575,EE +1607960576,1607962623,RU +1607962624,1607963647,UA +1607963648,1607965695,RU +1607965696,1607966719,UA +1607966720,1607967743,RU +1607967744,1607968767,GB +1607968768,1607969791,SE +1607969792,1607972863,RU +1607972864,1607974911,UA +1607974912,1607975935,LV +1607975936,1607976959,CZ +1607976960,1607977983,KZ +1607977984,1607979007,NL +1607979008,1607980031,RU +1607980032,1607981055,DE +1607981056,1607982079,UA +1607982080,1607983103,RU +1607983104,1607984127,GB +1607984128,1607985151,RU +1607985152,1607986175,AT +1607986176,1607987199,UA +1607987200,1607988223,ES +1607988224,1607989247,KG +1607989248,1607990271,DE +1607990272,1607991295,RU +1607991296,1608122367,UA +1608122368,1608253439,RO +1608253440,1608384511,RU +1608384512,1608515583,DE +1608515584,1610612735,IT +1610612736,1610678271,US +1610678272,1610743807,CA +1610743808,1611227135,US +1611235328,1611923455,US +1611923456,1612185599,CA +1612185600,1612587007,US +1612595200,1612611583,US +1612611584,1612636159,CA +1612644352,1612689407,US +1612693504,1612697599,US +1612701696,1613430783,US +1613758464,1614282751,CA +1614282752,1614675967,US +1614807040,1617362943,US +1619001344,1631633407,US +1631649792,1632305151,US +1632305152,1632321535,CA +1632370688,1634414591,US +1634414592,1634418687,CA +1634418688,1634447359,US +1634447360,1634451455,CA +1634451456,1634455551,US +1634455552,1634459647,CA +1634459648,1634467839,US +1634467840,1634729983,CA +1634729984,1652293631,US +1652293632,1652310015,CA +1652310016,1652322303,US +1652326400,1653534719,US +1653534720,1653538815,CA +1653538816,1653555199,US +1653555200,1653567487,CA +1653567488,1653571583,US +1653571584,1653575679,CA +1653575680,1653592063,US +1653592064,1653596159,CA +1653596160,1653600255,US +1653600256,1653604351,CA +1653604352,1654521855,US +1654652928,1667235839,US +1669332992,1673527295,US +1673527296,1673560063,CA +1673560064,1673576447,US +1673592832,1673986047,US +1673986048,1674051583,CA +1674051584,1674575871,US +1674575872,1677721599,CA +1845493760,1845755903,JP +1845755904,1845764095,HK +1845764096,1845766143,JP +1845766144,1845768191,MY +1845768192,1845772287,JP +1845772288,1845788671,KR +1845788672,1845837823,JP +1845837824,1845839871,PH +1845839872,1845841919,IN +1845841920,1845846015,AU +1845846016,1845850111,ID +1845850112,1845851135,WS +1845851136,1845852159,AU +1845852160,1845854207,JP +1845854208,1845886975,KR +1845886976,1846018047,CN +1846018048,1846542335,KR +1846542336,1846804479,CN +1846804480,1847066623,AU +1847066624,1847590911,TW +1847590912,1847721983,AU +1847721984,1847730175,NP +1847730176,1847732223,PK +1847732224,1847734271,AF +1847734272,1847735295,NZ +1847735296,1847736319,AU +1847736320,1847738367,HK +1847738368,1847754751,KR +1847754752,1847787519,TH +1847787520,1847803903,KR +1847803904,1847807999,VN +1847808000,1847810047,ID +1847810048,1847812095,AU +1847812096,1847853055,KR +1847853056,1848115199,PK +1848115200,1848377343,CN +1848377344,1848381439,HK +1848381440,1848382463,NZ +1848382464,1848385535,AU +1848385536,1848393727,KR +1848393728,1848401919,JP +1848401920,1848406015,PH +1848406016,1848410111,NP +1848410112,1848414207,PH +1848414208,1848420351,AU +1848420352,1848422399,ID +1848422400,1848424447,JP +1848424448,1848426495,VN +1848426496,1848639487,KR +1848639488,1848705023,CN +1848705024,1848770559,TH +1848770560,1848774655,JP +1848774656,1848778751,AU +1848778752,1848786943,IN +1848786944,1848791039,JP +1848791040,1848793087,ID +1848793088,1848803327,JP +1848803328,1848819711,TW +1848819712,1848827903,JP +1848827904,1848831999,PH +1848832000,1848836095,JP +1848836096,1849032703,CN +1849032704,1849065471,JP +1849065472,1849163775,PH +1849163776,1849819135,CN +1849819136,1849950207,JP +1849950208,1850212351,KR +1850212352,1850343423,CN +1850343424,1850376191,JP +1850376192,1850392575,MY +1850392576,1850400767,KH +1850400768,1850408959,JP +1850408960,1850441727,AU +1850441728,1850490879,CN +1850490880,1850507263,KR +1850507264,1850511359,AU +1850511360,1850513407,ID +1850513408,1850514431,TH +1850514432,1850515455,AU +1850515456,1850519551,IN +1850519552,1850523647,AU +1850523648,1850572799,CN +1850572800,1850671103,TH +1850671104,1850736639,HK +1850736640,1851523071,CN +1851523072,1851527167,JP +1851527168,1851528191,NZ +1851528192,1851529215,AU +1851529216,1851531263,PH +1851531264,1851539455,JP +1851539456,1851542527,ID +1851542528,1851543551,HK +1851543552,1851547647,JP +1851547648,1851555839,SG +1851555840,1851588607,KR +1851588608,1851590655,JP +1851590656,1851594751,AU +1851594752,1851596799,KR +1851596800,1851604991,IN +1851604992,1851613183,PH +1851613184,1851617279,JP +1851617280,1851637759,KR +1851637760,1851654143,PK +1851654144,1853882367,CN +1853882368,1854406655,JP +1854406656,1854668799,ID +1854668800,1855455231,AU +1855455232,1855848447,CN +1855848448,1855913983,JP +1855913984,1855979519,MY +1855979520,1856241663,JP +1856241664,1856307199,TH +1856307200,1856315391,KR +1856315392,1856323583,HK +1856323584,1856339967,KR +1856339968,1856372735,JP +1856372736,1856503807,CN +1856503808,1856765951,TH +1856765952,1856770047,JP +1856770048,1856774143,IN +1856774144,1856779263,JP +1856779264,1856780287,IN +1856780288,1856782335,JP +1856782336,1856798719,KR +1856798720,1856815103,IN +1856815104,1856843775,CN +1856843776,1856847871,HK +1856847872,1856864255,CN +1856864256,1856872447,AU +1856872448,1856876543,NZ +1856876544,1856880639,AU +1856880640,1856888831,CN +1856888832,1856892927,AU +1856892928,1856897023,JP +1856897024,1857028095,AU +1857028096,1860173823,CN +1860173824,1860435967,IN +1860435968,1860698111,CN +1860698112,1860706303,JP +1860706304,1860714495,CN +1860714496,1860722687,ID +1860722688,1860726783,KR +1860726784,1860728831,AU +1860728832,1860733951,JP +1860733952,1860734975,AU +1860734976,1860735999,NZ +1860736000,1860737023,AU +1860737024,1860739071,JP +1860739072,1860743167,PH +1860743168,1860747263,AU +1860747264,1860759551,JP +1860759552,1860763647,AU +1860763648,1860829183,JP +1860829184,1860960255,IN +1860960256,1861091327,CN +1861091328,1861222399,AU +1861222400,1866465279,CN +1866465280,1866530815,JP +1866530816,1866563583,SG +1866563584,1866579967,KR +1866579968,1866588159,JP +1866588160,1866592255,NZ +1866592256,1866596351,AU +1866596352,1866661887,CN +1866661888,1866670079,AU +1866670080,1866674175,MY +1866674176,1866678271,AU +1866678272,1866686463,ID +1866686464,1866989567,AU +1866989568,1867513855,CN +1867513856,1870659583,AU +1870659584,1873281023,CN +1873281024,1873412095,JP +1873412096,1873477631,CN +1873477632,1873510399,KR +1873510400,1873543167,JP +1873543168,1874329599,CN +1874329600,1874460671,TW +1874460672,1874591743,CN +1874591744,1874853887,JP +1874853888,1879048191,AU +1879048192,1883218547,CN +1883218548,1883218551,ES +1883218552,1883218555,FR +1883218556,1883218579,CN +1883218580,1883218583,BE +1883218584,1883504639,CN +1883504640,1883766783,JP +1883766784,1883770879,MN +1883770880,1883783167,KR +1883783168,1883799551,VN +1883799552,1883832319,KR +1883832320,1884028927,CN +1884028928,1884159999,KR +1884160000,1884164095,VN +1884164096,1884168191,TW +1884168192,1884172287,ID +1884172288,1884176383,PH +1884176384,1884184575,TW +1884184576,1884186623,ID +1884186624,1884188671,TW +1884188672,1884192767,JP +1884192768,1884209151,ID +1884209152,1884217343,JP +1884217344,1884225535,SG +1884225536,1884291071,IN +1884291072,1885863935,CN +1885863936,1885995007,TW +1885995008,1886191615,KR +1886191616,1886195711,PH +1886195712,1886197759,ID +1886197760,1886199807,AU +1886199808,1886207999,KR +1886208000,1886214143,NZ +1886214144,1886224383,AU +1886224384,1886257151,CN +1886257152,1886322687,IN +1886322688,1886781439,CN +1886781440,1886978047,HK +1886978048,1886986239,KR +1886986240,1886990335,TW +1886990336,1886994431,IN +1886994432,1887010815,TW +1887010816,1887019007,TH +1887019008,1887027199,HK +1887027200,1887043583,KR +1887043584,1887764479,CN +1887764480,1887813631,KR +1887813632,1887830015,IN +1887830016,1887961087,LK +1887961088,1887993855,JP +1887993856,1888026623,KR +1888026624,1888030719,BD +1888030720,1888034815,HK +1888034816,1888038911,JP +1888038912,1888040959,IN +1888040960,1888059391,JP +1888059392,1888063487,VN +1888063488,1888067583,JP +1888067584,1888071679,MY +1888071680,1888073727,KR +1888073728,1888239615,JP +1888239616,1888255999,KR +1888256000,1888260095,JP +1888260096,1888264191,KR +1888264192,1888266239,ID +1888266240,1888268287,JP +1888268288,1888270335,AU +1888270336,1888271359,SG +1888271360,1888272383,TH +1888272384,1888288767,KR +1888288768,1888354303,AU +1888354304,1888485375,TH +1888485376,1891631103,KR +1891631104,1891893247,CN +1891893248,1891942399,IN +1891942400,1891950591,KR +1891950592,1891958783,PH +1891958784,1892024319,VN +1892024320,1892122623,PH +1892122624,1892155391,SG +1892155392,1892941823,PH +1892941824,1893015551,KR +1893015552,1893023743,AU +1893023744,1893027839,HK +1893027840,1893031935,VN +1893031936,1893040127,HK +1893040128,1893072895,AU +1893072896,1893138431,KR +1893138432,1893203967,ID +1893203968,1893728255,KR +1893728256,1896480767,CN +1896480768,1896497151,KR +1896497152,1896513535,SG +1896513536,1896546303,HK +1896546304,1896579071,BD +1896579072,1896587263,ID +1896587264,1896591359,SG +1896591360,1896593407,ID +1896593408,1896595455,AU +1896595456,1896603647,CN +1896603648,1896605695,IN +1896605696,1896607743,AU +1896607744,1896609791,VU +1896609792,1896611839,AU +1896611840,1897070591,CN +1897070592,1897136127,IN +1897136128,1897144319,AU +1897144320,1897148415,NC +1897148416,1897152511,AU +1897152512,1897160703,FJ +1897160704,1897170943,AU +1897170944,1897172991,ID +1897172992,1897175039,SG +1897175040,1897176063,JP +1897176064,1897177087,SG +1897177088,1897185279,PH +1897185280,1897201663,JP +1897201664,1897209855,KR +1897209856,1897213951,AU +1897213952,1897218047,JP +1897218048,1897222143,AU +1897222144,1897226239,TW +1897226240,1897230335,NC +1897230336,1897242623,AU +1897242624,1897250815,TW +1897250816,1897259007,HK +1897259008,1897260031,NZ +1897260032,1897261055,BD +1897261056,1897263103,JP +1897263104,1897265151,TH +1897265152,1897267199,JP +1897267200,1897365503,VN +1897365504,1897398271,MY +1897398272,1897660415,CN +1897660416,1897725951,HK +1897725952,1897725983,JP +1897725984,1897734143,AU +1897734144,1897734159,HK +1897734160,1897738239,AU +1897738240,1897738255,KR +1897738256,1897758719,AU +1897758720,1897779199,KR +1897779200,1897781247,AU +1897781248,1897783295,JP +1897783296,1897787391,SG +1897787392,1897789439,AU +1897789440,1897790463,KH +1897790464,1897791487,HK +1897791488,1897824255,KR +1897824256,1897857023,IN +1897857024,1897922559,CN +1897922560,1898708991,JP +1898708992,1899233279,CN +1899233280,1899241471,AU +1899241472,1899249663,VN +1899249664,1899266047,MO +1899266048,1899268095,AU +1899268096,1899270143,KR +1899270144,1899272191,AU +1899272192,1899273215,SG +1899273216,1899274239,JP +1899274240,1899282431,CN +1899282432,1899290623,KR +1899290624,1899298815,AU +1899298816,1899364351,TH +1899364352,1899724799,CN +1899724800,1899741183,KR +1899741184,1899749375,LK +1899749376,1899750399,NZ +1899750400,1899751423,AU +1899751424,1899753471,ID +1899753472,1899757567,HK +1899757568,1899831295,KR +1899831296,1899839487,PH +1899839488,1899849727,AU +1899849728,1899850751,KR +1899850752,1899851775,VN +1899851776,1899855871,JP +1899855872,1899888639,TW +1899888640,1904345087,CN +1904345088,1904361471,JP +1904361472,1904369663,KR +1904369664,1904375807,CN +1904375808,1904376831,NZ +1904376832,1904377855,AU +1904377856,1904476159,KR +1904476160,1905262591,CN +1905262592,1906311167,JP +1906311168,1908408319,VN +1908408320,1908441087,AU +1908441088,1908473855,JP +1908473856,1908539391,IN +1908539392,1908670463,CN +1908670464,1908735999,TW +1908736000,1908744191,AU +1908744192,1908746239,SG +1908746240,1908748287,JP +1908748288,1908750335,PK +1908750336,1908752383,AU +1908752384,1908753407,NZ +1908753408,1908754431,AU +1908754432,1908756479,PH +1908756480,1908760575,KR +1908760576,1908761599,NZ +1908761600,1908762623,AU +1908762624,1908762879,IN +1908762880,1908763135,HK +1908763136,1908763647,IN +1908763648,1908768767,AU +1908768768,1908801535,JP +1908801536,1908899839,KR +1908899840,1908932607,NP +1908932608,1909129215,CN +1909129216,1909194751,AU +1909194752,1909456895,CN +1909456896,1909473279,JP +1909473280,1909473535,ID +1909473536,1909477631,HK +1909477632,1909477759,IQ +1909477760,1909481471,HK +1909481472,1909587967,CN +1909587968,1909719039,MY +1909719040,1909735423,CN +1909735424,1909743615,IN +1909743616,1909745663,AU +1909745664,1909746687,JP +1909746688,1909747711,MY +1909747712,1909751807,ID +1909751808,1909759999,JP +1909760000,1909762047,ID +1909762048,1909764095,AU +1909764096,1909766143,PH +1909766144,1909768191,AU +1909768192,1909784575,HK +1909784576,1909817343,CN +1909817344,1909850111,JP +1909850112,1909981183,CN +1909981184,1910112255,KR +1910112256,1912340479,CN +1912340480,1912602623,HK +1912602624,1913651199,ID +1913651200,1913913343,JP +1913913344,1914175487,AU +1914175488,1914437631,TW +1914437632,1914503167,CN +1914503168,1914552319,KR +1914552320,1914560511,SG +1914560512,1914568703,KH +1914568704,1914576895,KR +1914576896,1914580991,TW +1914580992,1914585087,KR +1914585088,1914587135,AU +1914587136,1914589183,IN +1914589184,1914593279,ID +1914593280,1914601471,AU +1914601472,1914634239,KR +1914634240,1914642431,BD +1914642432,1914650623,KR +1914650624,1914652671,MN +1914652672,1914654719,AU +1914654720,1914658815,JP +1914658816,1914662911,AU +1914662912,1914667007,KR +1914667008,1914683391,IN +1914683392,1914691583,AU +1914691584,1914695679,IN +1914695680,1914697727,ID +1914697728,1914699775,IN +1914699776,1915748351,TW +1915748352,1916010495,JP +1916010496,1916141567,KR +1916141568,1916272639,CN +1916272640,1916534783,ID +1916534784,1917124607,CN +1917124608,1917169663,JP +1917169664,1917177855,NC +1917177856,1917181951,AU +1917181952,1917190143,IN +1917190144,1917321215,KR +1917321216,1918894079,AU +1918894080,1919680511,CN +1919680512,1919729663,KR +1919729664,1919746047,PH +1919746048,1919811583,TH +1919811584,1919815679,CN +1919815680,1919817727,ID +1919817728,1919819775,KR +1919819776,1919821823,NZ +1919821824,1919823871,AU +1919823872,1919827967,JP +1919827968,1919844351,CN +1919844352,1919877119,AU +1919877120,1919885311,CN +1919885312,1919893503,KR +1919893504,1919909887,JP +1919909888,1919918079,AU +1919918080,1919926271,CN +1919926272,1919942655,KR +1919942656,1920466943,CN +1920466944,1920991231,ID +1920991232,1921056767,TH +1921056768,1921058815,JP +1921058816,1921060863,BD +1921060864,1921062911,ID +1921062912,1921064959,LA +1921064960,1921069055,SG +1921069056,1921073151,JP +1921073152,1921089535,KR +1921089536,1921105919,AU +1921105920,1921122303,KR +1921122304,1921187839,BD +1921187840,1921253375,AU +1921253376,1921318911,CN +1921318912,1921384447,MY +1921384448,1921388543,NZ +1921388544,1921392639,AU +1921392640,1921400831,JP +1921400832,1921404927,ID +1921404928,1921406975,HK +1921406976,1921409023,BD +1921409024,1921425407,JP +1921425408,1921431551,NZ +1921431552,1921433599,AU +1921433600,1921449983,JP +1921449984,1921515519,CN +1921515520,1921646591,TW +1921646592,1921777663,CN +1921777664,1921843199,TW +1921843200,1921851391,KR +1921851392,1921853439,JP +1921853440,1921855487,KR +1921855488,1921859583,ID +1921859584,1921861631,IN +1921861632,1921863679,SG +1921863680,1921865727,BD +1921865728,1921867775,ID +1921867776,1921875967,AU +1921875968,1921892351,CN +1921892352,1921900543,AU +1921900544,1921908735,KR +1921908736,1921943551,JP +1921943552,1921945599,IN +1921945600,1921949695,HK +1921949696,1921957887,AU +1921957888,1921966079,GU +1921966080,1921974271,AU +1921974272,1922039807,IN +1922039808,1925447679,JP +1925447680,1925578751,CN +1925578752,1925611519,AU +1925611520,1925619711,PH +1925619712,1925627903,TW +1925627904,1925638143,JP +1925638144,1925638399,SA +1925638400,1925638655,PK +1925638656,1925638911,KW +1925638912,1925639679,EG +1925639680,1925639935,KW +1925639936,1925640191,SA +1925640192,1925642239,ID +1925642240,1925644287,AU +1925644288,1925660671,KR +1925660672,1925664767,HK +1925664768,1925677055,ID +1925677056,1926234111,KR +1926234112,1929379839,CN +1929379840,1930952703,KR +1930952704,1931345919,CN +1931345920,1931354111,JP +1931354112,1931362303,AU +1931362304,1931378687,TW +1931378688,1931427839,JP +1931427840,1931431935,PH +1931431936,1931433983,JP +1931433984,1931436031,AU +1931436032,1931444223,KR +1931444224,1931460607,TH +1931460608,1931468799,JP +1931468800,1931476991,SG +1931476992,1931739135,CN +1931739136,1932001279,JP +1932001280,1932132351,KR +1932132352,1932148735,AU +1932148736,1932152831,PK +1932152832,1932156927,AU +1932156928,1932161023,JP +1932161024,1932163071,TW +1932163072,1932165119,PH +1932165120,1932197887,SG +1932197888,1932263423,TW +1932263424,1933574143,CN +1933574144,1933639679,AU +1933639680,1933705215,JP +1933705216,1933770751,SG +1933770752,1933836287,TH +1933836288,1933901823,KR +1933901824,1933918207,AU +1933918208,1933922303,KH +1933922304,1933926399,IN +1933926400,1933934591,KR +1933934592,1933942783,IN +1933942784,1933950975,AU +1933950976,1933955071,JP +1933955072,1933957119,BD +1933957120,1933959167,ID +1933959168,1933963263,JP +1933963264,1933967359,IN +1933967360,1934098431,AU +1934098432,1934622719,VN +1934622720,1934884863,TW +1934884864,1934901247,CN +1934901248,1934917631,LA +1934917632,1934925823,MV +1934925824,1934927871,KR +1934927872,1934929919,PH +1934929920,1934931967,VN +1934931968,1934934015,JP +1934934016,1934942207,CN +1934942208,1934966783,PH +1934966784,1934974975,ID +1934974976,1934983167,JP +1934983168,1934983423,MY +1934983424,1934987263,AU +1934987264,1934991359,TW +1934991360,1934999551,KR +1934999552,1935015935,CN +1935015936,1935081471,KR +1935081472,1935147007,TH +1935147008,1935671295,KR +1935671296,1935933439,IN +1935933440,1936457727,CN +1936457728,1937244159,IN +1937244160,1937506303,CN +1937506304,1937510399,AU +1937510400,1937514495,CN +1937514496,1937522687,AU +1937522688,1937530879,ID +1937530880,1937532927,US +1937532928,1937533439,IN +1937533440,1937534463,US +1937534464,1937534975,GB +1937534976,1937535743,US +1937535744,1937535999,IN +1937536000,1937536511,GB +1937536512,1937539071,IN +1937539072,1937637375,JP +1937637376,1937639167,HK +1937639168,1937639423,TH +1937639424,1937670143,HK +1937670144,1937672191,NZ +1937672192,1937674239,AU +1937674240,1937678335,JP +1937678336,1937682431,NC +1937682432,1937686527,AU +1937686528,1937702911,KR +1937702912,1937768447,BD +1937768448,1938030591,AU +1938030592,1938292735,MY +1938292736,1938948095,KR +1938948096,1938964479,JP +1938964480,1938972671,AU +1938972672,1938976767,MY +1938976768,1938978815,SG +1938978816,1938980863,VN +1938980864,1939079167,PH +1939079168,1939865599,CN +1939865600,1939898367,KR +1939898368,1939914751,HK +1939914752,1939931135,IN +1939931136,1939996671,KR +1939996672,1940127743,JP +1940127744,1940193279,MY +1940193280,1940234239,JP +1940234240,1940236287,VN +1940236288,1940238335,AU +1940238336,1940240383,KR +1940240384,1940242431,JP +1940242432,1940258815,TW +1940258816,1940275199,AU +1940275200,1940283391,PH +1940283392,1940291583,ID +1940291584,1940295679,HK +1940295680,1940324351,JP +1940324352,1940357119,PK +1940357120,1940389887,JP +1940389888,1940914175,CN +1940914176,1941045759,JP +1941045760,1941048319,AU +1941048320,1941048831,SG +1941048832,1941051391,AU +1941051392,1941052415,KH +1941052416,1941053439,AU +1941053440,1941057535,KR +1941057536,1941059583,ID +1941059584,1941061631,TH +1941061632,1941069823,KR +1941069824,1941071871,IN +1941071872,1941073919,AU +1941073920,1941075967,JP +1941075968,1941110783,ID +1941110784,1941176319,JP +1941176320,1941438463,CN +1941438464,1941569535,IN +1941569536,1941618687,PK +1941618688,1941635071,AU +1941635072,1941639167,IN +1941639168,1941643263,NP +1941643264,1941651455,IN +1941651456,1941655551,JP +1941655552,1941657599,KR +1941657600,1941658623,MN +1941658624,1941659647,JP +1941659648,1941667839,NZ +1941667840,1941700607,AU +1941700608,1941831679,NZ +1941831680,1941962751,AU +1941962752,1945108479,CN +1945108480,1946157055,IN +1946157056,1946159103,ID +1946159104,1946165247,AU +1946165248,1946173439,PK +1946173440,1946173503,PG +1946173504,1946173567,AU +1946173568,1946173631,HK +1946173632,1946173663,AU +1946173664,1946173679,PH +1946173680,1946173687,TW +1946173688,1946173695,AU +1946173696,1946173951,TW +1946173952,1946174463,AU +1946174464,1946174720,SG +1946174721,1946175487,AU +1946175488,1946176511,SY +1946176512,1946176767,PH +1946176768,1946177535,AU +1946177536,1946177791,SG +1946177792,1946181631,AU +1946181632,1946189823,MY +1946189824,1946222591,JP +1946222592,1946943487,CN +1946943488,1946951679,JP +1946951680,1946953727,BD +1946953728,1946955775,ID +1946955776,1946957823,SG +1946957824,1946959871,AU +1946959872,1946976255,LK +1946976256,1947009023,SG +1947009024,1947074559,CN +1947074560,1947205631,SG +1947205632,1948254207,CN +1948254208,1949302783,KR +1949302784,1949433855,HK +1949433856,1949434879,IN +1949434880,1949435903,AU +1949435904,1949437951,HK +1949437952,1949439999,AU +1949440000,1949442047,ID +1949442048,1949446143,TW +1949446144,1949448191,JP +1949448192,1949450239,AU +1949450240,1949466623,IN +1949466624,1949499391,PH +1949499392,1949564927,SG +1949564928,1949958143,CN +1949958144,1949990911,PK +1949990912,1949995007,CN +1949995008,1950007295,JP +1950007296,1950009343,ID +1950009344,1950011391,BD +1950011392,1950015487,CN +1950015488,1950023679,TH +1950023680,1950089215,TW +1950089216,1950351359,CN +1950351360,1950482431,JP +1950482432,1950515199,CN +1950515200,1950518271,US +1950518272,1950518783,GB +1950518784,1950519295,NL +1950519296,1950523391,IN +1950523392,1950531583,AU +1950531584,1950533631,NP +1950533632,1950535679,ID +1950535680,1950539775,HK +1950539776,1950543871,AU +1950543872,1950545919,NZ +1950545920,1950547967,PH +1950547968,1950580735,KR +1950580736,1950613503,AU +1950613504,1950617599,GU +1950617600,1950621695,AU +1950621696,1950629887,KR +1950629888,1950646271,IN +1950646272,1950648319,VN +1950648320,1950650367,PH +1950650368,1950654463,TH +1950654464,1950658559,ID +1950658560,1950660607,PH +1950660608,1950662655,AU +1950662656,1950666751,BD +1950666752,1950668799,NP +1950668800,1950670847,JP +1950670848,1950672895,ID +1950672896,1950674943,KR +1950674944,1950676991,IN +1950676992,1950679039,ID +1950679040,1950777343,CN +1950777344,1950793727,JP +1950793728,1950810111,AU +1950810112,1950875647,PK +1950875648,1951137791,IN +1951137792,1951399935,CN +1951399936,1951662079,JP +1951662080,1951727615,KR +1951727616,1951793151,AU +1951793152,1952022527,SG +1952022528,1952026623,TW +1952026624,1952030719,CN +1952030720,1952038911,KR +1952038912,1952047103,JP +1952047104,1952051199,NZ +1952051200,1952071679,AU +1952071680,1952073727,HK +1952073728,1952074751,AU +1952074752,1952075775,NZ +1952075776,1952079871,CN +1952079872,1952088063,PK +1952088064,1952092159,NZ +1952092160,1952096255,JP +1952096256,1952102399,ID +1952102400,1952104447,CN +1952104448,1952108543,JP +1952108544,1952110591,ID +1952110592,1952112639,KR +1952112640,1952116735,NP +1952116736,1952120831,IN +1952120832,1952186367,JP +1952186368,1952251903,HK +1952251904,1952268575,PH +1952268576,1952268607,SG +1952268608,1952284671,PH +1952284672,1952288767,NZ +1952288768,1952301055,AU +1952301056,1952317439,KR +1952317440,1952382975,JP +1952382976,1952448511,CN +1952448512,1953497087,VN +1953497088,1953890303,CN +1953890304,1953923071,VN +1953923072,1953939455,TW +1953939456,1953951743,JP +1953951744,1953955839,AU +1953955840,1954021375,IN +1954021376,1954545663,KR +1954545664,1958805503,CN +1958805504,1958807551,SG +1958807552,1958809599,MO +1958809600,1958821887,CN +1958821888,1958825983,VN +1958825984,1958830079,KR +1958830080,1958838271,JP +1958838272,1958842367,IN +1958842368,1958844415,NZ +1958844416,1958846463,AU +1958846464,1958848511,IN +1958848512,1958850559,BD +1958850560,1958871039,AU +1958871040,1959067647,CN +1959067648,1959100415,MY +1959100416,1959102463,ID +1959102464,1959104511,JP +1959104512,1959108607,AU +1959108608,1959110655,NP +1959110656,1959112703,JP +1959112704,1959116799,HK +1959116800,1959133183,SG +1959133184,1959239679,CN +1959239680,1959241727,KR +1959241728,1959243775,IN +1959243776,1959247871,JP +1959247872,1959251967,ID +1959251968,1959254015,NZ +1959254016,1959264255,AU +1959264256,1959395327,KR +1959395328,1959526399,AU +1959526400,1959657471,CN +1959657472,1959723007,MY +1959723008,1960050687,CN +1960050688,1960058879,KR +1960058880,1960069119,AU +1960069120,1960071167,ID +1960071168,1960075263,TW +1960075264,1960077311,ID +1960077312,1960079359,BD +1960079360,1960080127,HK +1960080128,1960080383,CN +1960080384,1960083455,HK +1960083456,1960091647,KH +1960091648,1960095743,CN +1960095744,1960097791,IN +1960097792,1960099839,BD +1960099840,1960128511,AU +1960128512,1960132607,ID +1960132608,1960181759,CN +1960181760,1960185855,TW +1960185856,1960187903,JP +1960187904,1960189951,IN +1960189952,1960202239,CN +1960202240,1960206335,JP +1960206336,1960210431,SG +1960210432,1960210943,TH +1960210944,1960211455,IN +1960211456,1960212479,SG +1960212480,1960212991,IN +1960212992,1960213247,SG +1960213248,1960213503,PH +1960213504,1960214527,SG +1960214528,1960574975,CN +1960574976,1960837119,JP +1960837120,1961885695,CN +1961885696,1962016767,AU +1962016768,1962541055,CN +1962541056,1962672127,AU +1962672128,1962803199,CN +1962803200,1962827775,JP +1962827776,1962829823,ID +1962829824,1962831871,JP +1962831872,1962835967,ID +1962835968,1962868735,CN +1962868736,1962901503,AU +1962901504,1962934271,CN +1962934272,1963458559,VN +1963458560,1963982847,CN +1963982848,1964113919,KR +1964113920,1964118015,HK +1964118016,1964120063,ID +1964120064,1964122111,JP +1964122112,1964126207,SG +1964126208,1964126463,HK +1964126464,1964130303,SG +1964130304,1964134399,HK +1964134400,1964136447,NZ +1964136448,1964138495,AU +1964138496,1964146687,HK +1964146688,1964171263,JP +1964171264,1964173311,BD +1964173312,1964175359,AU +1964175360,1964179455,PK +1964179456,1964244991,TW +1964244992,1964249087,AU +1964249088,1964253183,PK +1964253184,1964255231,WF +1964255232,1964257279,SG +1964257280,1964261375,ID +1964261376,1964263423,AU +1964263424,1964265471,JP +1964265472,1964269567,KR +1964269568,1964273663,AU +1964273664,1964275711,KH +1964275712,1964277759,GU +1964277760,1964294143,SG +1964294144,1964310527,KR +1964310528,1965948927,CN +1965948928,1966014463,JP +1966014464,1966079999,TH +1966080000,1966342143,CN +1966342144,1966407679,AU +1966407680,1966417919,JP +1966417920,1966419967,AU +1966419968,1966424063,CN +1966424064,1966440447,KR +1966440448,1966444543,AU +1966444544,1966446591,NZ +1966446592,1966452735,AU +1966452736,1966456831,CN +1966456832,1966473215,KR +1966473216,1966538751,ID +1966538752,1966571519,JP +1966571520,1966587903,KR +1966587904,1966591999,AF +1966592000,1966596095,JP +1966596096,1966600191,TW +1966600192,1966602239,IN +1966602240,1966604287,KH +1966604288,1966669823,TW +1966669824,1966768127,CN +1966768128,1966772223,KR +1966772224,1966776319,JP +1966776320,1966784511,SG +1966784512,1966792703,PH +1966792704,1966796799,JP +1966796800,1966798847,BD +1966798848,1966800895,AU +1966800896,1967783935,CN +1967783936,1967800319,JP +1967800320,1967804415,CN +1967804416,1967808511,KH +1967808512,1967812607,AU +1967812608,1967816703,ID +1967816704,1969225727,CN +1969225728,1969487871,IN +1969487872,1969618943,CN +1969618944,1969635327,PK +1969635328,1969651711,ID +1969651712,1969659903,AU +1969659904,1969661951,ID +1969661952,1969676287,JP +1969676288,1969688575,ID +1969688576,1969692671,CN +1969692672,1969694719,ID +1969694720,1969696767,PH +1969696768,1969702911,ID +1969702912,1969704959,AU +1969704960,1969707007,BD +1969707008,1969709055,MH +1969709056,1969713151,TW +1969713152,1969717247,AU +1969717248,1969721343,CN +1969721344,1969725439,HK +1969725440,1969727487,JP +1969727488,1969729535,ID +1969729536,1969733631,JP +1969733632,1969750015,VN +1969750016,1969790975,JP +1969790976,1969795071,AU +1969795072,1969797119,NZ +1969797120,1969799167,AU +1969799168,1969807359,ID +1969807360,1969809407,AF +1969809408,1969811455,IN +1969811456,1969815551,PH +1969815552,1969881087,SG +1969881088,1970012159,CN +1970012160,1970143231,JP +1970143232,1970274303,KR +1970274304,1970798591,CN +1970798592,1970800639,SG +1970800640,1970803711,AU +1970803712,1970804223,HK +1970804224,1970804735,AU +1970804736,1970806783,KH +1970806784,1970808831,NZ +1970808832,1970810879,AU +1970810880,1970812927,JP +1970812928,1970814975,LK +1970814976,1970915327,CN +1970915328,1970917375,ID +1970917376,1970921471,TH +1970921472,1970925567,NP +1970925568,1970926335,SG +1970926336,1970926591,US +1970926592,1970926847,SG +1970926848,1970927103,IL +1970927104,1970927615,SG +1970927616,1970929663,AU +1970929664,1970962431,VN +1970962432,1970995199,CN +1970995200,1971060735,KR +1971060736,1975517183,CN +1975517184,1979711487,IN +1979711488,1981284351,JP +1981284352,1981808639,CN +1981808640,1983905791,KR +1983905792,1984102399,CN +1984102400,1984118783,AU +1984118784,1984131071,JP +1984131072,1984135167,CN +1984135168,1984151551,KR +1984151552,1984153599,AU +1984153600,1984155647,KH +1984155648,1984159743,AU +1984159744,1984167935,IN +1984167936,1984430079,VN +1984430080,1985085439,CN +1985085440,1985093631,ID +1985093632,1985101823,AU +1985101824,1985118207,JP +1985118208,1985134591,NZ +1985134592,1985150975,AU +1985150976,1985216511,JP +1985216512,1985347583,CN +1985347584,1985478655,JP +1985478656,1985480703,IN +1985480704,1985482751,PH +1985482752,1985486847,AU +1985486848,1985609727,CN +1985609728,1985675263,NZ +1985675264,1985708031,KR +1985708032,1985712127,ID +1985712128,1985716223,KR +1985716224,1985720319,NP +1985720320,1985724415,IN +1985724416,1985732607,JP +1985732608,1985734655,ID +1985734656,1985736703,IN +1985736704,1985740799,CN +1985740800,1985871871,NZ +1985871872,1986002943,IN +1986002944,1986199551,ID +1986199552,1986265087,AU +1986265088,1986396159,MY +1986396160,1986398207,VN +1986398208,1986400255,HK +1986400256,1986404351,CN +1986404352,1986406399,PH +1986406400,1986412543,JP +1986412544,1986428927,AU +1986428928,1986461695,IN +1986461696,1986496511,JP +1986496512,1986498559,BT +1986498560,1986502655,HK +1986502656,1986510847,KH +1986510848,1986519039,KR +1986519040,1986523135,PK +1986523136,1986525183,CN +1986525184,1986527231,BN +1986527232,1986723839,JP +1986723840,1986756607,AU +1986756608,1986760703,PK +1986760704,1986764799,AU +1986764800,1986768895,KR +1986768896,1986772991,AU +1986772992,1986789375,MY +1986789376,1987051519,JP +1987051520,1988034559,CN +1988034560,1988083711,AU +1988083712,1988362239,KR +1988362240,1988624383,CN +1988624384,1988755455,ID +1988755456,1988886527,AU +1988886528,1989148671,HK +1989148672,1989410815,CN +1989410816,1989541887,NZ +1989541888,1989672959,AU +1989672960,1990197247,JP +1990197248,1990983679,TW +1990983680,1991245823,TH +1991245824,1991311359,KR +1991311360,1991376895,JP +1991376896,1991442431,CN +1991442432,1991499775,BD +1991499776,1991507967,AU +1991507968,1993342975,CN +1993342976,1993605119,AU +1993605120,1993736191,CN +1993736192,1993867263,SG +1993867264,1994391551,KR +1994391552,1994850303,CN +1994850304,1995046911,TW +1995046912,1995177983,KR +1995177984,1995374591,JP +1995374592,1995440127,CN +1995440128,1995571199,JP +1995571200,1995636735,CN +1995636736,1995702271,JP +1995702272,1996627967,CN +1996627968,1996630015,PH +1996630016,1996634111,ID +1996634112,1996636159,NP +1996636160,1996644351,ID +1996644352,1996652543,BT +1996652544,1997176831,CN +1997176832,1997185023,AU +1997185024,1997187071,JP +1997187072,1997189119,HK +1997189120,1997191167,ID +1997191168,1997209599,JP +1997209600,1997242367,AU +1997242368,1997275135,ID +1997275136,1997406207,AU +1997406208,1997471743,TW +1997471744,1997479935,NZ +1997479936,1997492223,AU +1997492224,1997496319,KH +1997496320,1997504511,AU +1997504512,1997506559,ID +1997506560,1997508607,CN +1997508608,1997510655,JP +1997510656,1997512703,BD +1997512704,1997520895,VN +1997520896,1997537279,TW +1997537280,1997602815,CN +1997602816,1997611007,KR +1997611008,1997619199,AU +1997619200,1997635583,KR +1997635584,1997651967,AU +1997651968,1997668351,VN +1997668352,1997701119,AU +1997701120,1997705215,VN +1997705216,1997707263,BD +1997707264,1997709311,ID +1997709312,1997715455,JP +1997715456,1997717503,VN +1997717504,1997723647,CN +1997723648,1997724495,JP +1997724496,1997724511,NL +1997724512,1997725695,JP +1997725696,1998061567,CN +1998061568,1998258175,JP +1998258176,1998272735,SG +1998272736,1998272751,US +1998272752,1998273023,JP +1998273024,1998273055,US +1998273056,1998274047,SG +1998274048,1998274303,US +1998274304,1998274559,SG +1998274560,1998290943,CN +1998290944,1998299135,PH +1998299136,1998454783,CN +1998454784,1998458879,AU +1998458880,1998462975,TW +1998462976,1998467071,BD +1998467072,1998471167,CN +1998471168,1998487551,PK +1998487552,1998503935,KR +1998503936,1998520319,JP +1998520320,1998553087,TH +1998553088,1998561279,JP +1998561280,1998561535,IN +1998561536,1998561791,SG +1998561792,1998562047,IN +1998562048,1998562303,TH +1998562304,1998562559,IN +1998562560,1998562815,CN +1998562816,1998565375,IN +1998565376,1998569471,TW +1998569472,1998577663,CN +1998577664,1998581759,AU +1998581760,1998585855,KR +1998585856,1999130623,CN +1999130624,1999134719,BD +1999134720,1999136767,MN +1999136768,1999138815,AU +1999138816,1999142911,MY +1999142912,1999249407,CN +1999249408,1999257599,AU +1999257600,1999273983,TH +1999273984,1999276031,AU +1999276032,1999278079,CN +1999278080,1999280127,HK +1999280128,1999282175,IN +1999282176,1999290367,KR +1999290368,1999298559,SG +1999298560,1999306751,CN +1999306752,1999372287,IN +1999372288,1999503359,CN +1999503360,1999568895,TH +1999568896,1999589375,JP +1999589376,1999591423,HK +1999591424,1999593471,ID +1999593472,1999597567,JP +1999597568,1999601663,NZ +1999601664,1999634431,JP +1999634432,2000158719,CN +2000158720,2000191487,SG +2000191488,2000224255,AU +2000224256,2000355327,CN +2000355328,2000371711,KR +2000371712,2000373759,JP +2000373760,2000374399,HK +2000374400,2000374527,US +2000374528,2000375807,HK +2000375808,2000377855,AF +2000377856,2000379903,JP +2000379904,2000388095,AU +2000388096,2000617471,CN +2000617472,2000621567,PH +2000621568,2000625663,JP +2000625664,2000633855,CN +2000633856,2000642047,TH +2000642048,2000646143,HK +2000646144,2000650239,JP +2000650240,2000654335,PK +2000654336,2000658431,AU +2000658432,2000668671,JP +2000668672,2000674815,AU +2000674816,2001207295,KR +2001207296,2001272831,JP +2001272832,2001305599,PK +2001305600,2001420287,SG +2001420288,2001453055,KR +2001453056,2001457151,SG +2001457152,2001461247,CN +2001461248,2001465343,JP +2001465344,2001469439,TW +2001469440,2001534975,TH +2001534976,2001559551,AU +2001559552,2001567743,KR +2001567744,2001600511,TW +2001600512,2001862655,CN +2001862656,2001866751,AU +2001866752,2001870847,JP +2001870848,2001879039,KR +2001879040,2001895423,IN +2001895424,2001899519,VN +2001899520,2001903615,AU +2001903616,2001915903,JP +2001915904,2001919999,AU +2001920000,2001926143,ID +2001926144,2001928191,KH +2001928192,2001993727,JP +2001993728,2002518015,CN +2002518016,2002780159,PH +2002780160,2003304447,CN +2003304448,2003566591,JP +2003566592,2003697663,CN +2003697664,2003714047,MY +2003714048,2003720191,ID +2003720192,2003722239,JP +2003722240,2003726335,MY +2003726336,2003730431,ID +2003730432,2003763199,MY +2003763200,2003828735,PH +2003828736,2006188031,CN +2006188032,2006204415,BD +2006204416,2006212607,AU +2006212608,2006214655,TH +2006214656,2006216703,JP +2006216704,2006228991,KR +2006228992,2006233087,CN +2006233088,2006237183,PH +2006237184,2006253567,JP +2006253568,2006319103,KR +2006319104,2006384639,JP +2006384640,2006450175,IN +2006450176,2007007231,PK +2007007232,2007023615,BN +2007023616,2007025663,IN +2007025664,2007027711,ID +2007027712,2007031807,TH +2007031808,2007035903,AU +2007035904,2007039999,TW +2007040000,2007048191,KR +2007048192,2007064575,AU +2007064576,2007066623,MY +2007066624,2007070719,JP +2007070720,2007072767,US +2007072768,2007498751,CN +2007498752,2008023039,JP +2008023040,2009071615,CN +2009071616,2011168767,KR +2011168768,2011205631,NZ +2011205632,2011299839,AU +2011299840,2011430911,IN +2011430912,2011693055,JP +2011693056,2011824127,CN +2011824128,2011889663,SG +2011889664,2011893759,LK +2011893760,2011897855,ID +2011897856,2011899903,NZ +2011899904,2011901951,HK +2011901952,2011906047,IN +2011906048,2011916287,FJ +2011916288,2011922431,AU +2011922432,2011938815,CN +2011938816,2011942911,KR +2011942912,2011947007,ID +2011947008,2011951103,JP +2011951104,2011953151,KR +2011953152,2011955199,ID +2011955200,2012086271,HK +2012086272,2012610559,JP +2012610560,2012741631,HK +2012741632,2013003775,CN +2013003776,2013036543,AU +2013036544,2013038591,ID +2013038592,2013040639,HK +2013040640,2013044735,IN +2013044736,2013048831,ID +2013048832,2013052927,AU +2013052928,2013061119,IN +2013061120,2013065215,PG +2013065216,2013069311,AU +2013069312,2014314495,CN +2014314496,2014838783,AU +2014838784,2015100927,CN +2015100928,2015166463,PH +2015166464,2015199231,AU +2015199232,2015203327,KR +2015203328,2015205375,JP +2015205376,2015207423,ID +2015207424,2015215615,JP +2015215616,2015216127,HK +2015216128,2015216383,CA +2015216384,2015216639,SG +2015216640,2015217663,CA +2015217664,2015219456,GU +2015219457,2015219775,CA +2015219776,2015219815,SG +2015219816,2015219823,PH +2015219824,2015219839,HK +2015219840,2015219903,SG +2015219904,2015219935,HK +2015219936,2015219967,CA +2015219968,2015220223,PH +2015220224,2015220351,HK +2015220352,2015220479,ID +2015220480,2015220735,HK +2015220736,2015221247,IN +2015221248,2015221759,CA +2015221760,2015222015,HK +2015222016,2015222271,JP +2015222272,2015222527,IN +2015222528,2015222783,CA +2015222784,2015223039,IN +2015223040,2015223295,CA +2015223296,2015223551,TH +2015223552,2015223679,IN +2015223680,2015223687,HK +2015223688,2015223695,SG +2015223696,2015223711,ID +2015223712,2015223727,PH +2015223728,2015223743,CA +2015223744,2015223751,PG +2015223752,2015223759,CA +2015223760,2015223767,JP +2015223768,2015223775,SG +2015223776,2015223807,CA +2015223808,2015225855,ID +2015225856,2015227903,IN +2015227904,2015231999,AU +2015232000,2016542719,CN +2016542720,2016550911,BD +2016550912,2016555007,SG +2016555008,2016559103,MY +2016559104,2016583679,KR +2016583680,2016585727,JP +2016585728,2016587775,AU +2016587776,2016589823,BD +2016589824,2016591871,VN +2016591872,2016595967,JP +2016595968,2016600063,AU +2016600064,2016673791,JP +2016673792,2016935935,CN +2016935936,2017460223,IN +2017460224,2017984511,CN +2017984512,2017988607,JP +2017988608,2017992703,PH +2017992704,2018000895,CN +2018000896,2018004991,JP +2018004992,2018007039,VN +2018007040,2018009087,IN +2018009088,2018017279,VN +2018017280,2018050047,CN +2018050048,2018115583,KR +2018115584,2018246655,JP +2018246656,2019033087,CN +2019033088,2019035135,AU +2019035136,2019037183,CN +2019037184,2019041279,JP +2019041280,2019045375,IN +2019045376,2019098623,AU +2019098624,2019115007,PH +2019115008,2019117055,US +2019117056,2019119103,IN +2019119104,2019121151,NZ +2019121152,2019123199,AU +2019123200,2019131391,NP +2019131392,2019164159,JP +2019164160,2019360767,CN +2019360768,2019426303,JP +2019426304,2019557375,CN +2019557376,2021654527,TW +2021654528,2022178815,CN +2022178816,2022180863,NZ +2022180864,2022182911,AU +2022182912,2022184959,ID +2022184960,2022187007,KH +2022187008,2022187071,US +2022187072,2022187783,HK +2022187784,2022187791,US +2022187792,2022187807,HK +2022187808,2022187831,US +2022187832,2022187839,HK +2022187840,2022187959,US +2022187960,2022187991,HK +2022187992,2022188015,US +2022188016,2022188031,HK +2022188032,2022188111,US +2022188112,2022188119,HK +2022188120,2022188191,US +2022188192,2022188199,HK +2022188200,2022188223,US +2022188224,2022188239,HK +2022188240,2022188255,US +2022188256,2022188671,HK +2022188672,2022188927,US +2022188928,2022189823,HK +2022189824,2022189831,US +2022189832,2022190335,HK +2022190336,2022190847,US +2022190848,2022191103,HK +2022191104,2022193151,NZ +2022193152,2022195199,AU +2022195200,2022211583,KR +2022211584,2022227967,CN +2022227968,2022244351,JP +2022244352,2022277119,CN +2022277120,2022309887,JP +2022309888,2022313983,PH +2022313984,2022316031,NZ +2022316032,2022326271,AU +2022326272,2022330367,VN +2022330368,2022334463,MY +2022334464,2022342655,IN +2022342656,2022359039,JP +2022359040,2022375423,IN +2022375424,2022572031,MY +2022572032,2022637567,KR +2022637568,2022662143,JP +2022662144,2022670335,AU +2022670336,2022678527,PH +2022678528,2022703103,KR +2022703104,2023751679,AU +2023751680,2025848831,ID +2025848832,2030043135,CN +2030043136,2030045183,AU +2030045184,2030047231,BD +2030047232,2030051327,CN +2030051328,2030057471,JP +2030057472,2030059519,AU +2030059520,2030108671,KR +2030108672,2030125055,PH +2030125056,2030141439,KR +2030141440,2030305279,JP +2030305280,2030436351,CN +2030436352,2030567423,SG +2030567424,2032926719,CN +2032926720,2033057791,AU +2033057792,2033074175,CN +2033074176,2033090559,AU +2033090560,2033319935,CN +2033319936,2033324031,IN +2033324032,2033328127,KR +2033328128,2033330175,ID +2033330176,2033336319,JP +2033336320,2033352703,KR +2033352704,2033356799,ID +2033356800,2033358847,TW +2033358848,2033362943,JP +2033362944,2033364991,AU +2033364992,2033369087,TW +2033369088,2033377279,AU +2033377280,2033385471,KR +2033385472,2033451007,CN +2033451008,2033487871,ID +2033487872,2033491967,PK +2033491968,2033500159,CN +2033500160,2033502207,AU +2033502208,2033504255,SG +2033504256,2033516543,CN +2033516544,2033582079,KR +2033582080,2033614847,PH +2033614848,2033623039,AU +2033623040,2033625087,PH +2033625088,2033627135,HK +2033627136,2033631231,AU +2033631232,2033647615,KR +2033647616,2033663999,CN +2033664000,2033696767,KR +2033696768,2033713151,GU +2033713152,2033876991,CN +2033876992,2033879039,JP +2033879040,2033881087,AU +2033881088,2033885183,CN +2033885184,2033887231,AU +2033887232,2033889279,IN +2033889280,2033891327,JP +2033891328,2033893375,ID +2033893376,2033909759,PH +2033909760,2034213775,CN +2034213776,2034213779,FR +2034213780,2034213783,DE +2034213784,2034213787,CN +2034213788,2034213791,SL +2034213792,2034237439,CN +2034237440,2034499583,KR +2034499584,2034761727,CN +2034761728,2034958335,NZ +2034958336,2035023871,AU +2035023872,2035154943,CN +2035154944,2035220479,KR +2035220480,2035253247,AU +2035253248,2035269631,CN +2035269632,2035277823,NZ +2035277824,2035286015,AU +2035286016,2035810303,JP +2035810304,2035875839,KR +2035875840,2035941375,CN +2035941376,2036006911,NZ +2036006912,2036072447,AU +2036072448,2036334591,JP +2036334592,2036465663,PH +2036465664,2036531199,NZ +2036531200,2036596735,AU +2036596736,2036598783,ID +2036598784,2036600831,JP +2036600832,2036604927,ID +2036604928,2036609023,SG +2036609024,2036611071,AF +2036611072,2036613119,AU +2036613120,2036629503,KR +2036629504,2036662271,CN +2036662272,2036678655,AU +2036678656,2036695039,JP +2036695040,2036697087,ID +2036697088,2036699135,AU +2036699136,2036703231,IN +2036703232,2036705279,AU +2036705280,2036707327,HK +2036707328,2036709375,MN +2036709376,2036711423,ID +2036711424,2036715519,KR +2036715520,2036719615,CN +2036719616,2036727807,KR +2036727808,2037907455,JP +2037907456,2038169599,MY +2038169600,2038366207,KR +2038366208,2038374399,PH +2038374400,2038382591,AF +2038382592,2038415359,KR +2038415360,2038423551,AU +2038423552,2038431743,HK +2038431744,2042626047,KR +2042626048,2043150335,CN +2043150336,2043166719,AU +2043166720,2043183103,KR +2043183104,2043199487,JP +2043199488,2043201535,BD +2043201536,2043203583,JP +2043203584,2043215871,AU +2043215872,2043281407,CN +2043281408,2043412479,HK +2043412480,2043674623,CN +2043674624,2044723199,AU +2044723200,2045771775,CN +2045771776,2046296063,IN +2046296064,2046558207,CN +2046558208,2046705663,KR +2046705664,2046722047,TW +2046722048,2046754815,KR +2046754816,2046820351,CN +2046820352,2046822399,TH +2046822400,2046824447,KR +2046824448,2046828543,MY +2046828544,2046836735,KR +2046836736,2046885887,CN +2046885888,2046951423,JP +2046951424,2047082495,PH +2047082496,2047868927,CN +2047868928,2048917503,JP +2048917504,2049966079,KR +2049966080,2050047999,CN +2050048000,2050064383,KR +2050064384,2050080767,AU +2050080768,2050082815,JP +2050082816,2050084863,AU +2050084864,2050088959,PH +2050088960,2050091007,ID +2050091008,2050097151,JP +2050097152,2050101247,SG +2050101248,2050113535,JP +2050113536,2050129031,SG +2050129032,2050129035,JP +2050129036,2050129591,SG +2050129592,2050129595,US +2050129596,2050129647,SG +2050129648,2050129655,JP +2050129656,2050129663,US +2050129664,2050129919,JP +2050129920,2050162687,IN +2050162688,2050228223,CN +2050228224,2050490367,PH +2050490368,2051014655,NZ +2051014656,2053242879,CN +2053242880,2053308415,IN +2053308416,2053324799,TW +2053324800,2053332991,AU +2053332992,2053335039,BD +2053335040,2053337087,JP +2053337088,2053341183,AU +2053341184,2053373951,KR +2053373952,2053378047,AU +2053378048,2053380095,JP +2053380096,2053382143,AU +2053382144,2053390335,KR +2053390336,2053406719,TW +2053406720,2053439487,MO +2053439488,2053505023,KR +2053505024,2053509119,CN +2053509120,2053513215,AU +2053513216,2053515263,BD +2053515264,2053517311,AU +2053517312,2053519359,ID +2053519360,2053521407,AU +2053521408,2053529599,CN +2053529600,2053537791,AU +2053537792,2053636095,JP +2053636096,2054160383,AU +2054160384,2054422527,CN +2054422528,2054619135,TW +2054619136,2054684671,CN +2054684672,2055208959,TW +2055208960,2055213055,JP +2055213056,2055217151,ID +2055217152,2055229439,KR +2055229440,2055231487,TW +2055231488,2055233535,AU +2055233536,2055235583,NP +2055235584,2055237631,HK +2055237632,2055239679,JP +2055239680,2055241727,AU +2055241728,2055274495,KR +2055274496,2055290879,AU +2055290880,2055299071,PK +2055299072,2055305215,ID +2055305216,2055323647,AU +2055323648,2055327743,ID +2055327744,2055329791,KR +2055329792,2055331839,AU +2055331840,2055335935,JP +2055335936,2055340031,KR +2055340032,2055733247,JP +2055733248,2056257535,CN +2056257536,2056259583,ID +2056259584,2056261631,BD +2056261632,2056263679,IN +2056263680,2056265727,TH +2056265728,2056273919,TW +2056273920,2056290303,PH +2056290304,2056323071,CN +2056323072,2056388607,JP +2056388608,2056519679,TW +2056519680,2056781823,AU +2056781824,2056794111,JP +2056794112,2056796159,BD +2056796160,2056798207,AU +2056798208,2056806399,JP +2056806400,2056814591,AU +2056814592,2056815103,JP +2056815104,2056815195,HK +2056815196,2056815215,JP +2056815216,2056815327,HK +2056815328,2056815343,JP +2056815344,2056815615,HK +2056815616,2056816031,JP +2056816032,2056816047,NZ +2056816048,2056816159,JP +2056816160,2056816191,PH +2056816192,2056816319,JP +2056816320,2056816383,PH +2056816384,2056816447,JP +2056816448,2056816511,PH +2056816512,2056816639,JP +2056816640,2056816815,SG +2056816816,2056816831,JP +2056816832,2056816943,SG +2056816944,2056816959,JP +2056816960,2056816991,MY +2056816992,2056817007,JP +2056817008,2056817151,SG +2056817152,2056817535,HK +2056817536,2056817599,JP +2056817600,2056817663,HK +2056817664,2056818175,JP +2056818176,2056818239,SG +2056818240,2056818271,MY +2056818272,2056818687,SG +2056818688,2056818751,MY +2056818752,2056818943,JP +2056818944,2056819007,MY +2056819008,2056819071,JP +2056819072,2056819199,MY +2056819200,2056819759,JP +2056819760,2056819775,NZ +2056819776,2056819839,JP +2056819840,2056819871,NZ +2056819872,2056819903,JP +2056819904,2056819911,NZ +2056819912,2056820223,JP +2056820224,2056820279,HK +2056820280,2056820287,JP +2056820288,2056820319,HK +2056820320,2056820351,JP +2056820352,2056820479,HK +2056820480,2056820511,JP +2056820512,2056820607,HK +2056820608,2056827935,JP +2056827936,2056827965,HK +2056827966,2056830271,JP +2056830272,2056830275,HK +2056830276,2056830975,JP +2056830976,2056847359,CN +2056847360,2056912895,KR +2056912896,2057043967,TH +2057043968,2057306111,CN +2057306112,2059141119,IN +2059141120,2059403263,AU +2059403264,2059665407,CN +2059665408,2059796479,JP +2059796480,2059862015,CN +2059862016,2059878399,AU +2059878400,2059927551,KR +2059927552,2059931647,ID +2059931648,2059933695,IN +2059933696,2059935743,AU +2059935744,2059937791,JP +2059937792,2059939839,BD +2059939840,2059941887,ID +2059941888,2059943935,AU +2059943936,2059960319,CN +2059960320,2059964415,AU +2059964416,2059966463,ID +2059966464,2059968511,TW +2059968512,2059976703,AU +2059976704,2059995135,JP +2059995136,2059997183,VN +2059997184,2060001279,MN +2060001280,2060001791,AE +2060001792,2060002239,HK +2060002240,2060002247,PK +2060002248,2060002391,HK +2060002392,2060002415,AF +2060002416,2060002455,HK +2060002456,2060002463,PK +2060002464,2060002847,HK +2060002848,2060002863,AF +2060002864,2060003039,HK +2060003040,2060003071,AF +2060003072,2060003199,HK +2060003200,2060003215,AF +2060003216,2060005375,HK +2060005376,2060025855,AU +2060025856,2060058623,TW +2060058624,2060062719,AU +2060062720,2060066815,JP +2060066816,2060075007,KR +2060075008,2060091391,AU +2060091392,2060189695,KR +2060189696,2060451839,CN +2060451840,2061500415,JP +2061500416,2063073279,CN +2063073280,2063077375,BD +2063077376,2063081471,HK +2063081472,2063085567,AU +2063085568,2063089663,CN +2063089664,2063097855,JP +2063097856,2063106047,AU +2063106048,2063107575,SG +2063107576,2063107583,AU +2063107584,2063107623,SG +2063107624,2063107631,AU +2063107632,2063107639,NZ +2063107640,2063107647,PH +2063107648,2063107655,MY +2063107656,2063107663,HK +2063107664,2063107671,TW +2063107672,2063107679,CN +2063107680,2063107839,AU +2063107840,2063108095,SG +2063108096,2063109119,HK +2063109120,2063109375,AU +2063109376,2063109607,HK +2063109608,2063109631,AU +2063109632,2063109759,HK +2063109760,2063109823,AU +2063109824,2063109839,HK +2063109840,2063109855,AU +2063109856,2063109887,HK +2063109888,2063110143,AU +2063110144,2063110399,JP +2063110400,2063110527,AU +2063110528,2063110591,JP +2063110592,2063110623,AU +2063110624,2063110663,JP +2063110664,2063110687,AU +2063110688,2063110703,JP +2063110704,2063114239,AU +2063114240,2063114439,IN +2063114440,2063115263,AU +2063115264,2063115519,JP +2063115520,2063116287,AU +2063116288,2063116319,SG +2063116320,2063116799,AU +2063116800,2063116807,KR +2063116808,2063117311,AU +2063117312,2063117327,NZ +2063117328,2063117823,AU +2063117824,2063117855,PH +2063117856,2063138815,AU +2063138816,2063335423,JP +2063335424,2063351807,AU +2063351808,2063368191,KR +2063368192,2063370239,AU +2063370240,2063372287,JP +2063372288,2063376383,AU +2063376384,2063380479,TW +2063380480,2063382527,KH +2063382528,2063384575,AU +2063384576,2063392767,KR +2063392768,2063400959,IN +2063400960,2063466495,JP +2063466496,2063482879,TW +2063482880,2063499263,MN +2063499264,2063532031,KR +2063532032,2063548415,LK +2063548416,2063550463,BD +2063550464,2063551487,IN +2063551488,2063552511,AU +2063552512,2063556607,TW +2063556608,2063564799,MY +2063564800,2063581183,JP +2063581184,2063597567,AU +2063597568,2063601663,KR +2063601664,2063605759,AU +2063605760,2063613951,TW +2063613952,2063630335,JP +2063630336,2063646719,CN +2063646720,2063663103,TW +2063663104,2063695871,JP +2063695872,2063859711,AU +2063859712,2064646143,CN +2064646144,2065694719,VN +2065694720,2066743295,KR +2066743296,2066808831,JP +2066808832,2066825215,BD +2066825216,2066841599,SG +2066841600,2066874367,CN +2066874368,2066882559,JP +2066882560,2066890751,TW +2066890752,2066907135,PF +2066907136,2066915327,AU +2066915328,2066923519,IN +2066923520,2066939903,JP +2066939904,2066972671,AU +2066972672,2067005439,TW +2067005440,2070052863,CN +2070052864,2070056959,AU +2070056960,2070061055,JP +2070061056,2070077439,KR +2070077440,2070085631,JP +2070085632,2070102015,TW +2070102016,2070118399,KR +2070118400,2070159359,CN +2070159360,2070167551,AU +2070167552,2070183935,NZ +2070183936,2070200319,AU +2070200320,2070208511,JP +2070208512,2070209023,MY +2070209024,2070210559,SG +2070210560,2070210815,CN +2070210816,2070211071,SG +2070211072,2070211327,IN +2070211328,2070211583,SG +2070211584,2070212607,US +2070212608,2070216703,SG +2070216704,2070282239,CN +2070282240,2070347775,AU +2070347776,2070380543,CN +2070380544,2070396927,JP +2070396928,2070405119,AU +2070405120,2070409215,JP +2070409216,2070413311,AU +2070413312,2070677503,JP +2070677504,2070679551,ID +2070679552,2070683647,KR +2070683648,2070691839,IN +2070691840,2070700031,AU +2070700032,2070702079,ID +2070702080,2070703103,AU +2070703104,2070704127,HK +2070704128,2070708223,PH +2070708224,2070712319,CN +2070712320,2070714367,NZ +2070714368,2070716415,AU +2070716416,2070724607,KR +2070724608,2070726655,JP +2070726656,2070728703,IN +2070728704,2070732799,CN +2070732800,2070734847,IN +2070734848,2070736895,JP +2070736896,2070738943,BD +2070738944,2070740991,KH +2070740992,2070806527,KR +2070806528,2070872063,TW +2070872064,2070937599,KR +2070937600,2072510463,CN +2072510464,2072514559,HK +2072514560,2072516607,IN +2072516608,2072518655,BD +2072518656,2072526847,AU +2072526848,2072528895,SG +2072528896,2072530943,PH +2072530944,2072535039,CN +2072535040,2072543231,MY +2072543232,2072575999,IN +2072576000,2072772607,CN +2072772608,2073034751,KR +2073034752,2075131903,CN +2075131904,2075140095,MV +2075140096,2075144191,IN +2075144192,2075148287,AU +2075148288,2075150335,PH +2075150336,2075152383,WS +2075152384,2075156479,CN +2075156480,2075158527,HK +2075158528,2075160575,JP +2075160576,2075162623,AU +2075162624,2075164671,ID +2075164672,2075197439,JP +2075197440,2076180479,CN +2076180480,2076442623,TW +2076442624,2076573695,CN +2076573696,2076606463,JP +2076606464,2076639231,AU +2076639232,2076671999,KR +2076672000,2076704767,CN +2076704768,2076712959,BD +2076712960,2076721151,JP +2076721152,2076737535,KR +2076737536,2076770303,AU +2076770304,2076835839,IN +2076835840,2076966911,HK +2076966912,2077097983,TW +2077097984,2077229055,CN +2077229056,2077491199,AU +2077491200,2077753343,KR +2077753344,2078539775,JP +2078539776,2078670847,KR +2078670848,2078736383,JP +2078736384,2078769151,LK +2078769152,2078797823,ID +2078797824,2078801919,AU +2078801920,2079064063,CN +2079064064,2079326207,IN +2079326208,2079457279,TW +2079457280,2079490047,CN +2079490048,2079506431,TH +2079506432,2079508479,AU +2079508480,2079510527,PH +2079510528,2079514623,JP +2079514624,2079516671,HK +2079516672,2079518719,JP +2079518720,2079522815,IN +2079522816,2079588351,AU +2079588352,2079850495,CN +2079850496,2079916031,KR +2079916032,2079981567,CN +2079981568,2080112639,KR +2080112640,2080145407,TW +2080145408,2080178175,IN +2080178176,2080243711,CN +2080243712,2080260095,JP +2080260096,2080268287,KR +2080268288,2080276479,AU +2080276480,2080309247,KR +2080309248,2080325631,NZ +2080325632,2080342015,AU +2080342016,2080360447,JP +2080360448,2080362495,ID +2080362496,2080366591,AU +2080366592,2080368639,TW +2080368640,2080372735,JP +2080372736,2080374783,IN +2080374784,2080636927,KR +2080636928,2080702463,IN +2080702464,2080767999,KR +2080768000,2080776191,TW +2080776192,2080784383,AU +2080784384,2080800767,CN +2080800768,2080817151,PH +2080817152,2080825343,NZ +2080825344,2080829439,BD +2080829440,2080833535,AU +2080833536,2080899071,IN +2080899072,2081226751,TW +2081226752,2081292287,MY +2081292288,2081554431,CN +2081554432,2081619967,JP +2081619968,2081652735,AU +2081652736,2081685503,PH +2081685504,2081947647,CN +2081947648,2082209791,JP +2082209792,2082258943,KR +2082258944,2082308095,CN +2082308096,2082324479,TW +2082324480,2082340863,PK +2082340864,2082406399,IN +2082406400,2082471935,CN +2082471936,2083024895,JP +2083024896,2083045375,CN +2083045376,2083053567,AU +2083053568,2083057663,TH +2083057664,2083059711,AU +2083059712,2083061759,ID +2083061760,2083110911,JP +2083110912,2083127295,NP +2083127296,2083192831,CN +2083192832,2083258367,LK +2083258368,2083389439,JP +2083389440,2083454975,KR +2083454976,2083471359,CN +2083471360,2083487743,JP +2083487744,2083504127,IN +2083504128,2083520511,JP +2083520512,2083734583,KR +2083734584,2083734591,FR +2083734592,2084569087,KR +2084569088,2084732927,CN +2084732928,2084741119,SG +2084741120,2084743167,ID +2084743168,2084745215,JP +2084745216,2084749311,KR +2084749312,2084753407,JP +2084753408,2084757503,AU +2084757504,2084765695,JP +2084765696,2085617663,CN +2085617664,2085683199,KR +2085683200,2085748735,ID +2085748736,2085814271,MY +2085814272,2085847039,PH +2085847040,2086141951,JP +2086141952,2086666239,CN +2086666240,2087190527,JP +2087190528,2087452671,PH +2087452672,2087453695,AU +2087453696,2087454719,KH +2087454720,2087456767,CN +2087456768,2087458815,BD +2087458816,2087460863,FJ +2087460864,2087462911,JP +2087462912,2087464959,CN +2087464960,2087467007,KH +2087467008,2087469055,JP +2087469056,2087472639,AU +2087472640,2087473151,SG +2087473152,2087474175,HK +2087474176,2087475711,AU +2087475712,2087476223,JP +2087476224,2087477247,HK +2087477248,2087481343,AU +2087481344,2087485439,HK +2087485440,2087501823,TW +2087501824,2087518207,JP +2087518208,2087519231,TH +2087519232,2087520255,SG +2087520256,2087522303,FM +2087522304,2087524351,BD +2087524352,2087526399,TH +2087526400,2087534591,PK +2087534592,2087546879,AU +2087546880,2087550975,TW +2087550976,2087649279,JP +2087649280,2087714815,KR +2087714816,2088239103,CN +2088239104,2088435711,TH +2088435712,2088632319,IN +2088632320,2089287679,CN +2089287680,2089549823,KR +2089549824,2089943039,JP +2089943040,2089959423,KR +2089959424,2090041343,JP +2090041344,2090074111,CN +2090074112,2090401791,AU +2090401792,2090418175,ID +2090418176,2090434559,IN +2090434560,2090467327,KR +2090467328,2090565631,JP +2090565632,2090582015,TW +2090582016,2090590207,SG +2090590208,2090594303,NZ +2090594304,2090598399,AU +2090598400,2090663935,CN +2090663936,2090680319,AU +2090680320,2090696703,NZ +2090696704,2090729471,TH +2090729472,2090737663,AU +2090737664,2090745855,PH +2090745856,2090762239,MN +2090762240,2090778623,ID +2090778624,2090786815,HK +2090786816,2090795007,MY +2090795008,2090860543,JP +2090860544,2091384831,CN +2091384832,2091646975,AU +2091646976,2091909119,CN +2091909120,2092957695,AU +2092957696,2093088767,CN +2093088768,2093154303,KR +2093154304,2093187071,ID +2093187072,2093191167,MY +2093191168,2093195263,JP +2093195264,2093203455,KR +2093203456,2093211647,MV +2093211648,2093219839,KR +2093219840,2093285375,CN +2093285376,2093301759,NZ +2093301760,2093318143,SG +2093318144,2093342719,KR +2093342720,2093350911,MY +2093350912,2093383679,KR +2093383680,2093400063,NZ +2093400064,2093416447,AU +2093416448,2093432831,KR +2093432832,2093445119,TW +2093445120,2093449215,AU +2093449216,2093481983,KR +2093481984,2094006271,CN +2094006272,2094530559,JP +2094530560,2094596095,KR +2094596096,2094628863,PH +2094628864,2094645247,HK +2094645248,2094653439,KR +2094653440,2094661631,MY +2094661632,2094759935,TW +2094759936,2094792703,JP +2094792704,2096152575,CN +2096152576,2096160767,PG +2096160768,2096168959,AU +2096168960,2096234495,JP +2096234496,2096300031,CN +2096300032,2096332799,KR +2096332800,2096349183,AU +2096349184,2096365567,CN +2096365568,2096431103,HK +2096431104,2096496639,JP +2096496640,2096513023,AU +2096513024,2096529407,SG +2096529408,2096611327,JP +2096611328,2096627711,IN +2096627712,2096660479,CN +2096660480,2096664575,NZ +2096664576,2096668671,AU +2096668672,2096676863,KH +2096676864,2096693247,HK +2096693248,2096889855,CN +2096889856,2096955391,AU +2096955392,2097020927,IN +2097020928,2097037311,CN +2097037312,2097053695,AU +2097053696,2097086463,KR +2097086464,2097479679,JP +2097479680,2097504791,PH +2097504792,2097504799,US +2097504800,2097545215,PH +2097545216,2097610751,JP +2097610752,2097643519,AU +2097643520,2097676287,KR +2097676288,2098200575,JP +2098200576,2098724863,IN +2098724864,2098987007,TH +2098987008,2099183615,JP +2099183616,2099199999,MO +2099200000,2099216383,JP +2099216384,2099232767,KR +2099232768,2100297727,CN +2100297728,2100854783,JP +2100854784,2100887551,US +2100887552,2100953087,KR +2100953088,2100969471,AU +2100969472,2100985855,JP +2100985856,2101018623,CN +2101018624,2101084159,HK +2101084160,2101116927,KR +2101116928,2101149695,PH +2101149696,2101182463,KR +2101182464,2101231615,CN +2101231616,2101239807,AU +2101239808,2101270527,IN +2101270528,2101272575,AU +2101272576,2101276671,TW +2101276672,2101280767,JP +2101280768,2101288959,AU +2101288960,2101293055,JP +2101293056,2101297151,AU +2101297152,2101313535,IN +2101313536,2101346303,AU +2101346304,2103640063,CN +2103640064,2103705599,IN +2103705600,2103967743,JP +2103967744,2105540607,CN +2105540608,2107637759,KR +2107637760,2108162047,ID +2108162048,2108227583,AU +2108227584,2108293119,CN +2108293120,2108358655,JP +2108358656,2108424191,CN +2108424192,2108686335,JP +2108686336,2109734911,KR +2109734912,2110783487,JP +2110783488,2110799871,CN +2110799872,2110816255,KR +2110816256,2110832639,ID +2110832640,2110865407,KR +2110865408,2110881791,PK +2110881792,2110914559,AU +2110914560,2111045631,CN +2111045632,2111078399,PH +2111078400,2111111167,VN +2111111168,2111143935,CN +2111143936,2111152127,ID +2111152128,2111160319,AU +2111160320,2111168511,AF +2111168512,2111176703,TH +2111176704,2111187815,VN +2111187816,2111187823,KH +2111187824,2111193087,VN +2111193088,2111201279,AU +2111201280,2111209471,CN +2111209472,2111217663,JP +2111217664,2111225855,LK +2111225856,2111242239,HK +2111242240,2111258623,CN +2111258624,2111275007,JP +2111275008,2111307775,HK +2111307776,2111832063,CN +2111832064,2112487423,TW +2112487424,2112618495,VN +2112618496,2112880639,NZ +2112880640,2113683455,KR +2113683456,2113683487,PH +2113683488,2113683519,TW +2113683520,2113683615,PH +2113683616,2113683647,AU +2113683648,2113683679,PH +2113683680,2113683775,TW +2113683776,2113683839,PH +2113683840,2113683967,AU +2113683968,2113683999,PH +2113684000,2113684159,AU +2113684160,2113684175,TW +2113684176,2113684223,PH +2113684224,2113684239,AU +2113684240,2113684255,PH +2113684256,2113684271,TW +2113684272,2113684279,AU +2113684280,2113684431,PH +2113684432,2113684439,TW +2113684440,2113684479,PH +2113684480,2113684527,TW +2113684528,2113684543,PH +2113684544,2113684671,AU +2113684672,2113684735,PH +2113684736,2113684991,TW +2113684992,2113685007,PH +2113685008,2113685023,AU +2113685024,2113685039,PH +2113685040,2113685119,AU +2113685120,2113685215,PH +2113685216,2113685231,AU +2113685232,2113685247,TW +2113685248,2113685407,AU +2113685408,2113686015,PH +2113686016,2113686079,AU +2113686080,2113686207,TW +2113686208,2113686527,AU +2113686528,2113687039,TW +2113687040,2113688575,AU +2113688576,2113689087,PH +2113689088,2113689343,AU +2113689344,2113689599,HK +2113689600,2113690111,AU +2113690112,2113690367,PH +2113690368,2113692159,AU +2113692160,2113692415,PH +2113692416,2113693183,AU +2113693184,2113693343,HK +2113693344,2113693359,AU +2113693360,2113693375,HK +2113693376,2113693439,AU +2113693440,2113693663,HK +2113693664,2113694207,AU +2113694208,2113694463,JP +2113694464,2113694719,HK +2113694720,2113699839,AU +2113699840,2113716223,JP +2113716224,2113724927,AU +2113724928,2113725183,IN +2113725184,2113728511,AU +2113728512,2113732607,JP +2113732608,2113765375,AU +2113765376,2113798143,HK +2113798144,2113830911,AU +2113830912,2113863679,CN +2113863680,2113929215,AU +2113929216,2130706431,JP +2147483648,2147942399,US +2147942400,2148007935,DE +2148007936,2148532223,US +2148532224,2148597759,GB +2148597760,2150039551,US +2150039552,2150105087,NO +2150105088,2150236159,GB +2150236160,2150301695,US +2150301696,2150367231,CA +2150367232,2150432767,US +2150498304,2151743487,US +2151809024,2151874559,US +2152726528,2153119743,US +2153119744,2153250815,GB +2153250816,2153578495,US +2153578496,2153644031,FR +2153644032,2153906175,US +2153906176,2153971711,GB +2153971712,2154037247,US +2154037248,2154102783,CA +2154102784,2155610111,US +2155675648,2155806719,US +2155872256,2156003327,US +2156003328,2156134399,AT +2156134400,2156265471,US +2156265472,2156331007,KR +2156331008,2156593151,US +2156593152,2156658687,IL +2156724224,2156855295,CH +2156855296,2156920831,US +2156920832,2156986367,CA +2156986368,2159017983,US +2159017984,2159083519,DE +2159083520,2159149055,US +2159149056,2159280127,CH +2159280128,2159542271,US +2159542272,2159607807,AU +2159607808,2159869951,US +2159869952,2159935487,CA +2159935488,2160525311,US +2160525312,2160590847,GB +2160590848,2160656383,US +2160656384,2160721919,FR +2160721920,2160852991,US +2160918528,2161508351,US +2161508352,2161573887,FI +2161573888,2162687999,US +2162688000,2162753535,GB +2162753536,2162819071,CA +2162884608,2163212287,US +2163212288,2163277823,GB +2163277824,2163408895,US +2163408896,2163474431,GB +2163474432,2163605503,US +2163605504,2163671039,CH +2163671040,2163867647,US +2163867648,2163933183,AU +2163933184,2164260863,US +2164326400,2164981759,US +2164981760,2165112831,GB +2165112832,2165178367,DE +2165178368,2165309439,US +2165309440,2165374975,SE +2165374976,2165440511,US +2165506048,2165571583,US +2165571584,2165637119,FR +2165637120,2165964799,US +2165964800,2166030335,DE +2166030336,2166095871,AT +2166095872,2166292479,US +2166292480,2166358015,GB +2166358016,2166571007,US +2166571008,2166575103,GB +2166575104,2167209983,US +2167275520,2167930879,US +2167996416,2168193023,US +2168193024,2168258559,JP +2168258560,2168651775,US +2168651776,2168717311,GB +2168717312,2168782847,US +2168782848,2168913919,DE +2168913920,2169044991,US +2169044992,2169110527,CR +2169110528,2169372671,US +2169372672,2169438207,AU +2169438208,2170028031,US +2170028032,2170093567,FR +2170093568,2170159103,US +2170159104,2170224639,VE +2170224640,2170421247,US +2170421248,2170486783,AU +2170486784,2170552319,US +2170552320,2170617855,AU +2170617856,2170683391,CA +2170683392,2170814463,US +2170814464,2170879999,CA +2170880000,2170945535,US +2170945536,2171011071,FR +2171011072,2171076607,DE +2171076608,2171142143,FR +2171142144,2172256255,US +2172321792,2172452863,US +2172452864,2172518399,NL +2172518400,2172583935,US +2172583936,2172649471,AU +2172649472,2172715007,CA +2172715008,2172780543,CH +2172780544,2172911615,US +2172911616,2172977151,CH +2172977152,2173173759,US +2173173760,2173239295,JP +2173239296,2173435903,US +2173501440,2173566975,US +2173566976,2173632511,DK +2173632512,2173698047,DE +2173698048,2175336447,US +2175336448,2175401983,GB +2175401984,2175598591,US +2175598592,2175664127,CA +2175664128,2175729663,US +2175729664,2175795199,FR +2175795200,2175860735,US +2175860736,2175926271,NO +2175926272,2175991807,SE +2175991808,2176057343,US +2176057344,2176122879,AU +2176122880,2176450559,FR +2176450560,2176516095,US +2176516096,2176581631,DE +2176581632,2176974847,US +2176974848,2177105919,CH +2177105920,2177302527,US +2177302528,2177368063,FR +2177368064,2177695743,US +2177761280,2177826815,DE +2177826816,2177892351,US +2177892352,2177957887,GB +2177957888,2178285567,US +2178285568,2178351103,AR +2178351104,2178416639,GB +2178416640,2178482175,US +2178482176,2178547711,DE +2178547712,2179465215,US +2179530752,2179596287,DE +2179596288,2179661823,GB +2179661824,2179989503,US +2179989504,2180186111,NO +2180186112,2180448255,US +2180448256,2180513791,DE +2180513792,2180579327,US +2180579328,2180644863,JP +2180644864,2180907007,US +2180907008,2180972543,KR +2180972544,2181038079,US +2181103616,2181824511,US +2181824512,2181890047,CA +2181890048,2182021119,US +2182021120,2182086655,CA +2182086656,2182610943,US +2182610944,2182676479,GB +2182742016,2182873087,US +2182873088,2182938623,SE +2182938624,2183135231,US +2183135232,2183200767,GB +2183200768,2183266303,US +2183266304,2183331839,JP +2183331840,2183462911,US +2183462912,2183528447,NL +2183528448,2183856127,US +2183921664,2184577023,US +2184577024,2184642559,JP +2184642560,2184708095,US +2184708096,2184773631,AU +2184773632,2184904703,US +2184904704,2185035775,CH +2185035776,2185166847,US +2185166848,2185232383,CA +2185232384,2185363455,US +2185363456,2185428991,FR +2185428992,2185494527,NO +2185494528,2185560063,US +2185560064,2185625599,JP +2185625600,2185822207,US +2185822208,2185887743,DE +2185887744,2185953279,US +2185953280,2186018815,DE +2186018816,2186149887,US +2186149888,2186215423,NL +2186215424,2186280959,FR +2186280960,2186412031,US +2186412032,2186477567,CH +2186477568,2186543103,DE +2186543104,2186608639,FR +2186608640,2186739711,US +2186739712,2186805247,JP +2186805248,2186870783,GB +2186870784,2186936319,NL +2186936320,2187067391,US +2187067392,2187132927,CH +2187132928,2187263999,US +2187264000,2187329535,AU +2187329536,2187460607,US +2187460608,2187526143,FR +2187526144,2187591679,US +2187591680,2187657215,SE +2187657216,2187722751,US +2187722752,2187788287,AU +2187788288,2187853823,US +2187853824,2187919359,BE +2187919360,2188378111,US +2188378112,2188443647,NL +2188443648,2188509183,CA +2188509184,2188574719,US +2188574720,2188640255,NL +2188640256,2188705791,AU +2188705792,2188902399,US +2188902400,2188967935,FR +2188967936,2189099007,US +2189099008,2189164543,NZ +2189164544,2189230079,US +2189230080,2189295615,CH +2189295616,2189557759,US +2189557760,2189623295,AU +2189623296,2189754367,US +2189754368,2189819903,DE +2189819904,2189950975,US +2189950976,2190016511,IT +2190016512,2190082047,US +2190082048,2190737407,NL +2190737408,2190802943,GB +2190802944,2190868479,DE +2190868480,2191065087,US +2191065088,2191130623,JP +2191130624,2191196159,US +2191196160,2191261695,AU +2191261696,2191392767,US +2191392768,2191458303,JP +2191458304,2191523839,GB +2191523840,2191589375,US +2191589376,2191654911,NL +2191654912,2192769023,US +2192769024,2192834559,CA +2192900096,2193031167,US +2193031168,2193096703,DE +2193096704,2193162239,US +2193227776,2193293311,IT +2193293312,2193358847,US +2193358848,2193424383,FI +2193424384,2193489919,US +2193489920,2193555455,FR +2193555456,2193620991,US +2193620992,2193686527,IT +2193752064,2193817599,AU +2193817600,2193883135,NZ +2193883136,2194014207,US +2194014208,2194079743,CH +2194079744,2194407423,US +2194472960,2194538495,US +2194538496,2194604031,ES +2194604032,2194669567,US +2194669568,2194735103,IS +2194735104,2194800639,GB +2194800640,2195193855,US +2195193856,2195324927,NZ +2195324928,2195455999,US +2195456000,2195521535,AU +2195521536,2195652607,US +2195652608,2195718143,CH +2195718144,2195783679,US +2195783680,2196045823,DK +2196045824,2196111359,SE +2196111360,2196439039,FI +2196439040,2197094399,SE +2197094400,2197159935,US +2197159936,2197225471,GB +2197225472,2197422079,US +2197422080,2197487615,CA +2197487616,2197553151,IT +2197553152,2197749759,US +2197880832,2197946367,IT +2197946368,2202533887,US +2202599424,2204172287,US +2204172288,2204237823,SE +2204237824,2204303359,US +2204303360,2204368895,DE +2204434432,2204499967,US +2204499968,2204565503,CH +2204565504,2204631039,US +2204631040,2204696575,CA +2204696576,2204893183,US +2204958720,2205089791,US +2205089792,2205155327,GB +2205155328,2205286399,JP +2205286400,2205351935,IT +2205351936,2205483007,SE +2205483008,2205516031,CH +2205548544,2206269439,US +2206269440,2206334975,CA +2206334976,2206400511,AT +2206400512,2206466047,US +2206466048,2207121407,CA +2207121408,2207449087,US +2207449088,2207711231,CA +2207711232,2207776767,US +2207776768,2207842303,CH +2207842304,2207907839,US +2207907840,2207973375,IT +2207973376,2208038911,NL +2208038912,2208235519,US +2208235520,2208301055,DE +2208301056,2208366591,FI +2208432128,2208563199,CA +2208563200,2208759807,DK +2208759808,2208890879,US +2208890880,2208956415,DE +2208956416,2209021951,AU +2209021952,2209087487,US +2209087488,2209153023,AU +2209153024,2209218559,DE +2209218560,2209284095,NL +2209284096,2209349631,IT +2209415168,2209480703,FI +2209480704,2209546239,MX +2209546240,2209611775,US +2209611776,2209677311,NL +2209677312,2209742847,AU +2209742848,2209939455,US +2209939456,2210004991,AU +2210004992,2210136063,US +2210136064,2210201599,DE +2210201600,2210594815,US +2210594816,2210660351,CA +2210660352,2210725887,FR +2210725888,2211053567,US +2211053568,2211119103,CA +2211119104,2211184639,NZ +2211184640,2211250175,US +2211250176,2211315711,SE +2211315712,2211381247,JP +2211381248,2211446783,FI +2211446784,2211643391,US +2211643392,2211708927,NL +2211708928,2211774463,US +2211774464,2211839999,CA +2211840000,2212036607,US +2212036608,2212102143,AU +2212102144,2212233215,US +2212233216,2212298751,DE +2212364288,2212495359,US +2212495360,2212560895,NL +2212560896,2212691967,US +2212691968,2212757503,GB +2212757504,2212823039,FI +2212823040,2212954111,US +2212954112,2213019647,GB +2213019648,2213085183,CA +2213085184,2213150719,US +2213150720,2213216255,DE +2213216256,2213281791,CA +2213281792,2213347327,AU +2213347328,2213412863,NL +2213412864,2213675007,US +2213675008,2213740543,AU +2213740544,2213806079,US +2213806080,2213937151,AU +2213937152,2214002687,DE +2214002688,2214068223,US +2214068224,2214133759,JP +2214133760,2214264831,US +2214264832,2214330367,GB +2214330368,2214395903,US +2214395904,2214461439,CA +2214461440,2214526975,FR +2214592512,2218786815,US +2218786816,2219769855,IL +2219769856,2224160767,US +2224160768,2224226303,GB +2224226304,2224357375,US +2224357376,2224422911,FR +2224422912,2224488447,NO +2224488448,2224619519,US +2224619520,2224685055,GB +2224685056,2224750591,US +2224750592,2224816127,FI +2224816128,2224881663,CA +2224947200,2225405951,US +2225405952,2225733631,FR +2225733632,2225799167,US +2225799168,2225864703,FI +2225864704,2226126847,US +2226126848,2226192383,DE +2226192384,2226323455,US +2226323456,2226388991,JP +2226388992,2226454527,DE +2226454528,2226520063,NZ +2226520064,2226585599,JP +2226585600,2226651135,US +2226716672,2226782207,GB +2226782208,2226847743,AE +2226847744,2226913279,DE +2226913280,2227109887,US +2227175424,2227372031,US +2227372032,2227437567,DE +2227437568,2227503103,SE +2227503104,2227634175,US +2227634176,2227699711,DE +2227699712,2227830783,US +2227830784,2229141503,CA +2229141504,2229207039,JP +2229207040,2229338111,US +2229338112,2229403647,CA +2229403648,2229469183,US +2229469184,2229534719,FR +2229534720,2229600255,US +2229600256,2229665791,NL +2229665792,2229796863,DE +2229796864,2229862399,GB +2229862400,2229927935,US +2229927936,2229993471,AU +2229993472,2230583295,US +2230583296,2230648831,GB +2230648832,2230714367,US +2230714368,2230779903,CA +2230779904,2230910975,MX +2230910976,2231042047,US +2231107584,2231173119,DE +2231173120,2231238655,US +2231238656,2231304191,MX +2231369728,2248146943,JP +2248212480,2248343551,DE +2248409088,2248605695,US +2248605696,2248671231,AU +2248671232,2249261055,US +2249326592,2249392127,AU +2249457664,2249523199,US +2249523200,2249588735,CH +2249588736,2249654271,CA +2249654272,2249785343,US +2249785344,2249850879,SE +2249850880,2249916415,US +2249916416,2249981951,NL +2249981952,2250047487,DE +2250047488,2250113023,US +2250113024,2250178559,DE +2250178560,2250244095,CA +2250244096,2250375167,US +2250375168,2250440703,DE +2250440704,2250506239,US +2250506240,2250571775,GB +2250571776,2250637311,FI +2250637312,2251227135,US +2251227136,2251292671,NO +2251292672,2251685887,US +2251685888,2251751423,BE +2251751424,2251948031,US +2251948032,2252013567,BE +2252013568,2252079103,FR +2252079104,2252210175,DE +2252210176,2253062143,US +2253062144,2253127679,KR +2253127680,2253193215,DE +2253193216,2253455359,US +2253455360,2253520895,DE +2253520896,2253586431,US +2253586432,2253651967,GB +2253651968,2253848575,US +2253848576,2253914111,CA +2253914112,2254045183,US +2254110720,2255421439,DE +2255421440,2255683583,US +2255683584,2255749119,AU +2255749120,2255814655,US +2255814656,2255880191,CA +2255880192,2255945727,US +2255945728,2256011263,NO +2256011264,2256666623,US +2256666624,2256732159,DE +2256732160,2257190911,US +2257190912,2257256447,SE +2257256448,2257453055,US +2257453056,2257518591,GB +2257518592,2257584127,NL +2257584128,2257649663,AU +2257649664,2257780735,NL +2257780736,2257846271,DE +2257846272,2257911807,AU +2257911808,2257977343,US +2257977344,2258042879,CA +2258042880,2258108415,GB +2258108416,2258173951,US +2258173952,2258239487,CA +2258239488,2258305023,US +2258305024,2258370559,DE +2258370560,2258436095,US +2258436096,2258567167,FR +2258567168,2258567679,US +2258567680,2258567935,HK +2258567936,2258568191,US +2258568192,2258568447,HK +2258568448,2258583551,US +2258583552,2258591743,GB +2258591744,2258591839,AU +2258591840,2258591847,TW +2258591848,2258591855,JP +2258591856,2258591935,TW +2258591936,2258591967,HK +2258591968,2258592255,AU +2258592256,2258592383,JP +2258592384,2258592439,AU +2258592440,2258592447,JP +2258592448,2258592479,IN +2258592480,2258592495,AU +2258592496,2258592511,JP +2258592512,2258593023,AU +2258593024,2258593151,SG +2258593152,2258594303,AU +2258594304,2258594559,BD +2258594560,2258594591,HK +2258594592,2258594607,AU +2258594608,2258594615,HK +2258594616,2258594623,AU +2258594624,2258594639,HK +2258594640,2258594655,AU +2258594656,2258594687,HK +2258594688,2258594751,AU +2258594752,2258594815,HK +2258594816,2258594831,AU +2258594832,2258594839,JP +2258594840,2258594847,AU +2258594848,2258594879,JP +2258594880,2258594959,AU +2258594960,2258594967,JP +2258594968,2258594975,AU +2258594976,2258594991,JP +2258594992,2258595007,AU +2258595008,2258595023,TW +2258595024,2258595031,JP +2258595032,2258595135,AU +2258595136,2258595151,SG +2258595152,2258595167,JP +2258595168,2258595231,AU +2258595232,2258595263,TW +2258595264,2258595295,AU +2258595296,2258595327,SG +2258595328,2258595335,KR +2258595336,2258595343,TW +2258595344,2258595351,AU +2258595352,2258595359,JP +2258595360,2258595383,AU +2258595384,2258595391,KR +2258595392,2258595463,AU +2258595464,2258595471,TW +2258595472,2258595495,AU +2258595496,2258595503,HK +2258595504,2258595551,AU +2258595552,2258595567,JP +2258595568,2258595583,AU +2258595584,2258595591,TW +2258595592,2258595603,AU +2258595604,2258595607,JP +2258595608,2258595639,AU +2258595640,2258595643,JP +2258595644,2258595655,AU +2258595656,2258595663,IN +2258595664,2258595711,AU +2258595712,2258595775,HK +2258595776,2258595839,SG +2258595840,2258596079,AU +2258596080,2258596087,JP +2258596088,2258596863,AU +2258596864,2258596903,HK +2258596904,2258597071,AU +2258597072,2258597087,TW +2258597088,2258597372,AU +2258597373,2258597375,HK +2258597376,2258597895,AU +2258597896,2258597903,NZ +2258597904,2258597927,AU +2258597928,2258597935,JP +2258597936,2258597951,AU +2258597952,2258597983,NZ +2258597984,2258597999,JP +2258598000,2258598079,AU +2258598080,2258598111,TW +2258598112,2258598143,AU +2258598144,2258598239,KR +2258598240,2258598255,AU +2258598256,2258598287,KR +2258598288,2258598319,NZ +2258598320,2258598335,JP +2258598336,2258598351,TW +2258598352,2258598519,AU +2258598520,2258598527,NZ +2258598528,2258598535,JP +2258598536,2258598543,AU +2258598544,2258598567,JP +2258598568,2258598591,AU +2258598592,2258598623,TW +2258598624,2258598639,AU +2258598640,2258598647,JP +2258598648,2258600799,AU +2258600800,2258600831,KR +2258600832,2258600959,AU +2258600960,2258601087,SG +2258601088,2258601199,AU +2258601200,2258601207,JP +2258601208,2258601471,AU +2258601472,2258601983,JP +2258601984,2258602319,AU +2258602320,2258602455,HK +2258602456,2258602495,AU +2258602496,2258602751,VN +2258602752,2258603263,AU +2258603264,2258603279,IN +2258603280,2258603679,AU +2258603680,2258603711,IN +2258603712,2258603743,AU +2258603744,2258603751,TW +2258603752,2258603839,AU +2258603840,2258603903,HK +2258603904,2258604543,AU +2258604544,2258604575,IN +2258604576,2258604591,SG +2258604592,2258604607,IN +2258604608,2258604671,AU +2258604672,2258604735,SG +2258604736,2258605567,AU +2258605568,2258605631,SG +2258605632,2258605967,AU +2258605968,2258605991,NZ +2258605992,2258606207,AU +2258606208,2258606335,HK +2258606336,2258606463,AU +2258606464,2258606471,JP +2258606472,2258606591,AU +2258606592,2258606607,JP +2258606608,2258606687,AU +2258606688,2258606703,JP +2258606704,2258607343,AU +2258607344,2258607351,SG +2258607352,2258609487,AU +2258609488,2258609503,IN +2258609504,2258609511,AU +2258609512,2258609527,IN +2258609528,2258610303,AU +2258610304,2258610431,IN +2258610432,2258614783,AU +2258614784,2258614799,TW +2258614800,2258616319,AU +2258616320,2258632703,HK +2258632704,2258698239,JP +2258698240,2259222527,US +2259222528,2259288063,DE +2259288064,2259353599,US +2259353600,2259419135,DE +2259419136,2259681279,US +2259681280,2259746815,DE +2259746816,2259812351,US +2259812352,2259877887,AU +2259877888,2259943423,US +2259943424,2260008959,JP +2260008960,2260140031,US +2260140032,2260205567,GB +2260205568,2260271103,BE +2260271104,2260467711,US +2260467712,2260533247,NL +2260533248,2260598783,US +2260598784,2260664319,CA +2260664320,2260729855,GB +2260729856,2260991999,US +2260992000,2261057535,CN +2261057536,2261188607,US +2261188608,2261254143,CA +2261254144,2261385215,US +2261385216,2261450751,PR +2261450752,2261516287,NL +2261516288,2261647359,US +2261647360,2261712895,FR +2261712896,2261778431,US +2261778432,2261843967,TW +2261843968,2261975039,US +2261975040,2262040575,AU +2262040576,2262106111,FR +2262106112,2262171647,IE +2262171648,2262237183,FR +2262237184,2262499327,US +2262499328,2262630399,GB +2262630400,2262761471,NL +2262761472,2262892543,US +2262892544,2262958079,GB +2262958080,2263023615,IE +2263023616,2263089151,FR +2263089152,2263678975,US +2263678976,2263744511,JP +2263744512,2263810047,US +2263810048,2263875583,GB +2263875584,2264203263,US +2264203264,2264268799,DE +2264268800,2264334335,FR +2264334336,2264399871,DE +2264399872,2264465407,US +2264530944,2264858623,US +2264989696,2265710591,US +2265710592,2265776127,CA +2265776128,2266169343,US +2266234880,2276786175,US +2276786176,2276851711,CA +2276851712,2277769215,US +2277769216,2277772543,GB +2277772544,2277772799,DE +2277772800,2277834751,GB +2277834752,2281701375,US +2281766912,2291204095,US +2291204096,2291269631,PR +2291269632,2291400703,CA +2291400704,2291466239,GB +2291466240,2291728383,US +2291728384,2291859455,AU +2291859456,2291924991,SE +2291924992,2291990527,GB +2291990528,2292056063,US +2292056064,2292121599,NO +2292121600,2292187135,CA +2292187136,2292383743,US +2292383744,2292449279,SE +2292449280,2292514815,NO +2292514816,2292776959,US +2292842496,2292908031,GB +2292908032,2292973567,US +2292973568,2293039103,DE +2293039104,2293104639,LU +2293104640,2293891071,US +2293891072,2293956607,AU +2293956608,2294022143,JP +2294022144,2294677503,US +2294677504,2294743039,JP +2294743040,2294808575,DE +2294808576,2294874111,US +2294874112,2294939647,IE +2294939648,2295201791,US +2295201792,2295267327,IE +2295267328,2296446975,US +2296446976,2296512511,SE +2296512512,2296774655,US +2296774656,2296840191,DE +2296840192,2296905727,NL +2296905728,2297626623,US +2297626624,2297692159,DE +2297692160,2298413055,US +2298544128,2299461631,US +2299461632,2299527167,CA +2299527168,2299592703,US +2299592704,2299658239,NL +2299658240,2300641279,US +2300641280,2300706815,FI +2300706816,2300772351,CH +2300772352,2301296639,US +2301296640,2301362175,IE +2301362176,2301427711,GB +2301427712,2301558783,US +2301558784,2301624319,NO +2301624320,2301755391,US +2301755392,2301820927,GB +2301820928,2302083071,US +2302083072,2302214143,NL +2302214144,2302279679,US +2302279680,2302541823,SE +2302541824,2302607359,CH +2302738432,2302935039,US +2302935040,2303000575,KR +2303000576,2303262719,US +2303262720,2303328255,GB +2303328256,2303393791,CA +2303393792,2303459327,US +2303459328,2303524863,AU +2303524864,2303852543,US +2303852544,2303918079,CA +2303918080,2304507903,US +2304507904,2304573439,AU +2304573440,2304638975,NO +2304638976,2304704511,CA +2304704512,2304770047,US +2304770048,2304835583,SE +2304835584,2305097727,US +2305097728,2305163263,GB +2305163264,2305359871,US +2305359872,2305425407,GB +2305425408,2305556479,US +2305556480,2305622015,GB +2305622016,2305687551,AU +2305687552,2305753087,US +2305753088,2305818623,AU +2305818624,2306015231,US +2306080768,2306146303,US +2306146304,2306211839,CA +2306211840,2306342911,US +2306342912,2306408447,NL +2306408448,2306473983,FR +2306473984,2306539519,CA +2306539520,2306932735,US +2306932736,2306998271,FR +2306998272,2307129343,US +2307129344,2307194879,SG +2307194880,2307260415,NO +2307260416,2307522559,US +2307522560,2307588095,CH +2307588096,2308112383,US +2308112384,2308177919,AU +2308177920,2308243455,US +2308243456,2308308991,CA +2308308992,2308505599,US +2308505600,2308571135,JP +2308571136,2308636671,AU +2308636672,2308702207,US +2308702208,2308767743,CH +2308767744,2308833279,AU +2308898816,2309160959,US +2309160960,2309226495,FI +2309226496,2309357567,US +2309357568,2309423103,AU +2309423104,2309685247,US +2309750784,2309816319,AU +2309816320,2309881855,US +2309881856,2309947391,NL +2309947392,2310668287,US +2310668288,2310733823,CA +2310733824,2310864895,US +2310864896,2310930431,HK +2310930432,2310995967,US +2310995968,2311061503,IE +2311061504,2311127039,US +2311127040,2311192575,DE +2311192576,2311258111,FR +2311258112,2311323647,GB +2311389184,2311847935,US +2311847936,2311913471,IT +2311913472,2311979007,GB +2311979008,2312044543,US +2312044544,2312110079,CA +2312110080,2312175615,AT +2312175616,2312437759,US +2312437760,2312503295,GB +2312634368,2312699903,US +2312699904,2312765439,NO +2312765440,2312830975,GB +2312830976,2312896511,AU +2312896512,2312962047,US +2312962048,2313158655,GB +2313158656,2313224191,NL +2313224192,2313289727,US +2313289728,2313355263,DE +2313355264,2314731519,US +2314731520,2314797055,DE +2314797056,2314862591,US +2314862592,2314993663,DE +2314993664,2315059199,US +2315059200,2315124735,GB +2315124736,2315190271,US +2315321344,2315452415,US +2315452416,2315517951,GB +2315517952,2315583487,ES +2315583488,2315649023,US +2315649024,2315714559,SE +2315714560,2315780095,AU +2315780096,2315911167,US +2315911168,2316042239,CA +2316042240,2316173311,US +2316173312,2316238847,SE +2316238848,2316500991,US +2316500992,2316566527,AU +2316566528,2316632063,US +2316632064,2316697599,FR +2316697600,2316763135,AT +2316763136,2316828671,US +2316828672,2316959743,AU +2316959744,2317221887,US +2317221888,2317287423,JP +2317287424,2317484031,US +2317484032,2317549567,CA +2317549568,2317615103,US +2317680640,2317811711,GB +2317811712,2317877247,US +2317877248,2317942783,GB +2317942784,2318008319,IT +2318008320,2318139391,US +2318139392,2318204927,AU +2318204928,2318401535,US +2318401536,2318467071,BE +2318467072,2318598143,US +2318598144,2318663679,CA +2318663680,2319122431,US +2319187968,2319253503,US +2319253504,2319319039,DE +2319319040,2319384575,NO +2319384576,2319450111,FR +2319450112,2319581183,US +2319581184,2319646719,IT +2319646720,2319843327,US +2319843328,2319908863,IT +2319908864,2319974399,AU +2319974400,2320039935,US +2320039936,2320105471,CA +2320105472,2320171007,US +2320171008,2320236543,NZ +2320236544,2320302079,US +2320302080,2320367615,AU +2320367616,2320433151,US +2320433152,2320564223,AU +2320564224,2320629759,CH +2320629760,2320695295,CA +2320695296,2321416191,US +2321481728,2321547263,US +2321547264,2321612799,FR +2321678336,2321743871,US +2321809408,2321874943,ES +2321874944,2321940479,JP +2321940480,2322006015,FR +2322006016,2322071551,SE +2322071552,2322137087,GB +2322137088,2322202623,US +2322202624,2322268159,SE +2322268160,2322333695,JP +2322333696,2322923519,US +2323054592,2323185663,CA +2323316736,2323382271,US +2323382272,2323447807,NO +2323447808,2323644415,US +2323677184,2323677695,US +2323709952,2323775487,US +2323775488,2323841023,AU +2323841024,2323906559,CH +2323906560,2323972095,IT +2323972096,2324037631,US +2324037632,2324103167,IL +2324103168,2327379967,US +2327511040,2327838719,CH +2327838720,2327969791,US +2327969792,2328035327,AU +2328035328,2328100863,FR +2328100864,2328231935,US +2328231936,2328297471,GB +2328313856,2328317951,NL +2328342528,2328342783,DE +2328362752,2328494079,DE +2328494080,2328559615,US +2328559616,2328625151,BE +2328690688,2328756223,BE +2328756224,2328821759,CH +2328821760,2329083903,US +2329083904,2329149439,NZ +2329149440,2329280511,JP +2329280512,2329346047,CA +2329346048,2329411583,SE +2329411584,2329477119,FI +2329477120,2329542655,AU +2329542656,2329608191,CA +2329673728,2329739263,US +2329739264,2329804799,SE +2329804800,2329870335,DE +2329870336,2330132479,CH +2330132480,2330198015,SE +2330198016,2330263551,CH +2330263552,2330394623,US +2330394624,2330460159,FR +2330460160,2330525695,AT +2330525696,2330591231,SE +2330591232,2330656767,US +2330656768,2330722303,NZ +2330722304,2331181055,US +2331181056,2331246591,JP +2331246592,2331443199,DE +2331443200,2331508735,US +2331508736,2331574271,GB +2331574272,2331639807,FI +2331639808,2331770879,GB +2331770880,2331836415,AU +2331836416,2331901951,GB +2331901952,2331967487,US +2332098560,2332622847,DE +2332688384,2332753919,BE +2332753920,2334064639,DE +2334064640,2334916607,US +2334916608,2334982143,AU +2334982144,2335178751,US +2335178752,2335244287,CA +2335244288,2335309823,US +2335309824,2335375359,DE +2335375360,2335506431,US +2335571968,2335637503,FR +2335637504,2335768575,US +2335768576,2335834111,CA +2335834112,2335899647,SE +2335899648,2335965183,AU +2335965184,2336161791,US +2336161792,2336227327,NL +2336227328,2336358399,US +2336358400,2336423935,FI +2336423936,2336882687,US +2336882688,2336948223,FI +2336948224,2337013759,DE +2337013760,2337210367,US +2337210368,2337275903,CH +2337275904,2337341439,NZ +2337341440,2337406975,US +2337406976,2337472511,BR +2337472512,2337538047,PT +2337538048,2337669119,US +2337669120,2337734655,AU +2337734656,2337865727,US +2337865728,2337931263,DE +2337931264,2337996799,BE +2337996800,2338062335,GR +2338075392,2338075647,IL +2338084864,2338085375,IL +2338085632,2338086143,IL +2338087424,2338087679,IL +2338108928,2338109951,IL +2338115072,2338115839,IL +2338126592,2338127615,IL +2338127872,2338324479,US +2338324480,2338390015,SE +2338390016,2338455551,FI +2338455552,2338521087,NO +2338521088,2338586623,US +2338586624,2338652159,FR +2338717696,2338783231,US +2338783232,2338848767,CA +2338848768,2338914303,US +2338914304,2339962879,NO +2339962880,2340028415,US +2340028416,2340093951,NL +2340093952,2340159487,FI +2340159488,2340225023,FR +2340225024,2340421631,US +2340421632,2340487167,IT +2340552704,2340618239,AU +2340618240,2340683775,US +2340683776,2340749311,AU +2340749312,2340814847,GB +2340814848,2340880383,AU +2340880384,2341273599,US +2341273600,2341339135,KW +2341339136,2341404671,CA +2341404672,2341470207,GB +2341470208,2341535743,US +2341535744,2341601279,NO +2341601280,2341732351,US +2341797888,2341863423,GB +2341928960,2341994495,US +2341994496,2342060031,JP +2342060032,2342125567,GB +2342125568,2342191103,JP +2342256640,2342322175,NL +2342322176,2342387711,FI +2342387712,2342453247,FR +2342518784,2342584319,FR +2342584320,2342649855,US +2342649856,2342715391,NL +2342715392,2342780927,AU +2342780928,2342846463,NO +2342846464,2342911999,BE +2342912000,2342977535,GB +2342977536,2343043071,US +2343043072,2343108607,AU +2343108608,2343174143,US +2343239680,2343370751,US +2343370752,2343436287,CA +2343436288,2343501823,DE +2343501824,2343567359,TW +2343632896,2343698431,US +2343698432,2343763967,NL +2343763968,2343829503,TR +2343829504,2344026111,US +2344091648,2344157183,GB +2344157184,2344222719,US +2344288256,2344353791,US +2344353792,2344419327,AU +2346582016,2346647551,GB +2346647552,2346713087,TW +2346778624,2346844159,US +2347040768,2347106303,US +2347106304,2347171839,AU +2347171840,2348744703,US +2348875776,2353725439,US +2353790976,2353856511,US +2353856512,2353922047,FR +2353922048,2353987583,AT +2353987584,2354053119,AU +2354053120,2354118655,CA +2354118656,2354184191,JP +2354184192,2354249727,US +2354249728,2354315263,AU +2354315264,2354380799,DE +2354380800,2354446335,NL +2354446336,2354511871,FR +2354511872,2354577407,CA +2354577408,2354839551,US +2354839552,2354905087,TW +2354905088,2355036159,FR +2355036160,2355101695,US +2355101696,2355167231,TW +2355167232,2355232767,GB +2355232768,2355305583,US +2355305584,2355305591,DK +2355305592,2355691519,US +2355691520,2355757055,IT +2355757056,2355953663,US +2355953664,2357919743,TW +2357919744,2358181887,US +2358247424,2358509567,US +2358509568,2358575103,MX +2358640640,2358706175,SE +2358706176,2358771711,FI +2358771712,2359230463,US +2359230464,2359295999,AU +2359296000,2359361535,US +2359361536,2359427071,CA +2359427072,2359558143,US +2359558144,2359623679,IT +2359623680,2359689215,US +2359689216,2359754751,SE +2359754752,2359820287,CA +2359820288,2359885823,AU +2359885824,2360672255,US +2360672256,2360737791,DE +2360737792,2360868863,US +2360868864,2360934399,CA +2360934400,2361327615,US +2361327616,2361393151,AR +2361393152,2361458687,US +2361458688,2361524223,CA +2361524224,2361917439,US +2361917440,2361982975,NZ +2361982976,2362114047,US +2362114048,2362179583,IE +2362179584,2362245119,US +2362441728,2362572799,US +2362638336,2362769407,US +2362834944,2363490303,US +2363555840,2363883519,US +2363883520,2363949055,CA +2363949056,2364342271,US +2364407808,2364538879,US +2364604416,2364735487,US +2364801024,2364932095,US +2364997632,2365128703,US +2365259776,2365390847,US +2365390848,2365456383,AU +2365456384,2365521919,US +2365652992,2367487999,DE +2367488000,2367553535,BA +2367553536,2370895871,DE +2370895872,2370961407,SE +2370961408,2371158015,DE +2371158016,2371223551,RO +2371223552,2371289087,US +2371289088,2371616767,DE +2371616768,2371682303,GB +2371682304,2371747839,NL +2371747840,2371878911,GB +2371878912,2371944447,BE +2371944448,2372009983,GB +2372009984,2372075519,CH +2372075520,2372206591,DE +2372272128,2372337663,US +2372337664,2372403199,ID +2372403200,2372468735,US +2372534272,2372665343,US +2372665344,2372730879,IT +2372730880,2372796415,CA +2372796416,2372993023,US +2372993024,2373058559,DE +2373058560,2373124095,US +2373124096,2373189631,FR +2373189632,2373255167,US +2373255168,2373451775,CA +2373451776,2373517311,AU +2373517312,2374107135,US +2374107136,2374172671,DE +2374172672,2374238207,US +2374238208,2374303743,AU +2374303744,2374369279,US +2374565888,2374631423,SE +2374696960,2374959103,US +2374959104,2375024639,BE +2375024640,2375090175,DK +2375090176,2375155711,NO +2375155712,2375221247,FI +2375221248,2375286783,SE +2375286784,2375352319,CH +2375352320,2376269823,US +2376269824,2376335359,GB +2376335360,2376597503,US +2376597504,2376663039,AU +2376663040,2376728575,DE +2376794112,2376859647,CH +2376859648,2376925183,FI +2376925184,2377056255,US +2377056256,2377121791,FR +2377121792,2377187327,NL +2377187328,2377252863,US +2377252864,2377318399,JP +2377318400,2378170367,US +2378170368,2378235903,FI +2378235904,2378301439,US +2378301440,2378366975,FR +2378366976,2378432511,US +2378498048,2378694655,US +2378694656,2378760191,DE +2378760192,2378825727,AT +2378825728,2378891263,US +2378891264,2378956799,AT +2378956800,2379218943,US +2379218944,2379284479,FI +2379284480,2380201983,US +2380201984,2380267519,KR +2380267520,2380398591,US +2380398592,2380464127,IL +2380464128,2380529663,FR +2380529664,2380595199,GB +2380595200,2380660735,JP +2380660736,2380726271,US +2380726272,2380791807,GB +2380791808,2381119487,US +2381185024,2381381631,US +2381381632,2381447167,GB +2381447168,2381512703,US +2381512704,2381578239,AU +2381578240,2381643775,AT +2381643776,2381709311,GB +2381709312,2381905919,US +2381905920,2381971455,CH +2381971456,2382036991,IT +2382036992,2382102527,US +2382102528,2382168063,NL +2382168064,2382233599,BE +2382233600,2382299135,US +2382430208,2383085567,CA +2383151104,2386624511,CA +2386624512,2386690047,US +2386690048,2387410943,CA +2387410944,2387476479,US +2387476480,2387542015,CA +2387542016,2387607551,US +2387607552,2388328447,CA +2388393984,2389245951,CA +2389311488,2389639167,CA +2389704704,2390818815,CA +2390884352,2391277567,CA +2391343104,2394947583,CA +2394947584,2395013119,US +2395013120,2395209727,CA +2395340800,2397700095,CA +2397765632,2398748671,CA +2398945280,2399010815,CA +2399207424,2401828863,US +2401828864,2401894399,GB +2401894400,2402222079,US +2402222080,2402287615,IE +2402287616,2402418687,US +2402418688,2402484223,AT +2402484224,2402549759,FI +2402549760,2402680831,GB +2402680832,2402746367,BR +2402746368,2403401727,US +2403401728,2403467263,GB +2403467264,2404974591,US +2404974592,2405040127,HK +2405040128,2405105663,JP +2405105664,2405171199,US +2405171200,2405236735,AU +2405236736,2405302271,DE +2405302272,2405367807,JP +2405367808,2405433343,US +2405433344,2405498879,NZ +2405498880,2405564415,NO +2405564416,2405629951,US +2405629952,2405695487,CH +2405695488,2406088703,US +2406088704,2406285311,BR +2406285312,2406809599,US +2406809600,2406875135,GB +2406875136,2406940671,SE +2406940672,2407006207,AU +2407006208,2407071743,US +2407071744,2407137279,NL +2407137280,2407333887,US +2407333888,2407399423,JP +2407399424,2407464959,FR +2407464960,2407530495,US +2407596032,2407661567,BE +2407661568,2407727103,AT +2407727104,2408054783,US +2408054784,2408120319,JP +2408185856,2409627647,US +2409693184,2409758719,AT +2409758720,2409824255,US +2409824256,2409955327,DE +2409955328,2410086399,US +2410086400,2410151935,GB +2410151936,2410217471,US +2410217472,2410283007,BE +2410283008,2410348543,US +2410348544,2410414079,JP +2410414080,2410545151,US +2410545152,2410610687,AU +2410610688,2410676223,US +2410676224,2410938367,NL +2410938368,2411003903,CH +2411003904,2411462655,US +2411462656,2411593727,AU +2411593728,2411986943,US +2411986944,2412052479,FR +2412052480,2412314623,US +2412314624,2412380159,JP +2412445696,2412576767,US +2412576768,2412642303,AT +2412642304,2412773375,US +2412838912,2412904447,US +2412904448,2412969983,GB +2412969984,2413297663,US +2413297664,2413363199,AU +2413363200,2413428735,SE +2413428736,2413494271,AU +2413494272,2413625343,US +2413625344,2413690879,JP +2413690880,2413821951,US +2413821952,2413887487,AT +2413887488,2413953023,IT +2413953024,2414411775,US +2414411776,2414477311,GR +2414477312,2414542847,GB +2414542848,2414673919,US +2414673920,2414739455,SE +2414739456,2414804991,AU +2414804992,2414870527,IE +2414870528,2415198207,US +2415198208,2415263743,AT +2415263744,2415394815,US +2415394816,2415460351,KR +2415460352,2415656959,US +2415656960,2415722495,GB +2415722496,2415788031,JP +2415788032,2415853567,US +2415984640,2416050175,JP +2416050176,2416115711,NL +2416115712,2416181247,US +2416181248,2416246783,FI +2416246784,2416312319,US +2416312320,2416377855,AU +2416443392,2416705535,US +2416771072,2416967679,US +2416967680,2417033215,IN +2417033216,2417229823,US +2417229824,2417295359,ES +2417295360,2417360895,PT +2417360896,2417426431,MX +2417426432,2417491967,BR +2417491968,2417557503,GR +2417557504,2417688575,US +2417688576,2417754111,SE +2417754112,2418016255,US +2418016256,2418081791,GB +2418081792,2418606079,US +2418606080,2418671615,DE +2418671616,2418737151,US +2418737152,2418802687,NL +2418868224,2419326975,US +2419392512,2419458047,AU +2419458048,2419523583,NL +2419523584,2419589119,AU +2419589120,2419654655,FR +2419654656,2419720191,SE +2419720192,2420047871,US +2420047872,2420113407,SE +2420113408,2420178943,PT +2420178944,2420244479,AT +2420244480,2420310015,NZ +2420310016,2420899839,US +2420899840,2420965375,DE +2420965376,2421096447,US +2421096448,2421161983,AU +2421161984,2421293055,US +2421293056,2421358591,GB +2421358592,2421424127,US +2421424128,2421489663,NO +2421489664,2421555199,CH +2421555200,2421620735,US +2421620736,2421686271,GB +2421686272,2422145023,US +2422145024,2422154239,NL +2422154240,2422155263,US +2422155264,2422210559,NL +2422210560,2422276095,US +2422276096,2422341631,AU +2422341632,2422407167,GB +2422407168,2423128063,US +2423128064,2423193599,AU +2423193600,2423717887,US +2423717888,2423783423,NL +2423783424,2423848959,FJ +2423848960,2423914495,US +2423914496,2423980031,TR +2424045568,2424111103,GB +2424111104,2424242175,US +2424242176,2424307711,NO +2424307712,2424438783,US +2424438784,2425159679,AU +2425159680,2425421823,US +2425421824,2425487359,DE +2425487360,2426667007,US +2426667008,2426732543,NO +2426732544,2426798079,FR +2426798080,2426929151,US +2426929152,2426994687,GB +2426994688,2427256831,US +2427256832,2427322367,GB +2427322368,2427453439,US +2427453440,2427584511,NO +2427584512,2427650047,GB +2427650048,2427846655,NO +2427846656,2428567551,US +2428567552,2428633087,NO +2428633088,2428698623,CA +2428698624,2428960767,US +2428960768,2429026303,MY +2429026304,2429091839,CH +2429091840,2429288447,US +2429288448,2429353983,FR +2429353984,2429419519,AU +2429419520,2429485055,RU +2429485056,2429616127,US +2429616128,2429681663,NL +2429681664,2429878271,US +2429878272,2429943807,JP +2429943808,2430009343,HK +2430009344,2430205951,US +2430205952,2430271487,AU +2430271488,2432172031,US +2432172032,2432237567,BE +2432237568,2432630783,US +2432696320,2433810431,NL +2433810432,2433875967,GB +2433875968,2436300799,NL +2436300800,2436366335,GB +2436366336,2436759551,NL +2436759552,2436825087,GB +2436825088,2447376383,NL +2447376384,2447441919,GB +2447441920,2447507455,DE +2447507456,2447572991,FR +2447572992,2447638527,GB +2447638528,2447679819,DE +2447679820,2447679839,IT +2447679840,2447704063,DE +2447704064,2447769599,GB +2447769600,2447835135,DE +2447835136,2447900671,FR +2447900672,2447966207,CH +2447966208,2448031743,GB +2448031744,2448097279,CH +2448097280,2448162815,SE +2448162816,2448228351,HU +2448228352,2448293887,PL +2448293888,2448359423,FR +2448359424,2448424959,GB +2448424960,2448490495,FR +2448490496,2448556031,AT +2448556032,2448621567,FR +2448621568,2448687103,DE +2448687104,2448752639,AT +2448752640,2448818175,CH +2448818176,2448883711,GB +2448883712,2448922367,FI +2448922368,2448927487,NO +2448927488,2448949247,FI +2448949248,2449014783,FR +2449014784,2449080319,RU +2449080320,2449145855,CH +2449145856,2449211391,SE +2449211392,2449276927,CH +2449276928,2449407999,DE +2449539072,2449604607,US +2449604608,2449670143,NO +2449670144,2449735679,LU +2449735680,2449801215,CH +2449801216,2450194431,US +2450194432,2450259967,AU +2450259968,2450718719,US +2450718720,2450784255,FR +2450784256,2450849791,US +2450849792,2450915327,SE +2450915328,2452619263,US +2452619264,2452684799,IT +2452684800,2452750335,US +2452750336,2452815871,NL +2452815872,2452881407,JP +2452946944,2453143551,US +2453143552,2453209087,JP +2453209088,2453340159,US +2453340160,2453405695,NO +2453471232,2453536767,US +2453536768,2453602303,AU +2453602304,2453667839,US +2453733376,2453798911,US +2453864448,2453929983,CH +2453929984,2454061055,US +2454061056,2454126591,GB +2454126592,2454192127,US +2454192128,2454257663,NO +2454257664,2454388735,US +2454388736,2454454271,SE +2454454272,2454519807,US +2454519808,2454585343,GB +2454585344,2454716415,US +2454716416,2454781951,GB +2454781952,2454847487,FI +2454847488,2454851583,US +2454851584,2454851839,DK +2454851840,2454853119,US +2454853120,2454853375,DK +2454853376,2454887423,US +2454887424,2454887679,DK +2454887680,2454913023,US +2454913024,2454978559,CL +2454978560,2455175167,US +2455175168,2455240703,GB +2455240704,2455371775,US +2455437312,2455830527,US +2455830528,2455896063,GB +2455896064,2456027135,US +2456027136,2456092671,IT +2456092672,2456158207,GB +2456158208,2456223743,CZ +2456223744,2456289279,BE +2456289280,2456354815,NL +2456354816,2456420351,GB +2456485888,2456551423,DE +2456551424,2456616959,AT +2456616960,2456682495,CH +2456682496,2456748031,HU +2456748032,2456813567,US +2456813568,2456879103,AT +2456879104,2457075711,US +2457075712,2457141247,AU +2457141248,2457206783,JP +2457206784,2457272319,AU +2457272320,2457337855,FI +2457403392,2457599999,US +2457600000,2457665535,GR +2457665536,2458058751,US +2458058752,2458124287,CA +2458124288,2458189823,US +2458189824,2458255359,IT +2458255360,2458320895,BR +2458320896,2458386431,US +2458386432,2458451967,CH +2458451968,2458648575,US +2458648576,2458714111,DE +2458779648,2458910719,US +2458910720,2458976255,AU +2458976256,2459631615,US +2459631616,2459697151,CL +2459697152,2459828223,US +2459893760,2459959295,CH +2459959296,2460024831,US +2460024832,2460090367,FI +2460090368,2460155903,GB +2460155904,2460221439,US +2460221440,2460286975,BR +2460286976,2460549119,US +2460549120,2460614655,GB +2460614656,2460680191,US +2460680192,2460745727,NZ +2460745728,2460811263,NO +2460811264,2460876799,SE +2460876800,2460942335,US +2460942336,2461007871,BE +2461007872,2461138943,GB +2461138944,2461204479,AU +2461204480,2461270015,GB +2461270016,2461401087,US +2461466624,2461597695,US +2461663232,2461794303,US +2461794304,2461859839,GB +2461859840,2461990911,US +2461990912,2462056447,GB +2462056448,2462121983,NO +2462121984,2462187519,PT +2462187520,2462253055,GB +2462253056,2462384127,AU +2462384128,2463236095,US +2463236096,2463301631,AT +2463301632,2463367167,FI +2463432704,2463498239,NO +2463498240,2463629311,US +2463629312,2463694847,CH +2463694848,2463825919,US +2463825920,2463891455,ES +2463891456,2463911935,LU +2463911936,2463916031,FR +2463916032,2463956991,LU +2463956992,2464022527,AU +2464022528,2464153599,US +2464153600,2464219135,NO +2464219136,2464284671,US +2464284672,2464350207,VI +2464350208,2464415743,GB +2464415744,2464481279,CH +2464481280,2464546815,US +2464743424,2464808959,US +2464808960,2464874495,DE +2464874496,2465660927,US +2465726464,2465791999,CH +2465792000,2465857535,FR +2465857536,2465923071,US +2465988608,2466054143,US +2466054144,2466119679,SE +2466119680,2466185215,DE +2466316288,2466643967,US +2466709504,2466775039,HU +2466775040,2466840575,HK +2466840576,2466906111,US +2466906112,2466971647,AU +2466971648,2467037183,US +2467037184,2467102719,NL +2467102720,2467233791,SE +2467233792,2468020223,US +2468020224,2468085759,GR +2468085760,2468151295,JP +2468151296,2468174847,DK +2468174848,2468175359,NO +2468175360,2468189663,DK +2468189664,2468189695,GB +2468189696,2468216831,DK +2468216832,2468282367,DE +2468282368,2468347903,US +2468347904,2468478975,CZ +2468478976,2468937727,US +2468937728,2469003263,AU +2469003264,2469068799,US +2469068800,2469134335,KR +2469134336,2469199871,SE +2469199872,2469265407,RU +2469265408,2469396479,KR +2469396480,2469658623,US +2469658624,2469724159,GR +2469724160,2469789695,US +2469789696,2469855231,DE +2469855232,2470182911,US +2470182912,2470248447,CH +2470248448,2470510591,US +2470510592,2470576127,BR +2470576128,2470641663,AU +2470641664,2470707199,LU +2470707200,2470772735,GB +2470772736,2470838271,AU +2470838272,2471165951,US +2471165952,2471231487,CH +2471231488,2471297023,AU +2471297024,2471362559,GB +2471428096,2471690239,US +2471690240,2471821311,ES +2471886848,2472083455,CH +2472083456,2472148991,GB +2472148992,2472214527,US +2472214528,2472280063,CS +2472280064,2472345599,US +2472345600,2472411135,BE +2472411136,2472476671,FR +2472476672,2472542207,GR +2472542208,2472607743,ES +2472607744,2472673279,US +2472673280,2472869887,FR +2472869888,2472935423,US +2472935424,2473000959,GR +2473000960,2473394175,US +2473394176,2473459711,AU +2473525248,2473656319,NO +2473656320,2474049535,US +2474049536,2474115071,GB +2474115072,2474246143,US +2474246144,2474377215,IT +2474377216,2474442751,US +2474442752,2474508287,AT +2474508288,2474573823,US +2474573824,2474639359,FR +2474639360,2474901503,US +2474901504,2474967039,AU +2474967040,2475556863,US +2475556864,2475622399,DE +2475622400,2475687935,GB +2475687936,2475884543,US +2475884544,2476277759,GB +2476277760,2476474367,US +2476474368,2476539903,ES +2476539904,2476605439,JP +2476605440,2476670975,NZ +2476670976,2476802047,US +2476802048,2476867583,IL +2476867584,2476998655,IT +2476998656,2477195263,US +2477195264,2477260799,CH +2477260800,2477457407,US +2477457408,2477522943,FR +2477522944,2477588479,DE +2477588480,2477654015,FR +2477654016,2477719551,US +2477719552,2477785087,SK +2477785088,2477850623,JP +2477850624,2478047231,US +2478047232,2478112767,SE +2478112768,2478178303,NL +2478178304,2478309375,US +2478309376,2478374911,GB +2478374912,2478440447,US +2478440448,2478505983,SE +2478505984,2478571519,US +2478571520,2478702591,GB +2478702592,2478899199,US +2478899200,2478964735,GB +2479030272,2479095807,US +2479095808,2479161343,FR +2479161344,2479226879,GB +2479226880,2479357951,US +2479357952,2479423487,AU +2479423488,2479489023,GB +2479489024,2479620095,US +2479620096,2479685631,DE +2479685632,2479947775,US +2479947776,2480013311,AU +2480013312,2480078847,FR +2480078848,2480209919,AU +2480209920,2480275455,SK +2480275456,2480340991,SE +2480340992,2480406527,FR +2480406528,2480668671,US +2480668672,2480734207,SE +2480734208,2481192959,US +2481192960,2481455103,CZ +2481455104,2481520639,SK +2481520640,2481848319,IL +2481848320,2482175999,US +2482176000,2482208767,FI +2482208768,2482216959,US +2482216960,2482225151,FI +2482225152,2482233343,SG +2482233344,2482241535,CN +2482241536,2482634751,US +2482634752,2482700287,FR +2482700288,2482765823,CZ +2482765824,2482831359,IE +2482831360,2482962431,US +2483093504,2483159039,US +2483159040,2483224575,SE +2483224576,2483290111,GB +2483290112,2483421183,US +2483421184,2483486719,HU +2483486720,2486566911,US +2486566912,2486632447,CH +2486632448,2486697983,US +2486697984,2486763519,AT +2486763520,2486960127,US +2486960128,2487025663,FR +2487025664,2488205311,US +2488205312,2488270847,GB +2488270848,2488336383,US +2488336384,2488401919,PL +2488401920,2488532991,NO +2488532992,2488795135,US +2488795136,2488860671,GB +2488860672,2489647103,US +2489843712,2490236927,US +2490236928,2490302463,LU +2490302464,2490695679,US +2490695680,2490761215,CA +2490761216,2491154431,NO +2491154432,2491875327,US +2491875328,2492006399,SE +2492006400,2492071935,US +2492071936,2492137471,SE +2492137472,2492203007,US +2492203008,2492268543,NO +2492268544,2492399615,US +2492399616,2492465151,FR +2492465152,2492530687,US +2492530688,2492596223,AU +2492596224,2492727295,US +2492727296,2492792831,NL +2492792832,2492923903,US +2492923904,2492989439,OM +2492989440,2493513727,US +2493513728,2493579263,SE +2493579264,2493644799,JP +2493644800,2494103551,US +2494103552,2494169087,FR +2494169088,2494562303,US +2494562304,2494627839,GB +2494627840,2494889983,US +2494889984,2494955519,GB +2494955520,2495021055,AU +2495021056,2495152127,US +2495217664,2495283199,US +2495283200,2495348735,CH +2495348736,2495807487,US +2495807488,2495873023,AU +2495873024,2495938559,CH +2495938560,2496004095,GB +2496004096,2496069631,AT +2496069632,2496135167,US +2496135168,2496200703,NL +2496200704,2497682431,MX +2497682432,2497683455,EC +2497683456,2498464415,MX +2498464416,2498464431,US +2498464432,2498475007,MX +2498475008,2498476031,EC +2498476032,2499477503,MX +2499477504,2499543039,DE +2499543040,2499608575,NL +2499608576,2499674111,GB +2499674112,2499739647,US +2499870720,2500001791,US +2500067328,2501574655,US +2501640192,2503016447,US +2503016448,2503081983,IL +2503081984,2503671807,US +2503671808,2503737343,NL +2503737344,2503868415,US +2503933952,2506293247,US +2506293248,2506358783,CA +2506358784,2508062719,US +2508128256,2508455935,US +2508455936,2508521471,IT +2508521472,2508587007,CH +2508587008,2508652543,BE +2508652544,2508718079,AU +2508718080,2508914687,US +2508914688,2508980223,IT +2509045760,2509242367,US +2509242368,2509307903,AU +2509307904,2509373439,US +2509373440,2509438975,NL +2509504512,2509570047,AT +2509570048,2509832191,US +2509832192,2509897727,IE +2509963264,2510028799,GB +2510028800,2510094335,PL +2510094336,2510159871,IE +2510159872,2510749695,US +2510749696,2510815231,AU +2510815232,2510946303,US +2510946304,2511011839,GB +2511011840,2511077375,AU +2511142912,2511339519,US +2511339520,2511405055,AU +2511405056,2512715775,GB +2512715776,2512781311,FI +2512781312,2512912383,US +2512977920,2513502207,DE +2513502208,2513567743,NO +2513633280,2513698815,DE +2513698816,2513764351,DK +2513764352,2514419711,DE +2514419712,2514485247,GB +2514485248,2514514431,DE +2514514432,2514514687,NL +2514514688,2515832831,DE +2515832832,2515833855,FR +2515833856,2516254719,DE +2516254720,2516320255,FR +2516320256,2516451327,US +2516451328,2516516863,GB +2516647936,2523201535,JP +2523201536,2523267071,AU +2523267072,2523529215,US +2523529216,2523594751,NO +2523594752,2523660287,AT +2523660288,2524119039,US +2524315648,2524512255,US +2524643328,2524971007,US +2524971008,2525036543,ES +2525102080,2525233151,US +2525233152,2525298687,SE +2525298688,2525626367,US +2525757440,2525822975,GR +2525822976,2526085119,US +2526085120,2526216191,IT +2526216192,2526412799,US +2526412800,2526478335,KR +2526478336,2526543871,AU +2526543872,2526937087,US +2526937088,2527002623,BE +2527002624,2527133695,US +2527133696,2527461375,BR +2527461376,2527920127,US +2527920128,2527985663,AU +2527985664,2528051199,US +2528051200,2528116735,FR +2528116736,2528247807,US +2528247808,2528313343,IT +2528313344,2528575487,US +2528575488,2528641023,KR +2528641024,2528706559,US +2528706560,2529034239,VE +2529034240,2529099775,US +2529099776,2529165311,AU +2529165312,2529492991,US +2529492992,2529558527,KR +2529558528,2529886207,US +2529886208,2529951743,AU +2529951744,2530017279,GB +2530017280,2530082815,CH +2530082816,2530148351,NZ +2530148352,2530213887,AU +2530213888,2530541567,US +2530541568,2530607103,CH +2530607104,2530672639,ES +2530672640,2530803711,US +2530803712,2530869247,IT +2530869248,2531196927,US +2531262464,2531459071,US +2531459072,2531524607,SE +2531524608,2531590143,US +2531590144,2531655679,AU +2531655680,2532048895,US +2532048896,2532114431,SE +2532114432,2532179967,GB +2532179968,2532376575,US +2532376576,2532442111,ES +2532442112,2532507647,FR +2532507648,2532573183,US +2532573184,2532638719,ES +2532638720,2533031935,US +2533031936,2533097471,BE +2533097472,2533228543,US +2533228544,2533294079,PL +2533425152,2539978751,IT +2539978752,2540240895,US +2540240896,2540306431,FI +2540306432,2540896255,US +2540896256,2540961791,GB +2540961792,2541223935,US +2541223936,2541289471,CH +2541289472,2541682687,US +2541682688,2541748223,CH +2541748224,2541813759,US +2541813760,2541879295,GB +2541879296,2541944831,AU +2541944832,2542075903,US +2542075904,2542141439,GB +2542141440,2542206975,US +2542272512,2542338047,DE +2542338048,2543583231,US +2543583232,2543648767,SE +2543648768,2543714303,NO +2543714304,2543779839,JP +2543779840,2544500735,US +2544500736,2544566271,GB +2544566272,2544631807,US +2544631808,2544697343,JP +2544697344,2544828415,US +2544893952,2544959487,GB +2544959488,2545025023,SE +2545025024,2545090559,AU +2545090560,2545156095,US +2545156096,2545221631,GB +2545221632,2545287167,US +2545287168,2545352703,GB +2545352704,2545418239,CH +2545418240,2545483775,NL +2545483776,2545614847,US +2545614848,2545680383,NO +2545680384,2545745919,US +2545745920,2545811455,DE +2545811456,2547187711,US +2547187712,2547318783,GB +2547318784,2547515391,US +2550202368,2554462207,US +2554462208,2554527743,HU +2554527744,2554789887,US +2554789888,2554855423,GB +2554855424,2554920959,US +2554920960,2554986495,DK +2554986496,2555052031,CL +2555052032,2555117567,US +2555117568,2555183103,AU +2555183104,2555248639,FR +2555248640,2555314175,GB +2555314176,2555445247,US +2555445248,2555510783,FR +2555510784,2555576319,US +2555576320,2555641855,AU +2555641856,2555707391,BR +2555707392,2555903999,US +2555904000,2555969535,CH +2555969536,2556035071,FR +2556035072,2556100607,NO +2556100608,2556166143,AU +2556166144,2556231679,BR +2556231680,2556362751,NO +2556362752,2556428287,DK +2556428288,2556493823,CH +2556493824,2556559359,US +2556559360,2556624895,AU +2556624896,2556690431,KR +2556690432,2556755967,US +2556755968,2557018111,HK +2557018112,2557083647,GB +2557542400,2557607935,US +2557607936,2557673471,GB +2557673472,2557739007,DK +2557739008,2557870079,US +2557870080,2557935615,ID +2557935616,2558918655,US +2558918656,2558984191,GB +2558984192,2559246335,US +2559246336,2559311871,CL +2559311872,2559508479,US +2559508480,2559574015,DE +2559574016,2559770623,US +2559770624,2559836159,AU +2559836160,2559901695,US +2559901696,2559967231,KR +2559967232,2560032767,GB +2560032768,2560098303,US +2560098304,2560163839,BE +2560163840,2560229375,NZ +2560229376,2560360447,US +2560425984,2561015807,US +2561671168,2563244031,US +2563768320,2564947967,US +2564947968,2565013503,SG +2565013504,2565210111,US +2566979584,2567045119,FI +2567045120,2567110655,US +2567176192,2567241727,US +2567241728,2567307263,SI +2567307264,2567897087,US +2567897088,2567962623,NO +2567962624,2568028159,US +2568028160,2568093695,DE +2568093696,2568159231,US +2568159232,2568224767,PL +2568224768,2568290303,SG +2568290304,2569142271,US +2569404416,2569797631,US +2569797632,2569863167,NO +2569863168,2569928703,CH +2569928704,2569989631,US +2569989632,2569989888,CH +2569989889,2572681215,US +2572681216,2572746751,SE +2572746752,2572943359,US +2572943360,2573402111,DE +2573467648,2573533183,DE +2573598720,2573926399,US +2573926400,2573991935,AU +2573991936,2574123007,CH +2574123008,2574188543,NO +2574188544,2574254079,NZ +2574254080,2574319615,SE +2574319616,2574647295,US +2583756800,2584018943,US +2584018944,2584084479,CA +2584084480,2584215551,US +2584215552,2584281087,GB +2584281088,2584346623,US +2584346624,2584412159,KR +2584412160,2584477695,CA +2584477696,2584608767,US +2584608768,2584805375,CH +2584805376,2585001983,US +2585001984,2585067519,CA +2585067520,2585788415,US +2585788416,2585853951,GB +2585853952,2585985023,JP +2585985024,2587951103,US +2600534016,2600665087,US +2600665088,2600730623,CA +2600730624,2600796159,NO +2600796160,2601123839,US +2601123840,2601189375,CA +2601320448,2601451519,US +2601451520,2601517055,CA +2601517056,2602565631,US +2602565632,2602631167,NZ +2602631168,2604007423,US +2604007424,2604072959,ES +2604072960,2604138495,NO +2604138496,2604204031,DE +2604204032,2604335103,US +2604335104,2604400639,NZ +2604400640,2604466175,AU +2604466176,2604531711,US +2604531712,2604597247,CA +2604597248,2604793855,US +2604793856,2604859391,CH +2604859392,2604990463,US +2604990464,2605055999,SG +2605056000,2605121535,US +2605121536,2605187071,AU +2605187072,2605252607,US +2605252608,2605318143,AT +2605318144,2606301183,US +2606366720,2606563327,US +2606628864,2607349759,US +2607349760,2607415295,CH +2607415296,2609053695,US +2609053696,2609119231,GB +2609119232,2609184767,FR +2609184768,2609250303,DE +2609250304,2609381375,US +2609381376,2609446911,GB +2609446912,2609512447,DK +2609512448,2609643519,US +2609643520,2609709055,GB +2609709056,2609840127,US +2609840128,2609971199,AU +2609971200,2610036735,GB +2610036736,2610823167,US +2610823168,2610888703,PL +2610954240,2611019775,JP +2611019776,2612592639,US +2612592640,2612658175,IT +2612658176,2612723711,US +2612723712,2612789247,AU +2612789248,2613051391,US +2613051392,2613116927,GB +2613116928,2613182463,US +2613182464,2613247999,CA +2613248000,2613313535,US +2613379072,2613444607,US +2613444608,2613510143,GB +2613510144,2613706751,US +2613706752,2613772287,GB +2613772288,2613837823,US +2613837824,2613903359,NL +2613903360,2613968895,AU +2613968896,2614034431,US +2614034432,2614099967,GR +2614099968,2614165503,US +2614165504,2614231039,NO +2614231040,2614296575,ES +2614296576,2614362111,BR +2614362112,2615083007,US +2615083008,2615148543,TR +2615148544,2615345151,US +2615345152,2615410687,NO +2615410688,2615476223,CH +2615476224,2615541759,US +2615541760,2615607295,KR +2615607296,2615672831,GB +2616262656,2616524799,US +2616524800,2616590335,GB +2616590336,2616786943,US +2616786944,2616852479,GB +2616852480,2616918015,DE +2616918016,2617049087,US +2617049088,2617114623,IT +2617114880,2617115135,US +2617147392,2617148159,US +2617311232,2617769983,US +2617835520,2617901055,US +2617901056,2617966591,FI +2617966592,2618032127,CA +2618032128,2618097663,US +2618097664,2618163199,NZ +2618163200,2618228735,IT +2618228736,2618294271,US +2618294272,2618359807,AU +2618359808,2618425343,PL +2618425344,2618490879,FR +2618490880,2618687487,US +2618687488,2618753023,AU +2618753024,2618884095,US +2618884096,2618949631,CH +2618949632,2619080703,US +2619080704,2619146239,FR +2619146240,2619277311,US +2619277312,2619342847,BN +2619342848,2619473919,US +2619473920,2619539455,CA +2619539456,2619604991,ES +2619604992,2619736063,US +2619801600,2620063743,US +2620063744,2620129279,GB +2620129280,2620194815,CA +2620194816,2620391423,US +2620391424,2620456959,GB +2620456960,2620522495,SE +2620522496,2620588031,AU +2620588032,2620653567,SE +2620653568,2620719103,NO +2620719104,2620784639,US +2620784640,2620850175,IT +2620850176,2620981247,US +2620981248,2621046783,CA +2621046784,2621112319,AT +2621112320,2621177855,NZ +2621177856,2621243391,US +2621243392,2621308927,GB +2621308928,2621374463,NZ +2621374464,2621636607,US +2621636608,2621702143,DE +2621702144,2621767679,US +2621767680,2621833215,NZ +2621833216,2622423039,US +2622423040,2622488575,CA +2622488576,2622685183,US +2622685184,2622750719,NL +2622750720,2623602687,US +2623602688,2623668223,CL +2623668224,2624192511,US +2624192512,2624258047,CH +2624258048,2624716799,US +2624716800,2624782335,NL +2624782336,2624847871,CH +2624847872,2624913407,NO +2624913408,2624978943,US +2624978944,2625044479,FR +2625044480,2625961983,US +2625961984,2626027519,LU +2626027520,2626093055,US +2626093056,2626158591,CH +2626158592,2626879487,US +2626879488,2626945023,KR +2626945024,2627010559,IT +2627010560,2627076095,NZ +2627076096,2627141631,NL +2627141632,2627403775,US +2634088448,2635202559,JP +2635268096,2635333631,JP +2635399168,2635530239,US +2635530240,2635595775,FR +2635595776,2635661311,FI +2635661312,2635726847,PL +2635726848,2635792383,CH +2635792384,2635988991,IT +2635988992,2638020607,US +2638086144,2638151679,US +2638151680,2639462399,JP +2639462400,2639593471,GB +2639593472,2639659007,AU +2639659008,2639724543,BR +2639724544,2639790079,US +2639790080,2639855615,ES +2639855616,2640052223,US +2640052224,2640117759,AR +2640117760,2640183295,US +2640183296,2640248831,FI +2640248832,2640314367,US +2640314368,2640379903,SE +2640379904,2640445439,CA +2640445440,2640510975,US +2640510976,2640576511,FR +2640576512,2640642047,EC +2640642048,2641821695,JP +2641887232,2641952767,JP +2641952768,2642018303,US +2642083840,2642149375,US +2642149376,2642214911,FI +2642214912,2642280447,SE +2642280448,2642411519,US +2642411520,2642477055,AU +2642477056,2642542591,FI +2642542592,2642935807,US +2642935808,2643001343,FR +2643001344,2643066879,US +2643066880,2643132415,IT +2643132416,2643197951,US +2643197952,2643263487,GB +2643263488,2643460095,US +2643460096,2643525631,FI +2643525632,2643722239,US +2643787776,2644180991,US +2644180992,2644246527,AU +2644312064,2644377599,IS +2644377600,2644443135,PL +2644443136,2644508671,FR +2644508672,2644574207,US +2644574208,2644639743,CH +2644639744,2644770815,DE +2644770816,2644836351,BE +2644836352,2644967423,US +2644967424,2645098495,AT +2645098496,2645164031,FR +2645164032,2645229567,US +2645229568,2645295103,SE +2645295104,2645360639,FR +2645360640,2645426175,GB +2645426176,2645622783,US +2645622784,2645688319,AT +2645688320,2645753855,US +2645753856,2645819391,TH +2645819392,2645884927,SE +2645884928,2645950463,HU +2645950464,2646212607,US +2646212608,2646278143,RU +2646278144,2646474751,US +2646474752,2646540287,IE +2646540288,2646605823,US +2646605824,2646671359,JP +2646671360,2646736895,BE +2646736896,2646933503,US +2646933504,2646999039,KR +2646999040,2647130111,US +2647130112,2647195647,FI +2647195648,2647326719,US +2647326720,2647392255,GB +2647392256,2647457791,US +2647457792,2647523327,JP +2647523328,2647851007,US +2647851008,2647916543,AU +2647916544,2648899583,US +2648899584,2648965119,IN +2648965120,2649030655,GB +2649030656,2649489407,US +2649489408,2649554943,GB +2649554944,2649620479,NO +2649620480,2649948159,US +2649948160,2650013695,FR +2650013696,2650079231,CA +2650079232,2650210303,US +2650210304,2650275839,AT +2650275840,2650341375,US +2650341376,2650406911,NO +2650406912,2650603519,US +2650603520,2650669055,CO +2650669056,2650734591,US +2650800128,2653159423,US +2653159424,2653421567,NO +2653421568,2653487103,AU +2653487104,2653552639,GB +2653552640,2653618175,ES +2653618176,2653683711,GB +2653683712,2653749247,KR +2653749248,2653814783,AU +2653880320,2653945855,IT +2653945856,2654011391,US +2654011392,2654076927,ES +2654076928,2654142463,FR +2654142464,2654207999,CA +2654208000,2654339071,US +2654339072,2654404607,AU +2654404608,2654601215,US +2654666752,2654994431,US +2654994432,2655059967,LU +2655059968,2655125503,US +2655185152,2655186944,PL +2655256576,2655715327,US +2655715328,2655780863,PL +2655780864,2656632831,US +2656632832,2656698367,AU +2656698368,2656763903,FI +2656763904,2656829439,US +2656829440,2656894975,SE +2656894976,2656960511,US +2656960512,2657026047,GB +2657026048,2657157119,US +2657157120,2657222655,MX +2657222656,2657288191,US +2657288192,2657353727,ES +2657353728,2657484799,US +2657484800,2657550335,IT +2657550336,2657681407,US +2657681408,2657746943,SE +2657746944,2657878015,US +2657878016,2657943551,TH +2657943552,2658009087,ES +2658009088,2658074623,IT +2658074624,2658140159,US +2658140160,2658205695,NO +2658205696,2658598911,US +2658598912,2658664447,GB +2658664448,2658926591,US +2658926592,2659057663,GB +2659057664,2659123199,SE +2659123200,2659188735,FI +2659188736,2659254271,CA +2659254272,2659319807,LT +2659319808,2659385343,US +2659385344,2659450879,FI +2659450880,2659516415,HK +2659516416,2659581951,CH +2659581952,2660040703,US +2660040704,2660106239,CA +2660106240,2660171775,US +2660171776,2660237311,GB +2660237312,2660302847,IN +2660302848,2660499455,US +2660564992,2660696063,NO +2660696064,2660761599,US +2660761600,2660827135,GB +2660827136,2661023743,US +2661023744,2661089279,FR +2661089280,2661285887,US +2661285888,2661351423,VE +2661351424,2661416959,BN +2661416960,2661482495,PT +2661482496,2661548031,CA +2661548032,2661679103,US +2661679104,2661941247,LU +2661941248,2662006783,CL +2662006784,2662072319,US +2662072320,2662137855,ES +2662137856,2662203391,SE +2662203392,2662662143,GB +2662727680,2662793215,HK +2662793216,2663251967,US +2663251968,2663448575,FR +2663448576,2663514111,SK +2663514112,2663579647,CZ +2663579648,2663645183,SK +2663645184,2663710719,CZ +2663710720,2663776255,SK +2663776256,2664955903,JP +2664955904,2665021439,CH +2665021440,2665086975,JP +2665086976,2665152511,GB +2665152512,2665218047,US +2665218048,2665283583,CH +2665283584,2665349119,US +2665359872,2665361407,US +2665374720,2665375231,US +2665414656,2665480191,GB +2665480192,2665545727,US +2665545728,2665611263,DE +2665611264,2665676799,CH +2665676800,2665742335,ES +2665742336,2665873407,US +2665873408,2665938943,GB +2665938944,2666004479,FR +2666004480,2666070015,CH +2666070016,2666135551,FI +2666135552,2666201087,GB +2666201088,2667053055,US +2667053056,2667118591,SE +2667118592,2667184127,HU +2667184128,2667249663,RU +2667249664,2667315199,CL +2667315200,2667511807,US +2667642880,2667970559,US +2667970560,2668036095,CA +2668036096,2668101631,SE +2668101632,2668167167,CH +2668167168,2668363775,US +2668363776,2668429311,CH +2668429312,2668494847,AU +2668494848,2668560383,US +2668560384,2668625919,GB +2668625920,2668691455,MX +2668691456,2668756991,US +2668756992,2668822527,CA +2668822528,2668888063,US +2668953600,2669019135,US +2669019136,2669084671,CH +2669084672,2669150207,ES +2669150208,2669215743,US +2669215744,2669281279,DE +2669281280,2669477887,US +2669477888,2669543423,CH +2669543424,2669608959,GB +2669608960,2669674495,FR +2669674496,2669805567,CA +2669805568,2669871103,GB +2669871104,2670067711,US +2670067712,2670133247,SE +2670133248,2670591999,US +2670592000,2670657535,NL +2670657536,2670854143,US +2670854144,2670919679,FR +2670919680,2670985215,DE +2670985216,2671050751,AU +2671050752,2671181823,US +2671181824,2671247359,CA +2671247360,2671378431,US +2671378432,2671443967,NO +2671443968,2671509503,US +2671509504,2671575039,NL +2671575040,2672295935,US +2672295936,2672361471,SE +2672361472,2672427007,AU +2672427008,2672820223,US +2672820224,2672885759,JP +2672885760,2672951295,NO +2672951296,2673082367,US +2673082368,2673147903,FR +2673147904,2673213439,US +2673278976,2673410047,US +2673410048,2673475583,CA +2673475584,2673541119,VE +2673541120,2673606655,US +2673606656,2673672191,GB +2673672192,2673737727,RU +2673737728,2673803263,US +2673803264,2673868799,FR +2673868800,2674130943,US +2674130944,2674262015,GB +2674262016,2674327551,US +2674327552,2674380799,CH +2674380800,2674381055,NL +2674381056,2674393087,CH +2674393088,2674458623,GB +2674458624,2674589695,US +2674589696,2674655231,SE +2674655232,2674720767,US +2674720768,2674786303,FR +2674786304,2674851839,US +2674851840,2674917375,AU +2674917376,2675048447,US +2675048448,2675113983,GB +2675113984,2675245055,US +2675245056,2675310591,NZ +2675310592,2675572735,US +2675572736,2675638271,CH +2675638272,2675965951,US +2675965952,2676031487,CA +2676031488,2676097023,US +2676097024,2676162559,NO +2676162560,2676359167,US +2676359168,2676424703,IE +2676424704,2677014527,US +2677014528,2677080063,CH +2677080064,2677145599,US +2677211136,2677276671,GB +2677276672,2677342207,LV +2677342208,2677407743,IT +2677407744,2677473279,US +2677473280,2677538815,FR +2677538816,2677604351,FI +2677604352,2677669887,US +2677669888,2677735423,DE +2677735424,2677800959,US +2677800960,2677866495,CH +2677866496,2677997567,US +2677997568,2678063103,CA +2678128640,2678194175,US +2678194176,2678259711,NO +2678259712,2678521855,US +2678521856,2678587391,GB +2678587392,2678652927,CH +2678652928,2678718463,US +2678718464,2678783999,GB +2678784000,2678849535,NO +2678849536,2678915071,US +2678915072,2678980607,FR +2678980608,2679046143,US +2679046144,2679111679,CA +2679111680,2679177215,US +2679177216,2679242751,CA +2679242752,2679308287,US +2679308288,2679373823,CH +2679373824,2679439359,GB +2679439360,2680029183,US +2680029184,2680094719,SE +2680094720,2680225791,US +2680225792,2680356863,SE +2680356864,2680422399,DK +2680422400,2680487935,AU +2680487936,2680553471,GB +2680553472,2680684543,US +2680684544,2680750079,SE +2680750080,2681012223,US +2681077760,2681143295,CA +2681143296,2681208831,AU +2681208832,2681274367,CA +2681274368,2681339903,US +2681339904,2681405439,IT +2681405440,2681470975,JP +2681470976,2681536511,US +2681536512,2681602047,IT +2681602048,2681733119,US +2681733120,2681798655,NO +2681798656,2681864191,FR +2681864192,2681929727,US +2681929728,2681995263,GB +2681995264,2682257407,US +2682322944,2682388479,US +2682388480,2682454015,CN +2682454016,2682519551,US +2682519552,2682585087,JP +2682585088,2682716159,US +2682716160,2682781695,CA +2682781696,2682847231,CH +2682847232,2683043839,US +2683043840,2683109375,GB +2683109376,2683174911,ES +2683174912,2683240447,US +2683240448,2683305983,GB +2683305984,2683371519,US +2683371520,2683437055,CH +2683437056,2683568127,US +2683568128,2683699199,GB +2683699200,2683830271,US +2683830272,2683895807,AU +2683895808,2684157951,US +2684223488,2684289023,GB +2684420096,2684616703,US +2684616704,2684682239,NZ +2684682240,2684747775,GB +2684747776,2684813311,IE +2684813312,2684878847,US +2684878848,2684944383,SE +2684944384,2685009919,GB +2685009920,2685075455,US +2685075456,2686386175,JP +2686386176,2686844927,US +2686844928,2686910463,GB +2686910464,2686975999,US +2686976000,2687041535,GR +2687041536,2687238143,US +2687238144,2687762431,DE +2687762432,2687827967,AT +2687827968,2687893503,CH +2687893504,2688221183,DE +2688221184,2688286719,CH +2688286720,2688352255,DE +2688352256,2688420095,CH +2688420096,2688420351,CN +2688420352,2688420863,CH +2688420864,2688421375,SG +2688421376,2688421887,US +2688421888,2688548863,CH +2688548864,2688614399,AU +2688614400,2688679935,US +2688679936,2688745471,IT +2688745472,2688876543,NO +2688876544,2688942079,US +2688942080,2689007615,DE +2689007616,2689073151,FI +2689073152,2689138687,CA +2689138688,2689204223,US +2689204224,2689269759,JP +2689269760,2689335295,TR +2689335296,2689400831,US +2689466368,2689531903,IT +2689531904,2689597439,US +2689597440,2689662975,IT +2689662976,2689925119,US +2689925120,2689990655,CH +2689990656,2690187263,US +2690318336,2690383871,US +2690383872,2690449407,FR +2690449408,2690646015,US +2690646016,2690711551,SG +2690711552,2690777087,IT +2690777088,2690842623,CH +2690842624,2690908159,CS +2690908160,2690973695,GB +2690973696,2691104767,US +2691104768,2691170303,FR +2691170304,2691235839,GB +2691301376,2691366911,CA +2691366912,2691760127,US +2691825664,2691891199,HU +2692546560,2694316031,US +2694381568,2694447103,US +2696151040,2696216575,IT +2696478720,2697789439,JP +2697789440,2697854975,US +2697854976,2697920511,AU +2697920512,2698117119,US +2698117120,2698182655,IS +2698182656,2698248191,DE +2698248192,2698313727,US +2698313728,2698379263,GB +2698379264,2698444799,ES +2698444800,2698510335,JP +2698510336,2698706943,CZ +2698706944,2698772479,CH +2698772480,2698838015,IT +2698838016,2698903551,BE +2698903552,2698969087,AU +2698969088,2699034623,CA +2699231232,2699296767,US +2699296768,2699362303,FR +2699362304,2699624447,US +2699624448,2700214271,JP +2700279808,2700935167,JP +2700935168,2701066239,US +2701197312,2701262847,US +2701262848,2701328383,GB +2701328384,2701393919,FR +2701393920,2701459455,NO +2701459456,2701524991,AT +2701524992,2701656063,US +2701656064,2701721599,RU +2701721600,2701787135,TR +2701852672,2701918207,US +2701918208,2701983743,GB +2701983744,2702245887,US +2702245888,2702311423,GB +2702376960,2702442495,CA +2702442496,2702508031,CH +2702508032,2702573567,US +2702639104,2702704639,GB +2702704640,2702770175,BR +2702770176,2702835711,CL +2702835712,2702901247,US +2702901248,2702966783,IT +2702966784,2703032319,US +2703032320,2703097855,NZ +2703097856,2703163391,GB +2703163392,2703556607,US +2703556608,2703622143,ES +2703622144,2703818751,US +2703818752,2703884287,FI +2703884288,2703949823,DE +2703949824,2704015359,AU +2704015360,2704277503,US +2704277504,2704343039,FR +2704343040,2704408575,US +2704408576,2704474111,AU +2704474112,2704539647,US +2704539648,2704605183,SE +2704605184,2704670719,HR +2704670720,2704736255,SE +2704736256,2704801791,US +2704867328,2704998399,US +2704998400,2705063935,BE +2705063936,2705195007,US +2705195008,2705260543,CH +2705260544,2705326079,US +2705326080,2705391615,MO +2705391616,2705522687,NZ +2705522688,2705588223,ES +2705588224,2705784831,US +2705784832,2705850367,GB +2705850368,2705915903,ES +2705915904,2706046975,GB +2706046976,2706112511,JP +2706112512,2706178047,GB +2706178048,2706243583,US +2706243584,2706309119,CH +2706309120,2706374655,BR +2706374656,2706571263,US +2706571264,2706694143,NL +2706694144,2706702335,US +2706702336,2706960383,NL +2706960384,2706964479,US +2706964480,2707226623,NL +2707226624,2707488767,JP +2707488768,2707947519,US +2707947520,2708144127,FR +2708144128,2708340735,US +2708340736,2708406271,AT +2708406272,2708471807,ES +2708471808,2708537343,GB +2708537344,2708733951,US +2708733952,2708799487,ES +2708799488,2708865023,AU +2708865024,2708930559,JP +2708930560,2709127167,US +2709127168,2709192703,KR +2709258240,2709389311,US +2709389312,2709454847,SG +2709454848,2709716991,US +2709716992,2709782527,CL +2709782528,2709848063,PE +2709848064,2710175743,US +2710241280,2710306815,MY +2710372352,2710437887,CA +2710437888,2710503423,MY +2710503424,2710568959,AU +2710568960,2710700031,US +2710700032,2710765567,AU +2710765568,2710831103,IT +2710831104,2710896639,BR +2710896640,2711093247,US +2711093248,2711158783,AU +2711158784,2711486463,US +2711486464,2711551999,NL +2711552000,2713190399,US +2713190400,2713255935,CA +2713255936,2713387007,US +2713387008,2713452543,CA +2713452544,2713583615,US +2713583616,2713649151,AR +2713649152,2713976831,US +2713976832,2714042367,VE +2714042368,2714238975,US +2714238976,2714304511,TH +2714304512,2714370047,US +2714370048,2714435583,CH +2714435584,2714697727,US +2714697728,2714763263,CN +2714763264,2715025407,US +2715090944,2715287551,US +2715287552,2715353087,CA +2715353088,2716139519,US +2716139520,2716205055,SG +2716205056,2716467199,US +2716532736,2716729343,US +2716729344,2716794879,CL +2716794880,2717253631,US +2717253632,2717319167,TH +2717319168,2717384703,US +2717384704,2717450239,JP +2717450240,2717646847,US +2717646848,2717712383,KW +2717712384,2717843455,US +2717974528,2718171135,US +2718171136,2718236671,JP +2718236672,2718629887,US +2718629888,2718695423,GB +2718695424,2718760959,US +2718760960,2718826495,GB +2718826496,2719023103,US +2719088640,2719285247,US +2719285248,2719350783,CH +2719350784,2719416319,US +2719416320,2719481855,CH +2719481856,2719547391,US +2719547392,2719612927,AT +2719612928,2719678463,CH +2719678464,2720399359,US +2720399360,2720464895,FR +2720464896,2721382399,US +2721382400,2721447935,CA +2721447936,2722627583,US +2722693120,2722758655,CA +2722758656,2723479551,US +2723479552,2723545087,CA +2723545088,2723610623,CH +2723610624,2724724735,US +2724790272,2724855807,CN +2724855808,2724921343,CA +2724921344,2725249023,US +2725249024,2725314559,NZ +2725314560,2725904383,US +2725904384,2725969919,VE +2725969920,2727018495,US +2727018496,2727084031,CA +2727084032,2727346175,US +2727411712,2727608319,AU +2734751744,2734817279,GB +2734817280,2734882815,US +2734882816,2734948351,SE +2734948352,2735013887,US +2735013888,2735079423,FR +2735079424,2735144959,US +2735144960,2735210495,NZ +2735210496,2735276031,AU +2735276032,2735341567,FR +2735341568,2735407103,AR +2735407104,2735538175,US +2735538176,2736848895,TW +2736848896,2736914431,US +2736914432,2736979967,NO +2736979968,2737438719,US +2737438720,2738749439,JP +2738749440,2742353919,FR +2742353920,2742419455,ES +2742419456,2742484991,US +2742484992,2742550527,GB +2742550528,2742616063,US +2742616064,2742681599,EG +2742681600,2742747135,IN +2742747136,2742812671,CA +2742812672,2742878207,US +2742943744,2743009279,US +2743009280,2743140351,AU +2743140352,2743205887,US +2743205888,2743992319,JP +2744057856,2744516607,JP +2744516608,2744647679,US +2744647680,2744713215,KR +2744713216,2744844287,US +2744844288,2744909823,CA +2744909824,2744975359,GB +2744975360,2745040895,SE +2745040896,2745106431,CH +2745106432,2745171967,SI +2745171968,2745237503,GB +2745237504,2745303039,CH +2745303040,2745368575,IT +2745368576,2745434111,BE +2745434112,2745499647,GB +2745499648,2745548799,BE +2745548800,2745565183,DE +2745565184,2745696255,GB +2745696256,2745761791,CH +2745761792,2746023935,GB +2746023936,2746089471,FR +2746089472,2746155007,NO +2746155008,2746220543,NL +2746220544,2746286079,US +2746351616,2746417151,CR +2746482688,2746548223,KR +2746548224,2747072511,US +2747072512,2747138047,AU +2747138048,2747465727,US +2748121088,2748317695,US +2748317696,2748645375,JP +2748710912,2749235199,JP +2749300736,2749628415,JP +2749628416,2749693951,US +2749759488,2749890559,US +2749890560,2750021631,AU +2750021632,2750349311,US +2750349312,2750414847,KR +2750414848,2750873599,US +2750873600,2750939135,CL +2750939136,2751070207,US +2751070208,2751135743,CL +2751135744,2751397887,US +2751528960,2751660031,FR +2751660032,2751725567,AT +2751725568,2751791103,SE +2751791104,2751856639,FI +2751856640,2751922175,GB +2751922176,2751987711,FR +2751987712,2752053247,SI +2752053248,2752184319,SE +2752184320,2752315391,GB +2752315392,2752380927,FI +2752380928,2752446463,CH +2752446464,2752511999,BE +2752512000,2753757183,DE +2753757184,2753822719,BE +2753822720,2753888255,GB +2753888256,2753953791,SE +2753953792,2754084863,GB +2754150400,2754215935,BR +2754215936,2754281471,PR +2754281472,2754347007,JP +2754347008,2754478079,US +2754478080,2754543615,JP +2754543616,2754609151,US +2754609152,2754674687,SE +2754674688,2754936831,US +2754936832,2755002367,AU +2755002368,2755330047,US +2755330048,2755395583,DE +2755395584,2755461119,FR +2755461120,2755526655,DE +2755526656,2755985407,US +2755985408,2756182015,JP +2756182016,2756247551,US +2756247552,2756313087,UY +2756313088,2756378623,US +2756378624,2756444159,AU +2756444160,2756509695,US +2756509696,2756556543,CL +2756556544,2756557311,PE +2756557312,2756575231,CL +2756575232,2756640767,SG +2756640768,2756706303,US +2756706304,2756771839,AU +2756771840,2756837375,FR +2756837376,2757033983,US +2757033984,2757099519,BR +2757099520,2757230591,US +2757296128,2757754879,US +2757754880,2757820415,CL +2757820416,2757885951,AU +2757885952,2757951487,CL +2757951488,2758017023,US +2758017024,2758082559,IN +2758082560,2758148095,US +2758148096,2758213631,CA +2758213632,2758541311,US +2758541312,2758606847,AU +2758606848,2758803455,US +2758803456,2758868991,AU +2758868992,2759000063,US +2759000064,2759065599,TH +2759065600,2759589887,US +2759589888,2759720959,KR +2759852032,2759871035,CH +2759871036,2759871039,GB +2759871040,2759883039,CH +2759883040,2759883043,LI +2759883044,2759883439,CH +2759883440,2759883443,LI +2759883444,2759883451,CH +2759883452,2759883455,LI +2759883456,2759884111,CH +2759884112,2759884115,GB +2759884116,2759894559,CH +2759894560,2759894563,LI +2759894564,2759917567,CH +2759917568,2759983103,FR +2759983104,2760048639,IT +2760048640,2760114175,FR +2760114176,2760179711,IT +2760179712,2760245247,DE +2760245248,2760310783,GB +2760310784,2760376319,SE +2760376320,2760507391,GB +2760507392,2760572927,FR +2760572928,2760638463,DE +2760638464,2760703999,NL +2760704000,2760769535,FI +2760769536,2760835071,IT +2760835072,2760898559,GB +2760898560,2760899583,US +2760899584,2760900607,GB +2760900608,2761031679,US +2761424896,2761621503,US +2761687040,2761949183,US +2762014720,2762211327,JP +2762211328,2762276863,IN +2762276864,2762342399,US +2762342400,2762407935,CA +2762407936,2763063295,US +2763128832,2763194367,CA +2763194368,2765553663,US +2765619200,2768240639,US +2768306176,2768437247,US +2768633856,2768764927,US +2769027072,2769092607,AU +2769092608,2769158143,US +2769158144,2769289215,JP +2769354752,2769485823,JP +2769485824,2769616895,US +2769616896,2769682431,SG +2769682432,2769747967,US +2769747968,2769813503,CA +2769813504,2769879039,US +2769944576,2770272255,US +2770272256,2770337791,AU +2770337792,2771451903,US +2772434944,2772631551,US +2772631552,2772697087,AU +2772697088,2772762623,US +2772762624,2772828159,AU +2772828160,2773221375,US +2773221376,2773286911,JP +2773286912,2773352447,US +2773352448,2773417983,CA +2773417984,2773745663,US +2773745664,2773811199,NZ +2773811200,2773876735,US +2773876736,2773942271,AU +2773942272,2774138879,US +2774204416,2774335487,US +2774335488,2774401023,JP +2774401024,2774532095,US +2774532096,2774597631,JP +2774597632,2774663167,US +2774663168,2774728703,NI +2774728704,2774990847,JP +2774990848,2775318527,US +2775318528,2775384063,JP +2775384064,2775711743,US +2775711744,2775777279,NL +2775777280,2775842815,CA +2775842816,2775973887,US +2775973888,2776039423,AU +2776039424,2776891391,US +2776891392,2777022463,KR +2777022464,2777481215,US +2777481216,2777546751,KR +2777546752,2777612287,AU +2778071040,2778333183,US +2778333184,2778398719,CA +2778398720,2779054079,US +2779119616,2779316223,US +2779381760,2779906047,US +2779906048,2779971583,CA +2779971584,2780037119,US +2780102656,2780168191,US +2780168192,2780299263,CL +2780299264,2780364799,US +2780364800,2780430335,CA +2780430336,2780495871,KR +2780495872,2780561407,AU +2780561408,2780758015,US +2780758016,2780823551,AU +2780823552,2780904159,US +2780904160,2780904191,CA +2780904192,2780909183,US +2780909184,2780909311,CA +2780909312,2780909887,US +2780909888,2780909903,CA +2780909904,2780921359,US +2780921360,2780921367,GB +2780921368,2780925951,US +2780925952,2780926207,GB +2780926208,2780926975,US +2780926976,2780927487,GB +2780927488,2780927743,US +2780927744,2780927999,GB +2780928000,2780928031,US +2780928032,2780928127,GB +2780928128,2780928383,US +2780928384,2780928415,GB +2780928416,2780928447,US +2780928448,2780928455,GB +2780928456,2780928463,US +2780928464,2780928471,DE +2780928472,2780929023,US +2780929024,2780929279,GB +2780929280,2780930047,US +2780930048,2780930559,GB +2780930560,2780930879,US +2780930880,2780930927,GB +2780930928,2780931071,US +2780931072,2780932335,GB +2780932336,2780932607,US +2780932608,2780933119,GB +2780933120,2780933151,US +2780933152,2780933191,GB +2780933192,2780933247,US +2780933248,2780933631,GB +2780933632,2780933887,US +2780933888,2780934143,GB +2780934144,2780940367,US +2780940368,2780940383,CA +2780940384,2780941055,US +2780941056,2780941087,GB +2780941088,2780941719,US +2780941720,2780941727,GB +2780941728,2780943575,US +2780943576,2780943583,BM +2780943584,2780945311,US +2780945312,2780945375,BM +2780945376,2780945663,US +2780945664,2780945695,BM +2780945696,2780946127,US +2780946128,2780946135,CA +2780946136,2780947903,US +2780947904,2780947967,MY +2780947968,2780952967,US +2780952968,2780952975,GB +2780952976,2780954623,US +2780954624,2781020159,KR +2781020160,2781478911,US +2781478912,2781544447,HK +2781544448,2781675519,US +2781675520,2781741055,NZ +2781741056,2781937663,US +2781937664,2782003199,TH +2782134272,2782199807,US +2782199808,2782265343,KR +2782265344,2782658559,US +2782658560,2782724095,PH +2782724096,2782789631,US +2782789632,2782855167,CH +2782855168,2783182847,US +2783182848,2783248383,AU +2783248384,2783313919,KR +2783313920,2783379455,US +2783379456,2783444991,GN +2783444992,2783510527,US +2783576064,2783969279,US +2783969280,2784034815,AU +2784034816,2784165887,JP +2784165888,2784296959,KR +2784296960,2784362495,US +2784362496,2784428031,KR +2784428032,2784952319,US +2785148928,2785542143,US +2785542144,2786066431,CH +2786066432,2788163583,US +2788229120,2788229935,US +2788229936,2788229943,GB +2788229944,2788230663,US +2788230664,2788230671,GB +2788230672,2788234767,US +2788234768,2788234775,GB +2788234776,2788238847,US +2788238848,2788238855,GB +2788238856,2788245007,US +2788245008,2788245023,CA +2788245024,2788261887,US +2788261888,2788294655,GB +2788294656,2789081087,US +2789179392,2789203967,US +2789212160,2789277695,AU +2789277696,2789343231,NZ +2789343232,2789933055,US +2789933056,2789998591,CL +2789998592,2790129663,US +2790195200,2790260735,KR +2790260736,2790326271,US +2790326272,2790391807,HK +2790391808,2790457343,US +2790457344,2790522879,NZ +2790522880,2790588415,US +2790653952,2790719487,US +2790719488,2790785023,SA +2790850560,2791571455,US +2791571456,2791636991,JP +2791636992,2791768063,US +2791768064,2791899135,KR +2791899136,2791964671,US +2791964672,2792030207,NZ +2792030208,2792226815,US +2792226816,2792292351,CL +2792292352,2792357887,CN +2792357888,2792488959,US +2792488960,2792554495,BO +2792554496,2792751103,US +2792751104,2792882175,JP +2792882176,2792947711,AU +2792947712,2793013247,SG +2793013248,2793209855,US +2793209856,2793275391,KR +2793275392,2801795071,US +2801860608,2802515967,US +2802515968,2802581503,CA +2802581504,2802909183,US +2802909184,2802974719,CA +2802974720,2803630079,US +2803630080,2803695615,CL +2803695616,2803761151,US +2803761152,2803826687,AU +2803826688,2803892223,US +2803892224,2805465087,CA +2805989376,2806644735,US +2806644736,2806710271,CA +2806710272,2807103487,US +2807103488,2807169023,NL +2807169024,2807824383,US +2807824384,2807889919,CA +2807889920,2808545279,US +2808545280,2808610815,AU +2808610816,2808872959,US +2808938496,2809069567,US +2809069568,2809135103,SA +2809135104,2809397247,US +2809462784,2809855999,US +2809856000,2809921535,AU +2809921536,2809987071,US +2809987072,2810052607,CA +2810052608,2810249215,US +2810249216,2810314751,CA +2810314752,2810380287,AU +2810380288,2810576895,US +2810576896,2810642431,VE +2810642432,2810904575,US +2810904576,2810970111,CN +2810970112,2811559935,US +2811559936,2811625471,CH +2811625472,2812084223,US +2812084224,2812149759,BO +2812149760,2812411903,US +2812411904,2812477439,AU +2812477440,2812805119,US +2812805120,2812870655,CH +2812870656,2812936191,JP +2812936192,2813067263,US +2813067264,2813132799,GB +2813132800,2813263871,US +2813263872,2813329407,JP +2813329408,2813526015,US +2813526016,2813591551,NZ +2813591552,2814181375,US +2814181376,2814246911,AU +2814246912,2815098879,US +2815098880,2815164415,GB +2815164416,2815229951,US +2815229952,2815295487,ID +2815295488,2815986687,US +2815986688,2815986815,GB +2815986816,2815986831,US +2815986832,2815987215,GB +2815987216,2815987231,US +2815987232,2815987263,GB +2815987264,2815987327,US +2815987328,2815987391,GB +2815987392,2816001151,US +2816001152,2816001183,DE +2816001184,2816671743,US +2816671744,2816737279,CA +2816737280,2818113535,US +2818244608,2818310143,US +2818310144,2818375679,AR +2818375680,2818572287,US +2818637824,2818703359,CH +2818703360,2823159807,US +2823159808,2823225343,HK +2823225344,2823553023,US +2823618560,2823684095,PA +2823684096,2823749631,KR +2823749632,2823815167,JP +2823946240,2824011775,US +2824011776,2824077311,AR +2824077312,2824404991,US +2824536064,2824798207,US +2824798208,2824863743,TW +2824863744,2824929279,AR +2824929280,2825191423,US +2825191424,2825256959,AR +2825256960,2825519103,US +2825519104,2825584639,HK +2825584640,2826108927,US +2826108928,2826174463,KR +2826174464,2826436607,US +2826436608,2826502143,TH +2826567680,2826829823,US +2826829824,2826895359,KR +2826895360,2826960895,US +2827026432,2827091967,US +2827091968,2827157503,AU +2827157504,2827223039,KR +2827223040,2827288575,AU +2827288576,2827354111,US +2827354112,2827419647,AU +2827419648,2827681791,US +2827681792,2827747327,TR +2827747328,2827812863,AU +2827812864,2827878399,US +2827943936,2828009471,US +2828009472,2828075007,CA +2828075008,2828533759,US +2828533760,2828664831,AU +2828664832,2828730367,KR +2828795904,2829058047,US +2829058048,2829123583,CN +2829123584,2829254655,US +2829254656,2829320191,CH +2829385728,2829451263,MX +2829451264,2829516799,US +2829582336,2829844479,US +2829910016,2830106623,US +2830106624,2830172159,CO +2830172160,2830434303,US +2830499840,2830761983,US +2830761984,2830827519,AU +2830827520,2830893055,KW +2830893056,2830958591,KR +2830958592,2831286271,US +2831548416,2831613951,AU +2831613952,2831810559,US +2831810560,2831876095,IT +2831876096,2832007167,US +2832138240,2832269311,US +2832347648,2832347903,ZA +2832465920,2832793599,US +2832793600,2832859135,AU +2832859136,2832924671,US +2832924672,2832990207,KR +2832990208,2833383423,US +2833383424,2833448959,AR +2833580032,2833711103,US +2833711104,2833776639,CL +2833842176,2833907711,US +2833907712,2833973247,GT +2833973248,2834497535,US +2834497536,2834563071,SV +2834563072,2834825215,US +2834825216,2834956287,KR +2834956288,2835087359,US +2835087360,2835152895,AU +2835218432,2835283967,US +2835283968,2835349503,MX +2835480576,2837446655,US +2837446656,2839543807,CH +2839543808,2840015359,US +2840015360,2840015615,GB +2840015616,2843803647,US +2843869184,2844524543,US +2844524544,2844590079,KR +2844590080,2845704191,US +2845704192,2845769727,CU +2845835264,2848276479,US +2848325632,2848522239,US +2848522240,2848587775,AU +2848653312,2848980991,US +2848980992,2849177599,AU +2849177600,2849177855,JP +2849177856,2849178111,CN +2849178112,2849178367,KR +2849178368,2849178623,TW +2849178624,2849178879,ID +2849178880,2849179135,VN +2849179136,2849964031,AU +2849964032,2850029567,PH +2850029568,2851012607,US +2851078144,2852061183,US +2852192256,2853306367,US +2853306368,2853371903,CL +2853371904,2853765119,US +2853765120,2853830655,MX +2853830656,2854617087,US +2854617088,2854682623,MY +2854682624,2855469055,US +2855469056,2855477247,PY +2855477248,2855485439,UY +2855485440,2855518207,AR +2855518208,2855520255,PY +2855520256,2855522303,UY +2855522304,2855534591,AR +2855534592,2856058879,US +2856058880,2856124415,CH +2856124416,2856452095,US +2856452096,2856517631,BR +2856517632,2856714239,US +2856714240,2856779775,MX +2856779776,2857238527,US +2857697280,2858352639,US +2858352640,2858418175,SG +2858418176,2859007999,US +2859008000,2859073535,JP +2859073536,2861957119,US +2862022656,2862284799,US +2862284800,2862350335,AR +2862350336,2862415871,US +2862415872,2862481407,AU +2862481408,2863202303,US +2863202304,2863267839,MX +2863267840,2863595519,US +2863595520,2863661055,CA +2863661056,2863857663,US +2863857664,2863923199,SG +2863923200,2865577983,US +2865577984,2865610751,BE +2865610752,2865889279,US +2865889280,2865954815,AR +2865954816,2867396607,US +2867462144,2867593215,US +2867593216,2867639295,CH +2867639296,2867639551,AT +2867639552,2867724287,CH +2867855360,2868117503,US +2868379648,2868772863,US +2868838400,2868903935,BE +2869952512,2870018047,FR +2870018048,2870083583,DE +2870083584,2870149119,FR +2870149120,2870214655,HU +2870214656,2870280191,DK +2870280192,2870345727,NL +2870345728,2870411263,GB +2870411264,2870476799,NO +2870476800,2870542335,DE +2870542336,2870574848,CH +2870575104,2870578944,SE +2870579200,2870583040,SE +2870583296,2870583551,NL +2870583552,2870584319,NO +2870607872,2870673407,BE +2870673408,2870738943,CH +2870738944,2870935551,GB +2870935552,2871001087,HU +2871001088,2871066623,SE +2871066624,2871083007,CH +2873098240,2873884671,US +2877292544,2882469887,US +2894069760,2899902463,US +2902523904,2904555519,US +2904555520,2904817663,CA +2904817664,2905350143,US +2905407488,2905449471,US +2905449472,2905449727,CA +2905449728,2905450495,US +2905450496,2905451519,CA +2905451520,2905452543,US +2905456640,2905473023,US +2905473024,2905481215,CA +2905481216,2905493503,US +2905497600,2905509887,US +2905513984,2905526271,US +2905530368,2907897855,US +2907963392,2912288767,US +2912944128,2913861631,US +2913992704,2914254847,CA +2914516992,2915041279,US +2919235584,2919759871,CA +2919759872,2920808447,US +2921332736,2921476095,US +2921480192,2921512703,US +2921512704,2921512959,CA +2921512960,2921521151,US +2921529344,2921562111,US +2921562112,2921594879,CA +2921594880,2925002751,US +2925002752,2925527039,CA +2925527040,2926215167,US +2926575616,2927099903,CA +2927099904,2927427583,US +2927493120,2927575039,US +2927591424,2927599615,US +2927689728,2928164863,US +2928181248,2928189439,US +2928197632,2928221695,US +2928221696,2928221951,CA +2928221952,2928226303,US +2928226304,2928230399,CA +2928230400,2928261375,US +2928261376,2928261887,CA +2928261888,2928263167,US +2928263168,2928279551,CA +2928279552,2928312319,US +2928312320,2928316415,CA +2928320512,2928324607,US +2928328704,2928336895,CA +2928336896,2928451583,US +2928459776,2928525311,US +2928541696,2928607231,CA +2928607232,2936012799,US +3019898880,3036676095,AU +3070230528,3087007743,AU +3120562176,3120578559,CO +3120627712,3120644095,NI +3120693248,3120709631,BO +3120758784,3120775167,EC +3121086464,3121102847,UY +3121152000,3121250303,CL +3121348608,3121479679,AR +3121479680,3121512447,VE +3121545216,3121610751,CR +3121610752,3121643519,PY +3121741824,3121807359,AR +3122135040,3122167807,VE +3122266112,3122282495,VE +3122397184,3122462719,CO +3122659328,3122724863,GT +3122921472,3122987007,CL +3124232192,3124494335,AR +3124756480,3124772863,AR +3124887552,3124953087,EC +3125018624,3125149695,EC +3125280768,3125346303,CO +3125346304,3125411839,PA +3125805056,3126329343,CO +3126853632,3126853887,US +3126853888,3126870015,AR +3126919168,3126935551,CO +3127115776,3127181311,AR +3127377920,3127508991,CL +3127902208,3128164351,CO +3129475072,3129606143,AR +3131047936,3131310079,PE +3137339392,3143630847,BR +3145728000,3147825151,MX +3154182144,3154247679,DE +3154247680,3154313215,RS +3154313216,3154378751,TR +3154378752,3154444287,GR +3154444288,3154509823,BE +3154509824,3154575359,RU +3154575360,3154640895,FR +3154640896,3155165183,IT +3155165184,3155427327,RU +3155427328,3155689471,AT +3155689472,3155951615,RO +3155951616,3156213759,GB +3156213760,3156279295,RU +3156279296,3156344831,PL +3156344832,3156410367,IR +3156410368,3156475903,RU +3156475904,3156539391,HU +3156539392,3156539647,RO +3156539648,3156541439,HU +3156606976,3156672511,TR +3156672512,3156738047,GB +3156738048,3156803583,DE +3156803584,3156869119,TR +3156869120,3156934655,LU +3156934656,3157065727,RU +3157065728,3157131263,AT +3157131264,3157196799,DE +3157196800,3157262335,PL +3157262336,3157786623,SA +3157786624,3158048767,TR +3158048768,3158310911,CH +3159359488,3159621631,PT +3159621632,3159883775,ES +3159883776,3160145919,NL +3160145920,3160147967,RU +3160147968,3160150015,CZ +3160150016,3160152063,LV +3160152064,3160154111,IT +3160154112,3160156159,DE +3160156160,3160158207,AM +3160158208,3160160255,BY +3160160256,3160162303,NL +3160162304,3160164351,FR +3160164352,3160166399,LV +3160166400,3160168447,NO +3160168448,3160170495,GB +3160170496,3160172543,IT +3160172544,3160174591,RU +3160174592,3160176639,DE +3160176640,3160178687,IT +3160178688,3160180735,DE +3160180736,3160182783,GB +3160182784,3160184831,CH +3160184832,3160186879,NL +3160186880,3160188927,EE +3160188928,3160190975,SE +3160190976,3160193023,RU +3160193024,3160195071,IT +3160195072,3160197119,RU +3160197120,3160199167,DE +3160199168,3160201215,GE +3160201216,3160203263,RU +3160203264,3160203775,CH +3160203776,3160203783,DE +3160203784,3160203791,CH +3160203792,3160203815,FR +3160203816,3160205311,CH +3160205312,3160207359,GB +3160207360,3160209407,RU +3160209408,3160211455,SE +3160211456,3160213503,IE +3160213504,3160215551,DE +3160215552,3160219647,RU +3160219648,3160221695,ES +3160221696,3160223743,FR +3160223744,3160227839,RU +3160227840,3160229887,IR +3160229888,3160231935,ES +3160231936,3160233983,BE +3160233984,3160236031,GE +3160236032,3160238079,BE +3160238080,3160240127,RU +3160240128,3160242175,BE +3160242176,3160244223,RS +3160244224,3160246271,RU +3160246272,3160248319,IT +3160248320,3160250367,NL +3160250368,3160252415,BE +3160252416,3160254463,PL +3160254464,3160256511,LU +3160256512,3160258559,GB +3160258560,3160260607,NO +3160260608,3160262655,PT +3160262656,3160264703,HU +3160264704,3160266751,RU +3160266752,3160268799,DE +3160268800,3160272895,PT +3160272896,3160274943,RU +3160274944,3160276991,AT +3160276992,3160279039,RU +3160279040,3160281087,ES +3160281088,3160283135,GB +3160283136,3160285183,DE +3160285184,3160287231,RU +3160287232,3160289279,GB +3160289280,3160291327,RU +3160291328,3160293375,ES +3160408064,3161456639,DE +3161456640,3161473023,PL +3161473024,3161489407,SK +3161489408,3161505791,LV +3161505792,3161538559,RU +3161538560,3161554943,NO +3161554944,3161571327,RU +3161571328,3161587711,UZ +3161587712,3161620479,RU +3161620480,3161636863,DK +3161636864,3161653247,RU +3161653248,3161669631,LU +3161669632,3161686015,FR +3161686016,3161702399,UA +3161702400,3161718783,AM +3161718784,3161735167,PL +3161980928,3161989119,SK +3161989120,3161997311,RU +3161997312,3162005503,DK +3162005504,3162013695,CS +3162013696,3162021887,IL +3162021888,3162030079,SE +3162030080,3162038271,CZ +3162038272,3162046463,LU +3162046464,3162054655,PL +3162054656,3162062847,NL +3162062848,3162071039,SE +3162071040,3162087423,IR +3162087424,3162095615,SK +3162095616,3162103807,GE +3162103808,3162111999,FR +3162112000,3162120191,PL +3162128384,3162128895,GB +3162128896,3162129407,NL +3162129408,3162129919,DE +3162129920,3162136575,NL +3162505216,3162537983,RU +3162537984,3162570751,PL +3162570752,3162603519,HR +3162603520,3162636287,GE +3162636288,3162669055,FR +3162669056,3162701823,RU +3162701824,3162734591,MD +3162734592,3162767359,RU +3162767360,3162800127,SA +3162800128,3162832895,TR +3162832896,3162865663,GR +3162865664,3162931199,RU +3162931200,3162963967,CZ +3162963968,3162996735,OM +3162996736,3163029503,IT +3163029504,3163062271,DE +3163062272,3163095039,IR +3163095040,3163127807,PL +3163160576,3163193343,DE +3163226112,3163258879,SA +3163258880,3163291647,SY +3163291648,3163324415,PT +3163324416,3163357183,OM +3163553792,3163684863,DE +3163684864,3163815935,PL +3163815936,3163947007,NO +3164078080,3164209151,IT +3164209152,3164340223,CH +3164340224,3164471295,HU +3164602368,3164667903,SY +3164667904,3164733439,PS +3164733440,3164798975,RU +3164798976,3164864511,UA +3165650944,3166175231,DK +3167748096,3168206847,RO +3168206848,3168272383,MD +3168272384,3168534527,IT +3168534528,3168796671,GB +3170893824,3179282431,BR +3179282432,3187671039,MX +3187671040,3187687423,CO +3187687424,3187695615,DO +3187695616,3187699711,AR +3187703808,3187711999,UY +3187712000,3187716095,AR +3187720192,3187728383,GT +3187736576,3187752959,AR +3187752960,3187761151,CO +3187769344,3187802111,CO +3187802112,3187818495,AR +3187818496,3187820543,PY +3187826688,3187830783,AR +3187834880,3187851263,AN +3187851264,3187855359,PY +3187859456,3187863551,PA +3187867648,3187908607,AR +3187916800,3187933183,CO +3187933184,3187933311,HN +3187933312,3187934783,GT +3187934784,3187934815,HN +3187934816,3187934823,GT +3187934824,3187934847,HN +3187934848,3187934991,GT +3187934992,3187935023,HN +3187935024,3187935027,GT +3187935028,3187935039,HN +3187935040,3187935047,GT +3187935048,3187935079,HN +3187935080,3187935087,GT +3187935088,3187935111,HN +3187935112,3187935151,GT +3187935152,3187935159,HN +3187935160,3187935167,GT +3187935168,3187935239,HN +3187935240,3187935247,GT +3187935248,3187935287,HN +3187935288,3187935291,GT +3187935292,3187935339,HN +3187935340,3187935351,GT +3187935352,3187935391,HN +3187935392,3187935395,GT +3187935396,3187935415,HN +3187935416,3187935423,GT +3187935424,3187935431,HN +3187935432,3187935439,GT +3187935440,3187935463,HN +3187935464,3187935467,GT +3187935468,3187935511,HN +3187935512,3187935519,GT +3187935520,3187935711,HN +3187935712,3187935735,GT +3187935736,3187935743,HN +3187935744,3187936007,GT +3187936008,3187936011,HN +3187936012,3187936015,GT +3187936016,3187936027,HN +3187936028,3187936039,GT +3187936040,3187936067,HN +3187936068,3187936071,GT +3187936072,3187936079,HN +3187936080,3187936095,GT +3187936096,3187936115,HN +3187936116,3187936119,GT +3187936120,3187936127,HN +3187936128,3187936131,GT +3187936132,3187936135,HN +3187936136,3187936151,GT +3187936152,3187936167,HN +3187936168,3187936183,GT +3187936184,3187936191,HN +3187936192,3187936199,GT +3187936200,3187936207,HN +3187936208,3187936223,GT +3187936224,3187936239,HN +3187936240,3187936519,GT +3187936520,3187936527,HN +3187936528,3187936583,GT +3187936584,3187936599,HN +3187936600,3187936607,GT +3187936608,3187936631,HN +3187936632,3187936639,GT +3187936640,3187936655,HN +3187936656,3187936663,GT +3187936664,3187936695,HN +3187936696,3187936711,GT +3187936712,3187936735,HN +3187936736,3187937031,GT +3187937032,3187937035,HN +3187937036,3187937071,GT +3187937072,3187937079,HN +3187937080,3187937103,GT +3187937104,3187937119,HN +3187937120,3187937135,GT +3187937136,3187937139,HN +3187937140,3187937143,GT +3187937144,3187937187,HN +3187937188,3187937207,GT +3187937208,3187937215,HN +3187937216,3187937235,GT +3187937236,3187937263,HN +3187937264,3187937275,GT +3187937276,3187937279,HN +3187937280,3187937287,GT +3187937288,3187937375,HN +3187937376,3187937383,GT +3187937384,3187937391,HN +3187937392,3187937407,GT +3187937408,3187937487,HN +3187937488,3187937503,GT +3187937504,3187937527,HN +3187937528,3187937791,GT +3187937792,3187937911,HN +3187937912,3187937919,GT +3187937920,3187938047,HN +3187938048,3187939071,GT +3187939072,3187939127,HN +3187939128,3187939135,GT +3187939136,3187939139,HN +3187939140,3187939143,GT +3187939144,3187939167,HN +3187939168,3187939175,GT +3187939176,3187939207,HN +3187939208,3187939215,GT +3187939216,3187939231,HN +3187939232,3187939239,GT +3187939240,3187939255,HN +3187939256,3187939271,GT +3187939272,3187939327,HN +3187939328,3187939839,GT +3187939840,3187939855,HN +3187939856,3187939863,GT +3187939864,3187939879,HN +3187939880,3187939887,GT +3187939888,3187939927,HN +3187939928,3187939939,GT +3187939940,3187939967,HN +3187939968,3187939975,GT +3187939976,3187940071,HN +3187940072,3187940075,GT +3187940076,3187940211,HN +3187940212,3187940215,GT +3187940216,3187940311,HN +3187940312,3187940319,GT +3187940320,3187940339,HN +3187940340,3187940343,GT +3187940344,3187940559,HN +3187940560,3187940567,GT +3187940568,3187940639,HN +3187940640,3187940647,GT +3187940648,3187940691,HN +3187940692,3187940695,GT +3187940696,3187940719,HN +3187940720,3187940723,GT +3187940724,3187940727,HN +3187940728,3187940735,GT +3187940736,3187940791,HN +3187940792,3187940795,GT +3187940796,3187940847,HN +3187940848,3187940851,GT +3187940852,3187940935,HN +3187940936,3187940947,GT +3187940948,3187940975,HN +3187940976,3187940983,GT +3187940984,3187940991,HN +3187940992,3187940999,GT +3187941000,3187941003,HN +3187941004,3187941007,GT +3187941008,3187941063,HN +3187941064,3187941071,GT +3187941072,3187941079,HN +3187941080,3187941087,GT +3187941088,3187941131,HN +3187941132,3187941139,GT +3187941140,3187941191,HN +3187941192,3187941199,GT +3187941200,3187941203,HN +3187941204,3187941207,GT +3187941208,3187941375,HN +3187941376,3187941383,GT +3187941384,3187941399,HN +3187941400,3187941407,GT +3187941408,3187941415,HN +3187941416,3187941439,GT +3187941440,3187941463,HN +3187941464,3187941471,GT +3187941472,3187941503,HN +3187941504,3187941511,GT +3187941512,3187941527,HN +3187941528,3187941531,GT +3187941532,3187941591,HN +3187941592,3187941599,GT +3187941600,3187941619,HN +3187941620,3187941631,GT +3187941632,3187941659,HN +3187941660,3187941667,GT +3187941668,3187941691,HN +3187941692,3187941695,GT +3187941696,3187941715,HN +3187941716,3187941719,GT +3187941720,3187941727,HN +3187941728,3187941739,GT +3187941740,3187941743,HN +3187941744,3187941755,GT +3187941756,3187941767,HN +3187941768,3187941787,GT +3187941788,3187941791,HN +3187941792,3187941799,GT +3187941800,3187941807,HN +3187941808,3187941815,GT +3187941816,3187941831,HN +3187941832,3187941839,GT +3187941840,3187941847,HN +3187941848,3187941855,GT +3187941856,3187941863,HN +3187941864,3187941879,GT +3187941880,3187941895,HN +3187941896,3187941903,GT +3187941904,3187941919,HN +3187941920,3187941927,GT +3187941928,3187941931,HN +3187941932,3187941935,GT +3187941936,3187941959,HN +3187941960,3187941963,GT +3187941964,3187941967,HN +3187941968,3187941975,GT +3187941976,3187942023,HN +3187942024,3187942031,GT +3187942032,3187942039,HN +3187942040,3187942063,GT +3187942064,3187942087,HN +3187942088,3187942091,GT +3187942092,3187942111,HN +3187942112,3187942123,GT +3187942124,3187942127,HN +3187942128,3187942143,GT +3187942144,3187942147,HN +3187942148,3187942151,GT +3187942152,3187942163,HN +3187942164,3187942179,GT +3187942180,3187942183,HN +3187942184,3187942195,GT +3187942196,3187942207,HN +3187942208,3187942223,GT +3187942224,3187942231,HN +3187942232,3187942235,GT +3187942236,3187942239,HN +3187942240,3187942247,GT +3187942248,3187942287,HN +3187942288,3187942303,GT +3187942304,3187942327,HN +3187942328,3187942335,GT +3187942336,3187942359,HN +3187942360,3187942391,GT +3187942392,3187942403,HN +3187942404,3187942407,GT +3187942408,3187942415,HN +3187942416,3187942423,GT +3187942424,3187942439,HN +3187942440,3187942447,GT +3187942448,3187942495,HN +3187942496,3187942503,GT +3187942504,3187942527,HN +3187942528,3187942551,GT +3187942552,3187942559,HN +3187942560,3187942563,GT +3187942564,3187942579,HN +3187942580,3187942591,GT +3187942592,3187942599,HN +3187942600,3187942623,GT +3187942624,3187942627,HN +3187942628,3187942647,GT +3187942648,3187942719,HN +3187942720,3187942727,GT +3187942728,3187942767,HN +3187942768,3187942775,GT +3187942776,3187942831,HN +3187942832,3187942839,GT +3187942840,3187942867,HN +3187942868,3187942871,GT +3187942872,3187942875,HN +3187942876,3187942879,GT +3187942880,3187942935,HN +3187942936,3187942943,GT +3187942944,3187942959,HN +3187942960,3187942975,GT +3187942976,3187943015,HN +3187943016,3187943023,GT +3187943024,3187943043,HN +3187943044,3187943047,GT +3187943048,3187943087,HN +3187943088,3187943091,GT +3187943092,3187943095,HN +3187943096,3187943103,GT +3187943104,3187943271,HN +3187943272,3187943279,GT +3187943280,3187943431,HN +3187943432,3187943439,GT +3187943440,3187943455,HN +3187943456,3187943475,GT +3187943476,3187943727,HN +3187943728,3187943743,GT +3187943744,3187943791,HN +3187943792,3187943807,GT +3187943808,3187943879,HN +3187943880,3187943887,GT +3187943888,3187943911,HN +3187943912,3187943983,GT +3187943984,3187943991,HN +3187943992,3187944015,GT +3187944016,3187944031,HN +3187944032,3187944039,GT +3187944040,3187944067,HN +3187944068,3187944071,GT +3187944072,3187944075,HN +3187944076,3187944095,GT +3187944096,3187944103,HN +3187944104,3187944107,GT +3187944108,3187944111,HN +3187944112,3187944119,GT +3187944120,3187944127,HN +3187944128,3187944131,GT +3187944132,3187944135,HN +3187944136,3187944139,GT +3187944140,3187944147,HN +3187944148,3187944151,GT +3187944152,3187944159,HN +3187944160,3187944175,GT +3187944176,3187944183,HN +3187944184,3187944187,GT +3187944188,3187944207,HN +3187944208,3187944211,GT +3187944212,3187944255,HN +3187944256,3187944263,GT +3187944264,3187944271,HN +3187944272,3187944279,GT +3187944280,3187944291,HN +3187944292,3187944307,GT +3187944308,3187944311,HN +3187944312,3187944319,GT +3187944320,3187944343,HN +3187944344,3187944351,GT +3187944352,3187944359,HN +3187944360,3187944367,GT +3187944368,3187944399,HN +3187944400,3187944407,GT +3187944408,3187944415,HN +3187944416,3187944423,GT +3187944424,3187944447,HN +3187944448,3187944463,GT +3187944464,3187944479,HN +3187944480,3187944487,GT +3187944488,3187944647,HN +3187944648,3187944651,GT +3187944652,3187944663,HN +3187944664,3187944671,GT +3187944672,3187944695,HN +3187944696,3187944719,GT +3187944720,3187944727,HN +3187944728,3187944743,GT +3187944744,3187944759,HN +3187944760,3187944799,GT +3187944800,3187944803,HN +3187944804,3187944807,GT +3187944808,3187944811,HN +3187944812,3187944819,GT +3187944820,3187944823,HN +3187944824,3187944831,GT +3187944832,3187944835,HN +3187944836,3187944839,GT +3187944840,3187944843,HN +3187944844,3187944851,GT +3187944852,3187944863,HN +3187944864,3187944871,GT +3187944872,3187944883,HN +3187944884,3187944915,GT +3187944916,3187944923,HN +3187944924,3187944927,GT +3187944928,3187944931,HN +3187944932,3187944935,GT +3187944936,3187944939,HN +3187944940,3187944959,GT +3187944960,3187945063,HN +3187945064,3187945071,GT +3187945072,3187945087,HN +3187945088,3187945095,GT +3187945096,3187945143,HN +3187945144,3187945151,GT +3187945152,3187945167,HN +3187945168,3187945175,GT +3187945176,3187945471,HN +3187945472,3187945735,GT +3187945736,3187945743,HN +3187945744,3187945751,GT +3187945752,3187945759,HN +3187945760,3187945767,GT +3187945768,3187945775,HN +3187945776,3187945783,GT +3187945784,3187945799,HN +3187945800,3187945831,GT +3187945832,3187945855,HN +3187945856,3187945863,GT +3187945864,3187945871,HN +3187945872,3187945875,GT +3187945876,3187945879,HN +3187945880,3187945887,GT +3187945888,3187945895,HN +3187945896,3187945911,GT +3187945912,3187945939,HN +3187945940,3187945951,GT +3187945952,3187945967,HN +3187945968,3187945971,GT +3187945972,3187946247,HN +3187946248,3187946255,GT +3187946256,3187946319,HN +3187946320,3187946343,GT +3187946344,3187946359,HN +3187946360,3187946375,GT +3187946376,3187946383,HN +3187946384,3187946455,GT +3187946456,3187946459,HN +3187946460,3187946463,GT +3187946464,3187946471,HN +3187946472,3187946475,GT +3187946476,3187946623,HN +3187946624,3187946631,GT +3187946632,3187946743,HN +3187946744,3187946751,GT +3187946752,3187946911,HN +3187946912,3187946919,GT +3187946920,3187946935,HN +3187946936,3187946939,GT +3187946940,3187946979,HN +3187946980,3187946983,GT +3187946984,3187946991,HN +3187946992,3187946999,GT +3187947000,3187947075,HN +3187947076,3187947095,GT +3187947096,3187947135,HN +3187947136,3187947151,GT +3187947152,3187947167,HN +3187947168,3187947175,GT +3187947176,3187947231,HN +3187947232,3187947239,GT +3187947240,3187947303,HN +3187947304,3187947315,GT +3187947316,3187947447,HN +3187947448,3187947455,GT +3187947456,3187947503,HN +3187947504,3187947511,GT +3187947512,3187947599,HN +3187947600,3187947607,GT +3187947608,3187947615,HN +3187947616,3187947623,GT +3187947624,3187947687,HN +3187947688,3187947695,GT +3187947696,3187947727,HN +3187947728,3187947735,GT +3187947736,3187947775,HN +3187947776,3187947791,GT +3187947792,3187947811,HN +3187947812,3187947815,GT +3187947816,3187947847,HN +3187947848,3187947855,GT +3187947856,3187947887,HN +3187947888,3187947895,GT +3187947896,3187947903,HN +3187947904,3187947911,GT +3187947912,3187947919,HN +3187947920,3187947935,GT +3187947936,3187947991,HN +3187947992,3187947999,GT +3187948000,3187948159,HN +3187948160,3187948287,GT +3187948288,3187948327,HN +3187948328,3187948331,GT +3187948332,3187948359,HN +3187948360,3187948367,GT +3187948368,3187948387,HN +3187948388,3187948391,GT +3187948392,3187948455,HN +3187948456,3187948463,GT +3187948464,3187948471,HN +3187948472,3187948479,GT +3187948480,3187948543,HN +3187948544,3187948799,GT +3187948800,3187948951,HN +3187948952,3187948959,GT +3187948960,3187949003,HN +3187949004,3187949007,GT +3187949008,3187949055,HN +3187949056,3187949059,GT +3187949060,3187949083,HN +3187949084,3187949087,GT +3187949088,3187949155,HN +3187949156,3187949159,GT +3187949160,3187949167,HN +3187949168,3187949175,GT +3187949176,3187949203,HN +3187949204,3187949207,GT +3187949208,3187949231,HN +3187949232,3187949239,GT +3187949240,3187949263,HN +3187949264,3187949287,GT +3187949288,3187949295,HN +3187949296,3187949311,GT +3187949312,3187949567,HN +3187949568,3187953663,AN +3187957760,3187961855,CL +3187965952,3187974143,AN +3187982336,3187998719,CL +3187998720,3188006911,AR +3188015104,3188031487,HN +3188031488,3188039679,SV +3188047872,3188051967,CO +3188056064,3188064255,PA +3188064256,3188080639,VE +3188080640,3188084735,CU +3188088832,3188092927,AR +3188097024,3188105215,DO +3188105216,3188113407,CO +3188113408,3188117503,HN +3188121600,3188125695,TT +3188129792,3188146175,AR +3188146176,3188158463,CO +3188162560,3188170751,CO +3188170752,3188174847,CR +3188178944,3188187135,CR +3188187136,3188191231,AR +3188195328,3188199423,AR +3188203520,3188207615,DO +3188211712,3188228095,CL +3188228096,3188236287,PE +3188244480,3188252671,CO +3188260864,3188264959,AR +3188269056,3188273151,VE +3188277248,3188293631,CO +3188293632,3188301823,VE +3188301824,3188310015,EC +3188310016,3188326399,CO +3188326400,3188343039,CR +3188343040,3188343295,CO +3188343296,3188343807,CR +3188343808,3188344063,CO +3188344064,3188344575,CR +3188344576,3188344831,CO +3188344832,3188346367,CR +3188346368,3188346623,CO +3188346624,3188357631,CR +3188357632,3188357887,CO +3188357888,3188359167,CR +3188359168,3188400127,EC +3188400128,3188404223,AR +3188408320,3188416511,BO +3188416512,3188420607,AR +3188424704,3188432895,AR +3188441088,3188445183,AR +3188449280,3188453375,HN +3188457472,3188473855,EC +3188473856,3188482047,PE +3188482048,3188490239,AR +3188490240,3188498431,CO +3188506624,3188506879,AR +3188506880,3188513535,US +3188513536,3188513791,AR +3188513792,3188520959,US +3188520960,3188523007,AR +3188523008,3188539391,CO +3188539392,3188542207,CL +3188542208,3188542463,US +3188542464,3188543487,CL +3188547584,3188551679,CO +3188555776,3188559871,CL +3188563968,3188572159,CL +3188572160,3188576255,CO +3188580352,3188584447,AR +3188588544,3188596735,AR +3188604928,3188621311,AR +3188621312,3188625407,GT +3188629504,3188637695,AR +3188637696,3188645887,PA +3188645888,3188662271,CO +3188670464,3188674559,HN +3188678656,3188682751,AR +3188686848,3188690943,EC +3188695040,3188703231,VE +3188703232,3188711423,AR +3188719616,3188981759,AR +3188981760,3189178367,CL +3189243904,3189637119,CO +3189637120,3189694175,AR +3189694176,3189694183,AW +3189694184,3189694231,AR +3189694232,3189694239,BO +3189694240,3189768191,AR +3189768192,3190030335,PA +3190030336,3190292479,VE +3190292480,3190554623,PE +3190554624,3190816767,CL +3190816768,3191078911,AR +3191078912,3191087103,CO +3191095296,3191099391,EC +3191103488,3191107583,CO +3191111680,3191119871,PY +3191128064,3191132159,EC +3191136256,3191144447,DO +3191144448,3191152639,SV +3191152640,3191156735,NI +3191156736,3191169023,HN +3191169024,3191193599,SV +3191193600,3191209983,HN +3191209984,3191275519,CL +3191275520,3191341055,AR +3191341056,3191406591,GT +3191406592,3191427071,SV +3191427072,3191439359,GT +3191472128,3191603199,TT +3191603200,3191608831,MX +3191608832,3191609343,US +3191609344,3191610879,CO +3191610880,3191611135,US +3191611136,3191719935,CO +3191719936,3191720447,AR +3191720448,3191734015,CO +3191734016,3191734031,US +3191734032,3191734271,CO +3191865344,3191930879,UY +3191930880,3192389631,CO +3192389632,3192913919,VE +3192913920,3192930303,GY +3192946688,3192979455,DO +3192979456,3192988767,PE +3192988768,3192988775,PA +3192988776,3193044991,PE +3193044992,3193061375,CL +3193077760,3193110527,CL +3193110528,3193143295,CO +3193176064,3193241599,CO +3193307136,3193438207,SV +3193438208,3193454591,AN +3193503744,3193569279,AN +3193569280,3193576447,CO +3193576448,3193576703,EC +3193576704,3193576959,CO +3193576960,3193577215,PE +3193577216,3193592319,CO +3193592320,3193592575,EC +3193592576,3193617151,CO +3193617152,3193617407,EC +3193617408,3193628671,CO +3193628672,3193628927,EC +3193628928,3193634815,CO +3193700352,3193716735,HN +3193733120,3193765887,AR +3193765888,3193774079,TT +3193782272,3193798655,TT +3193798656,3193806847,CO +3193831424,3193864191,DO +3193864192,3193872383,EC +3193896960,3193929727,CL +3193929728,3193962495,EC +3193962496,3193987071,CL +3193995264,3194019839,CO +3194028032,3194036223,AR +3194044416,3194052607,CO +3194052608,3194056461,TT +3194056462,3194056462,US +3194056463,3194056703,TT +3194060800,3194068991,CO +3194077184,3194085375,CO +3194093568,3194126335,SR +3194126336,3194127359,GT +3194127360,3194130175,AR +3194130176,3194134527,BR +3194159104,3194163199,HN +3194163200,3194167295,GT +3194167296,3194175487,SV +3194191872,3194224639,CO +3194224640,3194290175,CL +3194355712,3194359807,AN +3194363904,3194367999,CR +3194372096,3194380287,HT +3194404864,3194413055,CO +3194413056,3194417151,CL +3194421248,3194425343,AR +3194429440,3194437631,VE +3194437632,3194441727,BO +3194445824,3194449919,CO +3194454016,3194458111,AR +3194462208,3194466303,AR +3194470400,3194474495,AR +3194478592,3194486783,AR +3194486784,3194494975,BO +3194519552,3194535935,PY +3194552320,3194568703,AR +3194617856,3194626047,NI +3194634240,3194638335,CR +3194642432,3194646527,AR +3194650624,3194654719,AR +3194654720,3194658303,US +3194658304,3194659327,AR +3194659328,3194659583,US +3194659584,3194662399,AR +3194662400,3194662655,US +3194662656,3194665471,AR +3194665472,3194665983,US +3194665984,3194666495,AR +3194666496,3194667007,US +3194683392,3194687487,CU +3194691584,3194695679,BO +3194699776,3194703871,EC +3194707968,3194716159,AR +3194716160,3194720255,HN +3194724352,3194728447,PA +3194732544,3194736639,AR +3194748928,3194757119,UY +3194781696,3194798079,CL +3194814464,3194822655,AR +3194847232,3194863615,CO +3194863616,3194871807,HN +3194880000,3194888191,DO +3194912768,3194920959,CL +3194945536,3194953727,GT +3194978304,3194986495,PA +3194994688,3195002879,AR +3195011072,3195019263,AR +3195043840,3195052031,CO +3195535360,3195539455,SV +3195543552,3195547647,PE +3195551744,3195555839,EC +3195559936,3195564031,AR +3195568128,3195572223,CO +3195576320,3195580415,CL +3195584512,3195592703,HT +3195592704,3195596799,PA +3195600896,3195609087,CL +3195633664,3195637759,CO +3195641856,3195645951,PY +3195650048,3195654143,GT +3195658240,3195662335,VE +3195666432,3195670527,AR +3195674624,3195678719,AR +3195682816,3195686911,AR +3195691008,3195695103,DO +3196059648,3196092415,CO +3196092416,3196125183,PY +3196125184,3196157951,BO +3196190720,3196207103,HN +3196256256,3196289023,EC +3196321792,3196583935,UY +3196583936,3196690687,AR +3196690688,3196690943,UY +3196690944,3196807359,AR +3196807360,3196807367,AW +3196807368,3196846079,AR +3196846080,3196874431,PA +3196874432,3196874447,PG +3196874448,3196977151,PA +3196977152,3197042687,VE +3197042688,3197059071,CO +3197108224,3197370367,CO +3197370368,3197501439,GT +3197566976,3197599743,CL +3197632512,3197698047,EC +3197698048,3197730815,VE +3197763584,3197894655,EC +3197894656,3198156799,CO +3198156800,3198484479,CL +3198484480,3198500863,CO +3198517248,3198550015,CO +3198550016,3198681087,DO +3198681088,3198877695,VE +3198943232,3199467519,AR +3199467520,3199488255,US +3199488256,3199488511,AR +3199488512,3199488767,US +3199488768,3199489023,AR +3199489024,3199489279,US +3199489280,3199489535,AR +3199489536,3199490303,US +3199490304,3199491071,AR +3199491072,3199493375,US +3199493376,3199493631,AR +3199493632,3199504383,US +3199504384,3199505663,AR +3199505664,3199508223,US +3199508224,3199508479,AR +3199508480,3199511039,US +3199511040,3199511551,AR +3199511552,3199520767,US +3199520768,3199522815,AR +3199522816,3199523327,US +3199523328,3199530495,AR +3199530496,3199532031,US +3199532032,3199533055,AR +3199533056,3199549439,BO +3199598592,3199631359,CO +3199664128,3199713279,AR +3199729664,3199762431,NI +3199795200,3199815679,AN +3199860736,3199909887,BO +3199926272,3199959039,PE +3199991808,3200385023,AR +3200516096,3200548863,CL +3200581632,3200598015,BZ +3200614400,3200647167,AR +3200647168,3201302527,VE +3201302528,3201433599,CL +3201433600,3201435135,AR +3201435136,3201435263,US +3201435264,3201435559,AR +3201435560,3201435567,US +3201435568,3201441791,AR +3201441792,3201442047,US +3201442048,3201466367,AR +3201564672,3201630207,NI +3201630208,3201695743,TT +3201695744,3201728511,EC +3201826816,3201867775,AR +3201867776,3201871871,PE +3201871872,3201875967,AR +3201875968,3201880063,CO +3201880064,3201884159,EC +3201884160,3201888255,AR +3201888256,3201892351,VE +3201957888,3202023423,PA +3202088960,3202154495,AR +3202220032,3202351103,PE +3202351104,3202444455,AR +3202444456,3202444463,BR +3202444464,3202495495,AR +3202495496,3202495503,AW +3202495504,3202620463,AR +3202620464,3202620471,AW +3202620472,3202647039,AR +3202647040,3202647295,AW +3202647296,3202875391,AR +3202875392,3203137535,PE +3203399680,3203432447,CO +3203465216,3203476479,CR +3203476480,3203476735,CO +3203476736,3203476991,CR +3203476992,3203477503,CO +3203477504,3203481599,CR +3203497984,3203509247,CR +3203509248,3203511295,CO +3203511296,3203530751,CR +3203530752,3203531775,CO +3203531776,3203532031,CR +3203532032,3203532287,CO +3203532288,3203533055,PA +3203533056,3203533567,CO +3203533568,3203533823,PA +3203533824,3203547135,CO +3203547136,3203547647,PA +3203547648,3203596287,CO +3203661824,3203923967,AR +3203923968,3204055039,CO +3204186112,3204448255,CO +3221225472,3221410411,US +3221410412,3221410412,FR +3221410413,3221422079,US +3221487616,3221553151,US +3221553664,3221555967,US +3221556224,3221560319,US +3221560320,3221561087,GB +3221561344,3221562367,US +3221562368,3221562623,SE +3221562624,3221564927,US +3221565184,3221565951,US +3221565952,3221566207,SE +3221566464,3221567743,US +3221568256,3221568511,FR +3221568768,3221569279,FR +3221569280,3221570559,US +3221571072,3221576191,US +3221576192,3221576447,KR +3221576448,3221577727,US +3221577728,3221577983,CA +3221577984,3221578239,IT +3221578240,3221579775,US +3221580032,3221589503,US +3221589504,3221589759,FR +3221589760,3221590015,US +3221590016,3221590271,CA +3221590272,3221590527,DE +3221590528,3221591807,US +3221592064,3221592575,US +3221593088,3221594623,US +3221594624,3221594879,AT +3221594880,3221605119,US +3221605376,3221605887,CA +3221605888,3221607167,US +3221607424,3221608447,US +3221608448,3221608703,JP +3221608704,3221609727,US +3221610240,3221614335,US +3221614336,3221614591,GB +3221614592,3221614847,AU +3221615104,3221618175,US +3221618176,3221618431,GB +3221618688,3221621247,US +3221621248,3221621503,GB +3221621504,3221627391,US +3221627392,3221627647,FR +3221627648,3221633279,US +3221633280,3221633535,CH +3221633536,3221633791,US +3221633792,3221634047,CH +3221634048,3221636607,US +3221636608,3221636863,CH +3221636864,3221637119,US +3221637120,3221637375,DE +3221637376,3221638143,US +3221638144,3221638399,DE +3221638400,3221640191,US +3221640192,3221640447,NL +3221640448,3221642495,US +3221642496,3221642751,DE +3221642752,3221647103,US +3221647104,3221647359,FR +3221647360,3221650943,US +3221650944,3221651199,GB +3221651200,3221654783,US +3221654784,3221655039,FR +3221655040,3221663743,US +3221663744,3221663999,DE +3221664000,3221664255,NL +3221664256,3221664511,US +3221664512,3221664767,GB +3221664768,3221866495,US +3221866752,3221880575,US +3221880832,3222011903,US +3222012160,3222012415,GB +3222012672,3222016511,US +3222016768,3222017023,US +3222017536,3222017791,US +3222018048,3222018559,US +3222018816,3222019839,US +3222020096,3222022399,US +3222022656,3222023423,US +3222023936,3222024191,IT +3222024192,3222024959,US +3222025216,3222025727,US +3222025728,3222025983,NL +3222026240,3222027775,US +3222027776,3222028031,CA +3222028032,3222030335,US +3222030336,3222030847,GB +3222030848,3222031359,US +3222031360,3222031615,AU +3222031616,3222031871,IT +3222031872,3222032639,US +3222032640,3222032895,DE +3222032896,3222036479,US +3222036480,3222036735,FR +3222036736,3222036991,US +3222036992,3222037247,CA +3222037248,3222037503,GB +3222037504,3222038271,US +3222039808,3222044671,US +3222044928,3222045183,CA +3222045184,3222048767,US +3222049024,3222049279,US +3222050304,3222051327,US +3222051584,3222055935,US +3222056192,3222056447,US +3222056448,3222059007,CA +3222059008,3222061055,US +3222061056,3222061823,IT +3222061824,3222066943,US +3222066944,3222067199,CA +3222067200,3222067455,US +3222067456,3222067967,CH +3222068224,3222068479,US +3222068992,3222071039,US +3222071040,3222071295,GB +3222071296,3222071551,PT +3222071552,3222072063,US +3222072064,3222072319,SE +3222072576,3222075135,US +3222075136,3222075391,CH +3222075392,3222075903,US +3222076160,3222274047,US +3222292480,3222292735,US +3222292992,3222305535,US +3222305536,3222309119,SE +3222309376,3222313727,SE +3222313728,3222316799,CH +3222316800,3222318591,US +3222318848,3222319615,US +3222319616,3222320127,JP +3222320128,3222320383,AU +3222320384,3222320895,US +3222320896,3222326015,NL +3222326016,3222326527,US +3222326528,3222339583,CA +3222339584,3222455039,US +3222455040,3222455295,GB +3222455296,3222868735,US +3222868736,3222868991,DE +3222868992,3222869503,US +3222869504,3222869759,GB +3222869760,3222893311,US +3222893824,3222931711,US +3222931968,3222934527,US +3222934784,3222936319,US +3222936576,3222940927,CH +3222940928,3222941183,GB +3222941184,3222941695,CH +3222941696,3222952703,US +3222952704,3222952959,JP +3222952960,3222953215,US +3222953216,3222953727,JP +3222953728,3222953983,US +3222953984,3222954239,JP +3222954240,3222954495,US +3222955008,3222956031,US +3222956288,3222962431,FI +3222963456,3222964223,FI +3222964224,3222964479,US +3222967040,3222968831,US +3222968832,3222973951,NL +3222973952,3222979071,DE +3222979072,3222983167,US +3222983168,3222983935,CA +3222983936,3222984447,US +3222984448,3222988543,AU +3222988544,3222988799,PT +3222988800,3222989055,AU +3222989056,3222989311,US +3222989312,3222989567,GB +3222989568,3222989823,CA +3222989824,3222990079,PT +3222990080,3222990335,NL +3222990336,3222990591,AT +3222990592,3222990847,PT +3222990848,3222994687,US +3222994944,3223191551,US +3223201024,3223201279,US +3223202816,3223203071,US +3223204352,3223204607,US +3223205120,3223205375,US +3223207168,3223207423,US +3223214848,3223215871,US +3223216128,3223216383,US +3223217152,3223217407,US +3223219200,3223219455,US +3223220480,3223220735,US +3223220992,3223221247,US +3223222784,3223223039,US +3223223552,3223223807,US +3223227904,3223228159,CA +3223229184,3223229695,US +3223229696,3223229951,CA +3223240448,3223240703,US +3223242752,3223243007,US +3223243264,3223243519,CA +3223244288,3223245311,US +3223249408,3223249663,CA +3223254784,3223255295,US +3223257088,3223258623,US +3223258624,3223258879,CA +3223258880,3223260671,US +3223260672,3223260927,DE +3223261184,3223262975,US +3223262976,3223263231,BE +3223263232,3223263743,US +3223263744,3223263999,GB +3223264000,3223264255,FR +3223264256,3223265023,US +3223265024,3223265279,GB +3223265280,3223267327,US +3223267328,3223267583,BE +3223267584,3223269119,US +3223269376,3223269631,US +3223272960,3223273215,GB +3223273216,3223280383,US +3223280640,3223280895,US +3223281408,3223283199,US +3223283200,3223283455,DE +3223283968,3223284991,US +3223285504,3223286783,US +3223286784,3223289087,JP +3223294208,3223297279,US +3223297536,3223298815,US +3223299072,3223299327,US +3223299584,3223301119,NL +3223301120,3223302399,US +3223303168,3223303423,CA +3223303424,3223303679,US +3223305984,3223307519,US +3223307520,3223310079,JP +3223310080,3223310335,US +3223310848,3223311103,US +3223311104,3223311359,FR +3223311360,3223311871,US +3223312128,3223314431,US +3223314432,3223314687,CA +3223314688,3223315455,US +3223315712,3223316223,US +3223316224,3223316479,NL +3223316480,3223316991,US +3223317248,3223317759,US +3223318016,3223319039,US +3223319808,3223321343,US +3223321600,3223321855,FR +3223321856,3223322367,US +3223322624,3223388159,US +3223388672,3223390719,US +3223391232,3223391999,US +3223392000,3223392255,FR +3223392256,3223392511,GB +3223393024,3223394047,US +3223396608,3223396863,US +3223397120,3223397375,US +3223397376,3223397631,NL +3223397632,3223410431,US +3223410432,3223416831,CH +3223416832,3223417087,US +3223417088,3223417599,FR +3223417600,3223418367,US +3223418368,3223420927,CH +3223420928,3223421439,US +3223421440,3223421695,GB +3223421696,3223421951,NL +3223422464,3223422719,US +3223422720,3223422975,JP +3223423232,3223423743,US +3223424000,3223424767,US +3223424768,3223425535,FR +3223425792,3223430911,FR +3223431424,3223432191,FR +3223433216,3223435007,FR +3223435008,3223437055,US +3223437312,3223447551,CH +3223447552,3223447807,US +3223447808,3223449599,NL +3223449600,3223452671,US +3223452928,3223453183,US +3223453184,3223453439,DE +3223458560,3223458815,GB +3223460096,3223460351,US +3223462656,3223462911,US +3223466496,3223466751,GB +3223471616,3223471871,CA +3223471872,3223472383,US +3223476736,3223476991,US +3223481088,3223481343,SE +3223483392,3223483647,NL +3223490816,3223491071,US +3223496960,3223497215,US +3223499520,3223499775,FI +3223500032,3223503871,CA +3223504640,3223504895,CA +3223507968,3223508223,US +3223508480,3223508735,US +3223513344,3223513599,US +3223514880,3223515135,US +3223516160,3223516415,US +3223516928,3223517183,US +3223519232,3223524351,DE +3223524352,3223534335,US +3223534336,3223534591,AU +3223534592,3223534847,US +3223535104,3223535359,US +3223535360,3223537919,DE +3223537920,3223540991,US +3223541248,3223542271,US +3223542272,3223542527,DE +3223542528,3223543295,US +3223543296,3223543551,GB +3223543552,3223545855,US +3223546112,3223546879,US +3223546880,3223547135,GB +3223547136,3223551743,US +3223552000,3223552511,US +3223552512,3223553535,NL +3223553536,3223554559,US +3223554560,3223554815,GB +3223555328,3223556095,US +3223556096,3223556351,CA +3223556352,3223556607,US +3223556608,3223556863,IT +3223556864,3223557375,US +3223557376,3223558655,DE +3223558656,3223559423,US +3223559936,3223563263,US +3223563264,3223563519,GB +3223563520,3223565567,US +3223565824,3223566079,US +3223566080,3223568639,NL +3223568640,3223569663,US +3223569664,3223570175,GB +3223571456,3223571711,US +3223571712,3223572223,GB +3223572224,3223572479,IE +3223572480,3223577855,US +3223577856,3223578111,DE +3223578112,3223580671,US +3223580672,3223581951,AT +3223581952,3223582207,US +3223582208,3223582463,PT +3223582464,3223582719,NL +3223582720,3223582975,AU +3223583488,3223583743,US +3223584000,3223584511,US +3223584768,3223650303,SE +3223650304,3223715839,CH +3223715840,3223781375,DK +3223781376,3223823871,US +3223823872,3223824127,AT +3223824128,3223846911,US +3223848704,3223852799,US +3223853312,3223853567,US +3223854336,3223854591,US +3223857920,3223858175,US +3223858944,3223859455,US +3223859968,3223860223,US +3223860480,3223860991,US +3223862528,3223862783,US +3223863552,3223863807,US +3223864576,3223867647,FI +3223874816,3223875071,US +3223876608,3223876863,US +3223883520,3223883775,US +3223886592,3223887103,US +3223887616,3223887871,US +3223898368,3223898623,US +3223902464,3223902719,CA +3223905280,3223905535,FI +3223909632,3223910143,US +3223910400,3223910911,US +3223911936,3223912191,CA +3223912448,3223938559,US +3223938816,3223946239,GB +3223946240,3223947519,CH +3223947520,3223947775,US +3223948288,3223948543,NL +3223948544,3223949823,CH +3223949824,3223950079,AU +3223950080,3223950335,DE +3223950336,3223950591,CA +3223950592,3223953663,CH +3223953664,3223955967,US +3223955968,3223956223,TH +3223956224,3223957759,US +3223958016,3223963135,JP +3223963136,3223963647,US +3223963904,3223964159,CA +3223964160,3223964415,US +3223964416,3223964671,AU +3223964672,3223965183,US +3223965184,3223965439,ID +3223965440,3223966207,US +3223966208,3223966463,GB +3223966464,3223967743,US +3223968000,3223968255,US +3223968256,3223968511,IT +3223968512,3223970303,US +3223970560,3223970815,DE +3223971072,3223975935,US +3223976192,3223977983,US +3223978240,3223978495,DE +3223978752,3223979263,US +3223979264,3223979775,CA +3223979776,3223988735,US +3223988736,3223990271,CH +3223990272,3223991295,US +3223991296,3223991551,AU +3223991552,3223991807,GB +3223991808,3223992063,CA +3223992064,3223993343,US +3223993344,3223994111,AU +3223994112,3223994623,DE +3223994624,3223994879,NO +3223994880,3223995391,US +3223995392,3223995647,CA +3223995648,3223996159,US +3223997184,3223999487,US +3223999488,3224000255,JP +3224000256,3224000511,GB +3224000512,3224001023,US +3224001024,3224001279,CA +3224001280,3224002559,US +3224002816,3224003327,US +3224003584,3224003839,GB +3224003840,3224004095,US +3224004096,3224004351,FR +3224004352,3224005631,JP +3224005632,3224006143,US +3224006400,3224006655,US +3224006912,3224012031,NL +3224012032,3224014591,US +3224014592,3224014847,DE +3224014848,3224015615,US +3224015872,3224016639,US +3224016640,3224016895,AU +3224016896,3224017663,US +3224017920,3224022271,US +3224023808,3224024063,US +3224024064,3224029695,CH +3224029696,3224030463,CA +3224030720,3224030975,CA +3224030976,3224038655,US +3224038656,3224038911,JP +3224038912,3224039679,US +3224039936,3224040959,US +3224041216,3224042239,US +3224042496,3224042751,US +3224042752,3224043007,DE +3224043008,3224043263,US +3224043776,3224084991,US +3224084992,3224087551,SE +3224087552,3224088063,US +3224088064,3224088319,JP +3224088320,3224090879,US +3224090880,3224091135,AU +3224091648,3224091903,US +3224091904,3224092159,JP +3224092416,3224092671,US +3224092672,3224093951,CH +3224093952,3224094207,US +3224094208,3224094463,AU +3224094464,3224094975,US +3224094976,3224095487,JP +3224095488,3224096255,US +3224096512,3224097279,AU +3224097280,3224097535,NL +3224097536,3224097791,US +3224097792,3224098047,NL +3224098048,3224098559,US +3224098816,3224099583,US +3224099584,3224099839,CA +3224099840,3224100607,US +3224101120,3224101375,US +3224101376,3224102399,AU +3224103424,3224103679,GB +3224103680,3224104447,US +3224104704,3224104959,AU +3224104960,3224105471,US +3224105728,3224106495,US +3224106752,3224108799,US +3224109056,3224119551,DE +3224119552,3224126463,FR +3224127232,3224129791,FR +3224129792,3224132351,DE +3224132352,3224170495,US +3224170496,3224173567,SE +3224173568,3224174335,US +3224174592,3224258047,US +3224258048,3224258303,FI +3224258304,3224258559,BE +3224258560,3224305663,US +3224305664,3224367615,JP +3224367616,3224368127,US +3224368128,3224369663,CH +3224369664,3224370431,US +3224370688,3224370943,US +3224371200,3224379135,US +3224379136,3224379391,DE +3224379392,3224392191,US +3224394752,3224396287,US +3224396288,3224396543,FR +3224396544,3224397055,US +3224397824,3224398079,US +3224398336,3224398591,US +3224398592,3224398847,DE +3224398848,3224399103,US +3224399104,3224399615,AU +3224399616,3224406015,US +3224406272,3224406527,US +3224406784,3224407039,US +3224407296,3224407551,CA +3224407808,3224408319,US +3224408320,3224408575,DE +3224408576,3224424959,US +3224425216,3224427007,US +3224427776,3224428287,US +3224428544,3224428799,DE +3224428800,3224430079,US +3224430336,3224430591,DE +3224430592,3224430847,US +3224431104,3224431359,CA +3224431360,3224431615,US +3224432128,3224432383,US +3224433152,3224433407,US +3224433664,3224434687,US +3224434688,3224434943,AU +3224434944,3224435967,US +3224436224,3224436479,US +3224436736,3224502271,FI +3224502272,3224567807,JP +3224567808,3224571903,NO +3224571904,3224580095,JP +3224580352,3224615935,JP +3224616192,3224616959,JP +3224617472,3224629247,JP +3224629504,3224633343,JP +3224633344,3224646399,DE +3224646400,3224651775,US +3224651776,3224652287,AU +3224652800,3224660991,US +3224660992,3224661247,CA +3224661504,3224662527,US +3224663040,3224663551,US +3224663808,3224671999,JP +3224672000,3224672255,US +3224672256,3224672511,NL +3224672512,3224673791,US +3224674048,3224674559,DE +3224674560,3224674815,GB +3224675072,3224675839,US +3224676864,3224677119,US +3224677120,3224678655,AU +3224678656,3224680703,US +3224680704,3224680959,AU +3224680960,3224681471,US +3224682752,3224683519,US +3224683520,3224684031,AU +3224684032,3224689919,US +3224689920,3224690687,NL +3224690688,3224691455,US +3224691968,3224692735,US +3224692736,3224692991,DZ +3224692992,3224694527,US +3224694528,3224694783,CA +3224694784,3224695039,US +3224695808,3224697343,US +3224697856,3224698111,US +3224698112,3224698367,GB +3224698368,3224698623,FR +3224698880,3224725247,US +3224725248,3224725503,DE +3224725504,3224725759,CH +3224725760,3224772351,US +3224772352,3224777983,DE +3224778240,3224785151,DE +3224785152,3224787967,US +3224788480,3224791039,US +3224791040,3224791295,DE +3224791296,3224791807,AU +3224791808,3224793343,US +3224793344,3224793599,DE +3224793600,3224793855,US +3224793856,3224795391,DK +3224795392,3224795647,CA +3224795648,3224795903,CH +3224796160,3224796415,US +3224796416,3224797439,DE +3224797440,3224797695,US +3224797696,3224797951,NZ +3224797952,3224798207,US +3224798208,3224798463,CH +3224798464,3224798975,US +3224798976,3224799231,AU +3224799488,3224799743,AU +3224799744,3224799999,US +3224800000,3224800255,DE +3224800512,3224816639,FR +3224816896,3224820735,FR +3224820736,3224820991,AT +3224820992,3224821247,DE +3224821248,3224822015,US +3224822016,3224822271,SE +3224822272,3224822527,US +3224822784,3224823039,US +3224823296,3224826367,US +3224826368,3224826623,CA +3224826624,3224826879,US +3224826880,3224827135,CH +3224827136,3224827391,GB +3224827392,3224827647,US +3224827648,3224827903,JP +3224827904,3224828671,US +3224828672,3224828927,AU +3224829184,3224829439,US +3224829440,3224829695,DE +3224830208,3224850943,US +3224851200,3224851455,US +3224851456,3224851711,DE +3224851968,3224852735,US +3224852736,3224852991,DE +3224852992,3224854527,US +3224854784,3224855039,US +3224855040,3224855551,AU +3224855552,3224855807,US +3224855808,3224856063,IT +3224856064,3224856575,US +3224856832,3224857087,NL +3224857088,3224857855,US +3224858112,3224858367,JP +3224858368,3224858623,US +3224858624,3224858879,AU +3224858880,3224859391,US +3224859392,3224859647,NL +3224859648,3224860159,US +3224860160,3224860415,JP +3224860928,3224862719,US +3224862976,3224863231,NL +3224863488,3224863743,US +3224863744,3224863999,GB +3224864000,3224878079,US +3224878080,3224878335,DE +3224878336,3224878591,US +3224878592,3224878847,AU +3224879360,3224879615,GB +3224879616,3224879871,CA +3224879872,3224880383,US +3224880384,3224880639,DE +3224880640,3224880895,AU +3224880896,3224881151,US +3224881408,3224882431,US +3224882688,3224882943,CA +3224882944,3224883455,US +3224883456,3224883711,AU +3224883712,3224884223,US +3224884224,3224884479,GB +3224884480,3224884991,US +3224885248,3224885503,CA +3224885760,3224886015,US +3224886272,3224886527,JP +3224886528,3224887295,US +3224887296,3224887551,CA +3224887808,3224889087,US +3224889344,3224889599,AU +3224889600,3224890879,US +3224890880,3224891135,JP +3224891136,3224891647,US +3224892160,3224892415,CA +3224892416,3224892671,DE +3224892928,3224893183,US +3224893440,3224893951,US +3224895488,3224900607,US +3224900608,3224900863,FR +3224900864,3224921087,US +3224921088,3224921343,FI +3224921344,3224928255,US +3224928256,3224928511,FI +3224928512,3225026559,US +3225026816,3225028863,US +3225028864,3225031423,JP +3225031424,3225033727,US +3225033728,3225035775,LU +3225035776,3225037055,US +3225037056,3225049599,FI +3225051392,3225052671,JP +3225052672,3225056767,US +3225057024,3225057535,US +3225057536,3225057791,CA +3225057792,3225060095,US +3225060608,3225061631,AU +3225064704,3225075967,US +3225076224,3225076479,CA +3225076480,3225076991,US +3225076992,3225077247,SE +3225077504,3225081087,US +3225081088,3225081343,CA +3225081600,3225082367,US +3225082368,3225082623,IT +3225082880,3225084671,US +3225084672,3225085439,NL +3225085440,3225089279,US +3225089280,3225089535,CA +3225089536,3225091071,US +3225091584,3225091839,US +3225092096,3225419775,US +3225420032,3225420287,US +3225423872,3225424383,US +3225426944,3225427199,AT +3225429504,3225429759,CA +3225431552,3225433087,US +3225437184,3225437695,US +3225442304,3225442559,US +3225444352,3225444607,US +3225445376,3225446399,BE +3225451776,3225452031,SE +3225459968,3225460479,US +3225460480,3225460735,CA +3225460992,3225462015,CA +3225470464,3225470719,US +3225471488,3225471743,DE +3225471744,3225472511,US +3225477632,3225480191,US +3225485568,3225498111,US +3225498368,3225503487,NL +3225503488,3225505535,US +3225505792,3225506047,US +3225506304,3225508863,AU +3225508864,3225509631,CH +3225509632,3225509887,US +3225509888,3225510143,NL +3225510144,3225518591,US +3225518592,3225518847,AU +3225518848,3225519103,IT +3225519104,3225519359,GB +3225519872,3225520639,US +3225520896,3225521151,DE +3225521152,3225522175,US +3225522176,3225522943,GB +3225522944,3225524223,US +3225524224,3225524479,VE +3225524480,3225524735,GB +3225529088,3225529343,US +3225529600,3225530367,US +3225530368,3225530623,PR +3225530624,3225530879,US +3225531136,3225531647,US +3225531904,3225532159,AU +3225532160,3225535999,CH +3225536000,3225539839,US +3225540096,3225540863,US +3225540864,3225541119,AU +3225541120,3225541375,US +3225541376,3225543935,GB +3225547776,3225548543,US +3225548800,3225549055,NZ +3225549056,3225549311,US +3225549312,3225549567,AU +3225549568,3225550591,US +3225550848,3225616383,DK +3225616640,3225616895,AU +3225617152,3225617407,IE +3225617408,3225617663,GB +3225617920,3225618175,US +3225618432,3225618687,US +3225618688,3225618943,CA +3225619200,3225619455,US +3225619456,3225619711,AU +3225619712,3225622527,US +3225626368,3225626623,GB +3225626880,3225627391,US +3225627392,3225627647,GB +3225627648,3225627903,US +3225627904,3225628159,CA +3225628160,3225628415,US +3225628416,3225628671,GB +3225628672,3225629183,US +3225629184,3225629439,GB +3225629440,3225629695,US +3225629696,3225629951,GB +3225629952,3225630207,US +3225630464,3225630719,DE +3225630720,3225631231,US +3225631232,3225631487,SE +3225631488,3225632767,US +3225633536,3225633791,US +3225634048,3225634815,US +3225635072,3225635583,US +3225635840,3225636095,PT +3225636096,3225636607,US +3225636608,3225636863,ES +3225636864,3225637887,US +3225637888,3225638399,AU +3225638400,3225638655,US +3225638656,3225638911,GB +3225639424,3225640447,US +3225640448,3225640703,GB +3225640704,3225641983,US +3225641984,3225643263,GB +3225643264,3225643775,CA +3225643776,3225649919,US +3225650176,3225650943,US +3225650944,3225651199,GB +3225651200,3225657087,US +3225658624,3225659135,US +3225659136,3225659391,DE +3225659392,3225659647,NZ +3225659904,3225660159,DE +3225660160,3225660415,AU +3225660672,3225663743,US +3225664000,3225664511,US +3225664768,3225669887,DE +3225669888,3225671935,US +3225671936,3225672191,AU +3225672192,3225672447,DE +3225672448,3225672703,US +3225672704,3225673215,NL +3225673472,3225673727,IE +3225673984,3225675263,US +3225675264,3225676287,DE +3225676288,3225679871,US +3225679872,3225680127,AU +3225680128,3225680383,GR +3225680640,3225681151,US +3225681408,3225681663,US +3225681920,3225682943,DE +3225682944,3225683199,AT +3225683200,3225687039,DE +3225687040,3225687807,US +3225687808,3225688063,GB +3225688320,3225689343,US +3225689600,3225689855,US +3225689856,3225694975,NL +3225695232,3225695487,US +3225695488,3225701119,CA +3225701120,3225701375,US +3225701376,3225709567,NO +3225709568,3225710079,US +3225710080,3225710591,JP +3225710592,3225711615,US +3225712128,3225714175,US +3225715456,3225715711,CA +3225715712,3225715967,AU +3225715968,3225716991,US +3225716992,3225717247,CA +3225717504,3225717759,AU +3225717760,3225720063,US +3225720576,3225721343,GB +3225721344,3225722111,US +3225722624,3225723647,US +3225724160,3225725439,DE +3225725440,3225725695,GB +3225725696,3225726207,AU +3225726208,3225726463,US +3225726464,3225726719,GB +3225726720,3225726975,US +3225726976,3225727231,IT +3225727232,3225727487,US +3225727744,3225727999,AU +3225728000,3225728511,US +3225728512,3225728767,NL +3225728768,3225729023,US +3225729024,3225729279,CA +3225729280,3225729535,US +3225729536,3225729791,PT +3225729792,3225730047,US +3225730304,3225730559,US +3225730816,3225733887,US +3225734144,3225735167,US +3225735424,3225735679,PT +3225735680,3225735935,US +3225735936,3225737215,DE +3225737216,3225737471,PT +3225737472,3225738495,US +3225738496,3225738751,PT +3225738752,3225739263,US +3225739264,3225739519,PT +3225739520,3225740543,US +3225740544,3225740799,CA +3225740800,3225741055,NL +3225741056,3225741823,US +3225742080,3225745919,JP +3225745920,3225746687,NL +3225746688,3225746943,US +3225746944,3225747199,DE +3225747456,3225747711,US +3225752832,3225753087,US +3225759232,3225759487,US +3225763840,3225764095,BE +3225766400,3225766655,CA +3225767936,3225768191,US +3225768960,3225769215,US +3225773312,3225773567,CA +3225776128,3225776383,US +3225777152,3225777407,AU +3225777408,3225777663,US +3225780224,3225780479,US +3225783296,3225783551,US +3225783808,3225784063,US +3225785600,3225788159,CA +3225796096,3225796351,US +3225806080,3225806847,US +3225807360,3225807615,DE +3225810688,3225810943,US +3225812992,3225827071,FR +3225827072,3225827327,US +3225827328,3225843711,FR +3225843712,3225846527,US +3225846784,3225847039,US +3225847040,3225847551,TR +3225847552,3225847807,AU +3225847808,3225848063,IT +3225848064,3225848831,US +3225848832,3225853951,DE +3225853952,3225854719,US +3225855232,3225857023,US +3225857024,3225857279,CA +3225857280,3225857535,US +3225857536,3225857791,AU +3225857792,3225858047,US +3225858048,3225858559,CA +3225858560,3225858815,US +3225858816,3225860095,JP +3225860096,3225861887,US +3225862144,3225867775,US +3225868032,3225868287,US +3225868288,3225868543,AU +3225868544,3225869055,US +3225869056,3225869311,AU +3225869568,3225870335,US +3225870336,3225870591,CA +3225870592,3225873663,US +3225873920,3225874943,US +3225874944,3225875199,GB +3225875456,3225875967,US +3225876480,3225878271,US +3225878528,3225880319,SE +3225880320,3225880575,US +3225880576,3225944063,SE +3225944832,3226008831,TW +3226008832,3226009343,US +3226009856,3226010879,US +3226010880,3226011135,CA +3226011136,3226012415,US +3226012672,3226012927,AU +3226012928,3226014207,US +3226014464,3226014975,GB +3226014976,3226015231,NZ +3226015232,3226015487,AU +3226015744,3226016255,ID +3226016256,3226018303,US +3226018304,3226018559,DE +3226018560,3226021119,CH +3226021120,3226023423,US +3226023680,3226026495,US +3226026496,3226026751,AU +3226026752,3226030079,US +3226030592,3226064383,US +3226064640,3226066687,US +3226066944,3226067455,US +3226067456,3226067711,BE +3226067712,3226068223,US +3226068224,3226068479,GB +3226068480,3226068991,US +3226075136,3226107647,US +3226110208,3226110719,US +3226110720,3226128639,AU +3226128640,3226131455,US +3226140928,3226143487,CA +3226143744,3226156543,CA +3226156800,3226167807,CA +3226168064,3226175231,CA +3226175744,3226188543,CA +3226189056,3226189311,CA +3226189568,3226189823,CA +3226191360,3226191615,US +3226191872,3226194175,CA +3226194432,3226194687,CA +3226194944,3226201855,CA +3226201856,3226202111,US +3226202112,3226205439,CA +3226205440,3226205695,AE +3226205696,3226205951,CA +3226207744,3226215423,GB +3226215424,3226236159,US +3226237184,3226237439,US +3226237440,3226237695,AU +3226237696,3226240255,DE +3226240512,3226250495,DE +3226250496,3226251263,US +3226251264,3226251519,DE +3226251520,3226252287,US +3226252544,3226253567,US +3226253824,3226267903,US +3226267904,3226268159,DE +3226268160,3226268415,PT +3226268416,3226268927,AT +3226268928,3226269951,DE +3226269952,3226270719,US +3226270720,3226271487,JP +3226272000,3226273791,US +3226273792,3226274047,AU +3226274048,3226274559,US +3226274560,3226274815,CH +3226274816,3226276095,US +3226276096,3226276351,AU +3226276352,3226276863,US +3226277632,3226283519,US +3226283520,3226291199,CA +3226291200,3226300159,US +3226300416,3226300927,US +3226300928,3226301439,DE +3226301440,3226302463,US +3226302464,3226303487,FI +3226303488,3226305535,US +3226305536,3226307327,GB +3226307328,3226307583,US +3226307584,3226308095,ES +3226308096,3226308863,US +3226309120,3226316799,US +3226318080,3226318335,US +3226319360,3226319615,US +3226320896,3226331903,US +3226337536,3226365439,US +3226365440,3226365951,DE +3226365952,3226374143,US +3226374144,3226375423,DE +3226375424,3226468351,US +3226470656,3226473471,US +3226473472,3226473983,PT +3226473984,3226474495,US +3226474496,3226474751,CL +3226475264,3226475519,US +3226475776,3226476287,US +3226476288,3226479359,CH +3226479360,3226479871,US +3226480128,3226480383,GB +3226480384,3226481407,US +3226481408,3226481663,DE +3226481664,3226483199,US +3226483968,3226484479,US +3226484736,3226487295,US +3226488064,3226488831,US +3226489088,3226490879,US +3226491904,3226492927,US +3226521344,3226521855,US +3226521856,3226522111,BR +3226522112,3226523135,US +3226523392,3226533631,US +3226535936,3226536191,US +3226546176,3226546431,US +3226548992,3226549247,BE +3226549504,3226550015,GB +3226551040,3226551807,US +3226552832,3226553087,US +3226555648,3226555903,CA +3226556416,3226556671,US +3226558720,3226558975,US +3226561792,3226562047,NO +3226563072,3226563327,US +3226564864,3226565119,DE +3226565376,3226565631,FI +3226569984,3226570239,US +3226574848,3226575103,FI +3226576384,3226576639,US +3226580480,3226581247,FI +3226582528,3226582783,US +3226583040,3226583295,US +3226583552,3226583807,SE +3226592768,3226593023,DE +3226593792,3226594047,GB +3226598400,3226598911,US +3226599424,3226625535,US +3226625792,3226626047,US +3226626048,3226626303,CA +3226626304,3226627327,US +3226627584,3226629375,US +3226629376,3226629631,CA +3226629632,3226630399,US +3226630400,3226630655,GB +3226630912,3226631167,US +3226631168,3226631423,CH +3226631424,3226631935,US +3226631936,3226632191,PT +3226632192,3226633215,CA +3226633216,3226633471,JP +3226635008,3226635263,US +3226635264,3226635519,AU +3226635520,3226635775,US +3226636032,3226636287,AU +3226637056,3226637823,US +3226637824,3226638079,CA +3226638080,3226638335,US +3226638592,3226638847,GB +3226638848,3226639615,US +3226639616,3226640127,AT +3226640128,3226640639,US +3226640640,3226640895,AU +3226640896,3226654207,US +3226654208,3226654463,PT +3226654464,3226655743,US +3226655744,3226656255,IT +3226656256,3226656511,AU +3226656512,3226658303,US +3226658304,3226658559,AU +3226658560,3226658815,US +3226659072,3226661119,US +3226661120,3226661375,DE +3226661888,3226662143,US +3226664960,3226690815,FI +3226690816,3226691071,CA +3226691072,3226691327,GB +3226691584,3226691839,JP +3226691840,3226693119,US +3226693376,3226693887,US +3226694144,3226695167,US +3226695168,3226695679,AU +3226695680,3226695935,US +3226695936,3226696191,CA +3226696192,3226696447,CN +3226696448,3226696703,AU +3226705152,3226705407,JP +3226705408,3226705919,US +3226705920,3226706175,FR +3226706176,3226706943,US +3226707456,3226715391,TW +3226715392,3226715647,US +3226715648,3226715903,AU +3226715904,3226716159,US +3226716160,3226716415,GB +3226716672,3226716927,GB +3226716928,3226717439,US +3226717696,3226717951,US +3226717952,3226720511,GB +3226720512,3226721279,JP +3226721280,3226721791,US +3226722048,3226722303,CH +3226722304,3226722559,AU +3226722560,3226723583,US +3226723584,3226723839,DE +3226723840,3226724095,JP +3226724096,3226724351,AU +3226724352,3226725631,US +3226725632,3226726143,AU +3226726144,3226728191,US +3226728192,3226728447,CA +3226728448,3226729983,US +3226731008,3226731519,US +3226731776,3226732031,GB +3226732288,3226733567,US +3226733568,3226733823,MX +3226733824,3226734079,PT +3226734080,3226734335,US +3226734336,3226734591,PT +3226734592,3226736383,US +3226736640,3226737407,US +3226737408,3226737663,AT +3226737664,3226738175,US +3226738176,3226738431,NL +3226738432,3226738687,US +3226738688,3226739199,NO +3226740736,3226742783,US +3226744576,3226746367,US +3226746368,3226746623,PT +3226746624,3226748671,US +3226748672,3226749439,JP +3226749440,3226749695,US +3226749696,3226752255,GB +3226752256,3226752767,US +3226752768,3226753023,IT +3226753024,3226753279,US +3226753280,3226753535,AU +3226753536,3226753791,SI +3226753792,3226754303,HR +3226754304,3226756095,SI +3226756352,3226757375,SI +3226757376,3226757887,HR +3226757888,3226758655,SI +3226758912,3226762751,US +3226763008,3226770687,IT +3226770688,3226772991,US +3226772992,3226773247,CH +3226773248,3226774783,US +3226774784,3226775039,GB +3226775040,3226775295,US +3226775552,3226783743,FI +3226783744,3226783999,US +3226784256,3226784767,US +3226784768,3226785023,GB +3226785024,3226786559,US +3226786560,3226786815,AU +3226786816,3226787071,DE +3226787072,3226787327,AT +3226787328,3226788095,US +3226788352,3226789375,HU +3226789376,3226789631,AU +3226789632,3226791167,US +3226791168,3226791679,AU +3226791680,3226792191,US +3226792192,3226792703,AU +3226792704,3226792959,US +3226793216,3226793983,DE +3226793984,3226794239,US +3226794496,3226795263,US +3226795264,3226795519,NZ +3226795520,3226795775,US +3226796032,3226861567,US +3226861824,3226862079,CA +3226862080,3226864383,US +3226864384,3226864639,RU +3226864640,3226864895,NZ +3226864896,3226865151,US +3226865152,3226865407,PL +3226865408,3226866175,US +3226866176,3226866431,GB +3226866432,3226866943,US +3226867456,3226867967,US +3226867968,3226868223,IL +3226868224,3226868479,US +3226868480,3226868735,GB +3226868736,3226882303,US +3226882560,3226884351,US +3226884352,3226884607,IL +3226884608,3226892799,US +3226893056,3226893567,US +3226893568,3226894079,NL +3226894080,3226894335,GB +3226894336,3226894591,US +3226894592,3226894847,AU +3226895104,3226895359,US +3226895360,3226895871,SG +3226895872,3226896127,GB +3226896128,3226896639,US +3226896640,3226896895,GB +3226896896,3226897151,PT +3226897152,3226902527,US +3226903040,3226903295,US +3226903296,3226903551,DE +3226903552,3226903807,US +3226903808,3226904063,AU +3226904064,3226904319,CH +3226904320,3226904575,FR +3226904576,3226904831,US +3226904832,3226905087,GB +3226905088,3226926591,US +3226926592,3226926847,SE +3226927104,3226992639,NL +3226992896,3226993151,CH +3226993152,3226993663,US +3226993664,3226993919,DE +3226993920,3226994175,US +3226994176,3226994687,AU +3226994688,3226994943,US +3226994944,3226995455,GB +3226995456,3226996479,US +3226996992,3226997247,PT +3226998016,3226998527,US +3226998528,3226999039,AT +3226999040,3227005439,US +3227005696,3227013119,US +3227013120,3227013375,JP +3227013376,3227013887,US +3227013888,3227014399,GB +3227014400,3227014655,NZ +3227014656,3227014911,FI +3227014912,3227017215,US +3227017472,3227017983,DE +3227017984,3227018239,US +3227018752,3227019007,JP +3227019008,3227020287,US +3227020288,3227020543,DE +3227020800,3227022847,US +3227022848,3227023103,GB +3227023104,3227023359,NZ +3227023360,3227023615,US +3227023872,3227024127,US +3227024128,3227024383,PT +3227024384,3227024895,US +3227025408,3227025663,GB +3227025664,3227025919,US +3227025920,3227026175,GB +3227026176,3227026687,US +3227026688,3227026943,GB +3227027456,3227032319,US +3227032576,3227038207,US +3227039744,3227040255,US +3227040512,3227040767,AU +3227040768,3227041279,US +3227041280,3227041535,NZ +3227041536,3227042815,US +3227042816,3227043071,IT +3227043072,3227043327,US +3227043584,3227044863,US +3227045120,3227053567,US +3227053568,3227053823,GB +3227053824,3227054079,DE +3227054080,3227056639,US +3227056640,3227057919,PT +3227058176,3227083519,FI +3227083520,3227083775,ES +3227083776,3227123711,FI +3227123712,3227189247,US +3227189504,3227224831,US +3227225088,3227225599,LU +3227225600,3227226111,US +3227226368,3227234559,US +3227234560,3227234815,PT +3227234816,3227235071,US +3227235072,3227235327,AU +3227235328,3227236607,US +3227236608,3227236863,AU +3227236864,3227237119,RU +3227237120,3227237631,US +3227237632,3227237887,NO +3227237888,3227238143,US +3227238144,3227238399,GB +3227238400,3227239935,US +3227240192,3227240447,GB +3227240448,3227240703,BE +3227240704,3227240959,GB +3227240960,3227241471,US +3227241728,3227243007,US +3227243008,3227243263,CA +3227243264,3227243519,GB +3227243520,3227243775,US +3227243776,3227244031,AU +3227244032,3227249151,SE +3227249408,3227249663,US +3227249664,3227252735,CH +3227252736,3227252991,US +3227253248,3227254271,US +3227254272,3227254527,HK +3227257088,3227258623,US +3227258624,3227258879,NZ +3227258880,3227259135,US +3227259392,3227276543,US +3227276800,3227277055,FR +3227277312,3227278847,US +3227278848,3227279103,IE +3227279104,3227279615,US +3227279872,3227280895,US +3227281152,3227281407,US +3227281408,3227282175,IT +3227282176,3227282431,US +3227282432,3227282687,NL +3227282688,3227282943,GB +3227282944,3227284479,US +3227284480,3227284735,FI +3227284992,3227286783,US +3227286784,3227287039,AT +3227287040,3227287295,IT +3227287296,3227287551,NL +3227287552,3227287807,CH +3227287808,3227288063,BG +3227288064,3227288319,BE +3227288320,3227288831,NL +3227288832,3227289087,PT +3227289088,3227289343,NL +3227289344,3227289599,PT +3227289600,3227290111,NL +3227290112,3227290367,AT +3227290368,3227290623,CH +3227290880,3227291135,AT +3227291136,3227294463,PT +3227294464,3227294975,GR +3227295232,3227299839,US +3227300096,3227301375,US +3227301632,3227302399,US +3227302656,3227304191,US +3227304448,3227304959,US +3227305216,3227305983,US +3227309824,3227310079,US +3227310080,3227310335,NO +3227310336,3227312127,US +3227312128,3227312383,DK +3227312384,3227314943,US +3227320320,3227361791,FR +3227361792,3227362303,US +3227362304,3227385855,FR +3227386112,3227391999,US +3227392000,3227392255,PT +3227392256,3227393023,US +3227393024,3227393279,AT +3227393280,3227396351,US +3227396352,3227396607,AU +3227396608,3227398399,US +3227398656,3227400447,US +3227400448,3227400703,AT +3227400704,3227400959,GB +3227400960,3227401471,US +3227401728,3227402495,AU +3227402496,3227403007,US +3227403008,3227403519,GR +3227403520,3227403775,US +3227404544,3227405311,US +3227405312,3227405567,DE +3227405568,3227414015,US +3227414272,3227415551,GB +3227415552,3227415807,US +3227415808,3227416063,GB +3227416064,3227417087,US +3227417088,3227417343,BN +3227417344,3227417599,US +3227417856,3227418111,US +3227418112,3227418367,CA +3227418368,3227425023,US +3227425280,3227425791,US +3227425792,3227427583,DK +3227427584,3227427839,ES +3227427840,3227428351,US +3227428608,3227429119,US +3227429120,3227429375,NZ +3227429376,3227429887,US +3227429888,3227430143,GB +3227430144,3227430399,US +3227430400,3227430655,HK +3227430656,3227437055,FR +3227437056,3227437311,AU +3227437312,3227437823,US +3227438848,3227439103,US +3227439104,3227439615,AU +3227439872,3227440127,US +3227440128,3227440383,IT +3227440384,3227442175,US +3227442176,3227442431,JP +3227442432,3227442687,RU +3227442688,3227443711,US +3227443712,3227443967,AT +3227443968,3227444223,AU +3227444224,3227445503,US +3227445504,3227445759,CH +3227445760,3227446015,US +3227446016,3227446271,GB +3227446272,3227446783,US +3227446784,3227447039,JP +3227447040,3227447295,AT +3227447808,3227448063,US +3227448064,3227448575,AU +3227448576,3227448831,US +3227449088,3227450111,US +3227468032,3227468287,US +3227582464,3227647999,US +3227648000,3227659775,FI +3227659776,3227660031,JP +3227660032,3227660543,FI +3227660544,3227660799,EE +3227660800,3227713535,FI +3227779584,3227779839,KR +3227779840,3227783679,US +3227783680,3227783935,FR +3227783936,3227784703,US +3227784704,3227784959,AU +3227784960,3227785727,AT +3227785728,3227786495,US +3227786752,3227792383,US +3227792384,3227792639,GB +3227792640,3227792895,NZ +3227792896,3227794687,US +3227794688,3227794943,GB +3227794944,3227795199,US +3227795200,3227795455,NO +3227795456,3227797503,US +3227798528,3227798783,US +3227798784,3227799039,TH +3227799040,3227799295,GB +3227799296,3227799551,US +3227799552,3227799807,AU +3227799808,3227800063,US +3227800320,3227801343,US +3227801600,3227803647,US +3227803648,3227804415,DE +3227804416,3227804671,GB +3227804672,3227804927,US +3227804928,3227805183,CA +3227805184,3227813375,FI +3227813376,3227813631,US +3227813632,3227815167,GB +3227815168,3227815935,US +3227815936,3227816191,GB +3227816192,3227818495,US +3227818496,3227818751,GB +3227818752,3227844351,MX +3227844864,3227845119,ES +3227845120,3227845631,US +3227845632,3227845887,RU +3227846144,3227846655,US +3227846656,3227846911,ES +3227847424,3227847679,GB +3227847680,3227848703,US +3227848704,3227848959,NZ +3227848960,3227851775,US +3227851776,3227852031,DE +3227852032,3227853055,US +3227853312,3227853567,GB +3227853568,3227856127,US +3227856896,3227860991,US +3227863808,3227864063,DE +3227864064,3227864831,US +3227865088,3227865343,US +3227865344,3227867903,NL +3227867904,3227868159,TH +3227868160,3227873023,US +3227873024,3227874047,NL +3227874048,3227874815,US +3227874816,3227875071,PT +3227875072,3227878911,US +3227878912,3227879167,AU +3227879168,3227879679,US +3227879680,3227879935,GB +3227880192,3227880959,US +3227881472,3227885567,US +3227885824,3227887871,ES +3227887872,3227888127,PR +3227888128,3227888383,BE +3227888384,3227889663,US +3227889664,3227889919,CH +3227889920,3227890431,US +3227890432,3227890943,DE +3227890944,3227891455,US +3227891456,3227891711,AU +3227891712,3227893759,US +3227893760,3227894015,FI +3227894016,3227895039,US +3227895040,3227895551,DE +3227895552,3227909119,US +3227909120,3227909375,BE +3227909376,3227909631,US +3227909632,3227909887,AU +3227910400,3227910655,AT +3227910656,3227911679,US +3227911680,3227912191,HU +3227912192,3227912447,GB +3227912704,3227912959,US +3227912960,3227913215,CA +3227913216,3227913983,US +3227914240,3227914495,US +3227914496,3227914751,AT +3227914752,3227918591,FI +3227918592,3227918847,US +3227918848,3227931135,FI +3227931136,3227931391,US +3227931392,3227931647,TH +3227931648,3227931903,PE +3227932672,3227932927,US +3227932928,3227933183,DE +3227933184,3227933695,US +3227933696,3227933951,NZ +3227933952,3227934463,US +3227934464,3227934719,CH +3227934720,3227947519,US +3227947520,3227955711,DE +3227955712,3227964927,US +3227964928,3227965183,GB +3227965184,3227966975,US +3227967232,3227967487,US +3227967488,3227967743,FR +3227967744,3227967999,PL +3227968000,3227968255,US +3227968256,3227968767,GB +3227968768,3227969023,RU +3227969024,3227971327,US +3227971328,3227971583,AU +3227971584,3227974143,US +3227974144,3227974655,AU +3227974656,3227975167,US +3227975936,3227976191,US +3227976192,3227976447,LU +3227976448,3227977471,US +3227977472,3227977727,FR +3227977728,3227978495,US +3227979008,3227979263,US +3227979264,3227979519,AE +3227979520,3227980799,US +3227980800,3227981055,GR +3227981056,3227981567,US +3227981568,3227981823,DE +3227981824,3227982591,US +3227982592,3227982847,DE +3227982848,3227985919,GB +3227985920,3227986175,DE +3227986176,3227986431,US +3227986432,3227986943,JP +3227986944,3227987455,US +3227987456,3227987711,AU +3227987712,3227997439,US +3227997440,3228005631,FI +3228005632,3228008959,US +3228008960,3228009215,AU +3228009472,3228009727,AU +3228009728,3228010751,US +3228010752,3228011519,GB +3228011520,3228013311,US +3228013312,3228013567,PT +3228013568,3228039423,US +3228041472,3228042239,US +3228042752,3228045055,US +3228045056,3228045311,KR +3228045312,3228046335,US +3228046592,3228047103,US +3228047104,3228047359,IT +3228047360,3228048383,US +3228048384,3228048895,GB +3228048896,3228050175,US +3228050176,3228050943,PT +3228051200,3228051455,US +3228051456,3228051711,JP +3228051712,3228051967,CH +3228051968,3228052223,US +3228052224,3228052991,AU +3228052992,3228053503,US +3228053504,3228053759,PT +3228054016,3228054783,US +3228054784,3228055039,GB +3228055040,3228055295,US +3228055296,3228055807,NL +3228055808,3228056319,NO +3228056320,3228059647,US +3228059648,3228059903,CH +3228060160,3228060927,US +3228060928,3228061183,DE +3228061184,3228061695,US +3228061696,3228061951,JP +3228061952,3228062207,US +3228062208,3228062463,GB +3228062464,3228069631,US +3228076288,3228077055,US +3228077056,3228077311,NL +3228077312,3228077567,US +3228077568,3228077823,NL +3228077824,3228078847,US +3228078848,3228079103,GR +3228079360,3228079871,US +3228080128,3228080639,US +3228080640,3228080895,IE +3228080896,3228081151,FR +3228081152,3228081919,US +3228082944,3228083967,US +3228083968,3228084479,BE +3228084480,3228085247,US +3228085248,3228085503,JP +3228085504,3228100607,US +3228100608,3228101119,JP +3228101120,3228102143,US +3228102144,3228102399,GB +3228102400,3228103423,US +3228103680,3228103935,US +3228103936,3228104191,FR +3228104192,3228104703,JP +3228104704,3228104959,DK +3228104960,3228105471,US +3228105472,3228105727,CH +3228105728,3228105983,NZ +3228105984,3228106495,US +3228106752,3228109311,US +3228109312,3228109567,NZ +3228109568,3228125951,US +3228125952,3228126207,DE +3228126208,3228172287,US +3228172288,3228222463,IT +3228222464,3228222975,NL +3228222976,3228237823,IT +3228238080,3228238335,NO +3228238336,3228238591,GB +3228238592,3228238847,US +3228238848,3228239359,GB +3228239616,3228240127,US +3228240128,3228240383,AU +3228240384,3228240639,NZ +3228240640,3228241407,GB +3228241408,3228250367,US +3228250624,3228250879,US +3228250880,3228263679,IT +3228263680,3228263935,AU +3228263936,3228264447,US +3228264448,3228264703,NI +3228264704,3228265983,US +3228265984,3228266239,IE +3228266496,3228267007,NZ +3228267008,3228267263,NO +3228267264,3228268543,US +3228269056,3228269311,PT +3228269312,3228269567,DE +3228269568,3228270079,AT +3228270080,3228271103,GB +3228271104,3228271359,US +3228271360,3228271615,CA +3228271616,3228271871,DE +3228272128,3228272383,US +3228274944,3228280831,US +3228280832,3228281087,GB +3228281088,3228281599,US +3228281600,3228282111,NZ +3228282112,3228282367,US +3228282368,3228282623,GB +3228282624,3228283135,US +3228283136,3228283391,GR +3228283392,3228283647,GB +3228283648,3228285695,US +3228285696,3228285951,SE +3228285952,3228289023,US +3228289024,3228297215,FI +3228297216,3228297727,AT +3228297728,3228297983,US +3228297984,3228298495,DE +3228298496,3228303103,US +3228303360,3228309247,US +3228309248,3228316159,DE +3228316416,3228327167,DE +3228327168,3228328703,US +3228328704,3228328959,AU +3228328960,3228329471,NO +3228329472,3228330751,US +3228330752,3228331263,SE +3228331264,3228332287,US +3228332288,3228332543,AU +3228332544,3228332799,GR +3228332800,3228334079,FR +3228334080,3228334335,GB +3228334336,3228334591,AT +3228334592,3228335359,US +3228335360,3228335615,SK +3228335616,3228335871,CZ +3228336128,3228336639,CZ +3228336640,3228337663,SK +3228337664,3228338431,CZ +3228338432,3228340735,SK +3228340736,3228341247,CZ +3228341248,3228341759,SK +3228341760,3228342271,CZ +3228342272,3228342783,SK +3228342784,3228343039,CZ +3228343040,3228343295,SK +3228343296,3228343551,CZ +3228343552,3228344063,SK +3228344064,3228344575,CZ +3228344576,3228347135,SK +3228347136,3228347391,CZ +3228347392,3228348159,SK +3228348160,3228353279,US +3228353280,3228358399,SE +3228358400,3228361471,US +3228361728,3228362239,US +3228362240,3228362495,TH +3228362496,3228362751,US +3228363008,3228363263,US +3228363264,3228363519,CH +3228363520,3228364287,US +3228364288,3228364543,AT +3228364800,3228368383,US +3228368896,3228380415,DE +3228380672,3228388095,DE +3228388352,3228392447,DE +3228392960,3228394239,DE +3228394496,3228395263,DE +3228395776,3228399615,DE +3228399872,3228406783,DE +3228406784,3228407039,FR +3228407040,3228413183,DE +3228413184,3228413439,SG +3228413440,3228417791,DE +3228417792,3228418559,AT +3228418560,3228418815,IN +3228418816,3228421119,DE +3228421120,3228421375,BE +3228421376,3228423679,DE +3228423680,3228424191,CH +3228424192,3228430847,DE +3228430848,3228431103,ZA +3228431104,3228434431,DE +3228434688,3228471295,US +3228472320,3228472831,US +3228473344,3228473599,US +3228473856,3228474111,US +3228477440,3228477695,US +3228491520,3228499711,US +3228500224,3228508159,US +3228508160,3228508415,AU +3228508416,3228508671,NO +3228508672,3228509439,US +3228509952,3228510207,IE +3228510208,3228511231,US +3228511232,3228511487,CZ +3228511488,3228511999,US +3228512000,3228512255,DE +3228512256,3228512511,CH +3228512512,3228513791,US +3228521984,3228522495,US +3228522496,3228522751,GB +3228522752,3228525823,US +3228525824,3228526079,PT +3228526080,3228526335,NZ +3228526336,3228526591,CH +3228526592,3228526847,AT +3228526848,3228527103,AU +3228527104,3228528383,US +3228528640,3228531711,US +3228531712,3228532223,NO +3228532224,3228532479,US +3228532480,3228532735,DE +3228540928,3228554751,US +3228555008,3228557311,US +3228557568,3228558591,US +3228558592,3228559103,BR +3228559104,3228564223,US +3228564480,3228564735,AT +3228564736,3228565247,US +3228565760,3228571391,US +3228571648,3228572927,US +3228573184,3228573951,PT +3228573952,3228574463,US +3228574720,3228577023,US +3228577024,3228577279,PT +3228577280,3228578047,US +3228578048,3228578303,GB +3228578304,3228581119,US +3228581120,3228581375,AT +3228581376,3228583167,US +3228583424,3228585983,ES +3228585984,3228590591,US +3228590592,3228590847,GB +3228590848,3228591103,DK +3228591104,3228591359,GB +3228591360,3228603391,US +3228603648,3228603903,US +3228604160,3228611583,US +3228611840,3228617727,US +3228617728,3228617983,FI +3228617984,3228618239,US +3228618240,3228618495,SE +3228618496,3228618751,US +3228618752,3228619007,DE +3228619008,3228620031,US +3228620032,3228620287,DE +3228620288,3228620543,CH +3228620544,3228620799,AU +3228620800,3228628735,US +3228628736,3228628991,ES +3228628992,3228630527,US +3228630528,3228630783,CH +3228631040,3228696575,NL +3228696576,3228827647,IL +3228827648,3228828159,PS +3228828160,3228829183,IL +3228829184,3228829695,PS +3228829696,3228830207,IL +3228830208,3228833791,PS +3228833792,3228846335,IL +3228846336,3228846591,GB +3228846592,3228849407,IL +3228849408,3228849663,GB +3228849664,3228850175,IL +3228850176,3228850431,GB +3228850432,3228858111,IL +3228858112,3228858367,GB +3228858368,3228864255,IL +3228864256,3228864511,GB +3228864512,3229024255,IL +3229024512,3229024767,US +3229058816,3229059071,US +3229090048,3229101823,US +3229101824,3229102591,FI +3229102592,3229155327,US +3229155328,3229219583,SE +3229219584,3229219839,EE +3229219840,3229220863,SE +3229221120,3229221375,FR +3229221376,3229245439,GB +3229245440,3229246719,US +3229246720,3229250815,GB +3229250816,3229251071,US +3229251072,3229254399,GB +3229254400,3229256959,SG +3229256960,3229258495,GB +3229258496,3229259007,US +3229259520,3229264639,GB +3229264640,3229264895,NZ +3229264896,3229265919,US +3229265920,3229266175,AU +3229266176,3229266943,US +3229266944,3229267199,NZ +3229267200,3229272319,US +3229273856,3229274623,US +3229274624,3229274879,AU +3229274880,3229275647,US +3229275648,3229275903,GB +3229276160,3229281023,IE +3229281024,3229281791,US +3229281792,3229283071,PT +3229283072,3229285887,US +3229285888,3229286143,NO +3229286400,3229351935,US +3229352192,3229354495,US +3229354496,3229355775,AU +3229355776,3229356543,US +3229356800,3229357823,US +3229358080,3229358335,NZ +3229358336,3229359359,DE +3229359872,3229360127,US +3229360128,3229360383,AT +3229360384,3229361919,US +3229361920,3229362175,BE +3229362176,3229363199,US +3229363456,3229363711,US +3229363712,3229363967,GB +3229363968,3229380607,US +3229380608,3229380863,DE +3229380864,3229381375,US +3229381376,3229381631,DE +3229381632,3229381887,PL +3229381888,3229382143,AU +3229382144,3229382399,US +3229382656,3229384191,US +3229384448,3229384959,US +3229385216,3229385727,US +3229385984,3229390847,US +3229390848,3229391103,AU +3229391104,3229391359,US +3229391360,3229391615,CN +3229391616,3229391871,AT +3229392128,3229394175,US +3229395456,3229408255,RU +3229408256,3229409279,US +3229409536,3229412095,US +3229412096,3229412351,DE +3229412608,3229414911,DE +3229414912,3229415167,US +3229415168,3229415679,DE +3229415936,3229417215,DE +3229417472,3229483007,DE +3229483264,3229499647,FI +3229499648,3229500671,US +3229548544,3229679615,US +3229679872,3229680383,DE +3229680384,3229680895,RO +3229680896,3229693183,DE +3229693440,3229695487,DE +3229695488,3229697535,US +3229697792,3229699071,US +3229699328,3229699583,US +3229699840,3229700095,US +3229700096,3229700351,AT +3229700352,3229701887,US +3229701888,3229702143,TR +3229702144,3229704703,US +3229704704,3229704959,DE +3229705216,3229708031,US +3229745152,3229749759,FI +3229749760,3229750015,BE +3229750016,3229810687,FI +3229810944,3229811711,US +3229812224,3229814015,US +3229814016,3229814271,AU +3229814272,3229815807,US +3229815808,3229816063,DE +3229816320,3229817087,US +3229817088,3229817599,SE +3229817600,3229818623,AU +3229818624,3229818879,US +3229822208,3229830911,US +3229830912,3229831167,GB +3229831168,3229833215,US +3229833472,3229833727,GB +3229833728,3229834239,IN +3229834240,3229834495,AU +3229834496,3229834751,US +3229834752,3229835007,CA +3229835008,3229835263,US +3229835264,3229835519,FI +3229835520,3229835775,CA +3229835776,3229838079,US +3229838336,3229838591,GB +3229838592,3229838847,US +3229839104,3229844479,US +3229844480,3229844735,LU +3229844736,3229844991,US +3229845248,3229845503,US +3229845760,3229847295,CA +3229847296,3229870335,US +3229870848,3229874943,US +3229874944,3229875455,AU +3229875456,3229875967,US +3229876480,3229877503,US +3229877760,3229878271,US +3229878528,3229878783,GB +3229878784,3229879039,IT +3229879040,3229879295,NO +3229879296,3229880063,US +3229880064,3229880319,KR +3229880320,3229881087,US +3229881088,3229881343,CA +3229881344,3229883135,US +3229883648,3229883903,US +3229884160,3229884415,JP +3229884928,3229885183,IT +3229885184,3229885439,BR +3229885440,3229886719,US +3229886720,3229886975,AU +3229886976,3229887487,US +3229887744,3229889791,US +3229889792,3229890047,PT +3229890048,3229890303,US +3229890304,3229890559,PT +3229890560,3229891071,US +3229891584,3229891839,CA +3229892608,3229900031,US +3229900032,3229900287,AU +3229900288,3229901567,US +3229901568,3229901823,GB +3229901824,3229902335,US +3229902336,3229902591,AU +3229902592,3229928703,US +3229928960,3229930495,US +3229930752,3229937407,US +3229937408,3229937663,GB +3229937664,3229937919,US +3229937920,3229938175,CA +3229938176,3229938431,US +3229938688,3229938943,IL +3229938944,3229939199,AT +3229939200,3229939455,US +3229939456,3229940735,KR +3229940736,3229940991,CH +3229940992,3229941247,AU +3229941248,3229941503,US +3229942272,3229942783,US +3229943040,3229943295,US +3229943552,3229944319,US +3229944320,3229944575,TH +3229944576,3229945343,US +3229945344,3229945599,AU +3229945600,3229945855,PT +3229946112,3229947135,US +3229947136,3229947391,AU +3229947392,3229948415,US +3229948672,3229948927,US +3229948928,3229949183,IT +3229949184,3229949439,GB +3229949440,3229949695,US +3229949696,3229949951,NZ +3229949952,3229950207,NO +3229950208,3229950975,US +3229950976,3229951231,IL +3229951232,3229952255,US +3229952256,3229952511,AU +3229952512,3229953279,US +3229953536,3229953791,US +3229954048,3229954303,US +3229954560,3229955327,US +3229955328,3229955583,NL +3229955584,3229956095,PT +3229956096,3229956607,US +3229956608,3229956863,GB +3229956864,3229958143,US +3229958144,3229958399,NO +3229958400,3229958655,US +3229958656,3229958911,NZ +3229958912,3229959167,SG +3229959168,3229960191,US +3229960448,3229960959,US +3229963008,3229963519,US +3229963776,3229964799,US +3229965056,3229967615,US +3229967872,3229968127,US +3229968128,3229968383,BE +3229968384,3229968895,US +3229969408,3229969663,PT +3229969664,3229969919,AT +3229969920,3229970431,FI +3229971456,3229972735,US +3229972736,3229972991,SE +3229972992,3229975295,US +3229975296,3229975551,GB +3229975552,3229976575,US +3229978624,3230004223,US +3230004224,3230004479,GB +3230004480,3230004991,US +3230006016,3230007039,US +3230007296,3230043903,FR +3230043904,3230044159,CM +3230044160,3230072831,FR +3230073088,3230074623,US +3230074624,3230074879,DE +3230074880,3230082559,IT +3230082560,3230082815,US +3230083072,3230084607,US +3230084608,3230084863,NO +3230084864,3230085119,US +3230085120,3230085375,CA +3230085376,3230085631,US +3230085888,3230086143,DE +3230086144,3230086655,GB +3230088960,3230089215,AT +3230089216,3230089727,US +3230089728,3230089983,GB +3230089984,3230090239,US +3230090240,3230090495,GB +3230090496,3230092543,US +3230092544,3230092799,CA +3230092800,3230093823,US +3230093824,3230094079,NL +3230094080,3230094335,CA +3230094336,3230095615,US +3230095616,3230095871,JP +3230096384,3230096639,JP +3230096896,3230097151,JP +3230097408,3230097663,JP +3230098688,3230100735,JP +3230101504,3230104319,US +3230104576,3230105855,US +3230105856,3230106111,PT +3230106112,3230106879,US +3230106880,3230107135,AT +3230107136,3230107647,US +3230107904,3230109439,US +3230109440,3230109695,NO +3230109696,3230109951,US +3230109952,3230115071,CH +3230115072,3230115327,IT +3230115328,3230115583,GR +3230115584,3230116095,BE +3230116096,3230117631,US +3230117632,3230117887,FR +3230117888,3230120191,US +3230120192,3230120447,BE +3230120448,3230120703,US +3230120704,3230120959,PT +3230121216,3230122495,US +3230123264,3230123775,US +3230125312,3230125567,US +3230125824,3230126335,AU +3230126336,3230126591,US +3230126592,3230126847,AU +3230126848,3230128639,US +3230128896,3230129151,PT +3230129152,3230129663,US +3230129664,3230129919,JP +3230130176,3230130431,US +3230130432,3230130687,IE +3230130688,3230131711,US +3230131968,3230132991,GB +3230132992,3230136319,US +3230136576,3230137087,US +3230137344,3230137599,US +3230137600,3230137855,NO +3230137856,3230138111,PL +3230138624,3230140159,US +3230140160,3230140415,MT +3230140416,3230140671,US +3230140672,3230140927,FI +3230140928,3230142975,US +3230142976,3230143231,GB +3230143232,3230143487,BE +3230143488,3230144255,US +3230144256,3230144511,NL +3230144512,3230145279,US +3230145280,3230145535,CA +3230145536,3230145791,US +3230145792,3230146047,GB +3230146048,3230146303,FR +3230146304,3230146559,PT +3230146560,3230147583,US +3230147840,3230148351,US +3230148352,3230148607,AU +3230148608,3230148863,GB +3230148864,3230149119,CH +3230149120,3230150655,NI +3230150656,3230150911,US +3230150912,3230151167,PT +3230151168,3230151423,US +3230151424,3230151679,NL +3230151680,3230151935,PT +3230152192,3230152447,FR +3230153216,3230153471,FR +3230153472,3230153727,PF +3230153728,3230153983,US +3230153984,3230154239,RU +3230154240,3230156543,US +3230156544,3230164735,FI +3230165504,3230167295,US +3230167552,3230168063,CA +3230168832,3230172927,US +3230173184,3230174463,US +3230174464,3230175231,IN +3230175232,3230177791,US +3230177792,3230178303,GB +3230178304,3230178559,CH +3230203904,3230269439,US +3230269696,3230271743,GB +3230275584,3230291455,US +3230291456,3230291711,PT +3230291712,3230294783,US +3230295040,3230295295,AU +3230295296,3230296319,US +3230296320,3230297343,NO +3230297344,3230299647,SE +3230299648,3230301695,SG +3230301696,3230302207,US +3230302208,3230302975,CA +3230302976,3230303487,US +3230303744,3230307327,US +3230307584,3230309119,US +3230309120,3230309375,NO +3230309376,3230310143,GB +3230310144,3230310655,US +3230310912,3230311423,US +3230311680,3230316287,US +3230316288,3230316543,IT +3230316544,3230316799,US +3230316800,3230317311,CA +3230317312,3230317567,US +3230317568,3230317823,SG +3230317824,3230318591,US +3230318592,3230318847,GB +3230318848,3230321663,US +3230321664,3230321919,PT +3230321920,3230322175,US +3230322432,3230322943,US +3230323968,3230325247,US +3230325760,3230327551,US +3230327808,3230328063,AT +3230328064,3230328319,GB +3230328320,3230329087,CH +3230329088,3230332927,US +3230332928,3230333183,GB +3230333184,3230333695,US +3230333696,3230333951,NZ +3230333952,3230334719,US +3230335232,3230335743,CA +3230336000,3230336255,CA +3230336512,3230339583,CA +3230339840,3230340095,CA +3230340352,3230350847,CA +3230351104,3230354943,CA +3230354944,3230355199,FR +3230355200,3230367743,CA +3230368000,3230368511,CA +3230369024,3230370303,US +3230370304,3230370559,CA +3230370816,3230372607,CA +3230372864,3230383359,CA +3230383616,3230384127,CA +3230384384,3230387455,CA +3230387712,3230400255,CA +3230400768,3230591231,FR +3230591232,3230591487,FI +3230591488,3230625791,FR +3230625792,3230626047,FI +3230626048,3230654879,FR +3230654880,3230654895,HU +3230654896,3230787327,FR +3230793984,3230822655,US +3230822912,3230823679,US +3230823680,3230823935,DK +3230824192,3230824447,FR +3230824448,3230825215,US +3230825216,3230825471,GB +3230825472,3230826239,ES +3230826240,3230827007,US +3230827520,3230827775,AT +3230827776,3230828031,NZ +3230828032,3230828543,HU +3230828544,3230830079,GB +3230830080,3230832127,US +3230832128,3230832383,NZ +3230832384,3230832639,US +3230832640,3230832895,FI +3230832896,3230833663,US +3230833664,3230833919,CA +3230833920,3230834175,BR +3230834176,3230835455,US +3230835456,3230837503,NO +3230837504,3230837759,US +3230837760,3230838015,ES +3230838016,3230840319,IT +3230840320,3230840575,FR +3230840576,3230840831,US +3230840832,3230841087,JP +3230841088,3230841343,DE +3230841600,3230841855,ES +3230841856,3230842111,US +3230842112,3230842367,AU +3230842624,3230843135,US +3230843136,3230843391,NO +3230843392,3230844671,US +3230844928,3230845183,AU +3230845184,3230845951,US +3230845952,3230846207,CZ +3230846208,3230849535,US +3230849536,3230850047,NZ +3230850048,3230851839,US +3230851840,3230852095,NO +3230852096,3230852351,GB +3230852352,3230852607,BR +3230853120,3230853375,AU +3230853376,3230853887,FR +3230853888,3230854399,US +3230854400,3230854655,UY +3230854656,3230855167,NO +3230855168,3230855679,US +3230855680,3230855935,IT +3230855936,3230857983,US +3230857984,3230858751,AU +3230858752,3230859007,US +3230860032,3230865151,US +3230865152,3230865407,GB +3230865664,3230867967,US +3230867968,3230868223,IS +3230868224,3230868479,US +3230868480,3230868735,GB +3230868992,3230870015,US +3230870016,3230870271,PL +3230870272,3230877183,US +3230877696,3230878719,US +3230878720,3230879487,PT +3230879488,3230879743,FR +3230879744,3230888447,US +3230888448,3230888703,AU +3230888704,3230888959,US +3230889216,3230895359,US +3230895360,3230895615,PL +3230895616,3230897151,US +3230897408,3230897663,US +3230897664,3230897919,GB +3230897920,3230898687,NZ +3230898688,3230898943,US +3230898944,3230899199,PT +3230899200,3230913023,US +3230913024,3230913279,BR +3230913280,3230913535,US +3230913536,3230913791,GB +3230913792,3230914047,CA +3230914048,3230914303,US +3230914304,3230914815,FI +3230914816,3230915071,GB +3230915072,3230915327,BR +3230915328,3230915583,GB +3230915584,3230917631,US +3230917632,3230917887,GB +3230917888,3230918399,US +3230918656,3230919423,US +3230919424,3230919679,AU +3230919680,3230920959,US +3230921216,3230922239,US +3230922240,3230922495,AU +3230922496,3230922751,IT +3230922752,3230923519,US +3230923776,3230924031,US +3230924032,3230924287,AU +3230924288,3230924543,US +3230924800,3230933247,US +3230933248,3230948607,SE +3230948608,3230951167,US +3230951168,3230951423,PT +3230951680,3230951935,US +3230952192,3230953215,US +3230954496,3230967295,AU +3230967296,3230967551,RU +3230967552,3230967807,ES +3230967808,3230969087,US +3230969344,3230969599,US +3230969600,3230969855,MX +3230969856,3230970111,US +3230970112,3230972671,GB +3230972672,3230973951,US +3230973952,3230974207,NL +3230974208,3230974463,IT +3230974464,3230974719,GB +3230974720,3230975487,US +3230975488,3230975999,GB +3230976000,3230976255,NL +3230976256,3230980095,ES +3230980096,3230980351,GB +3230980352,3230980607,CA +3230980608,3230980863,US +3230981120,3230981375,IT +3230981376,3230981631,NZ +3230981632,3230981887,US +3230981888,3230983935,AU +3230983936,3230989823,US +3230990592,3230991103,US +3230991104,3230991359,PL +3230991360,3230991615,US +3230991616,3230991871,FI +3230991872,3230992383,US +3230992640,3230994175,US +3230994176,3230994431,GB +3230994432,3230994687,US +3230994944,3230995199,US +3230995200,3230995455,ES +3230995456,3230995711,AU +3230995712,3230996223,US +3230996480,3230997247,US +3230997248,3230997503,AT +3230997504,3230997759,US +3230997760,3230999039,NL +3230999040,3230999295,US +3230999296,3230999551,NL +3230999552,3230999807,AU +3230999808,3231000319,US +3231000576,3231000831,US +3231000832,3231001087,FR +3231001088,3231003903,US +3231003904,3231004159,CA +3231004160,3231004415,AU +3231004416,3231004927,US +3231004928,3231005183,GB +3231005440,3231005695,FR +3231005696,3231005951,GB +3231005952,3231007487,US +3231009280,3231009791,US +3231010048,3231010303,FR +3231010304,3231010815,NO +3231010816,3231011071,CA +3231011072,3231011839,US +3231012096,3231012863,US +3231013120,3231013375,US +3231013376,3231013631,DE +3231013888,3231014655,US +3231015168,3231015423,US +3231015424,3231015679,CA +3231015680,3231015935,US +3231015936,3231016191,NO +3231016192,3231016447,US +3231016448,3231016703,NO +3231016704,3231018495,US +3231018496,3231018751,IT +3231018752,3231019007,GB +3231019008,3231020287,US +3231020288,3231020543,GB +3231020544,3231020799,NL +3231020800,3231021567,GB +3231021568,3231021823,US +3231021824,3231022079,CA +3231022080,3231022591,US +3231022592,3231022847,DE +3231022848,3231028479,US +3231028480,3231028735,AU +3231028736,3231043839,US +3231043840,3231044095,JP +3231044352,3231046399,US +3231046656,3231048447,US +3231048448,3231048703,NL +3231048704,3231049727,US +3231049728,3231049983,AT +3231049984,3231050239,US +3231050496,3231051263,US +3231051264,3231051519,GB +3231051520,3231051775,HK +3231051776,3231053055,US +3231054848,3231055103,US +3231056128,3231066367,US +3231067392,3231067647,US +3231068928,3231070463,US +3231070720,3231074559,SE +3231075072,3231075583,SE +3231075840,3231077119,SE +3231077376,3231077631,SE +3231078144,3231078655,US +3231078656,3231078911,GB +3231078912,3231079423,CA +3231079424,3231079679,GB +3231079680,3231079935,US +3231079936,3231080191,NL +3231080192,3231080447,US +3231080448,3231080703,AU +3231080704,3231082495,US +3231082496,3231082751,PL +3231082752,3231083007,US +3231083008,3231083263,GB +3231083264,3231083519,AU +3231083520,3231085567,US +3231085824,3231087359,US +3231087616,3231087871,NO +3231087872,3231088127,US +3231088128,3231088383,GT +3231088384,3231088895,US +3231088896,3231091711,AU +3231091712,3231091967,GB +3231091968,3231092223,US +3231092480,3231092735,US +3231092736,3231092991,NZ +3231092992,3231093247,US +3231093248,3231093503,IT +3231093504,3231094527,US +3231097088,3231100415,US +3231100672,3231101183,US +3231101184,3231103231,GB +3231103488,3231103999,US +3231104000,3231104255,NO +3231104256,3231104767,DE +3231104768,3231105023,US +3231105024,3231105535,PT +3231105536,3231106303,IT +3231106304,3231106559,NO +3231106560,3231106815,GB +3231106816,3231107071,US +3231107072,3231107327,AU +3231107328,3231107583,US +3231107584,3231107839,AU +3231107840,3231108095,AT +3231108096,3231108351,GB +3231108352,3231108607,RU +3231108608,3231108863,US +3231109120,3231109375,GB +3231109376,3231109631,NO +3231109632,3231109887,US +3231110144,3231110399,US +3231111168,3231111679,US +3231111680,3231112447,NZ +3231112448,3231112959,US +3231112960,3231113215,NO +3231113216,3231113983,US +3231113984,3231115775,GB +3231115776,3231116799,AU +3231116800,3231117055,HU +3231117056,3231118335,US +3231118592,3231118847,US +3231118848,3231119103,AU +3231119104,3231119359,US +3231119360,3231119615,GB +3231119616,3231120383,TH +3231120384,3231120639,NO +3231120640,3231120895,US +3231120896,3231121151,NO +3231121664,3231135231,US +3231135232,3231135487,CH +3231135488,3231149311,US +3231149312,3231149567,CA +3231149568,3231150079,US +3231150080,3231150335,NL +3231150336,3231154431,US +3231154432,3231154687,IN +3231187200,3231188479,US +3231188480,3231188735,NO +3231188736,3231189503,US +3231189760,3231190527,US +3231190528,3231190783,GB +3231190784,3231191295,US +3231191296,3231191551,GB +3231191552,3231192575,US +3231193600,3231194111,DE +3231194368,3231197695,US +3231197696,3231197951,FR +3231197952,3231198207,US +3231198208,3231198463,GB +3231198464,3231198975,US +3231198976,3231199231,PT +3231199232,3231199487,GB +3231199488,3231200255,NL +3231200256,3231200767,US +3231200768,3231201023,AT +3231201024,3231202559,US +3231202560,3231203071,GB +3231203072,3231203327,AT +3231203328,3231203839,US +3231204096,3231204351,US +3231204352,3231204607,FI +3231204608,3231204863,JP +3231204864,3231207167,US +3231207424,3231207935,US +3231207936,3231208191,DE +3231208192,3231208959,US +3231208960,3231209471,AU +3231209472,3231210239,US +3231210496,3231211775,US +3231211776,3231212031,CA +3231212032,3231212287,CH +3231212288,3231214335,US +3231214336,3231214591,CA +3231214592,3231215103,US +3231215360,3231215615,NO +3231215616,3231215871,GB +3231215872,3231217151,US +3231217408,3231217663,AU +3231217664,3231218175,US +3231218176,3231218431,GB +3231218432,3231218687,US +3231218688,3231218943,BE +3231218944,3231219967,US +3231221248,3231221503,US +3231221760,3231223039,US +3231223040,3231223295,IT +3231223296,3231223807,US +3231223808,3231224063,AU +3231224064,3231224319,US +3231224320,3231224575,AU +3231224576,3231225599,US +3231225600,3231225855,DE +3231226368,3231226879,US +3231226880,3231227135,GB +3231227648,3231228927,US +3231228928,3231229183,PR +3231229184,3231229439,CA +3231229440,3231229695,IT +3231229696,3231229951,FR +3231229952,3231231487,US +3231231488,3231231743,PT +3231231744,3231233023,US +3231233280,3231234047,US +3231234048,3231235071,GB +3231235072,3231236095,US +3231236608,3231236863,US +3231236864,3231237119,CA +3231237120,3231237375,US +3231237376,3231237631,AU +3231237632,3231238911,US +3231239168,3231241215,US +3231241216,3231241471,JP +3231241984,3231244287,US +3231244544,3231248639,US +3231248640,3231248895,GB +3231248896,3231249407,US +3231249408,3231249663,GB +3231249664,3231250431,US +3231250432,3231250687,CA +3231250688,3231251711,US +3231251712,3231251967,GB +3231251968,3231252223,AT +3231252736,3231252991,US +3231252992,3231253503,GB +3231253504,3231254015,US +3231254272,3231254783,US +3231254784,3231255039,AU +3231255040,3231255551,US +3231255552,3231255807,GB +3231255808,3231256063,PT +3231256064,3231257087,US +3231257088,3231257599,HU +3231257600,3231264255,US +3231264512,3231265791,US +3231266048,3231275007,US +3231275008,3231275263,BR +3231275264,3231275519,CH +3231275520,3231276287,US +3231276288,3231276543,AU +3231276544,3231276799,US +3231276800,3231281919,JP +3231281920,3231282175,US +3231282176,3231282431,HU +3231282432,3231282943,US +3231282944,3231283199,CL +3231283200,3231283455,BR +3231283456,3231284991,US +3231284992,3231285247,PL +3231285248,3231290111,US +3231290368,3231291647,US +3231291648,3231291903,GB +3231291904,3231292159,US +3231292160,3231292415,BR +3231292416,3231292927,US +3231292928,3231293183,AU +3231293184,3231294975,US +3231294976,3231295231,GB +3231295232,3231295487,CR +3231295488,3231295743,BE +3231295744,3231296255,US +3231296256,3231296511,RU +3231296512,3231296767,US +3231296768,3231299327,AT +3231299328,3231299583,US +3231300352,3231300607,US +3231300608,3231300863,SE +3231300864,3231301119,GB +3231301120,3231302143,US +3231302144,3231302399,NO +3231302400,3231302655,US +3231302656,3231303167,AU +3231303168,3231307007,US +3231307008,3231307263,GB +3231307264,3231308031,US +3231308032,3231308287,CA +3231308288,3231308799,US +3231308800,3231309055,CA +3231309056,3231311103,PH +3231311104,3231316735,US +3231316736,3231316991,NZ +3231316992,3231317759,US +3231318272,3231318783,US +3231319040,3231319807,US +3231320064,3231321343,US +3231322112,3231324671,SG +3231326208,3231333119,US +3231333376,3231338495,US +3231338752,3231342591,US +3231350528,3231351551,US +3231383808,3231385343,NO +3231385856,3231401215,US +3231416320,3231423999,US +3231449088,3231482879,US +3231482880,3231483135,BE +3231483136,3231484927,US +3231484928,3231485951,JP +3231486208,3231489279,JP +3231489536,3231490047,JP +3231490048,3231490559,US +3231490560,3231490815,GB +3231490816,3231491071,US +3231491328,3231491583,NZ +3231491584,3231491839,US +3231491840,3231492095,GB +3231492096,3231497727,US +3231497984,3231499263,US +3231499520,3231500031,US +3231500032,3231500287,BM +3231500288,3231502079,US +3231502080,3231502591,AU +3231502592,3231502847,US +3231502848,3231503103,PT +3231503104,3231503615,US +3231503616,3231503871,IT +3231503872,3231504383,US +3231504640,3231504895,GB +3231505152,3231505407,US +3231505664,3231506687,US +3231506688,3231506943,NZ +3231506944,3231507199,US +3231507200,3231507455,BE +3231507456,3231507967,US +3231508224,3231508479,US +3231508992,3231509247,US +3231510272,3231510527,GB +3231510784,3231511551,US +3231512576,3231512831,LU +3231512832,3231513087,AU +3231513088,3231513343,US +3231513600,3231514367,US +3231514880,3231515647,NO +3231515648,3231516159,US +3231516672,3231519231,SE +3231522560,3231524607,US +3231531008,3231533567,US +3231547392,3231547647,US +3231547648,3231547903,NO +3231547904,3231556095,US +3231556096,3231556351,HK +3231556352,3231557887,US +3231557888,3231558399,GB +3231558400,3231558655,DE +3231558656,3231558911,GB +3231558912,3231559167,CA +3231559168,3231559423,GB +3231559424,3231559679,US +3231559680,3231559935,GB +3231559936,3231561983,US +3231561984,3231562239,IT +3231562240,3231562495,US +3231562496,3231562751,GB +3231562752,3231563007,US +3231563008,3231563263,CH +3231563520,3231563775,HK +3231580416,3231580927,US +3231581184,3231583231,US +3231584256,3231586559,US +3231588352,3231596031,US +3231596544,3231634943,US +3231643648,3231644927,US +3231645184,3231645439,US +3231645952,3231647743,US +3231648000,3231649791,US +3231649792,3231653631,SG +3231653888,3231655167,US +3231663616,3231663871,FI +3231663872,3231664127,CA +3231664128,3231664383,US +3231664384,3231664639,GB +3231664640,3231665407,US +3231665408,3231665663,IT +3231665664,3231667199,US +3231667200,3231667711,ES +3231667712,3231668735,US +3231668736,3231668991,BE +3231669248,3231669503,US +3231669760,3231670015,CA +3231670016,3231670271,DE +3231670272,3231671039,US +3231671040,3231672319,GB +3231672320,3231672575,US +3231672576,3231672831,NL +3231672832,3231673343,US +3231673344,3231673599,NO +3231673600,3231673855,IE +3231673856,3231674111,US +3231674112,3231674367,CA +3231674368,3231675391,US +3231675392,3231675903,BR +3231675904,3231676159,IE +3231676672,3231676927,FR +3231676928,3231677183,FI +3231678464,3231682047,US +3231711488,3231713023,US +3231713024,3231713279,CA +3231713280,3231713791,US +3231713792,3231714047,IE +3231714048,3231715071,US +3231715072,3231715327,SI +3231715328,3231715583,AU +3231715584,3231716095,US +3231716096,3231716351,AU +3231716352,3231716607,US +3231716608,3231716863,TR +3231716864,3231717119,LU +3231717120,3231717375,NO +3231717632,3231718143,US +3231718144,3231718399,IT +3231718400,3231718655,US +3231718656,3231718911,PG +3231718912,3231719679,US +3231719680,3231719935,ES +3231720192,3231720703,US +3231720704,3231720959,IT +3231720960,3231722751,US +3231722752,3231723007,BR +3231723008,3231723519,US +3231723776,3231724031,US +3231724032,3231724287,BR +3231724288,3231725055,US +3231725312,3231727871,US +3231727872,3231728127,DE +3231728384,3231728639,AT +3231728640,3231729407,US +3231729408,3231729663,AU +3231729664,3231735551,US +3231735552,3231736063,CH +3231736064,3231737087,US +3231737600,3231738367,US +3231738368,3231738623,NL +3231738624,3231739135,US +3231739136,3231739391,GB +3231739392,3231739647,PL +3231739648,3231739903,BR +3231739904,3231742719,US +3231742720,3231742975,FR +3231742976,3231743487,US +3231743488,3231743743,NO +3231743744,3231743999,US +3231744000,3231744255,BR +3231744256,3231747583,US +3231747584,3231747839,DE +3231747840,3231748095,GB +3231748096,3231750143,US +3231750144,3231750399,NL +3231750400,3231750911,US +3231750912,3231751167,AU +3231751168,3231751423,IT +3231751424,3231752191,US +3231752192,3231752447,IT +3231752448,3231752703,JP +3231752704,3231753983,US +3231753984,3231754239,CA +3231754240,3231754495,US +3231754496,3231755263,AU +3231755264,3231755519,HU +3231755520,3231755775,US +3231755776,3231756543,PR +3231756544,3231757311,GB +3231757312,3231759359,US +3231759360,3231759615,BR +3231759616,3231760895,US +3231760896,3231761407,GB +3231761408,3231763711,US +3231763712,3231763967,AU +3231763968,3231766271,US +3231766528,3231768575,US +3231768832,3231769087,NO +3231769088,3231769343,NZ +3231769344,3231769855,US +3231769856,3231770111,AU +3231770112,3231770367,US +3231770368,3231770879,AT +3231770880,3231771135,RU +3231771136,3231773951,US +3231773952,3231775231,PT +3231775488,3231775743,PT +3231775744,3231775999,IL +3231776000,3231776511,US +3231777024,3231778047,US +3231778816,3231786495,US +3231793152,3231793663,BE +3231809536,3231810047,NZ +3231846400,3231846655,RO +3231908096,3231913215,US +3231916032,3231948799,FI +3231973376,3232038911,AT +3232038912,3232092671,SE +3232092672,3232093183,GB +3232093184,3232093439,US +3232093440,3232094207,GB +3232094208,3232094719,CH +3232094720,3232095231,US +3232095232,3232096255,GB +3232096256,3232104447,SE +3232104448,3232107519,DE +3232108544,3232129023,DE +3232131072,3232133119,DE +3232133632,3232134143,DE +3232137216,3232141311,DE +3232141824,3232156159,DE +3232156672,3232159743,DE +3232160768,3232163839,DE +3232165888,3232169727,DE +3232169984,3232235519,IT +3232301056,3232302335,US +3232303104,3232303615,US +3232305152,3232305919,US +3232309248,3232311807,SG +3232317440,3232317951,US +3232366592,3232391167,US +3232391168,3232399359,CH +3232399360,3232399615,US +3232433920,3232435455,US +3232436224,3232436735,US +3232448512,3232461311,US +3232464896,3232483327,GB +3232497664,3232555007,US +3232555264,3232555775,US +3232555776,3232557055,JP +3232557568,3232559103,JP +3232559360,3232560127,JP +3232560384,3232560895,JP +3232560896,3232561663,US +3232561664,3232561919,CA +3232561920,3232562431,US +3232562432,3232562687,LU +3232562688,3232562943,CA +3232563456,3232564479,GB +3232565248,3232566527,US +3232567296,3232569599,NZ +3232571392,3232579583,US +3232595968,3232598015,GB +3232629248,3232629759,US +3232630784,3232632575,US +3232632832,3232634879,US +3232636928,3232645119,US +3232645120,3232646399,AT +3232661504,3232694271,JP +3232694528,3232695807,US +3232696320,3232697599,US +3232698368,3232699903,US +3232702464,3232706559,FI +3232706560,3232706815,US +3232710656,3232716799,US +3232727040,3232759807,US +3232759808,3232825343,SE +3233285120,3233285375,US +3233481728,3233484799,US +3233484800,3233487359,ES +3233488896,3233496575,US +3233497088,3233505279,US +3233513472,3233546239,US +3233546496,3233546751,US +3233547008,3233548287,US +3233548800,3233549055,PT +3233549056,3233549311,BR +3233549312,3233557247,US +3233557248,3233557503,NZ +3233557504,3233561855,EC +3233561856,3233562367,US +3233562368,3233562879,GB +3233562880,3233563135,FR +3233563136,3233563903,US +3233563904,3233564159,GB +3233564160,3233564415,US +3233564416,3233564671,NZ +3233564672,3233564927,US +3233564928,3233566975,JP +3233568000,3233568767,JP +3233569024,3233569535,JP +3233569792,3233570047,JP +3233570048,3233570559,US +3233570816,3233571071,GB +3233571072,3233572095,US +3233572096,3233572351,AU +3233572352,3233573119,US +3233573120,3233573375,NO +3233573376,3233573631,US +3233573632,3233573887,AU +3233573888,3233575679,US +3233575680,3233575935,AU +3233575936,3233576191,RU +3233576192,3233576447,GB +3233576448,3233577215,US +3233577216,3233577471,AT +3233577472,3233577727,GB +3233577984,3233578239,US +3233578240,3233578495,GB +3233578496,3233578751,US +3233578752,3233579007,IE +3233579008,3233579263,AU +3233579264,3233579519,GB +3233579520,3233580031,US +3233580032,3233580287,GB +3233580288,3233581055,US +3233581056,3233581311,DE +3233581312,3233583359,US +3233583360,3233583615,GB +3233583616,3233584895,US +3233584896,3233585151,AU +3233585152,3233586431,US +3233586432,3233586943,GB +3233586944,3233588223,US +3233589248,3233589759,CA +3233589760,3233590015,CN +3233590016,3233590271,TW +3233590272,3233590527,TH +3233590528,3233590783,PR +3233590784,3233591039,PH +3233591040,3233591295,ID +3233591552,3233593087,US +3233593344,3233593599,US +3233593600,3233593855,NZ +3233593856,3233594111,AU +3233594112,3233594367,RU +3233594368,3233594623,US +3233594624,3233594879,RU +3233594880,3233595903,US +3233595904,3233596927,EC +3233596928,3233603327,US +3233603584,3233605887,US +3233605888,3233607167,PL +3233607168,3233607935,US +3233607936,3233608191,NZ +3233608192,3233609727,HU +3233609728,3233609983,BE +3233609984,3233610495,US +3233610752,3233611519,US +3233612032,3233612287,GB +3233612544,3233612799,US +3233613056,3233613311,US +3233613568,3233613823,US +3233613824,3233614847,GB +3233615104,3233615359,US +3233615360,3233615615,DE +3233615616,3233617151,US +3233617408,3233617663,CA +3233617664,3233617919,GB +3233617920,3233618175,JP +3233619456,3233620479,US +3233620480,3233620735,NZ +3233620736,3233620991,US +3233622272,3233622527,GB +3233622528,3233624831,US +3233624832,3233625087,AT +3233625088,3233625343,GB +3233625344,3233625599,US +3233625600,3233625855,AU +3233625856,3233626111,GB +3233626112,3233626879,US +3233627136,3233628671,US +3233628672,3233628927,FR +3233628928,3233629439,CA +3233629440,3233629695,GB +3233629696,3233629951,IL +3233629952,3233630463,US +3233630464,3233630719,NL +3233630720,3233630975,US +3233631232,3233631487,DE +3233631488,3233631743,US +3233632000,3233633535,US +3233633792,3233635839,US +3233635840,3233636095,AU +3233636096,3233642239,US +3233642240,3233642495,GB +3233642496,3233646591,US +3233646592,3233646847,AU +3233646848,3233647359,US +3233647872,3233649663,US +3233649664,3233649919,AU +3233649920,3233650431,US +3233650432,3233650687,DE +3233651200,3233651455,IT +3233651456,3233651967,US +3233651968,3233652223,GB +3233652224,3233652479,US +3233652480,3233652735,AU +3233652736,3233652991,GB +3233652992,3233654271,US +3233654272,3233655551,GB +3233655552,3233662975,US +3233663488,3233663999,GB +3233664256,3233665023,US +3233665024,3233666047,AU +3233666048,3233668863,US +3233668864,3233669119,PH +3233669120,3233670399,US +3233670400,3233671679,AU +3233671680,3233675263,US +3233675520,3233676031,US +3233676032,3233676287,DE +3233676288,3233677055,US +3233677568,3233679103,US +3233679360,3233681151,US +3233681408,3233682431,US +3233682944,3233684991,US +3233684992,3233685503,BR +3233685760,3233688063,US +3233688576,3233688831,GB +3233688832,3233692159,US +3233692160,3233692671,NO +3233692672,3233692927,US +3233692928,3233693183,AU +3233693184,3233693695,US +3233693696,3233693951,GB +3233693952,3233694207,US +3233694208,3233694463,AU +3233694464,3233694719,GB +3233694720,3233694975,US +3233694976,3233695231,FR +3233695232,3233696511,US +3233696512,3233696767,CA +3233696768,3233697791,US +3233701632,3233701887,NO +3233701888,3233704959,US +3233704960,3233705215,NZ +3233705216,3233705983,US +3233707008,3233710335,US +3233710336,3233711359,FR +3233711360,3233721599,US +3233721600,3233721855,HU +3233721856,3233722111,PT +3233722112,3233723391,US +3233723392,3233723903,AU +3233723904,3233724415,GB +3233724416,3233725439,US +3233725952,3233726975,NO +3233726976,3233728767,US +3233728768,3233729279,GB +3233729280,3233729535,US +3233729536,3233730047,SG +3233730560,3233732607,AU +3233732608,3233733631,US +3233734656,3233734911,US +3233735680,3233736959,US +3233736960,3233737983,FR +3233737984,3233738751,US +3233738752,3233739007,GB +3233739008,3233739263,US +3233739264,3233739519,FR +3233739520,3233740543,US +3233740544,3233741311,GB +3233741312,3233742591,US +3233742848,3233808383,US +3233808384,3233873919,TW +3233873920,3233939455,US +3233939456,3233980671,FI +3233980672,3233980927,GB +3233980928,3233991167,FI +3233991168,3233991423,DE +3233991424,3234004991,FI +3234005248,3234005503,GB +3234005504,3234005759,AU +3234006528,3234007039,US +3234007040,3234007295,RU +3234007296,3234007551,US +3234007552,3234007807,AU +3234007808,3234008063,US +3234008064,3234008831,NZ +3234008832,3234011135,US +3234012160,3234013183,US +3234013440,3234013695,US +3234013696,3234013951,AU +3234013952,3234014207,US +3234014464,3234014975,US +3234014976,3234015487,KR +3234015488,3234015743,US +3234015744,3234015999,IE +3234016000,3234016255,GB +3234016256,3234019327,AU +3234019328,3234019839,MX +3234019840,3234023423,US +3234023424,3234023679,PL +3234023680,3234024703,US +3234026752,3234030079,US +3234030080,3234030335,DE +3234030336,3234031103,US +3234031104,3234031359,AU +3234031360,3234031871,US +3234031872,3234032127,GB +3234032128,3234032383,PL +3234032384,3234032895,US +3234033152,3234033407,IT +3234033408,3234033663,US +3234033664,3234033919,AU +3234033920,3234034687,US +3234034688,3234035455,GB +3234035456,3234039295,US +3234039296,3234043135,SE +3234043136,3234043903,US +3234043904,3234044159,AU +3234044160,3234048511,US +3234048512,3234048767,AU +3234048768,3234049279,US +3234049792,3234051839,US +3234051840,3234052095,NL +3234052096,3234052351,DE +3234052352,3234052607,US +3234052608,3234052863,NZ +3234052864,3234054911,US +3234054912,3234055167,PT +3234055168,3234055423,US +3234055424,3234055679,AU +3234055680,3234056959,US +3234057216,3234061055,US +3234061056,3234061311,NZ +3234061312,3234064639,US +3234064640,3234064895,AU +3234064896,3234065407,US +3234065408,3234065663,GB +3234065664,3234065919,BR +3234065920,3234069247,US +3234069504,3234069759,US +3234070016,3234070271,US +3234070784,3234110463,FR +3234136064,3234150911,CA +3234151424,3234158847,CA +3234159104,3234159359,CA +3234160128,3234163455,CA +3234163456,3234163711,US +3234163712,3234167295,CA +3234167808,3234172927,CA +3234172928,3234173951,US +3234173952,3234175999,CA +3234176256,3234177279,US +3234177280,3234187007,CA +3234187008,3234187519,US +3234187520,3234189055,CA +3234189312,3234192383,CA +3234192384,3234193663,US +3234193664,3234198783,CA +3234199040,3234201343,CA +3234202624,3234203647,US +3234203648,3234205695,BR +3234205696,3234208255,US +3234209792,3234215935,US +3234217984,3234221823,US +3234234368,3234247167,US +3234267392,3234269695,US +3234271232,3234275327,PT +3234275328,3234279423,AU +3234283520,3234312703,US +3234332928,3234334975,US +3234340864,3234349055,US +3234349056,3234353151,NZ +3234365440,3234367487,US +3234398208,3234529279,US +3234529536,3234538751,US +3234539008,3234539519,AU +3234539520,3234549759,US +3234549760,3234550015,RU +3234550016,3234553855,NZ +3234553856,3234554367,US +3234554624,3234554879,NZ +3234555904,3234556415,US +3234556416,3234556927,CA +3234556928,3234557439,FI +3234557440,3234564607,US +3234564608,3234566911,KR +3234566912,3234568703,US +3234568704,3234568959,NZ +3234568960,3234569215,US +3234569216,3234569727,AU +3234569728,3234569983,CL +3234569984,3234574335,US +3234574336,3234574591,AU +3234574592,3234574847,MX +3234574848,3234576127,US +3234576128,3234576895,HK +3234576896,3234578687,US +3234578688,3234578943,AU +3234578944,3234579711,US +3234579712,3234579967,CA +3234579968,3234581247,US +3234581248,3234581503,CA +3234581504,3234582527,US +3234582528,3234583039,NZ +3234583040,3234583807,US +3234583808,3234584063,AU +3234584064,3234584575,US +3234584576,3234584831,NZ +3234584832,3234585343,US +3234585600,3234587391,US +3234587392,3234587647,SA +3234587648,3234588415,US +3234588672,3234588927,MO +3234588928,3234589439,US +3234589440,3234589695,AU +3234589696,3234589951,US +3234590208,3234590463,US +3234590720,3234592511,US +3234592512,3234592767,TH +3234592768,3234594047,US +3234594816,3234725887,US +3234726144,3234726399,CA +3234726400,3234726911,US +3234728192,3234730495,US +3234730752,3234733055,US +3234733056,3234733311,CA +3234733312,3234734079,US +3234735616,3234737407,US +3234738176,3234739455,US +3234740224,3234742015,US +3234742272,3234743551,US +3234744832,3234745599,US +3234745600,3234746879,GB +3234746880,3234747903,US +3234747904,3234748159,IL +3234748160,3234749439,US +3234749696,3234750207,CA +3234750720,3234751999,US +3234752000,3234752255,HK +3234752256,3234753535,US +3234753536,3234753791,AU +3234753792,3234754047,US +3234754560,3234755839,US +3234755840,3234756095,AU +3234756096,3234760703,US +3234760960,3234761727,US +3234763264,3234764799,CA +3234764800,3234766335,NZ +3234766336,3234772223,US +3234772224,3234772479,CA +3234772480,3234772735,US +3234772992,3234777599,US +3234778368,3234781439,US +3234781440,3234781951,CA +3234781952,3234782719,US +3234782720,3234783999,IL +3234784000,3234786815,US +3234787328,3234791167,US +3234791680,3234794495,US +3234794752,3234795007,US +3234795008,3234795263,GB +3234795264,3234795519,US +3234795776,3234796031,US +3234796544,3234799359,US +3234799360,3234799615,NL +3234799616,3234799871,US +3234799872,3234800127,AU +3234800640,3234800895,AU +3234800896,3234801663,US +3234801664,3234802431,EC +3234802432,3234803711,US +3234803712,3234803967,PR +3234804224,3234805503,US +3234805760,3234806527,US +3234807552,3234807807,US +3234807808,3234808063,TH +3234808064,3234809087,EC +3234809088,3234810879,US +3234810880,3234811135,CA +3234811136,3234814719,US +3234814720,3234814975,HK +3234814976,3234815999,US +3234816000,3234816767,AU +3234816768,3234820351,US +3234820352,3234820607,AU +3234820608,3234820863,US +3234821120,3234821887,US +3234821888,3234822655,AU +3234822656,3234826751,US +3234826752,3234827007,CA +3234827008,3234827519,US +3234827520,3234827775,GB +3234827776,3234828031,LU +3234828032,3234828287,NZ +3234828288,3234828799,US +3234828800,3234829055,CL +3234829056,3234830079,US +3234830080,3234832127,AU +3234832128,3234832639,US +3234832640,3234832895,AU +3234832896,3234833663,US +3234833664,3234833919,AU +3234833920,3234838271,US +3234838272,3234838527,GT +3234838528,3234839295,US +3234839296,3234839551,AU +3234839552,3234841087,US +3234841088,3234841599,BR +3234841600,3234841855,PT +3234841856,3234842367,AU +3234842368,3234842623,US +3234842624,3234844415,BR +3234844416,3234853375,US +3234853376,3234853631,TH +3234853632,3234853887,US +3234853888,3234854143,EC +3234854144,3234854911,US +3234854912,3234855167,AU +3234855168,3234855935,US +3234856192,3234856447,US +3234856448,3234856703,TH +3234857216,3234861055,CA +3234861056,3234864383,US +3234865152,3234870271,US +3234873344,3234886143,US +3234889728,3234897407,US +3234922752,3234926847,US +3234930688,3234938367,US +3234938880,3234988031,US +3234988288,3234990847,CA +3234996224,3234998783,US +3235004416,3235020799,CA +3235053824,3235056383,US +3235057664,3235065343,US +3235069952,3235085311,US +3235119104,3235275007,US +3235315712,3235512319,US +3235512320,3235577855,JP +3235578112,3235641855,CA +3235642112,3235643135,CA +3235643392,3235774463,US +3235774720,3235776767,CA +3235778560,3235800319,US +3235840256,3235842303,US +3235844096,3235846143,US +3235848192,3235856383,US +3235856384,3235872767,BR +3235872768,3235971071,US +3235971328,3235977727,US +3235979264,3235985663,US +3235987456,3235995647,US +3236003840,3236010239,US +3236038656,3236044799,US +3236044800,3236052991,CA +3236052992,3236069375,US +3236102400,3236106239,PH +3236106240,3236134911,US +3236167936,3236175871,CA +3236175872,3236191487,US +3236200448,3236233215,MY +3236233472,3236238591,US +3236241408,3236249599,US +3236298752,3236302847,US +3236302848,3236306943,NZ +3236364544,3236365567,US +3236365824,3236368127,US +3236368128,3236368383,NZ +3236368384,3236372991,US +3236372992,3236373247,AU +3236373760,3236379391,US +3236379392,3236379647,AU +3236379648,3236380927,US +3236381184,3236381439,CA +3236381440,3236381695,AT +3236381696,3236383999,US +3236384000,3236384255,AU +3236384256,3236385279,US +3236385280,3236385535,DE +3236385536,3236385791,US +3236386304,3236387071,US +3236387072,3236387327,CA +3236387328,3236387839,US +3236387840,3236389375,PR +3236389376,3236392447,US +3236392448,3236392703,CL +3236392704,3236393471,US +3236393472,3236395519,BR +3236395520,3236396799,US +3236396800,3236397055,AU +3236397056,3236398591,US +3236398848,3236399615,AU +3236399616,3236400127,US +3236400128,3236400383,CL +3236400384,3236401151,US +3236401152,3236401407,AU +3236401408,3236403967,US +3236404224,3236406783,US +3236406784,3236407551,AU +3236407552,3236408063,SG +3236408064,3236408319,US +3236408320,3236409087,CA +3236409088,3236409599,BR +3236409600,3236411135,US +3236411136,3236411391,NZ +3236411392,3236412415,US +3236412672,3236413695,US +3236413696,3236413951,AU +3236413952,3236416255,US +3236416256,3236416511,AU +3236416512,3236418303,US +3236418304,3236418815,AU +3236418816,3236419071,US +3236419328,3236419583,US +3236419584,3236419839,AU +3236419840,3236420095,US +3236420096,3236420351,AU +3236420352,3236424959,US +3236425216,3236427519,US +3236427520,3236427775,CA +3236427776,3236428031,NZ +3236428800,3236429311,US +3236430080,3236432639,US +3236433920,3236438015,US +3236438016,3236446207,AU +3236446208,3236462591,US +3236462592,3236470783,AU +3236495360,3236560895,US +3236561152,3236566783,US +3236566784,3236567039,CA +3236567040,3236568831,US +3236569856,3236570367,US +3236571392,3236575743,US +3236575744,3236575999,JP +3236576000,3236581119,US +3236583680,3236585983,US +3236585984,3236586239,CA +3236586240,3236587775,US +3236588032,3236589823,US +3236590080,3236591103,US +3236592128,3236601343,US +3236601600,3236604671,US +3236604672,3236604927,CA +3236604928,3236610047,US +3236610560,3236611071,US +3236612096,3236612607,US +3236613376,3236617471,US +3236617728,3236617983,US +3236617984,3236619775,CA +3236619776,3236620031,US +3236620032,3236620287,AU +3236620288,3236623615,US +3236623616,3236623871,AU +3236623872,3236625919,US +3236625920,3236626175,CA +3236626432,3236642815,US +3236692224,3236694271,US +3236696064,3236698623,US +3236700160,3236708351,US +3236757504,3236765695,CA +3236765696,3236790271,US +3236823296,3236825855,CH +3236827136,3236829183,US +3236831232,3236855807,US +3236888576,3236958207,US +3236958208,3236962303,AU +3236962304,3236966143,US +3236970496,3236978687,US +3236986880,3236991999,US +3237019648,3237021695,US +3237023744,3237031935,US +3237085184,3237155839,US +3237155840,3237156863,AU +3237158912,3237159167,US +3237160192,3237160703,US +3237183488,3237205247,US +3237216256,3237281791,JP +3237282560,3237284607,US +3237284608,3237284863,AU +3237284864,3237285119,US +3237285120,3237285631,AU +3237285632,3237287935,US +3237287936,3237288191,CA +3237288192,3237289471,US +3237289728,3237290495,US +3237290496,3237291007,AU +3237291008,3237291263,NZ +3237291264,3237294847,US +3237294848,3237295103,CA +3237295104,3237296639,US +3237296640,3237297151,SG +3237297152,3237297407,CL +3237297408,3237300479,US +3237300480,3237302527,NZ +3237302528,3237305087,US +3237305088,3237305343,CA +3237305344,3237305855,US +3237305856,3237306111,NZ +3237306112,3237308671,US +3237308672,3237310719,AU +3237310720,3237311999,US +3237312256,3237312767,US +3237312768,3237313023,BO +3237313024,3237317631,US +3237317888,3237319679,US +3237319936,3237320703,US +3237320704,3237320959,UA +3237320960,3237321471,US +3237321472,3237321727,HK +3237321728,3237321983,US +3237323264,3237325055,US +3237325056,3237325311,PL +3237325312,3237325823,US +3237325824,3237326079,CA +3237326080,3237328127,US +3237328384,3237328639,US +3237328640,3237328895,CA +3237328896,3237329151,US +3237329152,3237329407,NZ +3237329408,3237330943,US +3237330944,3237331199,AU +3237331456,3237331967,US +3237331968,3237332223,HK +3237332224,3237335039,US +3237335040,3237335295,HK +3237335296,3237335551,US +3237335552,3237337599,AU +3237337600,3237337855,US +3237337856,3237338111,AU +3237338112,3237338367,NZ +3237338368,3237339391,US +3237339392,3237339647,GB +3237339648,3237340159,US +3237340160,3237340415,CA +3237340416,3237345535,US +3237345536,3237346303,KR +3237346304,3237347071,US +3237347328,3237412863,US +3237413120,3237415679,GB +3237416960,3237437439,US +3237445632,3237478399,US +3237478400,3237511167,LK +3237511168,3237548031,US +3237548032,3237552127,KR +3237552128,3237557247,US +3237609472,3237613567,US +3237615104,3237615615,US +3237615616,3237616895,CA +3237617152,3237658623,US +3237675264,3237681663,US +3237681664,3237682943,CA +3237682944,3237684991,US +3237684992,3237685247,CL +3237685248,3237688319,US +3237688320,3237689343,CA +3237689344,3237690623,US +3237690624,3237691903,SA +3237691904,3237698303,US +3237698304,3237698559,CA +3237698560,3237701631,US +3237702400,3237707775,US +3237708032,3237712895,US +3237712896,3237713151,AU +3237713152,3237716991,US +3237716992,3237717247,CA +3237717248,3237717503,US +3237717504,3237717759,CA +3237717760,3237724927,US +3237724928,3237725183,AU +3237725184,3237725439,CA +3237725440,3237725695,US +3237726464,3237726719,AU +3237726976,3237727231,US +3237727232,3237728255,AU +3237728256,3237732863,US +3237732864,3237733119,DE +3237733120,3237733631,TH +3237733632,3237733887,AU +3237734144,3237734399,CA +3237734400,3237735679,US +3237740544,3237773311,US +3237806336,3237857535,US +3237871616,3237887999,US +3238002688,3238006783,NL +3238006784,3238007039,GB +3238007040,3238010879,NL +3238010880,3238017023,CH +3238017024,3238018303,DK +3238019072,3238035455,PL +3238035456,3238060031,FR +3238060032,3238060287,CH +3238060288,3238060543,RO +3238060544,3238060799,HU +3238060800,3238061311,UA +3238061312,3238061567,GB +3238061568,3238061823,AT +3238061824,3238062079,CZ +3238062080,3238062591,CH +3238062592,3238062847,GB +3238062848,3238063103,SE +3238063104,3238063359,PL +3238063360,3238063615,CH +3238063616,3238063871,IT +3238063872,3238064127,GB +3238064128,3238064383,UA +3238064384,3238064639,ES +3238064640,3238064895,PL +3238064896,3238065151,DK +3238065152,3238065407,SI +3238065408,3238065663,FR +3238065664,3238065919,DE +3238065920,3238066175,UA +3238066176,3238066431,DE +3238066432,3238066687,GB +3238066688,3238066943,DE +3238066944,3238067199,LT +3238067200,3238067455,NO +3238067456,3238067711,SE +3238067712,3238067967,AT +3238067968,3238068223,GB +3238068224,3238133759,IE +3238133760,3238199295,SI +3238199296,3238201599,DK +3238201600,3238202367,US +3238202368,3238264831,DK +3238264832,3238330367,IS +3238330368,3238337023,CH +3238337024,3238337535,LI +3238337536,3238395903,CH +3238395904,3238461439,HU +3238461440,3238502399,DE +3238502400,3238504447,RU +3238504448,3238526975,DE +3238527232,3238541567,CH +3238541824,3238542591,CH +3238542848,3238545919,CH +3238546432,3238546943,CH +3238547456,3238548991,CH +3238549504,3238559231,CH +3238559488,3238562559,CH +3238562816,3238573567,CH +3238574080,3238582271,CH +3238582784,3238583295,CH +3238583808,3238589951,CH +3238590208,3238590719,CH +3238591232,3238592511,CH +3238592512,3238593023,GB +3238594304,3238594559,GB +3238594560,3238595583,BE +3238595584,3238595839,SI +3238595840,3238596607,GB +3238596608,3238596863,BG +3238596864,3238597119,RU +3238597120,3238597375,DE +3238597376,3238597631,SI +3238597632,3238597887,GB +3238597888,3238598143,SI +3238598144,3238598399,RU +3238598400,3238598655,NL +3238598656,3238598911,CH +3238598912,3238599167,PL +3238599168,3238599679,HU +3238599680,3238599935,UA +3238599936,3238600703,HU +3238600704,3238604799,DE +3238604800,3238606335,NL +3238606336,3238606591,SE +3238606592,3238607359,NL +3238607360,3238607871,SE +3238607872,3238608895,NL +3238621184,3238621439,FI +3238621440,3238621695,FR +3238621696,3238621951,IT +3238621952,3238622207,NL +3238622208,3238622463,NO +3238622464,3238622719,SE +3238622720,3238622975,DK +3238622976,3238623231,GB +3238623488,3238623743,PL +3238623744,3238623999,CH +3238624000,3238624255,PL +3238624256,3238625279,HU +3238630400,3238630655,GR +3238630656,3238632959,GB +3238632960,3238633215,UA +3238633216,3238657791,DK +3238657792,3238658047,AT +3238658048,3238675455,SE +3238675456,3238675711,DK +3238675712,3238723071,SE +3238723072,3238723327,DK +3238723328,3238795263,SE +3238795264,3238795775,IT +3238795776,3238801279,SE +3238801280,3238801343,GB +3238801344,3239051263,SE +3239051264,3239051519,CH +3239051520,3239062271,DE +3239062272,3239062527,ES +3239062528,3239062783,CH +3239062784,3239063551,UA +3239063552,3239075839,DE +3239075840,3239076095,MT +3239076096,3239076351,SE +3239076352,3239076607,DE +3239076608,3239076863,PL +3239076864,3239077119,NL +3239077120,3239077375,UA +3239077376,3239077631,BG +3239077632,3239077887,PT +3239077888,3239078143,CZ +3239078144,3239078399,UA +3239078400,3239078655,RU +3239078656,3239078911,PL +3239078912,3239079167,GB +3239079168,3239079423,SI +3239079424,3239079679,FR +3239079680,3239079935,MD +3239079936,3239088127,DE +3239088128,3239088639,GB +3239088640,3239088895,DK +3239088896,3239089151,IL +3239089152,3239089407,RO +3239089408,3239089919,GB +3239089920,3239090175,DE +3239090176,3239090431,SI +3239090432,3239090687,ES +3239090688,3239090943,NL +3239090944,3239091199,AT +3239091200,3239091455,FR +3239091456,3239091711,BG +3239091712,3239091967,UA +3239091968,3239092223,FR +3239092224,3239104511,DE +3239104512,3239105279,RU +3239105280,3239105535,CH +3239105536,3239105791,DE +3239105792,3239106047,RO +3239106048,3239106559,AT +3239106560,3239106815,ES +3239106816,3239107071,CH +3239107072,3239107327,RO +3239107328,3239107583,GR +3239107584,3239107839,CH +3239107840,3239108095,RO +3239108096,3239109887,DE +3239109888,3239110143,PL +3239110144,3239110655,DE +3239110656,3239110911,PL +3239110912,3239111167,UA +3239111168,3239111423,NL +3239111424,3239111935,DE +3239111936,3239112191,AT +3239112192,3239112447,UA +3239112448,3239112959,PL +3239112960,3239113215,CH +3239113472,3239113727,ES +3239113728,3239113983,AT +3239113984,3239114239,DE +3239114240,3239114495,BG +3239114496,3239114751,UA +3239114752,3239116543,DE +3239116544,3239116799,PL +3239116800,3239117055,PT +3239117312,3239119871,DE +3239119872,3239120127,GB +3239120128,3239120383,CZ +3239120384,3239120639,PL +3239120640,3239120895,FR +3239120896,3239121663,DE +3239121664,3239121919,FR +3239121920,3239127039,DE +3239127040,3239127295,PT +3239127296,3239127551,PL +3239127552,3239127807,IL +3239127808,3239128063,RU +3239128064,3239128319,AT +3239128320,3239128575,IT +3239128576,3239128831,UA +3239128832,3239129087,CZ +3239129088,3239130111,DE +3239130112,3239130367,RU +3239130368,3239130623,JO +3239130624,3239131135,PL +3239131136,3239133183,DE +3239133184,3239133439,CH +3239133440,3239133695,GB +3239133696,3239133951,ES +3239133952,3239134207,SE +3239134208,3239134463,IL +3239134464,3239134719,UA +3239134720,3239134975,RO +3239134976,3239135231,PL +3239135232,3239135487,SE +3239135488,3239135743,FR +3239135744,3239135999,IL +3239136000,3239136255,UA +3239136256,3239136511,CH +3239136512,3239136767,DE +3239136768,3239137023,MD +3239137024,3239137279,LI +3239137280,3239138303,DE +3239138304,3239138559,PL +3239138560,3239138815,CH +3239138816,3239149567,DE +3239149568,3239160319,GB +3239160320,3239160575,RU +3239160576,3239160831,DE +3239160832,3239161087,PL +3239161088,3239161343,BY +3239161344,3239161599,UA +3239161600,3239161855,HU +3239161856,3239162623,DE +3239162624,3239162879,BE +3239162880,3239163903,DE +3239164160,3239164671,DE +3239164672,3239164927,GB +3239164928,3239165183,DK +3239165184,3239165951,DE +3239165952,3239166207,FR +3239166208,3239166463,DE +3239166464,3239166719,CH +3239166720,3239166975,RO +3239166976,3239167231,FR +3239167232,3239167487,DE +3239167488,3239167743,FR +3239167744,3239168511,CH +3239168512,3239168767,SE +3239168768,3239169023,PL +3239169024,3239169535,DE +3239169536,3239169791,DK +3239169792,3239170047,SE +3239170048,3239170303,UA +3239170304,3239170559,FR +3239170560,3239170815,GB +3239170816,3239171071,SE +3239171072,3239171327,PL +3239171328,3239171583,UA +3239171584,3239171839,PL +3239171840,3239172095,CM +3239172096,3239172607,UA +3239172608,3239172863,SE +3239172864,3239173119,DE +3239173120,3239173375,RO +3239173376,3239173631,DE +3239173632,3239173887,AT +3239173888,3239174143,PL +3239174144,3239174399,DE +3239174400,3239174655,FR +3239174656,3239174911,UA +3239174912,3239175167,SI +3239175168,3239175423,UA +3239175424,3239175679,BG +3239175680,3239175935,DE +3239175936,3239176191,FI +3239176192,3239180287,DE +3239181312,3239181567,AT +3239181568,3239181823,UA +3239181824,3239264255,DE +3239264256,3239264767,NO +3239264768,3239266303,RU +3239266304,3239266815,PL +3239266816,3239267327,UA +3239267328,3239267839,FR +3239267840,3239268351,DE +3239268352,3239268863,SE +3239268864,3239269375,RU +3239269376,3239270399,UA +3239270400,3239270911,GB +3239270912,3239271423,SA +3239271424,3239271935,AT +3239271936,3239272447,CH +3239272448,3239272959,UA +3239272960,3239273471,GB +3239273472,3239273983,UA +3239273984,3239274495,RU +3239274496,3239275007,PL +3239275520,3239276543,UA +3239276544,3239277055,LU +3239277056,3239277567,DE +3239277568,3239278079,RU +3239278080,3239278591,UA +3239279104,3239280127,PL +3239280128,3239280639,RU +3239280640,3239281663,IR +3239281664,3239282687,UA +3239282688,3239283711,DE +3239283712,3239284735,PL +3239284736,3239285759,UA +3239285760,3239286783,KW +3239286784,3239287807,UA +3239287808,3239288831,GB +3239288832,3239289855,DE +3239289856,3239290879,PL +3239291904,3239292927,BG +3239292928,3239293951,CZ +3239293952,3239294975,DE +3239294976,3239295999,UA +3239296000,3239297023,SA +3239297024,3239298047,RO +3239298048,3239299071,GB +3239299072,3239301119,UA +3239301120,3239302143,FR +3239302144,3239303167,PL +3239303168,3239304191,FR +3239304192,3239305215,SI +3239305216,3239306239,NL +3239306240,3239307263,UA +3239307264,3239308287,EG +3239308288,3239309311,DE +3239309312,3239311359,UA +3239311360,3239312383,FR +3239312384,3239313407,UA +3239313408,3239445759,DE +3239445760,3239446015,PL +3239446016,3239446271,RU +3239446272,3239446527,FR +3239446528,3239451647,DE +3239451648,3239451903,NO +3239451904,3239452159,DE +3239452160,3239452415,CY +3239452416,3239452671,HR +3239452672,3239464959,DE +3239464960,3239465215,IL +3239465216,3239465471,HR +3239465472,3239465727,AT +3239465728,3239465983,PL +3239465984,3239466239,UA +3239466240,3239466495,AT +3239466496,3239466751,FI +3239466752,3239467007,GB +3239467008,3239467263,RU +3239467264,3239467519,GB +3239467520,3239467775,IT +3239467776,3239468031,PL +3239468032,3239468287,FR +3239468288,3239468543,RO +3239468544,3239468799,NO +3239468800,3239469055,RO +3239469056,3239470591,DE +3239470592,3239470847,DK +3239470848,3239471103,BG +3239471104,3239471871,DE +3239471872,3239472127,FR +3239472128,3239474943,DE +3239474944,3239475199,ES +3239475200,3239479295,DE +3239479552,3239479807,DE +3239479808,3239480063,UA +3239480064,3239480319,FR +3239480320,3239480575,UA +3239480576,3239480831,RO +3239480832,3239481087,CH +3239481088,3239481343,FR +3239481344,3239486719,DE +3239486720,3239486975,ES +3239486976,3239487487,DE +3239487488,3239487743,GB +3239487744,3239487999,PL +3239488000,3239488255,AT +3239488256,3239488511,CH +3239488512,3239488767,KW +3239488768,3239489023,RO +3239489024,3239489279,RU +3239489280,3239489535,PL +3239489536,3239501823,DE +3239501824,3239505919,BE +3239505920,3239506431,DE +3239506432,3239506687,RU +3239506688,3239507455,GB +3239507456,3239507967,DE +3239507968,3239508223,BG +3239508224,3239508479,SA +3239508480,3239508735,NO +3239508736,3239508991,DE +3239508992,3239509247,PL +3239509248,3239510015,DE +3239510016,3239510271,UA +3239510272,3239522303,DE +3239522304,3239522559,PL +3239522560,3239522815,SI +3239522816,3239523071,LT +3239523072,3239523327,PL +3239523328,3239523583,BG +3239523584,3239523839,UA +3239523840,3239524095,PL +3239524096,3239524351,SE +3239524352,3239524607,DE +3239524608,3239524863,SE +3239524864,3239525119,UA +3239525120,3239525375,LT +3239525376,3239525631,UA +3239525632,3239525887,PL +3239525888,3239526143,SI +3239526144,3239526399,PL +3239526400,3239538687,DE +3239538688,3239539199,NL +3239539200,3239539455,IT +3239539456,3239539711,BE +3239539712,3239539967,GB +3239539968,3239540223,SE +3239540224,3239540479,GR +3239540480,3239540735,DE +3239540736,3239540991,GB +3239540992,3239541247,FR +3239541248,3239541503,UA +3239541504,3239541759,FR +3239541760,3239542015,GB +3239542016,3239542271,PL +3239542272,3239542527,GB +3239542528,3239542783,FR +3239542784,3239544831,DE +3239544832,3239545087,GB +3239545088,3239545343,SI +3239545344,3239545855,HU +3239545856,3239546111,UA +3239546112,3239546367,GB +3239546368,3239546623,RU +3239546624,3239546879,NL +3239546880,3239549951,DE +3239549952,3239550207,TR +3239550208,3239550463,UA +3239550464,3239550719,FR +3239550720,3239550975,NO +3239550976,3239554047,DE +3239554048,3239554303,SE +3239554304,3239554559,DK +3239554560,3239554815,PL +3239554816,3239555071,UA +3239555072,3239556095,DE +3239556096,3239556351,SA +3239556352,3239556607,UA +3239556608,3239556863,HR +3239556864,3239557119,UA +3239557120,3239567359,DE +3239567616,3239567871,UA +3239567872,3239568127,DE +3239568128,3239568383,FR +3239568384,3239568639,SE +3239568640,3239568895,NO +3239568896,3239575295,DE +3239575296,3239575551,DK +3239575552,3239575807,RO +3239575808,3239578879,DE +3239579136,3239579391,PL +3239579392,3239581695,DE +3239581696,3239581951,PL +3239581952,3239582207,UA +3239582208,3239582463,GB +3239582464,3239582719,DE +3239582720,3239582975,GB +3239582976,3239583231,IT +3239583232,3239583487,UA +3239583488,3239583743,RO +3239583744,3239591935,DE +3239591936,3239593983,FI +3239593984,3239624703,DE +3239624704,3239625727,CH +3239625728,3239628799,PL +3239628800,3239629823,DE +3239629824,3239630847,FR +3239630848,3239631871,DE +3239631872,3239632895,PL +3239632896,3239633919,DE +3239633920,3239634943,FR +3239634944,3239635967,RU +3239635968,3239636991,DE +3239636992,3239638015,BG +3239638016,3239639039,PL +3239639040,3239640063,SI +3239640064,3239641087,DE +3239641088,3239643135,PL +3239643136,3239645183,RU +3239645184,3239665663,DE +3239665664,3239666175,BE +3239666176,3239666687,AT +3239666688,3239667199,SE +3239667200,3239667711,CH +3239667712,3239668223,RO +3239668224,3239668735,UA +3239668736,3239669247,PL +3239669248,3239670271,RO +3239670272,3239670783,DE +3239670784,3239671295,GB +3239671296,3239671807,DE +3239671808,3239672319,GB +3239672320,3239672831,DE +3239672832,3239673343,TR +3239673344,3239673855,SE +3239673856,3239682047,DE +3239682048,3239682559,PL +3239682560,3239683071,BG +3239683072,3239683583,PT +3239683584,3239684607,PL +3239684608,3239685119,GB +3239685120,3239686143,DE +3239686144,3239686655,UA +3239686656,3239687167,IT +3239687168,3239687679,UA +3239687680,3239688191,DE +3239688192,3239688703,PL +3239688704,3239689727,GB +3239689728,3239690239,RU +3239690240,3239690495,ES +3239690496,3239690751,PL +3239690752,3239691263,FR +3239691264,3239691519,IT +3239691520,3239692031,FR +3239692032,3239692287,AT +3239692288,3239697407,DE +3239697408,3239697663,NL +3239697664,3239697919,RU +3239697920,3239698431,PL +3239698432,3239702527,DE +3239704576,3239706367,DE +3239706368,3239706623,UA +3239706624,3239706879,RU +3239706880,3239707135,NL +3239707136,3239707391,RU +3239707392,3239707647,UA +3239707648,3239707903,GB +3239707904,3239708159,DE +3239708160,3239708415,SE +3239708416,3239708671,RO +3239708672,3239708927,AT +3239708928,3239709183,NL +3239709184,3239709439,RO +3239709440,3239709695,FR +3239709696,3239709951,DE +3239709952,3239710207,UA +3239710208,3239710463,BG +3239710464,3239710719,DE +3239710720,3239710975,RU +3239710976,3239711231,SE +3239711232,3239711487,BY +3239711488,3239711743,FR +3239711744,3239711999,UA +3239712000,3239712255,PL +3239712256,3239712511,DE +3239712512,3239712767,GB +3239712768,3239713023,DE +3239713024,3239713279,PL +3239713280,3239713535,SI +3239713536,3239713791,UA +3239713792,3239714047,DE +3239714048,3239714303,FR +3239714304,3239714559,SE +3239714560,3239714815,HU +3239714816,3239723007,DE +3239723008,3239731199,GB +3239731200,3239739391,DE +3239739392,3239739647,IT +3239739648,3239739903,RO +3239739904,3239740159,CH +3239740160,3239740415,PL +3239740416,3239740671,DK +3239740672,3239740927,GB +3239740928,3239741183,UA +3239741184,3239741439,RU +3239741440,3239759871,DE +3239759872,3239760127,RU +3239760128,3239760383,UA +3239760384,3239760895,PL +3239760896,3239761151,RU +3239761152,3239761407,GB +3239761408,3239761663,RU +3239761664,3239761919,PL +3239761920,3239762175,BG +3239762176,3239762431,CH +3239762432,3239762687,DK +3239762688,3239762943,RO +3239762944,3239763199,PL +3239763200,3239763455,SE +3239763456,3239763967,GB +3239763968,3239772159,DE +3239772160,3239772415,UA +3239772416,3239772671,GB +3239772672,3239773183,DK +3239773184,3239773439,FR +3239773440,3239773951,PL +3239773952,3239774207,SA +3239774208,3239774463,PL +3239774464,3239774719,ES +3239774720,3239774975,FR +3239774976,3239775231,PT +3239775232,3239776255,DE +3239776512,3239782399,DE +3239782400,3239782655,AT +3239782656,3239782911,RU +3239782912,3239783167,GB +3239783168,3239783423,CH +3239783424,3239783679,DK +3239783680,3239783935,CH +3239783936,3239784191,DE +3239784192,3239784447,UA +3239784448,3239788543,DE +3239789056,3239789567,RU +3239789568,3239790079,UA +3239790080,3239791103,RO +3239791104,3239791615,DK +3239791616,3239792639,FR +3239792640,3239793151,UA +3239793152,3239793663,PL +3239793664,3239794175,RO +3239794176,3239794687,NL +3239794688,3239795199,GB +3239795200,3239795711,PL +3239795712,3239796223,IL +3239796224,3239796735,NO +3239796736,3239821311,DE +3239821312,3239821823,SE +3239821824,3239822335,FR +3239822336,3239822847,RU +3239822848,3239823359,PL +3239823360,3239823871,SE +3239823872,3239824383,IT +3239824384,3239824895,PL +3239824896,3239825407,UZ +3239825408,3239825919,UA +3239825920,3239826431,PL +3239826432,3239826943,GB +3239826944,3239827455,RU +3239827456,3239827967,DK +3239827968,3239828479,CH +3239828480,3239828991,DE +3239828992,3239830015,RU +3239830016,3239830527,DK +3239830528,3239831039,SE +3239831040,3239832063,RU +3239832064,3239832575,UA +3239832576,3239834111,RU +3239834112,3239834623,UA +3239834624,3239835135,AT +3239835136,3239836159,RU +3239836160,3239836671,DK +3239836672,3239837183,DE +3239837184,3239837695,SE +3239837696,3239837951,PL +3239837952,3239839231,DE +3239839232,3239839487,RU +3239839488,3239839743,DE +3239839744,3239839999,SK +3239840000,3239840511,SA +3239840512,3239840767,DE +3239840768,3239841023,AT +3239841024,3239841279,NL +3239841280,3239848447,DE +3239848448,3239848703,DK +3239848704,3239848959,SE +3239848960,3239849215,RU +3239849216,3239849471,GB +3239849472,3239849727,RU +3239849728,3239849983,NL +3239849984,3239852287,DE +3239852544,3239852799,DE +3239853056,3239859199,DE +3239859200,3239859455,PL +3239859456,3239859711,UA +3239859712,3239859967,HU +3239859968,3239860223,CA +3239860224,3239860479,DE +3239860480,3239860735,GB +3239860736,3239861247,DE +3239861248,3239861503,UA +3239861504,3239861759,PL +3239861760,3239862015,SA +3239862016,3239862271,IT +3239862272,3239874559,DE +3239874560,3239874815,NL +3239874816,3239875071,DE +3239875072,3239875327,SI +3239875328,3239875583,DK +3239875584,3239875839,PL +3239875840,3239876095,DK +3239876096,3239876351,DE +3239876352,3239876607,RO +3239876608,3239876863,NL +3239876864,3239877119,DE +3239877120,3239877375,GB +3239877376,3239877631,IL +3239877632,3239877887,UA +3239877888,3239878143,IT +3239878144,3239878399,PL +3239878400,3239882751,DE +3239882752,3239883007,GB +3239883008,3239883263,UA +3239883264,3239883775,GB +3239883776,3239884031,DE +3239884032,3239884287,CH +3239884288,3239884543,GB +3239884544,3239884799,FR +3239884800,3239885055,UA +3239885056,3239885311,CH +3239885312,3239885567,UA +3239885568,3239885823,PL +3239885824,3239886079,CH +3239886080,3239886335,ES +3239886336,3239886591,RU +3239886592,3239886847,FR +3239886848,3239888895,DE +3239888896,3239889151,UA +3239889152,3239889407,GB +3239889408,3239889663,CZ +3239889664,3239889919,FI +3239889920,3239890175,AT +3239890176,3239890431,FR +3239890432,3239890687,NL +3239890688,3239895039,DE +3239895040,3239895295,DK +3239895552,3239895807,PL +3239895808,3239896063,DK +3239896064,3239896575,DE +3239896576,3239896831,PL +3239896832,3239897087,HU +3239897088,3239897343,GB +3239897344,3239897599,FR +3239897600,3239897855,RU +3239897856,3239898111,FR +3239898112,3239898367,NO +3239898368,3239898623,GB +3239898624,3239898879,DE +3239898880,3239899135,PL +3239899136,3239901695,DE +3239901696,3239901951,BG +3239901952,3239902207,DE +3239902208,3239902463,PL +3239902464,3239902719,RU +3239902720,3239902975,EE +3239902976,3239903231,GB +3239903232,3239907327,DE +3239907584,3239913215,DE +3239913216,3239913471,LT +3239913472,3239915519,DE +3239915520,3239915775,PL +3239915776,3239916031,HU +3239916032,3239916287,SA +3239916288,3239916543,PL +3239916544,3239916799,FR +3239916800,3239917055,KZ +3239917056,3239917311,DE +3239917312,3239917567,BG +3239917568,3239935999,DE +3239936000,3239936255,UA +3239936256,3239936511,FR +3239936512,3239938815,DE +3239938816,3239939071,NL +3239939072,3239950335,DE +3239950848,3239951103,DE +3239951104,3239951359,AT +3239951360,3239954431,DE +3239954432,3239954687,HU +3239954688,3239954943,DK +3239954944,3239955199,ES +3239955200,3239955711,UA +3239955712,3239955967,PL +3239955968,3239956223,CZ +3239956224,3239956479,PL +3239956480,3239959551,DE +3239959552,3239959807,UA +3239959808,3239960063,BE +3239960064,3239960319,FR +3239960320,3239960575,GB +3239960576,3239962111,DE +3239962368,3239968511,DE +3239968512,3239968767,PL +3239968768,3239969023,NO +3239969024,3239970047,DE +3239970304,3239974911,DE +3239974912,3239975935,GB +3239976960,3239978751,DE +3239978752,3239979007,RU +3239979008,3239979263,UA +3239979264,3239979519,GB +3239979520,3239979775,DE +3239979776,3239980031,SI +3239980032,3239993087,DE +3239995392,3239996415,DE +3239996416,3239996671,GB +3239996672,3239996927,PL +3239996928,3239997183,BE +3239997184,3239997439,GB +3239997440,3240004863,DE +3240004864,3240005119,FR +3240005120,3240005375,SE +3240005376,3240005631,NL +3240005632,3240009727,DE +3240009728,3240009983,PL +3240009984,3240010239,IL +3240010240,3240010495,GB +3240010496,3240010751,AT +3240010752,3240011007,HU +3240011008,3240011263,DE +3240011264,3240011519,GB +3240011520,3240011775,CH +3240011776,3240026111,DE +3240026112,3240027135,FR +3240027136,3240028159,BG +3240028160,3240029183,GB +3240029184,3240030207,RU +3240030208,3240032255,UA +3240032256,3240033279,RU +3240033280,3240034303,DE +3240034304,3240034559,RU +3240034560,3240035583,DE +3240035840,3240037375,DE +3240037888,3240038143,AT +3240038144,3240038399,DK +3240038400,3240098815,DE +3240098816,3240099327,CH +3240099584,3240099839,DE +3240099840,3240104703,GB +3240104704,3240104959,NL +3240104960,3240105215,RU +3240105216,3240105471,UA +3240105472,3240109055,GB +3240109056,3240109567,PL +3240109568,3240125439,GB +3240125440,3240125695,RO +3240125696,3240125951,IE +3240125952,3240165375,GB +3240165376,3240165887,IT +3240165888,3240166399,ES +3240166400,3240166911,PL +3240166912,3240167423,RO +3240167424,3240167935,MD +3240167936,3240168447,RU +3240168448,3240168959,FR +3240168960,3240169471,CZ +3240169472,3240169983,IL +3240169984,3240170495,IT +3240170496,3240171007,DE +3240171520,3240172031,RO +3240172032,3240173055,RU +3240173056,3240173567,CH +3240173568,3240174079,RO +3240174080,3240174591,PL +3240174592,3240175103,FR +3240175104,3240176127,RU +3240176128,3240176639,PL +3240176640,3240177151,UA +3240177152,3240177663,FR +3240177664,3240178175,UA +3240178176,3240178687,NL +3240178688,3240179199,BE +3240179200,3240179711,UA +3240179712,3240180223,RO +3240180224,3240180735,PL +3240180736,3240181247,NL +3240181248,3240181759,RU +3240181760,3240182271,UA +3240182272,3240182783,RO +3240182784,3240183295,RU +3240183296,3240183615,NL +3240183616,3240183647,CR +3240183648,3240183807,NL +3240183808,3240184319,GB +3240184320,3240184831,DE +3240184832,3240185343,GB +3240185344,3240185855,FR +3240185856,3240187391,RU +3240187392,3240187903,UA +3240187904,3240188415,RU +3240188416,3240188927,RO +3240188928,3240189439,MD +3240189440,3240189951,RO +3240189952,3240190463,DE +3240190464,3240190975,IT +3240190976,3240191487,RU +3240191488,3240191999,SE +3240192000,3240192511,UA +3240192512,3240193023,RO +3240193024,3240193535,GB +3240193536,3240194047,PL +3240194048,3240194559,GB +3240194560,3240195071,AT +3240195072,3240195583,GB +3240195584,3240196095,RO +3240196096,3240197119,RU +3240197120,3240197631,PL +3240197632,3240198143,CZ +3240198144,3240198655,CH +3240198656,3240199167,RO +3240199168,3240199679,HU +3240199680,3240200191,NL +3240200192,3240200703,RO +3240200704,3240201215,GB +3240201216,3240201727,RO +3240201728,3240202239,CH +3240202240,3240202751,RU +3240202752,3240203263,UA +3240203776,3240204799,AT +3240204800,3240205311,RO +3240205312,3240205823,GB +3240205824,3240206335,DE +3240206336,3240206847,RU +3240206848,3240207871,RO +3240207872,3240208383,CN +3240208384,3240208895,FR +3240208896,3240209407,GB +3240209408,3240209919,UA +3240209920,3240210943,PL +3240210944,3240211455,GB +3240211456,3240211967,NL +3240211968,3240212479,BE +3240212480,3240212991,RU +3240212992,3240213503,GB +3240213504,3240214015,SE +3240214016,3240214527,DK +3240214528,3240215551,RU +3240215552,3240216063,UA +3240216064,3240216575,GB +3240216576,3240217087,RO +3240217088,3240217599,UA +3240217600,3240218111,RU +3240218112,3240218623,UA +3240218624,3240219135,NL +3240219136,3240219647,AT +3240219648,3240220159,UA +3240220160,3240220671,NL +3240220672,3240221183,AT +3240221184,3240221695,SA +3240221696,3240222207,NL +3240222208,3240222719,FR +3240222720,3240223231,KW +3240223232,3240223743,RU +3240223744,3240224255,MT +3240224256,3240225279,RU +3240225280,3240225791,IL +3240225792,3240226303,UA +3240226304,3240226815,CH +3240226816,3240227839,RU +3240227840,3240228351,GB +3240228352,3240228863,SE +3240228864,3240229375,GB +3240229376,3240230399,RO +3240230400,3240230911,GB +3240230912,3240231935,PL +3240231936,3240232959,NL +3240232960,3240235007,RU +3240235008,3240236031,FR +3240236032,3240237055,UA +3240237056,3240238079,DE +3240238080,3240239103,GB +3240239104,3240240127,FR +3240240128,3240241151,US +3240241152,3240242175,FI +3240242176,3240243199,PL +3240243200,3240244223,DE +3240244224,3240245247,PL +3240245248,3240246271,IL +3240246272,3240247295,UA +3240247296,3240248319,RS +3240248320,3240249343,DE +3240249344,3240251391,UA +3240251392,3240252415,IE +3240252416,3240253439,LT +3240253440,3240254463,BE +3240254464,3240256511,UA +3240256512,3240257535,DE +3240257536,3240258559,FO +3240258560,3240259583,RO +3240259584,3240260607,PL +3240260608,3240262655,DE +3240262656,3240263679,RU +3240263680,3240264191,UA +3240264192,3240264703,FR +3240264704,3240265215,TR +3240265216,3240265727,RU +3240265728,3240266239,CH +3240266240,3240266751,PL +3240266752,3240267263,UA +3240267264,3240267775,CS +3240267776,3240268287,DE +3240268288,3240269311,GB +3240269312,3240269823,NL +3240269824,3240270335,SE +3240270336,3240270847,UA +3240270848,3240271359,RO +3240271360,3240271871,PL +3240271872,3240272383,RU +3240272384,3240272895,PL +3240272896,3240273407,RU +3240273408,3240273919,NL +3240273920,3240274431,UA +3240274432,3240274943,GB +3240274944,3240275455,UA +3240275456,3240275967,RO +3240275968,3240276479,GR +3240276480,3240276991,PL +3240276992,3240278015,RO +3240278016,3240278527,RU +3240278528,3240279039,GB +3240279040,3240279551,CH +3240279552,3240280063,RO +3240280064,3240280191,DE +3240280320,3240280447,PL +3240280448,3240280575,UA +3240280576,3240280703,GB +3240280704,3240280831,RU +3240280832,3240280959,GB +3240280960,3240281215,PL +3240281216,3240281343,FR +3240281344,3240281471,PL +3240281472,3240281599,IR +3240281600,3240281727,CY +3240281728,3240281855,PL +3240288256,3240296447,GB +3240296448,3240296703,RO +3240296704,3240302847,GB +3240302848,3240303103,UA +3240303104,3240321023,GB +3240325120,3240361983,GB +3240361984,3240362239,TR +3240362496,3240370175,GB +3240370176,3240370431,CH +3240370432,3240370687,DE +3240370688,3240370943,GB +3240370944,3240371199,RU +3240371200,3240371455,CH +3240371456,3240371711,RO +3240371712,3240371967,RU +3240371968,3240372223,TR +3240372224,3240372479,SI +3240372480,3240372991,RU +3240372992,3240373247,IE +3240373248,3240373503,RO +3240373504,3240373759,FR +3240373760,3240374015,DE +3240374016,3240407039,GB +3240407040,3240407295,IL +3240407296,3240407551,NL +3240407552,3240407807,NO +3240407808,3240408063,NL +3240408064,3240408319,DE +3240408320,3240408575,CH +3240408576,3240408831,FR +3240408832,3240409087,PL +3240409088,3240409343,TR +3240409344,3240409599,GB +3240409600,3240409855,NL +3240409856,3240410111,DE +3240410112,3240410367,CH +3240410368,3240410623,AT +3240410624,3240410879,PT +3240410880,3240411135,NO +3240411136,3240419839,GB +3240419840,3240420095,AT +3240420096,3240420351,DE +3240420352,3240420607,RO +3240420608,3240420863,NL +3240420864,3240460287,GB +3240460288,3240461055,IL +3240461056,3240461567,DE +3240461568,3240461823,UA +3240461824,3240462079,RU +3240462080,3240462335,TR +3240462336,3240462591,RO +3240462592,3240462847,RU +3240462848,3240463103,RO +3240463104,3240463359,PL +3240463360,3240463615,RU +3240463616,3240463871,UA +3240463872,3240464127,GB +3240464128,3240464383,SA +3240464384,3240464639,AT +3240464640,3240464895,FR +3240464896,3240465151,GB +3240465152,3240465407,CH +3240465408,3240465919,DE +3240465920,3240466175,FR +3240466176,3240466687,DE +3240466688,3240466943,PT +3240466944,3240467199,TR +3240467200,3240467455,NL +3240467456,3240467711,UA +3240467712,3240467967,RU +3240467968,3240468223,GB +3240468224,3240468479,CH +3240468480,3240487935,GB +3240487936,3240488191,CH +3240488192,3240488447,GB +3240488448,3240488703,BG +3240488704,3240488959,NL +3240488960,3240575487,GB +3240575488,3240575743,RO +3240575744,3240575999,GB +3240576000,3240576255,DE +3240576256,3240576511,UA +3240576512,3240576767,FR +3240576768,3240577023,PL +3240577024,3240577279,UA +3240577280,3240577535,RO +3240577536,3240577791,DE +3240577792,3240578559,UA +3240578560,3240578815,CH +3240578816,3240579071,IL +3240579072,3240587263,GB +3240587264,3240587519,NL +3240587520,3240587775,RU +3240587776,3240588031,UA +3240588032,3240588287,DE +3240588288,3240588543,RU +3240588544,3240588799,RO +3240588800,3240589055,UA +3240589056,3240589311,RO +3240589312,3240593407,SE +3240593408,3240594175,GB +3240594176,3240594431,DK +3240594432,3240622079,GB +3240622080,3240622591,RU +3240622592,3240624127,GB +3240624128,3240689663,EE +3240689664,3240690175,GB +3240690176,3240690687,TR +3240690688,3240691199,UA +3240691200,3240691711,IT +3240691712,3240692735,DE +3240692736,3240693247,DK +3240693248,3240693759,ES +3240693760,3240695807,BE +3240695808,3240697855,ES +3240697856,3240698111,SE +3240698112,3240698367,LV +3240698368,3240698623,GB +3240698624,3240699135,SI +3240699136,3240699391,DE +3240699392,3240699647,UA +3240699648,3240699903,NO +3240699904,3240700159,LT +3240700160,3240700415,AT +3240700416,3240700671,BE +3240700672,3240700927,ES +3240700928,3240701183,FR +3240701184,3240701439,LV +3240701440,3240701695,ES +3240701696,3240701951,FR +3240701952,3240702975,UA +3240702976,3240703999,DE +3240704000,3240705023,GR +3240705024,3240706047,UA +3240706048,3240707071,BG +3240707072,3240707839,NL +3240707840,3240709119,FR +3240709120,3240710143,IT +3240710144,3240710399,UA +3240710400,3240710655,LT +3240710656,3240710911,DE +3240710912,3240711167,FR +3240711168,3240711679,IT +3240711680,3240711935,RU +3240711936,3240712191,DE +3240712192,3240712447,UA +3240712448,3240712703,SI +3240712704,3240712959,CH +3240712960,3240713215,IT +3240713216,3240713471,GB +3240713472,3240713727,DE +3240713728,3240713983,AT +3240713984,3240714239,FR +3240714240,3240716287,GB +3240716288,3240718335,CH +3240718336,3240718847,PL +3240718848,3240719359,PT +3240719360,3240719871,DE +3240719872,3240720383,SE +3240720384,3240720895,DE +3240720896,3240721407,RO +3240721408,3240721919,DE +3240721920,3240722431,RO +3240722432,3240723455,UA +3240723456,3240724479,DE +3240724480,3240724991,CH +3240724992,3240725503,AT +3240725504,3240726527,RU +3240726528,3240727039,DE +3240727040,3240727551,DZ +3240727552,3240728063,CH +3240728064,3240728575,GR +3240728576,3240729599,GB +3240729600,3240730111,DK +3240730112,3240730623,BE +3240730624,3240731647,UA +3240731648,3240732671,GB +3240732672,3240733695,SE +3240733696,3240734719,UA +3240734720,3240735743,IT +3240735744,3240736255,FR +3240736256,3240736767,BG +3240736768,3240737791,UA +3240737792,3240738815,BG +3240738816,3240739071,UA +3240739072,3240739327,CH +3240739328,3240739583,FR +3240739584,3240739839,LV +3240739840,3240740095,US +3240740096,3240740351,LT +3240740352,3240740607,IT +3240740608,3240741119,DE +3240741120,3240741375,AT +3240741376,3240741631,IL +3240741888,3240742143,LV +3240742144,3240742399,IT +3240742400,3240742655,BG +3240742656,3240742911,AT +3240742912,3240743423,IL +3240743424,3240743935,DK +3240743936,3240744447,DE +3240744448,3240744959,SE +3240744960,3240745471,RO +3240745472,3240745983,UA +3240745984,3240746495,GB +3240746496,3240747007,FR +3240747008,3240747263,SE +3240747264,3240747519,US +3240747520,3240747775,RU +3240747776,3240748031,ES +3240748032,3240748287,AT +3240748288,3240748543,GR +3240748544,3240749055,PL +3240749056,3240749311,AT +3240749312,3240749567,BE +3240749568,3240749823,ES +3240749824,3240750335,IT +3240750336,3240750591,LU +3240750592,3240750847,FR +3240750848,3240751103,UA +3240751104,3240752127,ES +3240752128,3240754175,RO +3240754176,3240755199,DE +3240755200,3240755455,IE +3240755456,3240791551,IT +3240791552,3240791807,RU +3240791808,3240792063,ES +3240792064,3240792319,GB +3240792320,3240792575,RO +3240792576,3240792831,CH +3240792832,3240793087,PL +3240793088,3240793343,UA +3240793344,3240793599,RU +3240793600,3240794111,FR +3240794112,3240794367,GB +3240794368,3240794879,PL +3240794880,3240795135,DE +3240795136,3240795391,BG +3240795392,3240795647,UA +3240795648,3240795903,CH +3240795904,3240796159,SE +3240796160,3240808959,IT +3240808960,3240809215,GB +3240809216,3240809471,PL +3240809472,3240809727,NL +3240809728,3240809983,FR +3240809984,3240810239,GR +3240810240,3240810495,SA +3240810496,3240810751,TR +3240810752,3240811007,GB +3240811008,3240811263,PL +3240811264,3240811519,FR +3240811520,3240811775,SA +3240811776,3240812031,DE +3240812032,3240812287,HU +3240812288,3240812543,KW +3240813568,3240814591,PL +3240814592,3240818687,IT +3240818688,3240820735,NL +3240820800,3240820831,RU +3240820832,3240822783,IT +3240824320,3240827135,IT +3240827136,3240827391,FR +3240827392,3240827647,BG +3240827648,3240827903,CH +3240827904,3240828159,IT +3240828160,3240828415,DE +3240828416,3240837119,IT +3240837120,3240837375,GB +3240837632,3240840447,IT +3240840448,3240840703,PL +3240840704,3240840959,RO +3240840960,3240841215,GB +3240841216,3240843263,IT +3240843264,3240843775,NL +3240843776,3240844031,PL +3240844032,3240844543,NL +3240844544,3240844799,CH +3240844800,3240845055,GB +3240845056,3240845311,UA +3240845312,3240846847,IT +3240846848,3240847359,VA +3240847360,3240852735,IT +3240852736,3240852991,GB +3240852992,3240853247,IT +3240853248,3240853503,RU +3240853504,3240855039,VA +3240855040,3240857599,IT +3240857600,3240857855,PL +3240857856,3240858623,IT +3240858624,3240858879,UA +3240858880,3240859135,IT +3240859136,3240859391,NL +3240859392,3240859647,SE +3240859648,3240861183,CH +3240861184,3240861695,AT +3240861696,3240866815,IT +3240866816,3240867071,GB +3240867072,3240867327,PL +3240867328,3240867583,RU +3240867584,3240867839,CH +3240867840,3240873983,IT +3240873984,3240874495,RU +3240874496,3240875007,FR +3240875008,3240875519,AT +3240875520,3240876031,FR +3240876032,3240876543,DK +3240876544,3240877055,GR +3240877056,3240877567,DE +3240877568,3240879103,UA +3240879104,3240880127,PL +3240882176,3240883199,PL +3240883200,3240884223,IL +3240884224,3240886271,UA +3240886272,3240961791,SE +3240961792,3240961799,FI +3240961800,3240968703,SE +3240968704,3240968959,GB +3240968960,3240969215,SE +3240969216,3240969231,GB +3240969232,3240988159,SE +3240988160,3240988167,PL +3240988168,3241017343,SE +3241017344,3241017855,AT +3241017856,3241018111,DE +3241018112,3241029119,AT +3241029120,3241029375,UA +3241029376,3241029631,PL +3241029632,3241032703,AT +3241032704,3241032959,RU +3241032960,3241033215,GB +3241033216,3241033727,DE +3241033728,3241033983,IL +3241033984,3241034239,RU +3241034240,3241034495,UA +3241034496,3241034751,DE +3241034752,3241035007,PL +3241035008,3241035263,DK +3241035264,3241035519,RO +3241035520,3241035775,SI +3241035776,3241036031,GB +3241036032,3241036287,CH +3241036288,3241036543,RU +3241036544,3241036799,SI +3241036800,3241037055,GB +3241037056,3241037311,RU +3241037312,3241037567,BE +3241037568,3241037823,DK +3241037824,3241038079,NL +3241038080,3241038335,UA +3241038336,3241038591,DE +3241038592,3241039103,LT +3241039104,3241039359,FR +3241039360,3241039615,UA +3241039616,3241039871,GB +3241039872,3241040127,CH +3241040128,3241040383,UA +3241040384,3241040639,GB +3241040640,3241040895,RO +3241040896,3241063423,AT +3241063424,3241063679,IT +3241063680,3241063935,PL +3241063936,3241064191,DE +3241064192,3241064447,GB +3241064448,3241064703,DE +3241064704,3241065471,PL +3241065472,3241068543,AT +3241068544,3241068799,GB +3241068800,3241069055,UA +3241069056,3241069311,GB +3241069312,3241069567,FR +3241069568,3241070079,GB +3241070080,3241070335,FR +3241070336,3241070847,RU +3241070848,3241071103,AT +3241071104,3241071359,UA +3241071360,3241071615,RU +3241071616,3241071871,MD +3241071872,3241072127,RU +3241072128,3241072383,BE +3241072384,3241072639,DE +3241072640,3241073919,AT +3241073920,3241074175,GB +3241074176,3241076735,AT +3241076736,3241076991,GR +3241076992,3241077759,AT +3241077760,3241078015,LV +3241078016,3241078271,PL +3241078272,3241078527,ES +3241078528,3241078783,DE +3241078784,3241082879,AT +3241082880,3241083135,FR +3241083136,3241100031,CH +3241100800,3241101055,UA +3241101056,3241101311,DK +3241101312,3241101567,RO +3241101568,3241101823,DE +3241101824,3241102079,BG +3241102080,3241102335,RO +3241102336,3241102591,ES +3241102592,3241102847,DE +3241102848,3241103359,NL +3241103360,3241103615,FR +3241103616,3241103871,DK +3241103872,3241104127,DE +3241104128,3241104383,GB +3241104384,3241104639,ES +3241104640,3241104895,UA +3241104896,3241105151,ES +3241105152,3241105407,RU +3241105408,3241108223,CH +3241108224,3241108735,DE +3241108736,3241108991,RO +3241108992,3241109247,SA +3241109248,3241117695,CH +3241117696,3241117951,SI +3241117952,3241118207,UA +3241118208,3241118463,AT +3241118464,3241118719,FR +3241118720,3241118975,CH +3241118976,3241119231,FR +3241119232,3241119487,MD +3241119488,3241119743,BE +3241119744,3241119999,RO +3241120000,3241120255,UA +3241120256,3241120511,CZ +3241120512,3241120767,GB +3241120768,3241121023,RU +3241121024,3241121279,CH +3241121280,3241121535,FR +3241121536,3241121791,PL +3241121792,3241122047,DE +3241122048,3241122303,CH +3241122304,3241122559,RU +3241122560,3241123327,AT +3241123328,3241124095,PL +3241124096,3241124351,DE +3241124352,3241124607,RO +3241124608,3241124863,PL +3241124864,3241125119,ES +3241125120,3241125375,IL +3241125376,3241125631,UA +3241125632,3241125887,SE +3241125888,3241129983,CH +3241129984,3241130239,FR +3241130240,3241130495,PT +3241130496,3241130751,DK +3241130752,3241131007,DE +3241131008,3241131263,NL +3241131264,3241131519,FR +3241131520,3241131775,CH +3241131776,3241132031,DK +3241132032,3241145855,CH +3241145856,3241146111,HR +3241146112,3241146367,PL +3241146368,3241146623,IL +3241146624,3241146879,RO +3241146880,3241148415,CH +3241148416,3241476095,FR +3241476096,3241476351,CH +3241476352,3241477887,BE +3241478144,3241481471,BE +3241481472,3241481727,NL +3241481728,3241481983,PT +3241481984,3241482239,DE +3241482240,3241484799,SE +3241484800,3241485311,BE +3241485312,3241485567,GB +3241485568,3241496575,BE +3241496576,3241496831,AT +3241496832,3241497343,BE +3241497344,3241497599,UA +3241497600,3241497855,SE +3241497856,3241498111,DK +3241498112,3241498367,BE +3241498368,3241498623,RO +3241498624,3241498879,NO +3241498880,3241499135,UA +3241499136,3241499903,BE +3241499904,3241500159,DE +3241500160,3241500671,GB +3241500672,3241502975,BE +3241502976,3241503231,GR +3241503232,3241503487,FR +3241503488,3241508095,BE +3241508096,3241508351,NL +3241508352,3241538815,BE +3241539072,3241541375,BE +3241541376,3241541631,PL +3241541632,3241673215,FR +3241673472,3241674751,FR +3241675008,3241676543,FR +3241676800,3241681407,FR +3241681664,3241683199,FR +3241683456,3241702399,FR +3241702912,3241704447,FR +3241704704,3241714687,FR +3241715200,3241724927,FR +3241725952,3241726975,FR +3241728000,3241741311,FR +3241741568,3241760767,FR +3241761024,3241780223,FR +3241780736,3241780991,FR +3241781248,3241782527,FR +3241783296,3241784319,FR +3241784576,3241800191,FR +3241800448,3241803775,FR +3241803776,3241803791,GB +3241803800,3241803815,GB +3241803816,3241803823,RU +3241803832,3241803839,GB +3241803840,3241803903,PT +3241804032,3241820159,BE +3241820160,3241821695,GB +3241821696,3241822207,GR +3241822208,3241824255,CZ +3241824256,3241827071,BE +3241827328,3241843455,BE +3241843456,3241843711,CH +3241843712,3241848063,BE +3241848064,3241851391,CH +3241851392,3241851903,GR +3241851904,3241852927,GB +3241852928,3241854463,SK +3241854464,3241854975,GB +3241854976,3241855999,DE +3241856000,3241857279,NL +3241857280,3241857535,CH +3241857536,3241859071,AT +3241859072,3241861119,US +3241861120,3241863167,BE +3241863168,3241863423,PL +3241863424,3241863679,FR +3241863680,3241863935,GR +3241863936,3241864191,GB +3241864192,3241864447,TR +3241864448,3241864703,RU +3241864704,3241864959,SE +3241864960,3241865215,IT +3241865216,3241865471,DE +3241865472,3241865727,NO +3241865728,3241865983,CH +3241865984,3241866239,RO +3241866240,3241866751,DE +3241866752,3241867007,GB +3241867008,3241867263,FR +3241867264,3241867519,UA +3241867520,3241867775,PL +3241867776,3241868031,CH +3241868032,3241868287,UA +3241868288,3241868543,HR +3241868544,3241868799,DE +3241868800,3241869055,UA +3241869056,3241869311,CH +3241869312,3241934847,PL +3241934848,3242196991,GB +3242196992,3242197975,FI +3242197976,3242197987,NO +3242197988,3242207847,FI +3242207848,3242207855,SE +3242207856,3242393599,FI +3242393600,3242403783,NL +3242403784,3242403791,GB +3242403792,3242459135,NL +3242459136,3242467327,BG +3242467328,3242475519,HU +3242475520,3242483711,LV +3242483712,3242524671,BG +3242524672,3242590207,NO +3242590208,3242655743,IT +3242655744,3242721279,NO +3242721280,3242779903,CH +3242779904,3242780159,DE +3242780160,3242852351,CH +3242852352,3242911231,BE +3242911232,3242911743,NL +3242911744,3242917887,BE +3242917888,3242950655,NO +3242950656,3242983423,BE +3242983424,3243048959,IT +3243048960,3243114495,SI +3243114496,3243150847,NL +3243150848,3243151103,IT +3243151104,3243216823,NL +3243216824,3243216831,GB +3243216832,3243223615,NL +3243223616,3243223623,NO +3243223624,3243223695,NL +3243223696,3243223703,PT +3243223704,3243245567,NL +3243245568,3243297791,AT +3243297792,3243298047,SI +3243298048,3243376639,AT +3243376640,3243441919,GB +3243441920,3243442175,MT +3243442176,3243444167,AT +3243444168,3243444183,NL +3243444184,3243507711,AT +3243507712,3243507967,GB +3243508224,3243508991,CZ +3243509248,3243509759,CZ +3243509760,3243510015,RU +3243510016,3243510271,NL +3243510272,3243510527,CZ +3243510784,3243511807,CZ +3243511808,3243512063,GB +3243512064,3243512319,UA +3243512320,3243512575,FR +3243512576,3243512831,UA +3243512832,3243513087,DE +3243513088,3243513343,GR +3243513344,3243513855,UA +3243513856,3243514111,BE +3243514112,3243514367,CH +3243514368,3243514623,IE +3243514624,3243514879,DK +3243514880,3243515135,AT +3243515136,3243515391,PL +3243515392,3243515647,DE +3243515648,3243515903,RU +3243515904,3243519999,CZ +3243520512,3243520767,UA +3243520768,3243521023,GB +3243521024,3243521279,AT +3243521280,3243521535,CZ +3243521536,3243521791,DE +3243521792,3243524095,CZ +3243524096,3243524351,RO +3243524352,3243524607,AT +3243524608,3243524863,DE +3243524864,3243525119,NL +3243525120,3243525375,CZ +3243525376,3243525631,RO +3243525888,3243526143,PL +3243526144,3243526399,UA +3243526400,3243526655,FR +3243526656,3243526911,PL +3243526912,3243527167,SE +3243527168,3243527679,UA +3243527680,3243527935,GB +3243527936,3243528191,PL +3243528192,3243529215,CZ +3243529216,3243529471,BE +3243529472,3243529727,GB +3243529728,3243529983,BG +3243529984,3243530239,GB +3243530240,3243530495,RU +3243530496,3243530751,FR +3243530752,3243531007,UA +3243531008,3243531263,DE +3243531776,3243532031,AT +3243532032,3243532287,DE +3243532288,3243533311,CZ +3243534336,3243535359,CZ +3243536384,3243536639,AT +3243536640,3243536895,CH +3243536896,3243537151,CZ +3243537152,3243537407,RO +3243537408,3243540991,CZ +3243542528,3243543551,CZ +3243544064,3243544319,GB +3243544320,3243544575,CH +3243544576,3243552767,CZ +3243552768,3243553023,NL +3243553024,3243553279,FR +3243553280,3243553535,DE +3243553536,3243553791,PL +3243553792,3243554303,DE +3243554304,3243554559,PL +3243554560,3243554815,MD +3243554816,3243555071,LV +3243555072,3243555327,RO +3243555328,3243555583,CZ +3243555584,3243555839,FR +3243556864,3243565055,CZ +3243565056,3243569151,GB +3243570432,3243570687,CZ +3243570688,3243570943,PL +3243570944,3243571199,CZ +3243571456,3243571711,CZ +3243571712,3243571967,GB +3243571968,3243572223,GR +3243572224,3243572479,CZ +3243572736,3243572991,CZ +3243572992,3243573247,RU +3243573248,3243704319,CZ +3243704320,3243769855,SK +3243769856,3243900927,DK +3243900928,3243966463,NO +3243966464,3243974655,PL +3243974656,3243978751,LU +3243978752,3243982847,NL +3243982848,3243991039,HU +3243991040,3243999231,BE +3243999232,3244031999,NO +3244032000,3244097535,GR +3244097536,3244098559,DE +3244098560,3244099583,GB +3244099584,3244100607,FR +3244100608,3244102655,UA +3244102656,3244103679,CH +3244103680,3244104703,BG +3244104704,3244105727,DE +3244105728,3244107775,GB +3244107776,3244108799,RO +3244108800,3244109823,GB +3244109824,3244110847,UA +3244110848,3244111871,PL +3244111872,3244112895,KZ +3244112896,3244113919,RU +3244113920,3244114943,CH +3244114944,3244115967,PL +3244115968,3244116991,SK +3244116992,3244118015,UA +3244118016,3244120063,GB +3244120064,3244122111,PL +3244122112,3244123135,NG +3244123136,3244124159,UA +3244124160,3244125183,PL +3244125184,3244126207,UA +3244126208,3244127231,BE +3244127232,3244128255,UA +3244128256,3244129279,DE +3244129280,3244130303,FR +3244130304,3244131327,NO +3244131328,3244133375,FI +3244133376,3244134399,RO +3244134400,3244135423,PL +3244135424,3244137471,GB +3244137472,3244138495,PL +3244138496,3244139519,UA +3244139520,3244140543,GR +3244140544,3244141567,SE +3244141568,3244142591,NL +3244142592,3244143615,DE +3244143616,3244144639,FR +3244144640,3244147711,UA +3244147712,3244149759,GB +3244149760,3244150783,PL +3244150784,3244151807,CH +3244151808,3244152831,KZ +3244153856,3244154879,NO +3244154880,3244155903,GB +3244155904,3244156927,UA +3244156928,3244158975,RU +3244158976,3244159999,DE +3244160000,3244161023,RU +3244161024,3244163071,NO +3244163072,3244228607,FI +3244261376,3244265823,IE +3244265824,3244265831,ES +3244265832,3244272575,IE +3244272576,3244272639,US +3244272640,3244273687,IE +3244273688,3244273695,US +3244273696,3244274279,IE +3244274280,3244274287,US +3244274288,3244277359,IE +3244277360,3244277367,GB +3244277368,3244277631,IE +3244277632,3244277695,US +3244277696,3244277759,IE +3244277760,3244294143,SI +3244294144,3244408575,DE +3244408576,3244408831,GB +3244408832,3244592127,DE +3244592128,3244592639,CH +3244592640,3244818431,DE +3244818432,3245080575,FR +3245080576,3245082623,SE +3245082624,3245084927,DE +3245084928,3245085183,SE +3245085184,3245085439,GB +3245085440,3245085695,DE +3245085696,3245086207,FR +3245086208,3245086463,AT +3245086464,3245086719,GH +3245086720,3245086975,BG +3245086976,3245087231,IT +3245087232,3245087487,CH +3245087488,3245087743,NL +3245087744,3245087999,GH +3245088000,3245088255,LV +3245088256,3245088511,KW +3245088512,3245088767,FR +3245088768,3245089279,BG +3245089280,3245089791,PL +3245090304,3245090815,UA +3245090816,3245091327,AT +3245091328,3245091839,SE +3245091840,3245093887,UA +3245093888,3245094911,RO +3245094912,3245095935,UA +3245095936,3245096959,IT +3245096960,3245099007,CZ +3245099008,3245103103,GB +3245105152,3245105663,GB +3245105664,3245106175,NL +3245106176,3245106687,AT +3245106688,3245107711,UA +3245107712,3245108735,CZ +3245108736,3245109247,FR +3245109248,3245113855,UA +3245113856,3245114367,RU +3245114368,3245114879,SK +3245114880,3245115391,JO +3245115392,3245115903,CH +3245115904,3245116415,AT +3245116416,3245116927,FR +3245117440,3245118463,LV +3245118464,3245119487,GB +3245120512,3245121535,GB +3245121536,3245122047,GR +3245122048,3245122559,UA +3245122560,3245123071,DE +3245123072,3245123583,FR +3245123584,3245124095,GB +3245124096,3245124607,UA +3245124608,3245125119,DE +3245125120,3245125631,ES +3245125632,3245125887,DE +3245125888,3245126143,PL +3245126144,3245126399,FR +3245126400,3245126655,DE +3245126656,3245126911,FR +3245126912,3245127167,DE +3245127168,3245127423,RU +3245127424,3245127679,AT +3245127680,3245127935,DE +3245127936,3245128191,LV +3245128192,3245128447,IT +3245128448,3245128703,CH +3245128704,3245128959,GB +3245128960,3245129471,DK +3245129472,3245129983,GB +3245129984,3245130239,DE +3245130240,3245130495,PL +3245130496,3245130751,IL +3245130752,3245131007,SE +3245131008,3245131519,FR +3245131520,3245132031,GB +3245132032,3245132287,BE +3245132288,3245132543,PL +3245132544,3245132799,FR +3245132800,3245133311,IT +3245133312,3245133567,PL +3245133568,3245133823,RU +3245133824,3245134079,NO +3245134080,3245134335,UA +3245134336,3245134591,NL +3245134592,3245134847,IL +3245134848,3245135103,AT +3245135104,3245135359,TR +3245135360,3245135615,UG +3245135616,3245135871,BE +3245135872,3245136127,FR +3245136128,3245136383,DE +3245136384,3245136639,GB +3245136896,3245137151,PL +3245137152,3245137407,IT +3245137408,3245137663,DE +3245137664,3245137919,SE +3245137920,3245138431,DK +3245138432,3245138943,UA +3245138944,3245139455,PL +3245139456,3245139967,RU +3245139968,3245140479,CH +3245140480,3245140991,RO +3245140992,3245141503,UA +3245142016,3245143039,UA +3245143040,3245144063,GB +3245144064,3245145087,UA +3245145088,3245146111,UG +3245146112,3245147135,FR +3245147136,3245148159,DE +3245148160,3245149183,UA +3245149184,3245150207,RU +3245150208,3245154303,IS +3245154304,3245158399,IT +3245158400,3245158911,CH +3245158912,3245159423,GB +3245159424,3245159935,CH +3245159936,3245160447,BG +3245160448,3245160959,DK +3245160960,3245161471,LU +3245161472,3245161983,SE +3245161984,3245162495,BE +3245162496,3245163007,DE +3245163008,3245163519,KE +3245163520,3245164031,RU +3245164544,3245165055,BE +3245165056,3245165567,AT +3245165568,3245166079,RU +3245166080,3245166591,TZ +3245166592,3245166847,UA +3245166848,3245167103,GB +3245167104,3245167359,IL +3245167360,3245167615,GB +3245167616,3245167871,UA +3245167872,3245168127,LV +3245168128,3245168383,SE +3245168384,3245168639,FR +3245168640,3245168895,AT +3245168896,3245169151,RU +3245169152,3245169407,IT +3245169408,3245169919,PL +3245169920,3245170175,UA +3245170176,3245170431,GB +3245170432,3245170687,CH +3245170688,3245171711,DE +3245171712,3245172735,UA +3245172736,3245173759,IT +3245173760,3245174783,UA +3245174784,3245175039,IT +3245175040,3245175295,DE +3245175296,3245175551,RU +3245175552,3245175807,PL +3245175808,3245176063,GB +3245176064,3245176319,IT +3245176320,3245176575,UA +3245176576,3245176831,FR +3245176832,3245177343,ES +3245177344,3245177599,NL +3245177600,3245177855,PL +3245177856,3245178111,SI +3245178112,3245178623,BE +3245178624,3245178879,PL +3245178880,3245179391,UA +3245179392,3245179903,LU +3245179904,3245180415,DE +3245180416,3245180927,TR +3245180928,3245181439,NL +3245181440,3245181951,DE +3245181952,3245182463,AT +3245182464,3245182975,FR +3245182976,3245183999,UA +3245184000,3245185023,CH +3245185024,3245187071,AT +3245187072,3245190143,UA +3245190144,3245191167,ES +3245191168,3245193215,CZ +3245193216,3245195263,BE +3245195264,3245197311,GB +3245197312,3245199359,IT +3245199360,3245199615,LU +3245199616,3245199871,SE +3245199872,3245200127,NO +3245200128,3245200383,LV +3245200384,3245200639,PL +3245200640,3245200895,GR +3245200896,3245201151,DE +3245201152,3245201407,GB +3245201408,3245201663,CH +3245201664,3245201919,NO +3245201920,3245202175,SA +3245202176,3245202687,GB +3245202688,3245203455,DE +3245203456,3245203711,FR +3245203712,3245204223,PL +3245204224,3245204479,SI +3245204480,3245204735,BE +3245204736,3245205247,ES +3245205248,3245205503,DE +3245205504,3245205759,AT +3245205760,3245206015,IT +3245206016,3245206271,BE +3245206272,3245206527,LT +3245206528,3245207551,DE +3245207552,3245208063,UA +3245208064,3245208575,DE +3245208576,3245209087,PL +3245209088,3245209599,RU +3245209600,3245210111,UA +3245210112,3245210623,FR +3245210624,3245211135,HU +3245211136,3245211647,GB +3245211648,3245212159,RU +3245212160,3245212671,NG +3245212672,3245213183,RU +3245213184,3245213695,DE +3245213696,3245214207,LV +3245214208,3245214719,AT +3245214720,3245215231,SE +3245215232,3245215743,SI +3245215744,3245217791,UA +3245217792,3245218815,DE +3245218816,3245219839,AT +3245219840,3245221887,FI +3245221888,3245223935,DE +3245223936,3245225983,GB +3245225984,3245228031,HU +3245228032,3245229055,FI +3245229056,3245230079,DE +3245230080,3245232127,UA +3245232128,3245232383,PL +3245232384,3245232639,BE +3245232640,3245232895,BG +3245232896,3245233151,IT +3245233152,3245233407,DK +3245233408,3245233663,CH +3245233664,3245233919,GR +3245233920,3245234175,DK +3245234176,3245234431,GB +3245234432,3245234687,UA +3245234688,3245234943,DE +3245234944,3245235199,GB +3245235200,3245235455,BE +3245235456,3245235711,GB +3245235712,3245235967,AT +3245235968,3245236223,CH +3245236224,3245237247,PL +3245237248,3245237759,UA +3245237760,3245238271,DE +3245238784,3245239295,UA +3245239296,3245240319,FI +3245240320,3245241343,UA +3245241344,3245242367,DE +3245242368,3245243391,PL +3245243392,3245244415,UA +3245244416,3245244671,ES +3245244672,3245244927,AT +3245244928,3245245183,BE +3245245184,3245245439,CH +3245245440,3245245695,BG +3245245696,3245245951,DE +3245245952,3245246207,UA +3245246208,3245246463,GB +3245246464,3245246719,AT +3245246720,3245246975,PL +3245246976,3245247231,GB +3245247232,3245247487,DE +3245247488,3245247999,FR +3245248000,3245248255,PL +3245248256,3245248511,GB +3245248512,3245248767,UA +3245248768,3245249023,SI +3245249024,3245249279,FR +3245249280,3245249535,NL +3245249536,3245249791,FR +3245249792,3245250047,GB +3245250048,3245250303,DE +3245250304,3245250559,IT +3245250560,3245250815,FR +3245250816,3245251071,DE +3245251072,3245251327,ES +3245251328,3245251583,MT +3245251584,3245251839,UA +3245251840,3245252095,NL +3245252096,3245252351,BE +3245252352,3245252607,BG +3245252608,3245253631,UA +3245253632,3245254143,LV +3245254144,3245254655,DK +3245254656,3245255167,UA +3245255168,3245255679,TR +3245255680,3245257215,UA +3245257216,3245257727,DE +3245257728,3245258239,GB +3245258240,3245258751,AT +3245258752,3245259263,UA +3245259264,3245259775,SK +3245259776,3245260287,UA +3245260288,3245260799,BE +3245260800,3245261823,DE +3245261824,3245262847,DK +3245262848,3245263871,IT +3245263872,3245264895,DE +3245264896,3245266943,TR +3245266944,3245268991,BG +3245268992,3245270015,FI +3245270016,3245271039,PL +3245271040,3245272063,NL +3245272064,3245273087,RU +3245273088,3245275135,GB +3245275136,3245277183,BE +3245277184,3245277695,UA +3245277696,3245278207,RU +3245278208,3245278719,GB +3245278720,3245279743,UA +3245279744,3245280255,TJ +3245280256,3245280767,BE +3245280768,3245281279,FR +3245281280,3245281791,RO +3245281792,3245282303,ES +3245282304,3245282815,IT +3245282816,3245283327,PL +3245283328,3245283839,GB +3245283840,3245284351,PL +3245284352,3245284863,GB +3245284864,3245285375,PL +3245285376,3245285631,NL +3245285632,3245285887,GB +3245285888,3245286143,DE +3245286144,3245286399,GB +3245286400,3245287423,PL +3245287424,3245287679,DE +3245287680,3245287935,PL +3245287936,3245288191,PT +3245288192,3245288703,DE +3245288704,3245288959,FI +3245288960,3245289215,IT +3245289216,3245289471,AT +3245289472,3245290495,UA +3245290496,3245291519,LU +3245291520,3245292543,DE +3245292544,3245293567,UA +3245293568,3245294079,FI +3245294080,3245294591,ES +3245294592,3245295103,RO +3245295104,3245296127,IT +3245296128,3245296639,GB +3245296640,3245297151,TJ +3245297152,3245297663,IT +3245297664,3245297919,FR +3245297920,3245298175,DK +3245298176,3245298431,IE +3245298432,3245298687,UA +3245298688,3245298943,GB +3245298944,3245299199,UA +3245299200,3245299455,GB +3245299456,3245299711,CY +3245299712,3245299967,DE +3245299968,3245300223,BG +3245300224,3245300479,FR +3245300480,3245300991,RU +3245300992,3245301247,FI +3245301248,3245301503,DK +3245301504,3245301759,BE +3245301760,3245302783,SK +3245302784,3245303807,DE +3245303808,3245304831,SE +3245304832,3245306367,DE +3245306368,3245306879,UA +3245306880,3245307391,RU +3245307392,3245307903,FI +3245307904,3245308415,RO +3245308416,3245308927,ES +3245308928,3245309439,SE +3245309440,3245309951,UA +3245309952,3245311999,CZ +3245312000,3245314047,GB +3245314048,3245315071,PL +3245315072,3245316095,IT +3245316096,3245317119,SE +3245317120,3245318143,UA +3245318144,3245318399,IT +3245318400,3245318655,RO +3245318656,3245318911,DK +3245318912,3245319167,DE +3245319168,3245319423,HR +3245319424,3245319679,SE +3245319680,3245319935,PL +3245319936,3245320191,DE +3245320192,3245320703,GB +3245320704,3245320959,DE +3245320960,3245321215,IE +3245321216,3245321471,NL +3245321472,3245321727,UA +3245321728,3245321983,PL +3245321984,3245322239,DE +3245322240,3245323263,RU +3245323264,3245325311,GB +3245325312,3245326335,UA +3245326336,3245326847,SI +3245326848,3245327359,BG +3245327360,3245327871,CH +3245327872,3245328383,DE +3245328384,3245328895,GB +3245328896,3245329407,CH +3245329408,3245329919,UA +3245329920,3245333503,DE +3245333504,3245334527,SI +3245334528,3245334783,HU +3245334784,3245335039,BE +3245335040,3245335551,GB +3245335552,3245335807,NL +3245335808,3245336063,RO +3245336064,3245336575,GB +3245336576,3245336831,RO +3245336832,3245337087,DE +3245337088,3245337343,GB +3245337344,3245337599,BE +3245337600,3245337855,PL +3245337856,3245338367,DE +3245338368,3245339647,UA +3245339648,3245340671,LV +3245340672,3245341695,UA +3245341696,3245342719,RU +3245342720,3245867007,GB +3245867008,3245878303,IE +3245878304,3245878335,US +3245878336,3245888703,IE +3245888704,3245888767,US +3245888768,3245892639,IE +3245892640,3245892647,US +3245892648,3245894719,IE +3245894720,3245894751,US +3245894752,3245896311,IE +3245896312,3245896319,GB +3245896320,3245896991,IE +3245896992,3245897007,US +3245897008,3245899343,IE +3245899344,3245899351,GB +3245899352,3245901831,IE +3245901832,3245901839,GB +3245901840,3245902887,IE +3245902888,3245902895,GB +3245902896,3245902903,IE +3245902904,3245902911,GB +3245902912,3245903959,IE +3245903960,3245903967,FR +3245903968,3245906367,IE +3245906368,3245906431,GB +3245906432,3245910831,IE +3245910832,3245910847,GB +3245910848,3245921279,IE +3245921280,3245921535,BE +3245921536,3245924647,IE +3245924648,3245924655,GB +3245924656,3245931263,IE +3245931264,3245931519,GB +3245931520,3245932543,IE +3245932544,3245998079,BE +3245998080,3246100351,GB +3246100352,3246100367,DE +3246100368,3246128479,GB +3246128480,3246128495,DE +3246128496,3246129151,GB +3246129152,3246141439,RU +3246141440,3246141695,UA +3246141696,3246142975,RU +3246142976,3246143231,UA +3246143232,3246143743,RU +3246143744,3246143999,UA +3246144000,3246144255,RU +3246144256,3246145023,UA +3246145024,3246147839,RU +3246147840,3246148095,UA +3246148096,3246148607,RU +3246148608,3246149631,UA +3246149632,3246260223,RU +3246260224,3246325759,PT +3246325760,3246328831,ES +3246329088,3246329855,ES +3246350848,3246351103,ES +3246351616,3246352639,ES +3246375160,3246375423,GB +3246378496,3246379007,ES +3246391296,3246418887,GB +3246418888,3246418895,SE +3246418896,3246419455,GB +3246419456,3246419463,IT +3246419464,3246613503,GB +3246613504,3246614527,HU +3246614528,3246784511,GB +3246784512,3246915583,CH +3246915584,3247046655,PT +3247046656,3247046911,AT +3247046912,3247048191,SI +3247048704,3247048959,EE +3247048960,3247049215,SI +3247049216,3247054079,DE +3247054080,3247054335,CH +3247054592,3247054847,DE +3247054848,3247063039,SI +3247063040,3247063295,FR +3247063296,3247063551,GR +3247063552,3247063807,DE +3247063808,3247064063,BG +3247064064,3247064319,DE +3247064320,3247064575,CH +3247064576,3247064831,RU +3247064832,3247065087,SE +3247065088,3247065343,US +3247065344,3247065599,CH +3247065600,3247065855,SE +3247065856,3247066111,GB +3247066112,3247066367,DK +3247066368,3247066623,UA +3247066624,3247066879,CZ +3247066880,3247067135,RU +3247067136,3247067647,DE +3247067648,3247067903,RU +3247067904,3247068159,CH +3247068160,3247068415,UA +3247068416,3247068671,RO +3247068672,3247068927,GB +3247068928,3247069183,UA +3247069184,3247069439,DE +3247069440,3247069695,RU +3247069696,3247069951,FR +3247069952,3247070207,DE +3247070208,3247070463,IL +3247070464,3247070719,UA +3247070720,3247070975,AT +3247070976,3247071231,GB +3247071232,3247071487,DE +3247071488,3247072255,RO +3247072256,3247072511,IE +3247072512,3247072767,BE +3247072768,3247073023,SE +3247073024,3247073279,RO +3247073280,3247073535,DE +3247073536,3247073791,AT +3247073792,3247074047,CZ +3247074048,3247074303,GB +3247074304,3247074559,DE +3247074560,3247074815,SE +3247074816,3247075071,PL +3247075072,3247075327,IE +3247075328,3247075839,DE +3247075840,3247076095,UA +3247076096,3247076351,DK +3247076352,3247076607,RU +3247076608,3247076863,DE +3247076864,3247077119,PL +3247077120,3247077375,DE +3247077376,3247077631,GB +3247077632,3247077887,NL +3247077888,3247078143,UA +3247078144,3247078399,AT +3247078400,3247078655,DK +3247078656,3247078911,HU +3247078912,3247079167,FI +3247079168,3247079423,HU +3247079424,3247080447,RU +3247080448,3247081471,UA +3247081472,3247083519,PL +3247083520,3247084543,UA +3247084544,3247086591,RU +3247086592,3247087615,NL +3247087616,3247088639,IT +3247088640,3247089663,DE +3247089664,3247090687,RO +3247090688,3247091711,LV +3247091712,3247092735,RU +3247092736,3247093759,DE +3247093760,3247094783,UA +3247094784,3247095807,LV +3247095808,3247097855,RO +3247097856,3247098879,FI +3247098880,3247099903,NL +3247099904,3247100927,PL +3247100928,3247101951,CH +3247101952,3247102975,SE +3247102976,3247106047,NL +3247106048,3247107071,RU +3247107072,3247108095,UA +3247108096,3247109119,PL +3247109120,3247110143,UA +3247110144,3247111167,NL +3247111168,3247112191,DE +3247112192,3247177727,FR +3247177728,3247243263,TR +3247243264,3247244287,DE +3247244288,3247244359,NL +3247244360,3247244367,DE +3247244368,3247244455,NL +3247244456,3247244463,DE +3247244464,3247244703,NL +3247244704,3247244711,DE +3247244712,3247244719,NL +3247244720,3247244727,DE +3247244728,3247244735,NL +3247244736,3247244743,DE +3247244744,3247245055,NL +3247245056,3247245063,DE +3247245064,3247245391,NL +3247245392,3247245399,DE +3247245400,3247245535,NL +3247245536,3247245543,DE +3247245544,3247245847,NL +3247245848,3247245855,DE +3247245856,3247246047,NL +3247246048,3247246055,DE +3247246056,3247246663,NL +3247246664,3247246671,DE +3247246672,3247247175,NL +3247247176,3247247183,DE +3247247184,3247247543,NL +3247247544,3247247551,DE +3247247552,3247247631,NL +3247247632,3247247639,DE +3247247640,3247248007,NL +3247248008,3247248015,DE +3247248016,3247248383,NL +3247248384,3247250431,DE +3247250432,3247250487,NL +3247250488,3247250495,DE +3247250496,3247250567,NL +3247250568,3247250575,DE +3247250576,3247251255,NL +3247251256,3247251263,DE +3247251264,3247251671,NL +3247251672,3247251679,DE +3247251680,3247251943,NL +3247251944,3247251951,DE +3247251952,3247252271,NL +3247252272,3247252279,DE +3247252280,3247252351,NL +3247252352,3247252359,DE +3247252360,3247252567,NL +3247252568,3247252575,DE +3247252576,3247252583,NL +3247252584,3247252591,DE +3247252592,3247253095,NL +3247253096,3247253103,DE +3247253104,3247253247,NL +3247253248,3247253255,DE +3247253256,3247253463,NL +3247253464,3247253471,DE +3247253472,3247253503,NL +3247253504,3247255295,DE +3247255296,3247255351,NL +3247255352,3247255359,DE +3247255360,3247255399,NL +3247255400,3247255407,DE +3247255408,3247255743,NL +3247255744,3247255751,DE +3247255752,3247256207,NL +3247256208,3247256223,DE +3247256224,3247256439,NL +3247256440,3247256447,DE +3247256448,3247256831,NL +3247256832,3247260671,DE +3247260672,3247261255,NL +3247261256,3247261263,DE +3247261264,3247261623,NL +3247261624,3247261631,DE +3247261632,3247261951,NL +3247261952,3247261959,DE +3247261960,3247262007,NL +3247262008,3247262015,DE +3247262016,3247262255,NL +3247262256,3247262263,DE +3247262264,3247262495,NL +3247262496,3247262503,DE +3247262504,3247262959,NL +3247262960,3247262967,DE +3247262968,3247263495,NL +3247263496,3247263503,DE +3247263504,3247263591,NL +3247263592,3247263599,DE +3247263600,3247263687,NL +3247263688,3247263695,DE +3247263696,3247264015,NL +3247264016,3247264023,DE +3247264024,3247264119,NL +3247264120,3247264127,DE +3247264128,3247264319,NL +3247264320,3247264327,DE +3247264328,3247265143,NL +3247265144,3247265151,DE +3247265152,3247265487,NL +3247265488,3247265495,DE +3247265496,3247265607,NL +3247265608,3247265615,DE +3247265616,3247265695,NL +3247265696,3247265703,DE +3247265704,3247266319,NL +3247266320,3247266327,DE +3247266328,3247266399,NL +3247266400,3247266407,DE +3247266408,3247266559,NL +3247266560,3247271679,DE +3247271680,3247272351,NL +3247272352,3247272359,DE +3247272360,3247272775,NL +3247272776,3247272783,DE +3247272784,3247273751,NL +3247273752,3247273759,DE +3247273760,3247274239,NL +3247274240,3247274495,DE +3247274496,3247274863,NL +3247274864,3247274871,DE +3247274872,3247275135,NL +3247275136,3247275143,DE +3247275144,3247275263,NL +3247275264,3247276031,DE +3247276032,3247276111,NL +3247276112,3247276119,DE +3247276120,3247276271,NL +3247276272,3247276279,DE +3247276280,3247276751,NL +3247276752,3247276759,DE +3247276760,3247276815,NL +3247276816,3247276823,DE +3247276824,3247277199,NL +3247277200,3247277207,DE +3247277208,3247277247,NL +3247277248,3247277255,DE +3247277256,3247277471,NL +3247277472,3247277479,DE +3247277480,3247277631,NL +3247277632,3247277639,DE +3247277640,3247278343,NL +3247278344,3247278351,DE +3247278352,3247278791,NL +3247278792,3247278799,DE +3247278800,3247278847,NL +3247278848,3247280127,DE +3247280128,3247280799,NL +3247280800,3247280807,DE +3247280808,3247281607,NL +3247281608,3247281615,DE +3247281616,3247281831,NL +3247281832,3247281839,DE +3247281840,3247282383,NL +3247282384,3247282391,DE +3247282392,3247282463,NL +3247282464,3247282471,DE +3247282472,3247283079,NL +3247283080,3247283087,DE +3247283088,3247284167,NL +3247284168,3247284175,DE +3247284176,3247284335,NL +3247284336,3247284343,DE +3247284344,3247284607,NL +3247284608,3247284615,DE +3247284616,3247284735,NL +3247284736,3247284743,DE +3247284744,3247284775,NL +3247284776,3247284783,DE +3247284784,3247284855,NL +3247284856,3247284863,DE +3247284864,3247284871,NL +3247284872,3247284879,DE +3247284880,3247285551,NL +3247285552,3247285559,DE +3247285560,3247285631,NL +3247285632,3247285639,DE +3247285640,3247285663,NL +3247285664,3247285671,DE +3247285672,3247285999,NL +3247286000,3247286007,DE +3247286008,3247286295,NL +3247286296,3247286303,DE +3247286304,3247286551,NL +3247286552,3247286567,DE +3247286568,3247286711,NL +3247286712,3247286719,DE +3247286720,3247287199,NL +3247287200,3247287207,DE +3247287208,3247287263,NL +3247287264,3247287271,DE +3247287272,3247287471,NL +3247287472,3247287479,DE +3247287480,3247288319,NL +3247288320,3247302655,DE +3247302656,3247302711,NL +3247302712,3247302719,DE +3247302720,3247303111,NL +3247303112,3247303119,DE +3247303120,3247303951,NL +3247303952,3247303959,DE +3247303960,3247304519,NL +3247304520,3247304527,DE +3247304528,3247304751,NL +3247304752,3247304759,DE +3247304760,3247305775,NL +3247305776,3247305783,DE +3247305784,3247305967,NL +3247305968,3247305975,DE +3247305976,3247306199,NL +3247306200,3247306207,DE +3247306208,3247306311,NL +3247306312,3247306319,DE +3247306320,3247306447,NL +3247306448,3247306455,DE +3247306456,3247306583,NL +3247306584,3247306591,DE +3247306592,3247306895,NL +3247306896,3247306903,DE +3247306904,3247307415,NL +3247307416,3247307423,DE +3247307424,3247307543,NL +3247307544,3247307551,DE +3247307552,3247307591,NL +3247307592,3247307599,DE +3247307600,3247307991,NL +3247307992,3247307999,DE +3247308000,3247308079,NL +3247308080,3247308087,DE +3247308088,3247308727,NL +3247308728,3247308735,DE +3247308736,3247308799,NL +3247308800,3247309055,BG +3247309056,3247313663,FI +3247313920,3247316479,FI +3247316480,3247316735,NO +3247316992,3247322367,FI +3247322368,3247322623,DE +3247322624,3247323135,FI +3247323136,3247323647,RU +3247323648,3247324415,FI +3247324416,3247324671,AT +3247324672,3247324927,CH +3247324928,3247333631,FI +3247333632,3247333887,DE +3247333888,3247334399,FI +3247334400,3247334655,NO +3247334656,3247335167,FI +3247335168,3247335423,DK +3247335424,3247336447,FI +3247336448,3247337215,NO +3247337216,3247337471,CH +3247337472,3247337983,PL +3247338240,3247338495,PL +3247338496,3247338751,SI +3247338752,3247339519,GB +3247339520,3247340543,FI +3247340544,3247340799,UA +3247340800,3247341055,CH +3247341056,3247341311,FI +3247341312,3247341567,GB +3247341568,3247345919,FI +3247345920,3247346175,HU +3247346176,3247346943,FI +3247346944,3247347199,SI +3247347200,3247347455,FI +3247347456,3247347711,IL +3247347712,3247347967,FI +3247347968,3247348223,HU +3247348224,3247348991,FI +3247348992,3247349247,DE +3247349248,3247349759,FI +3247349760,3247353855,SE +3247353856,3247362047,FI +3247362048,3247362303,RO +3247362304,3247362559,HU +3247362560,3247362815,PL +3247362816,3247363071,DK +3247363072,3247363327,GB +3247363328,3247363583,UA +3247363584,3247363839,HU +3247363840,3247364095,NL +3247364096,3247364351,GB +3247364352,3247364607,ES +3247364608,3247365119,UA +3247365120,3247365375,GB +3247365376,3247365631,UA +3247365632,3247365887,SA +3247365888,3247366143,DE +3247366144,3247371007,FI +3247371008,3247371263,PL +3247371520,3247371775,GB +3247371776,3247374335,FI +3247374336,3247374591,RU +3247374592,3247394047,FI +3247394048,3247394303,PL +3247394304,3247397887,FI +3247398144,3247399423,FI +3247399424,3247399679,RU +3247399680,3247404799,FI +3247404800,3247405055,RU +3247405056,3247405311,RO +3247405312,3247405567,PL +3247405568,3247405823,DE +3247405824,3247432191,FI +3247432192,3247432447,TR +3247432448,3247438079,FI +3247438080,3247438335,IT +3247438336,3247439871,FI +3247439872,3247702015,ES +3247702016,3247702271,RO +3247702272,3247703551,ES +3247704064,3247704831,ES +3247704832,3247705087,GB +3247705088,3247705855,ES +3247705856,3247706111,RU +3247706112,3247711743,ES +3247711744,3247712255,IT +3247712256,3247713279,ES +3247713280,3247713535,RU +3247713536,3247713791,BE +3247713792,3247714047,SK +3247714048,3247714303,RU +3247714304,3247716351,CH +3247716352,3247717887,ES +3247717888,3247718399,CH +3247718400,3247769599,ES +3247769600,3247771647,DE +3247771648,3247775743,ES +3247775744,3247779647,DE +3247779648,3247779839,IE +3247779840,3247783935,DE +3247783936,3247792127,GB +3247792128,3247800319,FR +3247800320,3247816703,DK +3247816704,3247817471,BE +3247817472,3247817727,CH +3247817728,3247820799,BE +3247820800,3247822335,CH +3247822336,3247823103,DE +3247823104,3247823871,AT +3247823872,3247825151,BE +3247825152,3247825919,CH +3247825920,3247826943,BE +3247826944,3247828991,CH +3247828992,3247833087,BE +3247833088,3247865855,RU +3247865856,3247871999,GB +3247872000,3247875327,NL +3247875584,3247876095,DE +3247876096,3247876351,PL +3247876352,3247876607,FR +3247876608,3247876863,ES +3247876864,3247877119,DE +3247877120,3247877631,GR +3247877632,3247879167,AT +3247879168,3247882239,GB +3247882240,3247898623,SE +3247898624,3247899647,RU +3247899648,3247900671,DE +3247900672,3247901695,PL +3247901696,3247902719,UA +3247902720,3247903743,GB +3247903744,3247904767,BG +3247904768,3247905791,PL +3247905792,3247906815,RO +3247906816,3247907839,DE +3247907840,3247908863,PL +3247908864,3247909887,BY +3247909888,3247910911,DE +3247910912,3247912959,PL +3247912960,3247913983,UA +3247913984,3247915007,DE +3247915008,3247917055,PL +3247917056,3247918079,NL +3247918080,3247919103,PL +3247919104,3247920127,BG +3247920128,3247921151,FR +3247921152,3247922175,RU +3247922176,3247923199,SE +3247923200,3247925247,PL +3247925248,3247926271,UA +3247926272,3247927295,RU +3247927296,3247928319,PL +3247928320,3247929343,HU +3247929344,3247931391,GB +3247931392,3247960063,FR +3247960064,3247962111,UA +3247962112,3247963135,DE +3247963136,3247964159,UA +3247964160,3248095231,ES +3248095232,3248095823,AT +3248095824,3248095831,HU +3248095832,3248160767,AT +3248160768,3248226303,DE +3248226304,3248235007,NO +3248235008,3248235263,PK +3248235264,3248357375,NO +3248357376,3248358367,DE +3248358368,3248358383,LU +3248358384,3248370511,DE +3248370512,3248370519,AT +3248370520,3248371743,DE +3248371744,3248371751,PL +3248371752,3248372239,DE +3248372240,3248372247,AT +3248372248,3248372255,CH +3248372256,3248372263,AT +3248372264,3248372271,NL +3248372272,3248372319,DE +3248372320,3248372327,BE +3248372328,3248488447,DE +3248488448,3248525311,NO +3248525312,3248525567,DE +3248525568,3248525823,DK +3248525824,3248619519,NO +3248619520,3248638463,DK +3248638464,3248638719,GB +3248638720,3248750591,DK +3248750592,3248750847,PT +3248750848,3248752383,PL +3248752384,3248752639,NL +3248752640,3248752895,DE +3248752896,3248753151,TR +3248753152,3248753663,GB +3248753664,3248753919,FR +3248753920,3248754431,GB +3248754432,3248754687,AT +3248754688,3248758783,PL +3248758784,3248774143,SE +3248774144,3248775167,UA +3248775168,3248783615,GB +3248783616,3248783871,PL +3248783872,3248784127,UA +3248784128,3248785407,DE +3248785408,3248785663,RO +3248785664,3248786943,SI +3248786944,3248787199,PL +3248787200,3248787455,GB +3248787456,3248787711,NL +3248787712,3248787967,CH +3248787968,3248788223,RU +3248788224,3248788479,ES +3248788480,3248788735,FR +3248788736,3248788991,UA +3248788992,3248789503,FR +3248789504,3248789759,RO +3248789760,3248790015,FR +3248790016,3248790271,DE +3248790272,3248790527,DK +3248790528,3248790783,FR +3248790784,3248791039,PL +3248791040,3248791295,BE +3248791296,3248791551,DE +3248791552,3248792335,GB +3248796608,3248796863,GB +3248798648,3248798651,GB +3248798976,3248799231,GB +3248799736,3248799743,GB +3248807936,3248808447,AT +3248808448,3248808959,GR +3248808960,3248810079,FR +3248810080,3248810111,UA +3248810112,3248810143,RU +3248810144,3248810175,HR +3248810176,3248810207,FR +3248810208,3248810239,GB +3248810240,3248810495,CH +3248810496,3248812543,AT +3248812544,3248813055,GB +3248813056,3248813567,CH +3248813568,3248814079,DE +3248814080,3248815103,DK +3248815104,3248815615,GB +3248816128,3248881663,CZ +3248881664,3249012735,FI +3249012736,3249012991,DE +3249012992,3249014271,LU +3249014784,3249025535,LU +3249025536,3249025791,FR +3249025792,3249026559,LU +3249026816,3249045503,LU +3249045504,3249078271,DE +3249078272,3249078783,RU +3249078784,3249079295,CH +3249079296,3249079807,RU +3249079808,3249080831,RO +3249080832,3249081343,DE +3249081344,3249081855,UA +3249081856,3249082367,GB +3249082368,3249082879,HU +3249082880,3249083391,PL +3249083392,3249083903,RO +3249083904,3249085951,RU +3249085952,3249086463,GI +3249086464,3249088511,RU +3249088512,3249089023,NL +3249089024,3249089535,NO +3249089536,3249090047,RU +3249090048,3249090559,FR +3249090560,3249091071,SI +3249091072,3249091583,RO +3249143808,3249274879,AT +3249274880,3249277759,NL +3249277760,3249277775,BG +3249277776,3249290143,NL +3249290144,3249290159,BG +3249290160,3249330111,NL +3249330112,3249330143,BG +3249330144,3249350095,NL +3249350096,3249350111,BG +3249350112,3249405951,NL +3249405952,3249406975,DE +3249406976,3249407231,IT +3249407232,3249521279,DE +3249521280,3249521343,UA +3249521344,3249537023,DE +3249537024,3249537279,PT +3249537280,3249537791,NL +3249537792,3249538047,GB +3249538048,3249551359,NL +3249551360,3249552639,GB +3249552640,3249574143,NL +3249574912,3249590527,NL +3249590784,3249600255,NL +3249601792,3249668095,NL +3249668096,3249676799,IE +3249676800,3249677055,UA +3249677056,3249677311,SE +3249677312,3249679103,IE +3249679104,3249679359,CH +3249679360,3249683455,IE +3249683456,3249684479,SE +3249684480,3249698047,IE +3249698048,3249698303,PL +3249698304,3249698559,RU +3249698560,3249698815,HU +3249698816,3249699839,GB +3249699840,3249700863,UA +3249700864,3249701631,SE +3249701632,3249701887,GR +3249701888,3249702143,PL +3249702144,3249702399,FI +3249702400,3249702655,FR +3249702656,3249702911,RU +3249702912,3249703679,FR +3249703680,3249703935,GB +3249703936,3249704191,FR +3249704192,3249704447,RO +3249704448,3249704703,DE +3249704704,3249704959,PL +3249704960,3249705983,UA +3249705984,3249706495,AT +3249706496,3249707007,LV +3249707008,3249707519,BG +3249707520,3249708031,FR +3249708032,3249708543,CH +3249708544,3249709055,RU +3249709056,3249709311,AT +3249709312,3249709567,PL +3249709568,3249709823,UA +3249709824,3249710079,DE +3249710080,3249710335,PL +3249710336,3249710591,RO +3249710592,3249710847,BG +3249710848,3249711103,PL +3249711104,3249711359,HU +3249711360,3249711871,DE +3249711872,3249712127,AT +3249712128,3249712383,UA +3249712384,3249712639,GB +3249712640,3249712895,BE +3249712896,3249713151,DK +3249713152,3249715199,LV +3249715200,3249715455,AT +3249715456,3249715711,DE +3249715712,3249715967,FR +3249715968,3249716223,UA +3249716224,3249716479,SI +3249716480,3249716735,NL +3249716736,3249717247,UA +3249717248,3249718271,LV +3249718272,3249719295,DE +3249719296,3249720319,GB +3249720320,3249721343,IT +3249721344,3249721599,AT +3249721600,3249721855,BE +3249721856,3249722623,FR +3249722624,3249723135,PL +3249723136,3249723391,GB +3249723392,3249723647,IT +3249723648,3249723903,GB +3249723904,3249724159,TR +3249724160,3249724415,LU +3249724416,3249724671,IL +3249724672,3249724927,SE +3249724928,3249725183,BG +3249725184,3249725439,GB +3249725440,3249725951,RO +3249725952,3249726463,DE +3249726464,3249726975,UA +3249726976,3249727487,IT +3249727488,3249727999,LV +3249728000,3249728511,IT +3249728512,3249729023,UA +3249729024,3249729535,GB +3249729536,3249730559,PL +3249730560,3249731583,IT +3249731584,3249732607,UA +3249732608,3249733631,IT +3249733632,3249799167,CZ +3249799168,3250061311,SE +3250061312,3250192383,FI +3250192384,3250192639,AT +3250192640,3250192895,RU +3250192896,3250193151,IL +3250193152,3250193407,DE +3250193408,3250193663,PL +3250193664,3250194175,AT +3250194176,3250194431,DE +3250194432,3250194687,FR +3250194688,3250194943,UA +3250194944,3250195455,RO +3250195456,3250195711,DE +3250195712,3250196223,GB +3250196224,3250196479,UA +3250196480,3250200575,AT +3250200576,3250200831,HU +3250200832,3250201087,RO +3250201088,3250201343,RU +3250201344,3250201599,DK +3250202624,3250233855,AT +3250233856,3250234111,GB +3250234112,3250234367,GR +3250234368,3250245631,AT +3250245632,3250245887,TR +3250245888,3250246143,AT +3250246144,3250246399,GB +3250246400,3250257663,AT +3250257664,3250257919,PL +3250257920,3250258175,DE +3250258176,3250323199,AT +3250323200,3250323455,RU +3250323456,3250323711,PL +3250323712,3250324479,SA +3250324480,3250324991,GB +3250324992,3250325247,AE +3250325248,3250325503,MA +3250325504,3250326527,OM +3250326528,3250327039,BH +3250327040,3250331647,SA +3250331648,3250335743,MT +3250335744,3250339839,KW +3250339840,3250348031,JO +3250348032,3250356223,BH +3250356224,3250357247,LB +3250357248,3250357823,GB +3250357824,3250357855,FR +3250357856,3250357871,EE +3250357872,3250357879,CH +3250357920,3250357927,PL +3250357960,3250358015,GB +3250358016,3250358527,LB +3250358528,3250358783,HU +3250358784,3250359295,LB +3250359296,3250359807,HU +3250359808,3250362879,KW +3250362880,3250363391,DE +3250363904,3250364415,DE +3250364416,3250372607,KW +3250372608,3250373375,HU +3250373376,3250373631,GB +3250373632,3250374143,DE +3250374144,3250374655,TR +3250374656,3250374911,SA +3250374912,3250375679,SE +3250375680,3250376703,GB +3250376704,3250380799,AT +3250380800,3250381055,DK +3250381056,3250386943,CH +3250386944,3250387199,SE +3250387200,3250387455,FR +3250387456,3250387711,DE +3250387712,3250387967,FR +3250387968,3250388223,JO +3250388224,3250388479,PL +3250388480,3250388735,UA +3250388736,3250388991,FR +3250388992,3250405887,NG +3250405888,3250406399,IE +3250406400,3250406911,RU +3250406912,3250407423,RO +3250407424,3250407935,PL +3250407936,3250408447,GB +3250408448,3250408959,PL +3250408960,3250409471,DE +3250409472,3250409983,GB +3250409984,3250410495,DE +3250410496,3250411007,AT +3250411008,3250411519,LT +3250411520,3250412031,RU +3250412032,3250412543,FR +3250412544,3250413055,DK +3250413056,3250413567,DE +3250413568,3250414079,UA +3250414080,3250414591,RO +3250414592,3250415103,DE +3250415104,3250415615,NL +3250415616,3250416127,FR +3250416128,3250417663,DE +3250417664,3250418175,IT +3250418176,3250418687,DE +3250418688,3250419199,PL +3250419200,3250419711,NO +3250419712,3250420223,RU +3250420224,3250420735,IR +3250420736,3250421247,FR +3250421248,3250421759,UA +3250421760,3250422015,NG +3250422016,3250423295,GB +3250423296,3250423551,NL +3250423552,3250423807,BE +3250423808,3250424063,AT +3250424064,3250424319,DE +3250424320,3250424831,NL +3250424832,3250425343,GB +3250425344,3250425599,TR +3250425600,3250425855,FR +3250425856,3250426111,LT +3250426112,3250426367,NO +3250426368,3250426623,AT +3250426624,3250426879,BE +3250426880,3250427135,JO +3250427136,3250427391,NL +3250427392,3250429951,DE +3250429952,3250438143,SI +3250438144,3250438207,FR +3250438208,3250438399,CH +3250438400,3250438431,FR +3250438432,3250443519,CH +3250443520,3250443527,DE +3250443528,3250443543,CH +3250443544,3250443551,DE +3250443552,3250446335,CH +3250446336,3250451583,DE +3250451584,3250451599,AT +3250451600,3250454527,DE +3250454528,3250585599,BE +3250585600,3250585855,NL +3250585856,3250588671,PT +3250588672,3250588799,IE +3250588800,3250588927,AT +3250588928,3250589183,GB +3250589184,3250589439,DE +3250589440,3250589471,IE +3250589472,3250589503,NL +3250589504,3250589567,HR +3250589632,3250589695,NO +3250589696,3250593791,CH +3250593792,3250594815,GB +3250594816,3250595327,UA +3250595328,3250595839,GR +3250595840,3250596351,DE +3250596352,3250597887,RO +3250597888,3250598399,BG +3250598400,3250598911,GB +3250598912,3250599423,RO +3250599424,3250599935,SE +3250599936,3250600447,BG +3250600448,3250601471,DE +3250601472,3250601983,PL +3250601984,3250610175,GB +3250610176,3250618367,TR +3250618368,3250626559,RU +3250626560,3250634751,PL +3250634752,3250642943,GB +3250642944,3250651135,CH +3250651136,3250659327,IT +3250667520,3250675711,PL +3250675712,3250683903,GB +3250683904,3250692095,CH +3250692096,3250692351,NO +3250692352,3250692607,NL +3250692608,3250693375,BG +3250693376,3250694399,IE +3250694400,3250694655,GB +3250694656,3250694911,SK +3250694912,3250695167,NL +3250695168,3250695679,IT +3250695680,3250697471,DE +3250697472,3250697727,PL +3250697728,3250697983,BG +3250697984,3250698239,IT +3250698240,3250698751,GR +3250699264,3250699775,GB +3250699776,3250700287,DE +3250700288,3250708479,UA +3250708480,3250716671,KZ +3250716672,3250716927,RO +3250716928,3250718207,MA +3250718208,3250720767,DE +3250720768,3250722047,IT +3250722048,3250722303,RO +3250722304,3250724863,GB +3250724864,3250733055,MA +3250749440,3250749695,GH +3250749696,3250749951,IT +3250749952,3250750463,RO +3250750464,3250751487,FR +3250751488,3250751999,DE +3250752000,3250752511,CH +3250752512,3250753023,BG +3250753024,3250754047,DE +3250754048,3250754303,AT +3250754304,3250754479,GB +3250754480,3250754495,IE +3250754496,3250754559,GB +3250754560,3250755071,DE +3250755072,3250755583,GB +3250755584,3250755839,FR +3250755840,3250756351,RU +3250756352,3250756607,PT +3250756608,3250756863,BG +3250756864,3250757119,DE +3250757120,3250757375,BE +3250757376,3250757631,HU +3250765824,3250782207,SE +3250782208,3250847743,GB +3250847744,3250978815,DE +3250978816,3250989311,HR +3250989312,3250989343,BA +3250989344,3251044351,HR +3251044352,3251109887,FI +3251109888,3251110143,SI +3251110144,3251110655,BG +3251110656,3251110911,IT +3251110912,3251111167,FR +3251111168,3251111423,CH +3251111424,3251111679,AT +3251111680,3251111935,ES +3251111936,3251112191,BG +3251112192,3251112447,SK +3251112448,3251112703,RU +3251112704,3251112959,SE +3251112960,3251113215,BG +3251113216,3251113471,VG +3251113472,3251114495,BG +3251114496,3251114751,RU +3251114752,3251115007,RO +3251115008,3251115263,PL +3251115264,3251115519,RU +3251115520,3251115775,UA +3251115776,3251116031,BE +3251116032,3251116287,BG +3251116288,3251116543,GB +3251116544,3251116799,DK +3251116800,3251117055,GB +3251117056,3251117311,BG +3251117312,3251117567,FR +3251117568,3251117823,IL +3251117824,3251118079,SE +3251118080,3251118591,UA +3251118592,3251119103,RU +3251119104,3251120127,UA +3251120128,3251120639,KW +3251120640,3251121151,FR +3251121152,3251121663,DK +3251121664,3251122175,PL +3251122176,3251122687,CH +3251123200,3251123711,FR +3251123712,3251124223,RO +3251124224,3251124735,NL +3251124736,3251125247,FR +3251125248,3251125759,BE +3251125760,3251126271,RU +3251126272,3251126783,UA +3251126784,3251127295,PL +3251127296,3251127807,UA +3251127808,3251128319,NL +3251128320,3251128831,DE +3251128832,3251129343,SE +3251129344,3251129855,UA +3251129856,3251130367,CH +3251130368,3251130879,GB +3251130880,3251131391,PL +3251131392,3251131903,UA +3251131904,3251132415,SE +3251132416,3251132927,RU +3251132928,3251133439,DK +3251133440,3251133951,NO +3251133952,3251134463,RU +3251134464,3251134975,DE +3251134976,3251135999,GB +3251136000,3251136511,RO +3251136512,3251137023,DK +3251137024,3251137535,DE +3251137536,3251138047,PL +3251138048,3251138559,FR +3251138560,3251139071,AT +3251139072,3251139583,GB +3251139584,3251140095,FR +3251140096,3251141631,PL +3251141632,3251142143,LT +3251142144,3251142655,RO +3251142656,3251142911,DE +3251142912,3251143167,RU +3251143168,3251143423,AM +3251143424,3251143679,LV +3251143680,3251143935,NL +3251143936,3251144191,PL +3251144192,3251144447,TR +3251144448,3251144703,BE +3251144704,3251144959,HU +3251144960,3251145471,DE +3251145472,3251145727,FR +3251145728,3251145983,NL +3251145984,3251146239,RO +3251146240,3251146495,AT +3251146496,3251146751,SK +3251146752,3251147007,CH +3251147008,3251147263,GB +3251147264,3251147519,PL +3251147520,3251147775,NL +3251147776,3251148031,SE +3251148032,3251148287,RU +3251148288,3251148543,SC +3251148544,3251148799,UA +3251148800,3251149055,HU +3251149056,3251149311,NL +3251149312,3251149567,DE +3251149568,3251149823,IE +3251149824,3251150079,DE +3251150080,3251150335,CH +3251150336,3251150591,GB +3251150592,3251150847,CH +3251150848,3251151359,UA +3251151360,3251151615,DE +3251151616,3251151871,PL +3251151872,3251152127,NL +3251152128,3251152639,RO +3251152640,3251152895,UA +3251152896,3251153151,RU +3251153152,3251153407,UA +3251153408,3251153663,TR +3251153664,3251153919,FR +3251153920,3251154175,DE +3251154176,3251154431,UA +3251154432,3251154687,NL +3251154688,3251154943,UA +3251154944,3251155455,GB +3251155456,3251155711,NL +3251155712,3251155967,UA +3251155968,3251156223,TR +3251156224,3251156735,FR +3251156736,3251156991,UA +3251156992,3251157247,FR +3251157248,3251157503,BE +3251157504,3251158015,PL +3251158016,3251158271,TR +3251158272,3251158527,RU +3251158528,3251158783,UA +3251158784,3251159295,GB +3251159296,3251159551,DE +3251159552,3251159807,ES +3251159808,3251160063,DE +3251160064,3251160319,JO +3251160320,3251160575,PL +3251160576,3251160831,NL +3251160832,3251161087,RU +3251161088,3251161343,RO +3251161344,3251161599,LV +3251161600,3251161855,SE +3251161856,3251162111,HR +3251162112,3251162367,DK +3251162368,3251162623,UA +3251162624,3251162879,DE +3251162880,3251163135,SI +3251163136,3251163391,SE +3251163392,3251163647,UA +3251163648,3251163903,DE +3251163904,3251164159,RU +3251164160,3251164415,UA +3251164416,3251164671,IT +3251164672,3251164927,NL +3251164928,3251165439,PL +3251165440,3251165695,CH +3251165696,3251165951,DE +3251165952,3251166207,UA +3251166208,3251166463,CH +3251166464,3251166719,RU +3251166720,3251166975,FR +3251166976,3251167231,CH +3251167232,3251167487,LV +3251167488,3251167743,DK +3251167744,3251167999,FR +3251168000,3251168255,PL +3251168256,3251168511,AT +3251168512,3251168767,UA +3251168768,3251169023,DE +3251169024,3251169279,FR +3251169280,3251170047,PL +3251170048,3251170303,NO +3251170304,3251170559,CH +3251170560,3251170815,DE +3251170816,3251171327,RU +3251171328,3251171839,DE +3251171840,3251172095,RO +3251172096,3251172351,ES +3251172352,3251172607,RO +3251172608,3251172863,GB +3251172864,3251173119,UA +3251173120,3251173375,SA +3251173376,3251173631,UA +3251173632,3251173887,DE +3251173888,3251174143,DK +3251174144,3251174399,RU +3251174400,3251174655,RO +3251174656,3251174911,DE +3251174912,3251175167,AT +3251175168,3251175423,UA +3251175424,3251176703,FR +3251176704,3251176959,IT +3251176960,3251177471,FR +3251177472,3251179519,DE +3251179520,3251180031,SE +3251180032,3251180543,PL +3251180544,3251181055,RO +3251181056,3251181567,GR +3251181568,3251182079,DE +3251182080,3251182591,FR +3251182592,3251183103,IT +3251183104,3251183615,RU +3251183616,3251183871,NO +3251183872,3251184127,CH +3251184128,3251184383,PL +3251184384,3251184639,DK +3251184640,3251184895,PL +3251184896,3251185407,DE +3251185408,3251185663,DK +3251185664,3251185919,IT +3251185920,3251186175,AT +3251186176,3251186431,GB +3251186432,3251186687,SE +3251186688,3251186943,RO +3251186944,3251187199,SI +3251187200,3251187455,GR +3251187456,3251187711,GB +3251187712,3251188735,NL +3251188736,3251189759,DE +3251189760,3251190783,IT +3251190784,3251191807,UA +3251191808,3251192319,GB +3251192320,3251192831,LV +3251192832,3251193343,BE +3251193344,3251193855,GB +3251193856,3251194367,DE +3251194368,3251194879,NO +3251194880,3251195391,FR +3251195392,3251195903,CZ +3251195904,3251196927,UA +3251196928,3251197951,CH +3251197952,3251198975,RU +3251198976,3251199999,DE +3251200000,3251200511,SE +3251200512,3251201279,UA +3251201280,3251201535,SI +3251201536,3251201791,AT +3251201792,3251202047,FR +3251202048,3251202303,NL +3251202304,3251202559,PL +3251202560,3251202815,AT +3251202816,3251203327,ES +3251203328,3251203583,SI +3251203584,3251203839,CZ +3251203840,3251204095,SE +3251204096,3251204607,DE +3251204608,3251205119,BG +3251205120,3251205631,UA +3251205632,3251206143,RU +3251206144,3251206655,GB +3251206656,3251207167,CH +3251207168,3251207679,GB +3251207680,3251208191,RU +3251208192,3251209215,CY +3251209216,3251210239,GB +3251210240,3251211263,PL +3251211264,3251212287,UA +3251212288,3251212415,DE +3251212416,3251212543,FI +3251212672,3251212799,SE +3251212800,3251212927,FR +3251213056,3251213119,SE +3251213120,3251213151,NL +3251213184,3251213215,UA +3251213216,3251213247,CH +3251213248,3251213311,GB +3251213312,3251213439,DE +3251213440,3251213503,GB +3251213504,3251213567,DE +3251213568,3251213631,FR +3251213696,3251213759,LV +3251213760,3251213823,TR +3251213824,3251213887,GB +3251213888,3251214015,FI +3251214016,3251214079,UA +3251214080,3251214143,FR +3251214144,3251214207,MC +3251214208,3251214271,RU +3251214272,3251214335,DE +3251214336,3251214463,RU +3251214464,3251214591,UA +3251214592,3251214975,GB +3251214976,3251215103,RO +3251215104,3251215231,SI +3251215232,3251215359,IL +3251215360,3251215487,UA +3251215488,3251215615,SE +3251215616,3251215743,TR +3251215744,3251215871,GB +3251215872,3251215999,CH +3251216000,3251216127,LI +3251216128,3251216255,FI +3251216256,3251216383,RU +3251216384,3251216639,GB +3251216640,3251216895,RO +3251216896,3251217151,BE +3251217152,3251217407,GB +3251217408,3251217663,PL +3251217664,3251217919,SI +3251217920,3251218175,GR +3251218176,3251218431,PL +3251218432,3251219199,DE +3251219200,3251219455,IT +3251219456,3251219711,BG +3251219712,3251220223,AT +3251220224,3251220479,UA +3251220480,3251222527,DE +3251222528,3251224575,GB +3251224576,3251225087,UA +3251225088,3251225599,FR +3251225600,3251226111,GB +3251226112,3251226623,UA +3251226624,3251227135,GB +3251227136,3251227647,DE +3251227648,3251228159,GB +3251228160,3251229695,UA +3251229696,3251230719,SI +3251230720,3251231743,UA +3251231744,3251232767,NO +3251232768,3251233791,UA +3251233792,3251234815,RU +3251234816,3251235839,RO +3251235840,3251236863,DE +3251236864,3251237887,BG +3251237888,3251238911,DK +3251238912,3251239935,FR +3251239936,3251240959,US +3251241216,3251243007,GB +3251243008,3251245055,BE +3251245056,3251245311,DE +3251245312,3251245567,BE +3251245568,3251245823,TR +3251245824,3251246079,UA +3251246080,3251246335,DE +3251246336,3251246591,UA +3251246592,3251246847,RO +3251246848,3251247103,NL +3251247104,3251247359,FR +3251247360,3251247871,DE +3251247872,3251248127,GB +3251248128,3251248383,DE +3251248384,3251248639,SE +3251248640,3251248895,DE +3251248896,3251249151,GB +3251249152,3251251199,NL +3251251200,3251251455,PT +3251251456,3251251711,GB +3251251712,3251251967,CH +3251251968,3251252223,BG +3251252224,3251252479,AT +3251252480,3251252735,NL +3251252736,3251256831,CH +3251256832,3251257343,GB +3251257344,3251259903,BE +3251259904,3251260671,FR +3251260672,3251261183,BE +3251261184,3251261439,PT +3251261440,3251264255,CH +3251264256,3251264511,BG +3251264512,3251264767,IT +3251264768,3251265023,GB +3251265024,3251265279,ES +3251265280,3251265535,DE +3251265536,3251267839,NL +3251267840,3251268351,GB +3251268352,3251269119,NL +3251269120,3251269375,UA +3251269376,3251269631,FR +3251269632,3251269887,NL +3251269888,3251270143,GB +3251270144,3251270399,PL +3251270400,3251270655,NL +3251270656,3251270911,DE +3251270912,3251271167,PL +3251271168,3251271423,UA +3251271424,3251271679,DE +3251271680,3251271935,TR +3251271936,3251272191,FR +3251272192,3251272447,NL +3251272448,3251272703,AT +3251272704,3251272959,DE +3251272960,3251273471,FR +3251273472,3251290111,DE +3251290112,3251302399,GB +3251302400,3251306239,LI +3251306240,3251306495,CH +3251306496,3251306751,AT +3251306752,3251307007,MK +3251307008,3251307519,CS +3251307520,3251307775,MK +3251307776,3251308031,GB +3251308032,3251308543,CS +3251308544,3251310591,US +3251310592,3251311103,SI +3251311104,3251311615,CS +3251312128,3251312383,CS +3251312384,3251312639,CH +3251312640,3251314175,CS +3251314176,3251314687,CH +3251314688,3251315711,FR +3251315712,3251317759,RU +3251317760,3251318783,PL +3251318784,3251319807,UA +3251319808,3251320831,HU +3251321856,3251322879,RU +3251322880,3251329535,GB +3251329536,3251329567,FR +3251329568,3251329727,GB +3251329728,3251329791,FR +3251329792,3251330047,GB +3251330048,3251330079,IT +3251330080,3251330239,GB +3251330240,3251330303,IT +3251330304,3251331071,GB +3251331072,3251331583,FR +3251331584,3251332095,PL +3251332096,3251333119,RU +3251333120,3251333631,IT +3251333632,3251334143,PT +3251334144,3251334655,FR +3251334656,3251335167,UA +3251335168,3251335679,RU +3251335680,3251336191,RO +3251336192,3251336703,GB +3251336704,3251337215,ES +3251337216,3251337727,CH +3251337728,3251338239,DE +3251338240,3251339263,RU +3251339264,3251347455,IE +3251347456,3251355647,DE +3251355648,3251356159,GB +3251356160,3251356671,AT +3251356672,3251357183,EE +3251357184,3251357695,IL +3251357696,3251358207,ES +3251358208,3251358719,RU +3251358720,3251359231,RO +3251359232,3251360255,PL +3251360256,3251360767,GB +3251360768,3251361279,FR +3251361280,3251361791,RO +3251361792,3251362303,AT +3251362304,3251362815,UA +3251362816,3251363327,NL +3251363328,3251363839,PL +3251363840,3251364095,MK +3251364096,3251364607,NL +3251364608,3251364863,RO +3251364864,3251366911,IT +3251366912,3251367423,UA +3251367424,3251367935,DE +3251367936,3251372031,GB +3251372032,3251604447,IT +3251604448,3251604455,CH +3251604456,3251634175,IT +3251634176,3251661311,FI +3251661312,3251661567,NO +3251661568,3251672575,FI +3251672576,3251672831,NL +3251672832,3251674879,FI +3251674880,3251675135,BE +3251675136,3251705343,FI +3251705344,3251705599,DK +3251705600,3251707391,FI +3251707392,3251707647,SE +3251707648,3251710207,FI +3251710208,3251710215,NL +3251710216,3251710223,FI +3251710224,3251710239,NL +3251710240,3251734271,FI +3251734272,3251734527,CH +3251734528,3251734783,NL +3251734784,3251765247,FI +3251765248,3251765503,NL +3251765504,3251774207,FI +3251774208,3251774463,DE +3251774464,3251783423,FI +3251783424,3251783679,GB +3251783680,3251795455,FI +3251795456,3251795711,GB +3251795712,3251802879,FI +3251802880,3251803135,BE +3251803136,3251806207,FI +3251806208,3251815167,BE +3251815168,3251815679,LU +3251815680,3251818495,BE +3251818496,3251850495,FI +3251850496,3251850751,FR +3251850752,3251851007,CH +3251851008,3251896319,FI +3251896320,3251927991,NO +3251927992,3251927999,NL +3251928000,3252015687,NO +3252015688,3252015695,SE +3252015696,3252289535,NO +3252289792,3252291327,GR +3252291328,3252291583,SK +3252291584,3252293631,FR +3252293632,3252297983,DE +3252297984,3252310527,GR +3252311040,3252313599,GR +3252313600,3252313855,SI +3252313856,3252314111,DE +3252314112,3252314623,GR +3252314624,3252314879,HU +3252314880,3252315135,GB +3252315136,3252316415,CH +3252316416,3252316671,FR +3252316672,3252318463,GR +3252318464,3252318719,TR +3252318720,3252318975,GP +3252318976,3252319231,PL +3252319232,3252319743,AT +3252320000,3252320255,GR +3252320512,3252321791,GR +3252321792,3252322303,DE +3252322304,3252323327,NO +3252323328,3252324351,PL +3252324352,3252326399,RU +3252326400,3252327423,UA +3252327424,3252329471,PL +3252329472,3252330495,UA +3252330496,3252338687,GB +3252338688,3252340735,BE +3252340736,3252340991,TR +3252341504,3252341759,GR +3252342016,3252342079,GB +3252342080,3252342143,IR +3252342144,3252342207,LU +3252342208,3252342239,GB +3252342240,3252342271,CH +3252342528,3252342543,NO +3252342784,3252346367,DE +3252346368,3252346623,GB +3252346624,3252355071,GR +3252355072,3252355327,GB +3252355328,3252358911,LT +3252358912,3252358927,GB +3252358928,3252359167,DE +3252359168,3252362239,DK +3252362240,3252362495,PL +3252362496,3252362751,IT +3252362752,3252363263,DK +3252363264,3252379647,LT +3252379648,3252379903,ES +3252379904,3252380159,GB +3252380160,3252380415,BE +3252380416,3252380671,UA +3252380672,3252380927,SI +3252380928,3252381183,RU +3252381184,3252381439,IT +3252381440,3252381695,ES +3252381696,3252381951,RU +3252381952,3252382207,DE +3252382208,3252382463,SI +3252382464,3252382719,PL +3252382720,3252382975,GB +3252382976,3252383231,IT +3252383232,3252383743,GB +3252383744,3252383999,SE +3252384000,3252384511,PL +3252384512,3252384767,CH +3252384768,3252385023,NL +3252385024,3252385279,RO +3252385280,3252385535,GB +3252385536,3252385791,RO +3252385792,3252386047,GB +3252386048,3252386303,SI +3252386304,3252386559,GB +3252386560,3252386815,BE +3252386816,3252387071,UA +3252387072,3252387327,RU +3252387328,3252387583,PL +3252387584,3252387839,RU +3252387840,3252404223,LT +3252404224,3252406527,NO +3252406528,3252407295,LT +3252407296,3252407583,NO +3252407584,3252407599,NG +3252407600,3252407615,BJ +3252407616,3252407679,NO +3252407680,3252407743,NG +3252407744,3252407751,NO +3252407752,3252407759,AO +3252407760,3252407807,NO +3252407808,3252407999,GN +3252408000,3252408159,NO +3252408160,3252408191,GQ +3252408192,3252408319,NO +3252408320,3252408335,TR +3252408336,3252408367,LT +3252408368,3252408383,NG +3252408384,3252408391,BI +3252408392,3252408415,LT +3252408416,3252408479,NO +3252408480,3252408495,FI +3252408496,3252408511,LT +3252408512,3252408527,SO +3252408528,3252408543,LT +3252408544,3252408551,AF +3252408552,3252408559,LT +3252408560,3252408575,IQ +3252408576,3252408607,SO +3252408608,3252408639,LT +3252408640,3252408671,CF +3252408672,3252408687,LT +3252408688,3252408703,SO +3252408704,3252408751,NG +3252408752,3252408767,LT +3252408768,3252408783,NG +3252408784,3252408799,LT +3252408800,3252408831,SO +3252408832,3252408839,NG +3252408840,3252408847,KE +3252408848,3252408855,LR +3252408856,3252408863,CM +3252408864,3252408871,LR +3252408872,3252408879,CI +3252408880,3252408975,LT +3252408976,3252408983,IQ +3252408984,3252408991,LT +3252408992,3252409007,IQ +3252409008,3252409087,LT +3252409088,3252409095,RW +3252409096,3252409103,LT +3252409104,3252409111,SD +3252409112,3252409119,LT +3252409120,3252409127,NG +3252409128,3252409135,LT +3252409136,3252409143,AO +3252409144,3252409183,LT +3252409184,3252409191,UG +3252409192,3252409247,LT +3252409248,3252409263,IQ +3252409264,3252409343,SO +3252409344,3252409375,TD +3252409376,3252409407,LT +3252409408,3252409471,BI +3252409472,3252409519,LT +3252409520,3252409527,NG +3252409528,3252409535,LT +3252409536,3252409543,BI +3252409544,3252409551,LT +3252409552,3252409567,CG +3252409568,3252409599,TZ +3252409600,3252409663,NG +3252409664,3252409855,LT +3252409856,3252410383,BW +3252410384,3252410879,LT +3252410880,3252411007,IQ +3252411008,3252411135,LT +3252411136,3252411167,IQ +3252411168,3252411327,LT +3252411328,3252411391,UG +3252411392,3252411647,LT +3252411648,3252411679,BI +3252411680,3252411711,UG +3252411712,3252411743,NG +3252411744,3252411775,LT +3252411776,3252411783,GH +3252411784,3252411791,LT +3252411792,3252411823,NG +3252411824,3252411839,LT +3252411840,3252411855,NG +3252411856,3252411879,LT +3252411880,3252411895,CD +3252411896,3252412415,LT +3252412416,3252412479,IQ +3252412480,3252412927,LT +3252412928,3252413439,NG +3252413440,3252414223,ZM +3252414224,3252414239,LT +3252414240,3252414271,ZM +3252414272,3252414335,LT +3252414336,3252414367,ZM +3252414368,3252414399,LT +3252414400,3252414415,ZM +3252414416,3252414463,LT +3252414464,3252414479,GH +3252414480,3252414495,ML +3252414496,3252414511,LT +3252414512,3252414527,MR +3252414528,3252414607,GH +3252414608,3252414623,LT +3252414624,3252414639,TZ +3252414640,3252414655,GH +3252414656,3252414719,ER +3252414720,3252414975,LT +3252414976,3252415231,NG +3252415232,3252415487,LT +3252415488,3252415503,SD +3252415504,3252415519,LT +3252415520,3252415535,NG +3252415536,3252415551,LT +3252415552,3252415567,NG +3252415568,3252415679,LT +3252415680,3252415743,SO +3252415744,3252415775,GB +3252415776,3252415967,LT +3252415968,3252415999,CM +3252416000,3252416255,BW +3252416256,3252416511,LT +3252416512,3252416767,GN +3252416768,3252416799,CD +3252416800,3252416831,LT +3252416832,3252416927,GN +3252416928,3252416959,LT +3252416960,3252417023,GN +3252417024,3252417535,SO +3252417536,3252417855,NG +3252417856,3252417919,LT +3252417920,3252417935,MW +3252417936,3252418047,LT +3252418048,3252418079,IQ +3252418080,3252418239,LT +3252418240,3252418303,JO +3252418304,3252418367,NG +3252418368,3252418815,LT +3252418816,3252418847,KE +3252418848,3252419071,LT +3252419072,3252419087,ZM +3252419088,3252419103,LT +3252419104,3252419119,SL +3252419120,3252419127,GH +3252419128,3252419135,LT +3252419136,3252419167,SL +3252419168,3252419199,CD +3252419200,3252419215,GH +3252419216,3252419247,GN +3252419248,3252419263,SN +3252419264,3252419279,TZ +3252419280,3252419311,SN +3252419312,3252419327,ZM +3252419328,3252419343,GH +3252419344,3252419359,LT +3252419360,3252419423,GH +3252419424,3252419583,LT +3252419584,3252419775,IQ +3252419776,3252419839,LT +3252419840,3252420111,IQ +3252420112,3252420119,GB +3252420120,3252420231,IQ +3252420232,3252420239,LT +3252420240,3252420255,IQ +3252420256,3252420263,LT +3252420264,3252420279,IQ +3252420280,3252420287,LT +3252420288,3252420415,IQ +3252420416,3252420431,GB +3252420432,3252420447,IQ +3252420448,3252420455,LT +3252420456,3252420463,IQ +3252420464,3252420479,LT +3252420480,3252420607,IQ +3252420608,3252421119,LT +3252421120,3252424703,NO +3252424704,3252424719,GN +3252424720,3252424735,LT +3252424736,3252424767,MA +3252424768,3252424799,LT +3252424800,3252424815,NE +3252424816,3252424831,CD +3252424832,3252424959,LT +3252424960,3252424967,KE +3252424968,3252425023,LT +3252425024,3252425215,SO +3252425216,3252425343,TD +3252425344,3252425471,LT +3252425472,3252425551,AO +3252425552,3252425599,LT +3252425600,3252425631,AF +3252425632,3252425727,LT +3252425728,3252425855,ZM +3252425856,3252426751,LT +3252426752,3252427263,MZ +3252427264,3252427519,NG +3252427520,3252427775,LT +3252427776,3252428287,MW +3252428288,3252428351,NG +3252428352,3252428383,AO +3252428384,3252428415,LT +3252428416,3252428447,KE +3252428448,3252428543,LT +3252428544,3252428671,CG +3252428672,3252428863,LT +3252428864,3252428879,IQ +3252428880,3252429247,LT +3252429248,3252429263,IQ +3252429264,3252429823,LT +3252429824,3252429951,NE +3252429952,3252430079,LT +3252430080,3252430335,BJ +3252430336,3252430463,NE +3252430464,3252430519,LT +3252430520,3252430535,BF +3252430536,3252430543,LT +3252430544,3252430559,BJ +3252430560,3252430591,BF +3252430592,3252430847,GN +3252430848,3252431359,MW +3252431360,3252431871,NG +3252431872,3252432127,SO +3252432128,3252432383,LR +3252432384,3252432399,MW +3252432400,3252432447,LT +3252432448,3252432463,MW +3252432464,3252432511,LT +3252432512,3252432527,MW +3252432528,3252432575,LT +3252432576,3252432591,MW +3252432592,3252432895,LT +3252432896,3252433407,SO +3252433408,3252433663,NG +3252433664,3252433919,SO +3252433920,3252434175,MZ +3252434176,3252434687,LT +3252434688,3252434703,GH +3252434704,3252434711,TZ +3252434712,3252435199,LT +3252435200,3252435263,TZ +3252435264,3252435295,LT +3252435296,3252435311,TZ +3252435312,3252435319,MG +3252435320,3252435327,MZ +3252435328,3252435343,CD +3252435344,3252435359,BF +3252435360,3252435375,CD +3252435376,3252435391,GN +3252435392,3252435439,LT +3252435440,3252435455,GN +3252435456,3252435711,TZ +3252435712,3252435887,GH +3252435888,3252435919,BW +3252435920,3252435935,BF +3252435936,3252435967,CF +3252435968,3252436223,TZ +3252436224,3252436239,GN +3252436240,3252436255,NA +3252436256,3252436271,ML +3252436272,3252436287,BF +3252436288,3252436319,ZM +3252436320,3252436335,GH +3252436336,3252436351,ZM +3252436352,3252436383,GN +3252436384,3252436399,ZM +3252436400,3252436431,TZ +3252436432,3252436447,LT +3252436448,3252436479,ER +3252436480,3252436735,NG +3252436736,3252436991,LT +3252436992,3252437247,NG +3252437248,3252437759,LT +3252437760,3252438015,ZM +3252438016,3252438271,TR +3252438272,3252438527,MD +3252438528,3252438783,CM +3252438784,3252439039,LT +3252439040,3252439055,BJ +3252439056,3252439071,LT +3252439072,3252439079,BJ +3252439080,3252439287,LT +3252439288,3252439295,SN +3252439296,3252439391,SO +3252439392,3252439807,LT +3252439808,3252439871,SO +3252439872,3252440063,LT +3252440064,3252440319,MW +3252440320,3252440383,NG +3252440384,3252440575,LT +3252440576,3252441087,NG +3252441088,3252441599,TZ +3252441600,3252442111,LT +3252442112,3252442143,TZ +3252442144,3252442175,LT +3252442176,3252442191,TZ +3252442192,3252442623,LT +3252442624,3252442751,TZ +3252442752,3252442783,LT +3252442784,3252442815,TZ +3252442816,3252442831,LT +3252442832,3252442863,TZ +3252442864,3252442879,LT +3252442880,3252443135,TZ +3252443136,3252443327,LT +3252443328,3252443903,TZ +3252443904,3252444191,LT +3252444192,3252444927,TZ +3252444928,3252445183,LT +3252445184,3252445263,GN +3252445264,3252445695,LT +3252445696,3252446207,NG +3252446208,3252446703,LT +3252446704,3252446719,NO +3252446720,3252447231,LT +3252447232,3252448255,NO +3252448256,3252448511,SE +3252448512,3252448767,NO +3252448768,3252449279,SE +3252449280,3252449535,CN +3252449536,3252449615,CH +3252449616,3252449623,DK +3252449624,3252449791,LT +3252449792,3252450047,CH +3252450048,3252450303,LT +3252450304,3252450815,NO +3252450816,3252450823,ET +3252450824,3252450879,LT +3252450880,3252450911,NO +3252450912,3252451071,LT +3252451072,3252451327,CH +3252451328,3252451583,DK +3252451584,3252451839,LT +3252451840,3252451855,NO +3252451856,3252451967,LT +3252451968,3252451999,NO +3252452000,3252452095,LT +3252452096,3252452127,NO +3252452128,3252452135,LT +3252452136,3252452143,NO +3252452144,3252452159,LT +3252452160,3252452175,NL +3252452176,3252452191,NO +3252452192,3252452215,NL +3252452216,3252452223,NO +3252452224,3252452227,NL +3252452228,3252452231,LT +3252452232,3252452239,NL +3252452240,3252452271,LT +3252452272,3252452415,NO +3252452416,3252452479,LT +3252452480,3252452487,KE +3252452488,3252452495,MW +3252452496,3252452503,ZM +3252452504,3252452607,LT +3252452608,3252452735,TD +3252452736,3252452863,LT +3252452864,3252452879,TZ +3252452880,3252453119,LT +3252453120,3252453151,NG +3252453152,3252453375,LT +3252453376,3252454527,NO +3252454528,3252454655,LT +3252454656,3252454911,IQ +3252454912,3252455167,GB +3252455168,3252455295,NG +3252455296,3252455679,LT +3252455680,3252455807,BI +3252455808,3252455935,LT +3252455936,3252456191,MW +3252456192,3252456447,LT +3252456448,3252456703,NG +3252456704,3252456959,LT +3252456960,3252457471,NG +3252457472,3252459519,LT +3252459520,3252465663,NO +3252465664,3252465919,GH +3252465920,3252465951,LT +3252465952,3252465983,GH +3252465984,3252466047,LT +3252466048,3252466175,GH +3252466176,3252466431,UG +3252466432,3252466687,LT +3252466688,3252467199,NE +3252467200,3252467455,LT +3252467456,3252467967,CG +3252467968,3252468223,LT +3252468224,3252468231,CM +3252468232,3252468239,LT +3252468240,3252468479,CM +3252468480,3252468735,CG +3252468736,3252469247,ZM +3252469248,3252471807,LT +3252471808,3252472831,NG +3252472832,3252473343,LT +3252473344,3252473855,CD +3252473856,3252474879,SO +3252474880,3252475407,NG +3252475408,3252475903,LT +3252475904,3252476415,BW +3252476416,3252476671,LT +3252476672,3252476799,NG +3252476800,3252476927,LT +3252476928,3252477183,GW +3252477184,3252477311,NG +3252477312,3252477951,LT +3252477952,3252478463,KE +3252478464,3252479039,LT +3252479040,3252479047,KE +3252479048,3252479055,LT +3252479056,3252479063,KE +3252479064,3252479087,LT +3252479088,3252479103,KE +3252479104,3252479143,LT +3252479144,3252479151,NO +3252479152,3252479359,LT +3252479360,3252479375,KE +3252479376,3252479487,LT +3252479488,3252479743,KE +3252479744,3252479999,LT +3252480000,3252480255,KE +3252480256,3252480511,LT +3252480512,3252480895,CG +3252480896,3252481023,LT +3252481024,3252481535,MZ +3252481536,3252482047,LT +3252482048,3252483071,GW +3252483072,3252483583,KW +3252483584,3252484095,LT +3252484096,3252486143,KW +3252486144,3252490239,BE +3252490240,3252495871,SE +3252495872,3252496127,HU +3252496128,3252505343,SE +3252505344,3252505855,US +3252505856,3252507135,SE +3252507648,3252509951,GB +3252509952,3252510719,CH +3252510720,3252514815,FR +3252514816,3252515071,SI +3252515072,3252515327,GB +3252515328,3252515583,DE +3252515584,3252515839,SI +3252515840,3252516095,CH +3252516096,3252516351,FR +3252516352,3252516607,GB +3252516608,3252516863,SE +3252516864,3252517119,FR +3252517120,3252517375,DE +3252517376,3252517631,PL +3252517632,3252517887,BE +3252517888,3252518143,DK +3252518144,3252518399,NL +3252518400,3252518655,PL +3252518656,3252518911,DE +3252518912,3252527103,NL +3252527104,3252535295,BE +3252535296,3252539391,GB +3252540416,3252541951,NL +3252541952,3252542207,CI +3252542208,3252551679,BE +3252551680,3252563967,CH +3252566784,3252567295,CH +3252567296,3252567551,GB +3252567552,3252567807,ES +3252567808,3252568063,RO +3252568064,3252579327,CH +3252579328,3252579583,FR +3252579584,3252579839,RU +3252579840,3252580095,SE +3252580096,3252580351,UA +3252580352,3252584447,LI +3252584448,3252584703,FR +3252584704,3252584959,IL +3252584960,3252585215,CZ +3252585216,3252585471,PL +3252585472,3252585727,NL +3252585728,3252585983,FI +3252585984,3252586239,FR +3252586240,3252586495,PL +3252586496,3252586751,IT +3252586752,3252587007,NL +3252587008,3252587263,CH +3252587264,3252587519,AT +3252587520,3252587775,UA +3252587776,3252588031,SE +3252588032,3252600319,CH +3252600320,3252600831,RU +3252600832,3252616703,CH +3252616704,3252616959,ES +3252616960,3252617215,CH +3252617216,3252617471,PL +3252617472,3252636671,CH +3252636672,3252636927,TR +3252636928,3252637183,DE +3252637184,3252637695,GB +3252637696,3252642303,CH +3252642304,3252642559,UA +3252642560,3252642815,DK +3252642816,3252643071,NL +3252643072,3252643327,RO +3252643328,3252643583,CH +3252643584,3252643839,AT +3252643840,3252645631,CH +3252645888,3252682751,CH +3252682752,3252813823,HU +3252813824,3252830207,RO +3252830208,3252832255,MD +3252832256,3252832767,RO +3252832768,3252834303,MD +3252834304,3252862975,RO +3252862976,3252879359,HU +3252879360,3252895743,EG +3252895744,3252903935,IT +3252903936,3252904447,UA +3252904448,3252904703,RU +3252904704,3252904959,DE +3252904960,3252905215,PL +3252905216,3252905471,CH +3252905472,3252905727,LT +3252905728,3252905983,BE +3252905984,3252906239,IT +3252906240,3252906495,PL +3252906496,3252906751,GB +3252906752,3252907007,FR +3252907008,3252907263,AT +3252907264,3252907775,RO +3252907776,3252908031,GB +3252908032,3252908287,PL +3252908288,3252908543,AT +3252908544,3252908799,MT +3252908800,3252909055,UA +3252909056,3252909311,PL +3252909312,3252909567,DE +3252909568,3252909823,GB +3252909824,3252910335,UA +3252910336,3252910591,NL +3252910592,3252910847,CH +3252910848,3252911103,PL +3252911104,3252911359,DE +3252911360,3252911615,RU +3252911616,3252911871,SE +3252911872,3252912127,SA +3252912128,3252912383,EG +3252912384,3252912639,HU +3252912640,3252912895,FR +3252912896,3252913151,PL +3252913152,3252913407,ES +3252913408,3252913663,FR +3252913664,3252913919,NL +3252913920,3252914175,NO +3252914176,3252916223,FR +3252916224,3252920319,DE +3252920320,3252928511,LB +3252928512,3252929535,DE +3252929536,3252930559,HU +3252930560,3252931071,GB +3252931072,3252931583,DE +3252931584,3252932095,NO +3252932096,3252933631,UA +3252933632,3252934655,IT +3252934656,3252936703,PL +3252936704,3252937215,CH +3252937728,3252938239,FR +3252938240,3252938751,UA +3252938752,3252939263,RU +3252939776,3252940287,RO +3252940288,3252940799,PT +3252940800,3252941311,RU +3252941312,3252941823,RO +3252941824,3252942847,GB +3252942848,3252943359,FR +3252943360,3252943871,UA +3252943872,3252944383,RU +3252944384,3252944895,DE +3252944896,3252945151,AT +3252945152,3252945407,GB +3252945408,3252945663,UA +3252945664,3252980735,AT +3252980736,3252980991,PL +3252980992,3252981247,GB +3252981248,3252981503,RU +3252981504,3252981759,SE +3252981760,3252982015,DE +3252982016,3252982271,RO +3252982272,3252982527,DE +3252982528,3252982783,FR +3252982784,3252983039,UA +3252983040,3252983551,DE +3252983552,3252983807,SI +3252983808,3252984063,BG +3252984064,3252984319,RO +3252984320,3252984575,AT +3252984576,3252984831,GB +3252984832,3252985087,FR +3252985088,3252985343,SE +3252985344,3252985599,AT +3252985600,3252985855,RU +3252985856,3252989439,AT +3252989440,3252989695,PL +3252989696,3253004799,AT +3253004800,3253005055,CZ +3253005056,3253010431,AT +3253010432,3253075967,FI +3253075968,3253207039,RO +3253207040,3253223679,RU +3253223680,3253223935,UA +3253223936,3253230591,RU +3253230592,3253230847,BY +3253230848,3253247999,RU +3253248000,3253248255,DE +3253248256,3253248511,UZ +3253248512,3253264383,RU +3253264384,3253264895,KZ +3253264896,3253265407,RU +3253265408,3253265919,AM +3253265920,3253270527,RU +3253270528,3253271551,BY +3253271552,3253338111,RU +3253338112,3253469183,SE +3253469184,3253471231,AO +3253471232,3253534719,PT +3253534720,3253600255,GB +3253600256,3253601279,RO +3253601280,3253602303,FI +3253602304,3253603327,DE +3253603328,3253605375,PL +3253605376,3253606399,UA +3253606400,3253607423,NL +3253607424,3253608447,NG +3253608448,3253609471,UA +3253610496,3253611519,PL +3253611520,3253612543,UA +3253612544,3253613567,RU +3253613568,3253614591,ES +3253614592,3253615615,RO +3253615616,3253616639,DE +3253616640,3253617663,PL +3253617664,3253618687,GB +3253618688,3253619711,PL +3253619712,3253620735,IT +3253620736,3253622783,GB +3253622784,3253623807,DE +3253623808,3253624831,PL +3253624832,3253625855,UA +3253625856,3253626879,IT +3253626880,3253627903,DE +3253627904,3253628927,UA +3253628928,3253629951,GR +3253629952,3253630975,UA +3253630976,3253631999,RU +3253632000,3253633023,DE +3253633024,3253635071,RU +3253635072,3253636095,IT +3253636096,3253637119,CH +3253637120,3253638143,ES +3253638144,3253639167,FR +3253639168,3253640191,UA +3253640192,3253641215,AT +3253641216,3253642239,NL +3253642240,3253643263,GB +3253643264,3253645311,PL +3253645312,3253646335,RU +3253646336,3253647359,PL +3253647360,3253648383,DK +3253648384,3253649407,IL +3253649408,3253650431,UA +3253650432,3253651455,DE +3253651456,3253652479,PL +3253652480,3253653503,LI +3253653504,3253654527,IL +3253654528,3253657599,LV +3253657600,3253658623,UA +3253658624,3253659647,FR +3253659648,3253660671,GB +3253660672,3253661695,NO +3253661696,3253662719,NL +3253662720,3253663743,RO +3253663744,3253664767,NL +3253664768,3253665791,DE +3253665792,3253666815,CZ +3253666816,3253667839,NL +3253667840,3253668863,GB +3253668864,3253669887,ES +3253669888,3253670911,DE +3253670912,3253671935,CH +3253671936,3253672959,UA +3253672960,3253673983,DE +3253673984,3253675007,GB +3253675008,3253676031,PL +3253676032,3253677055,AT +3253677056,3253678079,PL +3253678080,3253679103,DK +3253679104,3253680127,IT +3253680128,3253682175,PL +3253682176,3253683199,RO +3253683200,3253685247,UA +3253685248,3253686271,FR +3253686272,3253687295,PL +3253687296,3253688319,UA +3253688320,3253690367,NL +3253690368,3253691391,DK +3253691392,3253692415,PL +3253692416,3253693439,DE +3253693440,3253694463,IL +3253694464,3253695487,GB +3253695488,3253696511,NL +3253696512,3253697535,FR +3253697536,3253698559,PL +3253698560,3253699071,UA +3253699072,3253699583,RO +3253699584,3253700095,UA +3253700096,3253700607,RO +3253700608,3253701119,PL +3253701120,3253702143,RO +3253702144,3253702655,UA +3253702656,3253703679,RO +3253703680,3253704191,HU +3253704192,3253704703,RU +3253704704,3253705215,UA +3253705216,3253705727,NO +3253705728,3253706239,DE +3253706240,3253706751,RO +3253706752,3253707263,GB +3253707264,3253707775,FR +3253707776,3253708287,DE +3253708288,3253708799,RO +3253708800,3253709311,DK +3253709312,3253709823,UA +3253709824,3253710335,RO +3253710336,3253710847,GB +3253710848,3253711359,DK +3253711360,3253712383,UA +3253712384,3253712895,MD +3253712896,3253713407,GR +3253713408,3253713919,NL +3253713920,3253714431,AT +3253714432,3253714943,RO +3253714944,3253715455,FR +3253715456,3253715967,RO +3253715968,3253716479,DE +3253716480,3253716991,FR +3253716992,3253717503,CH +3253717504,3253718015,NL +3253718016,3253719551,PL +3253719552,3253720063,BE +3253720064,3253720575,RO +3253720576,3253721087,GR +3253721088,3253721599,UA +3253721600,3253722111,RO +3253722112,3253722623,CH +3253722624,3253723135,NL +3253723136,3253723647,PL +3253723648,3253724159,AT +3253724160,3253724671,UA +3253724672,3253725695,RO +3253725696,3253726207,UA +3253726208,3253726719,RO +3253726720,3253727231,UA +3253727232,3253727743,FR +3253727744,3253728255,RU +3253728256,3253728767,PL +3253728768,3253729279,RO +3253729280,3253729791,AT +3253729792,3253730303,UA +3253730304,3253730815,RO +3253730816,3253731327,UA +3253731328,3253796863,GB +3253796864,3253862399,SE +3253862400,3253862655,GB +3253862656,3253882879,FR +3253882880,3253886975,NL +3253886976,3253887231,GB +3253887232,3253887487,NL +3253887488,3253887743,ES +3253887744,3253887999,GB +3253888000,3253888255,PL +3253888256,3253888511,BE +3253888512,3253888767,GB +3253888768,3253889023,SE +3253889024,3253889279,PL +3253889280,3253889535,CH +3253889536,3253889791,DE +3253889792,3253890047,DK +3253890048,3253890303,NL +3253890304,3253890559,SE +3253890560,3253890815,GB +3253890816,3253891071,IE +3253891072,3253891327,DE +3253891328,3253891583,GB +3253891584,3253891839,UA +3253891840,3253892351,GB +3253892352,3253892607,NL +3253892608,3253892863,AT +3253892864,3253893119,NL +3253893120,3253893375,RO +3253893376,3253893631,DE +3253893632,3253893887,SE +3253893888,3253894143,RU +3253894144,3253894399,PT +3253894400,3253894655,NL +3253894656,3253894911,FI +3253894912,3253895167,RU +3253895168,3253911551,BE +3253911552,3253919743,FR +3253919744,3253923839,GB +3253923840,3253927935,GR +3253927936,3253961727,GB +3253961728,3253962239,MD +3253962240,3253962751,SE +3253962752,3253963263,BE +3253963264,3253963775,RU +3253963776,3253964287,SI +3253964288,3253964799,PL +3253964800,3253965311,SE +3253965312,3253966335,PL +3253966336,3253966847,DE +3253966848,3253967359,UA +3253967360,3253967871,GR +3253967872,3253968895,UA +3253968896,3253969407,DE +3253969408,3253969919,AT +3253969920,3253970431,NL +3253970432,3253970687,DE +3253970688,3253970943,HU +3253970944,3253972991,DK +3253972992,3253974783,GB +3253974784,3253974847,NO +3253974848,3253974911,SE +3253974912,3253974975,IL +3253974976,3253975039,SE +3253975040,3253977087,DE +3253977088,3253985279,TR +3253985280,3253993471,GB +3253993472,3254067199,BE +3254067200,3254069247,CZ +3254069248,3254124543,BE +3254124544,3254156799,CH +3254156800,3254157055,LI +3254157056,3254177279,CH +3254177280,3254177535,LI +3254177536,3254255615,CH +3254255616,3254485503,FR +3254485504,3254485799,CI +3254485800,3254485807,FR +3254485808,3254485819,CI +3254485820,3254485820,FR +3254485821,3254485821,CI +3254485822,3254485822,FR +3254485823,3254485855,CI +3254485856,3254485859,FR +3254485860,3254485887,CI +3254485888,3254486527,FR +3254486528,3254486543,CH +3254486544,3254486559,US +3254486560,3254486591,GB +3254486592,3254486655,FR +3254486656,3254486671,CH +3254486672,3254486687,FR +3254486688,3254486719,CH +3254486720,3254486735,FR +3254486736,3254486767,US +3254486768,3254486783,HK +3254486784,3254487039,FR +3254487040,3254487199,KM +3254487200,3254487263,FR +3254487264,3254487295,KM +3254487296,3254487419,CF +3254487420,3254487551,FR +3254487552,3254487803,CI +3254487804,3254487807,FR +3254487808,3254487855,LB +3254487856,3254487863,FR +3254487864,3254488063,LB +3254488064,3254488447,MG +3254488448,3254488450,FR +3254488451,3254488515,MG +3254488516,3254488516,FR +3254488517,3254488518,MG +3254488519,3254488521,FR +3254488522,3254488548,MG +3254488549,3254488550,FR +3254488551,3254488831,MG +3254488832,3254489087,DJ +3254489088,3254489343,DZ +3254489344,3254489365,FR +3254489366,3254489367,MR +3254489368,3254489369,FR +3254489370,3254489370,MR +3254489371,3254489373,FR +3254489374,3254489375,MR +3254489376,3254489407,FR +3254489408,3254489439,MR +3254489440,3254489443,FR +3254489444,3254489455,MR +3254489456,3254489463,FR +3254489464,3254489519,MR +3254489520,3254489535,FR +3254489536,3254489567,MR +3254489568,3254489599,FR +3254489600,3254489855,MR +3254489856,3254490111,TD +3254490112,3254490367,FR +3254490368,3254490623,CF +3254490624,3254491135,FR +3254491136,3254491391,DZ +3254491392,3254491607,GQ +3254491608,3254491615,FR +3254491616,3254491647,GQ +3254491648,3254491903,FR +3254491904,3254492031,CM +3254492032,3254492159,FR +3254492160,3254492671,LB +3254492672,3254492927,FR +3254492928,3254493183,CI +3254493184,3254493323,GP +3254493324,3254493327,FR +3254493328,3254493335,GP +3254493336,3254493343,FR +3254493344,3254493439,GP +3254493440,3254493695,CI +3254493696,3254494527,GP +3254494528,3254494719,FR +3254494720,3254494735,LB +3254494736,3254494743,FR +3254494744,3254494803,LB +3254494804,3254494807,FR +3254494808,3254494975,LB +3254494976,3254495087,DJ +3254495088,3254495231,FR +3254495232,3254495487,CI +3254495488,3254495743,DZ +3254495744,3254496255,LB +3254496256,3254496511,FR +3254496512,3254496527,CI +3254496528,3254496767,FR +3254496768,3254497247,DZ +3254497248,3254508031,FR +3254508032,3254508543,GQ +3254508544,3254508799,NE +3254508800,3254508831,MQ +3254508832,3254509055,FR +3254509056,3254509567,GQ +3254509568,3254509783,DJ +3254509784,3254510339,FR +3254510340,3254510359,NE +3254510360,3254510375,FR +3254510376,3254510407,NE +3254510408,3254510420,FR +3254510421,3254510421,NE +3254510422,3254510431,FR +3254510432,3254510432,NE +3254510433,3254510440,FR +3254510441,3254510441,NE +3254510442,3254510443,FR +3254510444,3254510451,NE +3254510452,3254510455,FR +3254510456,3254510519,NE +3254510520,3254510527,FR +3254510528,3254510559,NE +3254510560,3254510563,FR +3254510564,3254510847,NE +3254510848,3254521855,FR +3254521856,3254522367,GB +3254522368,3254550527,FR +3254550528,3254550783,US +3254550784,3254551039,IR +3254551040,3254551295,US +3254551296,3254551551,IR +3254551552,3254551807,US +3254551808,3254552063,FR +3254552064,3254552319,US +3254552320,3254552831,IR +3254552832,3254553087,HK +3254553088,3254553343,FR +3254553344,3254553599,HK +3254553600,3254554879,FR +3254554880,3254555135,HK +3254555136,3254555391,FR +3254555392,3254555647,HK +3254555648,3254557439,FR +3254557440,3254557695,AT +3254557696,3254576383,FR +3254576384,3254576543,DO +3254576544,3254583296,FR +3254583297,3254583300,SG +3254583301,3254583302,US +3254583303,3254583551,FR +3254583552,3254583567,SG +3254583568,3254583583,US +3254583584,3254623743,FR +3254623744,3254624255,US +3254624256,3254648831,FR +3254648832,3254648895,DK +3254648896,3254649087,GB +3254649088,3254649855,AL +3254649856,3254650879,SE +3254650880,3254653439,CH +3254653440,3254654847,DE +3254654848,3254654975,DK +3254654976,3254655743,IT +3254655744,3254656255,GB +3254656256,3254656511,BG +3254656512,3254656767,DE +3254656768,3254657023,GB +3254657024,3254665215,RO +3254676480,3254676735,DE +3254681600,3254697983,DE +3254697984,3254698495,SE +3254698496,3254699007,GB +3254699008,3254699519,UA +3254699520,3254700031,US +3254700032,3254700543,GR +3254700544,3254701055,DE +3254701056,3254701567,RU +3254701568,3254702079,IL +3254702080,3254702591,RU +3254702592,3254703103,GB +3254703104,3254703615,DE +3254703616,3254704127,NL +3254704128,3254705663,UA +3254705664,3254706175,GR +3254706176,3254707199,UA +3254707200,3254707711,TR +3254707712,3254708223,RO +3254708224,3254709247,UA +3254709248,3254710271,DE +3254710272,3254710783,IT +3254710784,3254711295,RO +3254711296,3254711807,FR +3254712320,3254712831,RU +3254712832,3254713343,KZ +3254713344,3254713855,TR +3254713856,3254714367,NL +3254714368,3254779903,TR +3254779904,3254780159,DE +3254780160,3254780671,GB +3254780672,3254780927,LT +3254780928,3254781183,GR +3254781184,3254781439,NL +3254781440,3254781951,BE +3254781952,3254782207,LV +3254796288,3254797311,SE +3254797312,3254798335,RU +3254798336,3254799359,AT +3254799360,3254800383,IE +3254800384,3254801407,FI +3254801408,3254802431,HR +3254802432,3254803455,UA +3254803456,3254804479,DE +3254804480,3254806527,PL +3254806528,3254807551,UA +3254807552,3254808575,KZ +3254808576,3254809599,PL +3254809600,3254810623,UA +3254810624,3254811647,RU +3254811648,3254812671,RO +3254812672,3254812927,PL +3254812928,3254813183,RO +3254813184,3254813439,TR +3254813440,3254813695,UA +3254813696,3254813951,DK +3254813952,3254814207,IT +3254814208,3254814463,SE +3254814464,3254814719,DE +3254814720,3254814975,RU +3254814976,3254815231,CH +3254815232,3254815487,UA +3254815488,3254815743,GB +3254815744,3254815999,IT +3254816000,3254816255,RU +3254816256,3254816511,TR +3254816512,3254816767,DE +3254816768,3254817279,RU +3254817280,3254817535,CY +3254817536,3254817791,GB +3254817792,3254818047,UA +3254818048,3254818303,DE +3254818304,3254818559,UA +3254818560,3254818815,DE +3254818816,3254819327,FR +3254819328,3254819583,PL +3254819584,3254819839,DK +3254819840,3254820095,GB +3254820096,3254820351,UA +3254820352,3254820863,GB +3254820864,3254821119,LT +3254821120,3254821375,DK +3254821376,3254821631,RU +3254821632,3254821887,DE +3254821888,3254822143,HU +3254822144,3254822399,DE +3254822400,3254822655,FR +3254822656,3254822911,PL +3254822912,3254823167,CH +3254823168,3254823423,NO +3254823424,3254823679,NL +3254823680,3254823935,PL +3254823936,3254824191,CH +3254824192,3254824959,BE +3254824960,3254825215,FR +3254825216,3254825471,RO +3254825472,3254825727,TR +3254825728,3254825983,FR +3254825984,3254826239,DE +3254826240,3254826495,PL +3254826496,3254827263,DE +3254827264,3254827519,GR +3254827520,3254827775,PL +3254827776,3254828031,UA +3254828032,3254828287,DE +3254828288,3254828799,RO +3254828800,3254829055,BE +3254829056,3254829311,NO +3254829312,3254829567,GB +3254829568,3254829823,NL +3254829824,3254830079,FR +3254830080,3254830335,IE +3254830336,3254830591,NL +3254830592,3254830847,CH +3254830848,3254831103,PL +3254831104,3254831359,UA +3254831360,3254831615,DE +3254831616,3254831871,TR +3254831872,3254832127,LT +3254832128,3254832383,RO +3254832384,3254832639,BE +3254832640,3254832895,UA +3254832896,3254833151,LV +3254833152,3254833407,DE +3254833408,3254833663,RU +3254833664,3254833919,GB +3254833920,3254834175,PL +3254834176,3254834687,CH +3254834688,3254834943,GB +3254834944,3254835199,NO +3254835200,3254835455,DE +3254835456,3254835711,SE +3254835712,3254835967,UA +3254835968,3254836223,GB +3254836224,3254836479,PL +3254836480,3254836735,DE +3254836736,3254836991,AT +3254836992,3254837247,GB +3254837248,3254837503,HR +3254837504,3254837759,RU +3254837760,3254838015,IE +3254838016,3254838271,GE +3254838272,3254838527,DE +3254838528,3254838783,CH +3254838784,3254839039,AT +3254839040,3254839295,RU +3254839296,3254839551,DE +3254839552,3254839807,PL +3254839808,3254840063,BE +3254840064,3254840319,BG +3254840320,3254840575,DK +3254840576,3254840831,UA +3254840832,3254841343,GB +3254841600,3254841855,IE +3254841856,3254842111,LV +3254842112,3254842367,GB +3254842368,3254842623,PL +3254842624,3254842879,RU +3254842880,3254843135,SE +3254843136,3254843647,DE +3254843648,3254843903,FR +3254843904,3254844159,NL +3254844160,3254844415,PL +3254844416,3254844671,GB +3254844672,3254844927,RO +3254844928,3254845183,DE +3254845184,3254845439,FR +3254845440,3254882303,SK +3254882304,3254882559,PL +3254882560,3254882815,IL +3254882816,3254883071,PL +3254883072,3254883583,GB +3254883584,3254883839,AL +3254883840,3254884351,GB +3254884352,3254884607,RU +3254884608,3254884863,PL +3254884864,3254885119,SE +3254885120,3254885375,DE +3254885632,3254886143,SK +3254886400,3254886655,IT +3254886656,3254886911,RU +3254886912,3254887423,CH +3254887424,3254888191,GB +3254888192,3254888447,RO +3254888704,3254888959,SK +3254889472,3254890495,SK +3254890496,3254890751,DE +3254890752,3254891007,UA +3254891008,3254891519,RO +3254891520,3254891775,GB +3254891776,3254892031,DE +3254892032,3254892287,GB +3254892800,3254893567,SK +3254894080,3254894591,SK +3254894592,3254894847,DK +3254894848,3254895103,UA +3254895104,3254895359,GB +3254895360,3254895615,UA +3254895616,3254895871,DK +3254895872,3254896127,SE +3254896128,3254896383,RU +3254896384,3254896639,PL +3254896640,3254896895,DK +3254896896,3254897151,PL +3254897152,3254897407,DE +3254897408,3254897663,FR +3254897664,3254897919,NL +3254897920,3254898175,BE +3254898176,3254898431,AT +3254898432,3254898687,DE +3254898688,3254898943,IT +3254898944,3254899199,EE +3254899200,3254899455,GB +3254899456,3254899711,SE +3254899712,3254899967,SK +3254900480,3254900991,SK +3254901248,3254901503,SK +3254901760,3254904831,SK +3254907904,3254908159,SK +3254908416,3254908671,SK +3254910720,3254910975,SK +3254910976,3254926279,FR +3254926280,3254926287,GB +3254926288,3254937999,FR +3254938000,3254938007,GB +3254938008,3254994734,FR +3254994735,3254994735,BE +3254994736,3255017648,FR +3255017649,3255017649,LB +3255017650,3255120639,FR +3255120640,3255120895,DE +3255120896,3255123711,FR +3255123712,3255123967,DE +3255123968,3255125759,FR +3255126016,3255172351,FR +3255172352,3255172607,DE +3255172608,3255173119,FR +3255173120,3255173631,GB +3255173648,3255173711,GB +3255173760,3255173823,GB +3255173840,3255174151,GB +3255174160,3255174167,GB +3255174200,3255174207,GB +3255174216,3255174247,GB +3255174272,3255174279,GB +3255174312,3255174319,GB +3255174328,3255174335,GB +3255174376,3255174383,GB +3255174400,3255175167,GB +3255175200,3255175231,GB +3255175248,3255175263,GB +3255175280,3255175295,GB +3255175312,3255175327,GB +3255175432,3255175447,GB +3255175456,3255175503,GB +3255175512,3255175535,GB +3255175552,3255175559,GB +3255175592,3255175607,GB +3255175680,3255175935,GB +3255176192,3255177215,GB +3255177472,3255177855,GB +3255177984,3255187199,GB +3255187200,3255187455,DE +3255187456,3255187711,GB +3255188480,3255191807,GB +3255192320,3255193863,GB +3255193888,3255193959,GB +3255193968,3255193975,GB +3255193976,3255193983,GI +3255193984,3255193999,GB +3255194016,3255194039,GB +3255194056,3255194063,GB +3255194072,3255194431,GB +3255194496,3255194559,GB +3255194624,3255194703,GB +3255194720,3255194815,GB +3255194880,3255205887,GB +3255205888,3255214079,FR +3255214080,3255222271,CH +3255222272,3255223295,DE +3255223296,3255224319,UA +3255224320,3255225343,RO +3255225344,3255226367,PL +3255226368,3255227391,DE +3255227392,3255228415,RO +3255228416,3255230463,RU +3255230464,3255230719,MA +3255230720,3255230975,PS +3255230976,3255231231,DE +3255231232,3255231487,BE +3255231488,3255231743,DE +3255231744,3255231999,PT +3255232000,3255232255,RO +3255232256,3255233023,UA +3255233024,3255233279,DE +3255233280,3255233535,GB +3255233536,3255233791,SE +3255233792,3255234047,SI +3255234048,3255234303,NO +3255234304,3255234559,DE +3255234560,3255234815,FR +3255234816,3255235071,PL +3255235072,3255235327,SI +3255235328,3255235583,SE +3255235584,3255235839,GB +3255235840,3255236351,PL +3255236352,3255236607,IT +3255236608,3255236863,GB +3255236864,3255237119,DE +3255237120,3255237375,AT +3255237376,3255237887,SE +3255237888,3255238143,ES +3255238144,3255238399,GB +3255238400,3255238655,QA +3255238656,3255243583,BE +3255243584,3255243591,GB +3255243592,3255243679,BE +3255243680,3255243711,LU +3255243712,3255245599,BE +3255245600,3255245631,LU +3255245632,3255245687,BE +3255245688,3255245695,LU +3255245696,3255246591,BE +3255246592,3255246623,LU +3255246624,3255247455,BE +3255247456,3255247487,LU +3255247488,3255247647,BE +3255247648,3255247663,LU +3255247664,3255248127,BE +3255248128,3255248383,LU +3255248384,3255248735,BE +3255248736,3255248767,LU +3255248768,3255249295,BE +3255249296,3255249311,LU +3255249312,3255249383,BE +3255249384,3255249387,LU +3255249388,3255249935,BE +3255249936,3255249951,LU +3255249952,3255250079,BE +3255250080,3255250111,LU +3255250112,3255252487,BE +3255252488,3255252495,FR +3255252496,3255252559,BE +3255252560,3255252575,LU +3255252576,3255254847,BE +3255254848,3255254879,LU +3255254880,3255255559,BE +3255255560,3255255567,LU +3255255568,3255255599,BE +3255255600,3255255607,LU +3255255608,3255255711,BE +3255255712,3255255743,LU +3255255744,3255255775,BE +3255255776,3255255807,LU +3255255808,3255259199,BE +3255259200,3255259215,LU +3255259216,3255259327,BE +3255259328,3255259359,LU +3255259360,3255259919,BE +3255259920,3255259927,LU +3255259928,3255260095,BE +3255260096,3255260127,LU +3255260128,3255260319,BE +3255260320,3255260335,LU +3255260336,3255260343,BE +3255260344,3255260347,LU +3255260348,3255261519,BE +3255261520,3255261535,LU +3255261536,3255262799,BE +3255262800,3255262815,LU +3255262816,3255263295,BE +3255263296,3255263327,US +3255263328,3255264775,BE +3255264776,3255264783,LU +3255264784,3255270431,BE +3255270432,3255270463,FR +3255270464,3255271359,BE +3255271360,3255271391,LU +3255271392,3255273855,BE +3255273856,3255273887,LU +3255273888,3255274207,BE +3255274208,3255274239,LU +3255274240,3255274335,BE +3255274336,3255274367,LU +3255274368,3255276223,BE +3255276224,3255276255,FR +3255276256,3255278855,BE +3255278856,3255278863,DE +3255278864,3255279087,BE +3255279088,3255279103,LU +3255279104,3255279131,BE +3255279132,3255279135,NL +3255279136,3255279639,BE +3255279640,3255279647,LU +3255279648,3255280047,BE +3255280048,3255280055,LU +3255280056,3255283927,BE +3255283928,3255283931,LU +3255283932,3255284239,BE +3255284240,3255284255,LU +3255284256,3255285535,BE +3255285536,3255285567,LU +3255285568,3255286095,BE +3255286096,3255286103,DK +3255286104,3255286111,LU +3255286112,3255286279,BE +3255286280,3255286287,LU +3255286288,3255288735,BE +3255288736,3255288799,LU +3255288800,3255288831,BE +3255288832,3255289087,LU +3255289088,3255290143,BE +3255290144,3255290175,LU +3255290176,3255290271,BE +3255290272,3255290287,LU +3255290288,3255290351,BE +3255290352,3255290367,LU +3255290368,3255290879,BE +3255290880,3255291391,LU +3255291392,3255291399,BE +3255291400,3255291423,LU +3255291424,3255291615,BE +3255291616,3255291623,LU +3255291624,3255291871,BE +3255291872,3255291887,LU +3255291888,3255291983,BE +3255291984,3255291999,LU +3255292000,3255292311,BE +3255292312,3255292319,LU +3255292320,3255297015,BE +3255297016,3255297023,HU +3255297024,3255300803,BE +3255300804,3255300807,LU +3255300808,3255304191,BE +3255304192,3255304447,DE +3255304448,3255305215,LV +3255305472,3255307775,LV +3255307776,3255308031,PL +3255308032,3255308287,CH +3255308288,3255311359,LV +3255311360,3255311615,GB +3255311616,3255311871,SE +3255311872,3255312127,PT +3255312128,3255312383,SE +3255312384,3255315455,LV +3255315712,3255316223,PL +3255316224,3255316479,RU +3255316480,3255316991,GB +3255316992,3255317247,FR +3255317248,3255317503,UA +3255317504,3255317759,BE +3255317760,3255318015,BG +3255318016,3255318271,GB +3255318272,3255318527,RU +3255318528,3255318783,UA +3255318784,3255319295,DE +3255319296,3255319551,UA +3255319552,3255319807,BG +3255319808,3255320063,AT +3255320064,3255320319,BE +3255320320,3255320575,AT +3255320576,3255321087,UA +3255321088,3255321599,PL +3255321600,3255323135,RU +3255323136,3255323647,GB +3255323648,3255324159,IL +3255324160,3255324671,CH +3255324672,3255325695,RO +3255325696,3255326207,RU +3255326208,3255326719,DE +3255326720,3255327231,IL +3255327232,3255327743,DE +3255327744,3255328255,SE +3255328256,3255328767,SI +3255328768,3255336959,DE +3255336960,3255341055,RU +3255341056,3255343103,UA +3255343104,3255344127,RU +3255344128,3255345151,UA +3255345152,3255353343,RU +3255353344,3255361535,DE +3255361536,3255369727,GB +3255369728,3255370239,CA +3255370240,3255370751,UA +3255370752,3255371263,DE +3255371264,3255371775,BG +3255371776,3255372287,SE +3255372288,3255372799,DE +3255372800,3255373311,MC +3255373312,3255373823,UA +3255373824,3255374335,PL +3255374336,3255374847,RU +3255374848,3255375359,CY +3255375360,3255375871,RO +3255375872,3255376383,PL +3255376384,3255376895,UA +3255376896,3255377407,GB +3255377408,3255377919,KZ +3255377920,3255378431,GB +3255378432,3255378943,CH +3255378944,3255379455,UA +3255379456,3255379967,RU +3255379968,3255380479,GB +3255380480,3255380991,NL +3255380992,3255381503,CH +3255381504,3255382015,PL +3255382016,3255382527,NL +3255382528,3255383039,UA +3255383040,3255383551,PL +3255383552,3255384063,CH +3255384064,3255384575,RO +3255384576,3255385087,AT +3255385088,3255385599,RO +3255385600,3255386111,FR +3255386112,3255386623,KE +3255386624,3255387135,PL +3255387136,3255388159,UA +3255388160,3255388671,DE +3255388672,3255389183,SE +3255389184,3255389695,GB +3255389696,3255390207,PL +3255390208,3255390719,GB +3255390720,3255391231,KE +3255391232,3255391743,NL +3255391744,3255392767,DE +3255392768,3255393791,RO +3255393792,3255394303,SE +3255394304,3255399679,DK +3255399680,3255400447,DE +3255400448,3255401471,CH +3255401472,3255412479,DE +3255412480,3255412735,RO +3255412736,3255413247,DE +3255413248,3255413759,LV +3255413760,3255414271,GB +3255414272,3255414527,TR +3255414528,3255414783,LV +3255414784,3255415807,BE +3255415808,3255416319,AT +3255416320,3255416831,DE +3255416832,3255417855,FR +3255417856,3255418879,GB +3255418880,3255422975,DE +3255422976,3255426047,GB +3255426048,3255426559,IT +3255426560,3255426815,FR +3255426816,3255427071,PL +3255431168,3255436543,GB +3255436544,3255436799,NL +3255436800,3255437055,DE +3255437056,3255437311,GB +3255446528,3255446783,GB +3255449600,3255450111,BE +3255450112,3255450367,GB +3255450368,3255450623,FR +3255450624,3255451135,DE +3255451136,3255452671,FR +3255468032,3255468543,GB +3255469056,3255469567,GB +3255469568,3255469823,DE +3255469824,3255470079,DK +3255470080,3255470591,AT +3255470592,3255470847,DE +3255470848,3255471103,HU +3255471104,3255471615,BE +3255471616,3255471871,GB +3255471872,3255472127,BE +3255472128,3255472383,GB +3255472384,3255472639,BE +3255472640,3255472895,NL +3255472896,3255473151,BE +3255473152,3255473407,GB +3255473408,3255473663,CH +3255473664,3255473919,BE +3255473920,3255474175,NO +3255474176,3255476735,GB +3255476736,3255476991,IE +3255476992,3255477247,NL +3255477248,3255477503,GB +3255477504,3255477759,CH +3255477760,3255478271,GB +3255482368,3255482623,GB +3255482624,3255482815,BE +3255482816,3255482831,FR +3255482832,3255482839,BE +3255482840,3255482847,FR +3255482848,3255482871,BE +3255482880,3255483135,GB +3255483136,3255484415,DE +3255484416,3255484671,PL +3255484672,3255484927,NL +3255484928,3255485183,CH +3255485184,3255485439,AT +3255485440,3255486463,FR +3255486464,3255486719,BE +3255486976,3255487487,GB +3255487488,3255487743,BE +3255487744,3255487999,GB +3255488000,3255488255,BE +3255488256,3255488511,GB +3255488512,3255489535,AT +3255489536,3255489887,DE +3255489888,3255490047,GB +3255490048,3255490559,DE +3255492608,3255496703,GB +3255497728,3255497983,BE +3255497984,3255498239,DE +3255498240,3255498495,FR +3255498496,3255498751,GB +3255498752,3255500799,FR +3255500800,3255504895,CH +3255504896,3255505151,RU +3255505152,3255505919,GB +3255505920,3255506431,RU +3255506432,3255506687,PL +3255506688,3255506943,PT +3255506944,3255507199,PL +3255507200,3255507455,PT +3255507456,3255507711,FR +3255507712,3255507967,AT +3255507968,3255508223,UA +3255508224,3255508479,RU +3255508480,3255544319,CH +3255544320,3255544575,DE +3255544576,3255544831,AT +3255544832,3255551999,CH +3255552000,3255552511,DE +3255552512,3255558143,CH +3255558144,3255558399,BE +3255558400,3255564031,CH +3255564032,3255564287,RU +3255564288,3255565823,CH +3255565824,3255566079,DE +3255566080,3255566335,CH +3255566336,3255599103,SE +3255599104,3255615487,CH +3255615488,3255623679,DE +3255623680,3255631871,BG +3255631872,3255660287,NL +3255660288,3255660543,GR +3255660544,3255666431,NL +3255666432,3255666687,DE +3255667200,3255667455,NL +3255667712,3255697407,NL +3255697408,3255745535,SE +3255745536,3255746047,DK +3255746048,3255762943,SE +3255762944,3255799039,DE +3255799040,3255799295,SE +3255799296,3255800575,DE +3255800576,3255800831,UA +3255800832,3255817215,DE +3255817216,3255817471,SE +3255817472,3255817727,ES +3255817728,3255821311,DE +3255821312,3255821823,CH +3255821824,3255822079,DE +3255822080,3255822335,CH +3255822336,3255828479,DE +3255828480,3255851311,SE +3255851312,3255851315,DK +3255851316,3255909183,SE +3255909184,3255909191,DK +3255909192,3256025087,SE +3256025088,3256057855,NO +3256057856,3256074751,DK +3256074752,3256075007,SE +3256075008,3256076287,DK +3256076288,3256076799,SE +3256076800,3256080127,DK +3256080128,3256080383,US +3256080384,3256080639,DK +3256080640,3256080767,SE +3256080768,3256081919,DK +3256081920,3256082175,SE +3256082176,3256082431,DK +3256082432,3256090623,LV +3256090624,3256164863,IT +3256164864,3256165375,SE +3256165376,3256187391,IT +3256187392,3256187647,SM +3256187648,3256221695,IT +3256221696,3256222207,SE +3256222208,3256222463,NL +3256222464,3256223743,SE +3256223744,3256226047,NL +3256226048,3256229887,SE +3256229888,3256233983,DE +3256233984,3256238079,SE +3256238080,3256246271,NO +3256246272,3256345343,SE +3256345344,3256345599,DE +3256345600,3256352767,SE +3256352768,3256385535,CH +3256385536,3256393727,AT +3256393728,3256394239,DE +3256394240,3256394751,UA +3256394752,3256395263,PL +3256395264,3256395775,GB +3256395776,3256396287,TR +3256396288,3256396799,GR +3256396800,3256397311,DE +3256397312,3256397823,PL +3256397824,3256398847,RO +3256398848,3256399359,PL +3256399360,3256400895,UA +3256400896,3256401407,GB +3256401408,3256401919,UA +3256401920,3256410111,DE +3256410112,3256410623,TR +3256410624,3256411135,GR +3256411136,3256411647,FR +3256411648,3256412159,DE +3256412160,3256412671,GB +3256412672,3256413183,RO +3256413184,3256413695,UA +3256413696,3256414207,PL +3256414208,3256414719,RU +3256414720,3256415231,DE +3256415232,3256415743,PL +3256415744,3256416255,UA +3256416256,3256416767,DE +3256416768,3256417279,GB +3256417280,3256417791,NO +3256417792,3256418303,GB +3256418304,3256427503,DE +3256427504,3256427511,GB +3256427512,3256443727,DE +3256443728,3256443735,GB +3256443736,3256446855,DE +3256446856,3256446863,US +3256446864,3256448575,DE +3256448576,3256448591,ES +3256448592,3256448935,DE +3256448936,3256448943,IT +3256448944,3256452063,DE +3256452064,3256452071,BE +3256452072,3256483839,DE +3256483840,3256487151,NL +3256487152,3256487159,FR +3256487160,3256489471,NL +3256489472,3256489983,GR +3256489984,3256490239,BE +3256490240,3256490495,DE +3256490496,3256513023,NL +3256513024,3256513279,GB +3256513280,3256513791,NL +3256513792,3256514047,GB +3256514048,3256524287,NL +3256524288,3256524799,DE +3256524800,3256528895,NL +3256528896,3256530943,DE +3256530944,3256549375,NL +3256549376,3256614911,TR +3256614912,3256680447,IT +3256680448,3256682415,CH +3256682416,3256682431,IT +3256682432,3256688639,CH +3256688640,3256692735,IL +3256692736,3256693759,GR +3256693760,3256694783,IT +3256694784,3256695807,CH +3256695808,3256696831,UA +3256696832,3256697599,BE +3256697600,3256697855,GB +3256697856,3256698367,IT +3256698368,3256698623,NL +3256698624,3256698879,GB +3256698880,3256699135,DE +3256701184,3256701439,BE +3256701440,3256701695,GB +3256705280,3256705791,BE +3256705792,3256706047,AT +3256706048,3256706559,GR +3256709632,3256709887,AT +3256710144,3256710655,AT +3256710656,3256711167,SE +3256711168,3256711423,DE +3256713216,3256727551,PL +3256727552,3256728575,UA +3256728576,3256729599,DE +3256729600,3256731647,FI +3256731648,3256732671,NO +3256732672,3256732927,IT +3256732928,3256733183,UA +3256733184,3256733439,FR +3256733440,3256733695,DK +3256733696,3256735743,TR +3256735744,3256737791,GB +3256737792,3256745983,DE +3256745984,3256778751,ES +3256778752,3256786943,CY +3256786944,3256787199,NL +3256787200,3256787455,RO +3256787456,3256787711,DE +3256787712,3256787967,UA +3256787968,3256788223,PL +3256788224,3256788479,RU +3256788480,3256788735,GB +3256788736,3256788991,DE +3256788992,3256789247,UA +3256789248,3256789503,SE +3256789504,3256789759,UA +3256789760,3256790015,GB +3256790016,3256790271,UA +3256790272,3256790783,DE +3256790784,3256791039,NL +3256791040,3256791295,CH +3256791296,3256791551,RO +3256791552,3256791807,DE +3256791808,3256792063,PL +3256792064,3256792319,DE +3256792320,3256792575,CH +3256792576,3256792831,NL +3256792832,3256793087,DE +3256793088,3256793343,GB +3256793344,3256793599,PL +3256793600,3256793855,GB +3256793856,3256794111,SK +3256794112,3256794367,NL +3256794368,3256794623,DK +3256794624,3256794879,RU +3256794880,3256795135,AT +3256795136,3256811519,GR +3256811520,3256819711,DE +3256827904,3256869631,DE +3256869888,3256870911,DE +3256871168,3256871935,DE +3256872448,3256877055,DE +3256877056,3256898559,GB +3256899584,3256915455,GB +3256915456,3256915967,SE +3256915968,3256945663,GB +3256945664,3256945919,UA +3256945920,3256946175,GB +3256946176,3256946431,RO +3256946432,3256946687,UA +3256946688,3256946943,GB +3256946944,3256947711,DE +3256947712,3256988671,GB +3256988672,3256989183,UA +3256989184,3256989439,FR +3256989440,3256989695,GB +3256989696,3256989951,HU +3256989952,3256990207,PL +3256990208,3256990463,CH +3256990464,3256990719,PL +3256990720,3256991231,UA +3256991232,3256991487,SE +3256991488,3256991743,RU +3256991744,3257011199,GB +3257011200,3257011455,BG +3257011456,3257058815,GB +3257058816,3257059071,PL +3257059072,3257077503,GB +3257077760,3257087487,GB +3257087744,3257139199,GB +3257139200,3257139455,NL +3257139456,3257143295,GB +3257144576,3257144831,GB +3257144832,3257145087,FR +3257145088,3257160703,GB +3257161728,3257180159,GB +3257180160,3257180415,TR +3257180416,3257180671,RU +3257180672,3257180927,EE +3257180928,3257181183,GB +3257181184,3257181439,SA +3257181440,3257181695,PL +3257181696,3257181951,FR +3257181952,3257182207,BG +3257182208,3257182463,PL +3257182464,3257196543,GB +3257196544,3257200639,LU +3257200640,3257204735,GB +3257204736,3257268223,AT +3257268224,3257268479,UA +3257268480,3257268735,SE +3257268736,3257269247,AT +3257269248,3257269503,IT +3257269504,3257270015,AT +3257270016,3257270271,DE +3257270272,3257286655,SE +3257286656,3257294847,CH +3257294848,3257303039,HU +3257303040,3257311231,PT +3257311232,3257311903,CH +3257311904,3257311911,ES +3257311912,3257335807,CH +3257335808,3257357311,DE +3257357312,3257357567,PT +3257357568,3257357823,SI +3257357824,3257371903,DE +3257371904,3257372159,BE +3257372160,3257372671,GB +3257372672,3257383679,DE +3257383680,3257383935,CH +3257383936,3257388799,DE +3257388800,3257389055,FR +3257389056,3257401343,DE +3257401344,3257466879,CH +3257466880,3257467135,DE +3257467136,3257467391,GB +3257467904,3257468927,IT +3257469184,3257469439,IT +3257469440,3257469951,GB +3257469952,3257470975,BE +3257470976,3257475071,FI +3257475072,3257475327,ES +3257475328,3257475583,FI +3257475584,3257476095,DE +3257476352,3257477119,DE +3257477120,3257477375,NL +3257477376,3257477887,SE +3257477888,3257480447,GB +3257480448,3257480959,NL +3257480960,3257481215,SE +3257481216,3257481471,GB +3257481472,3257481727,DE +3257481728,3257481983,FI +3257481984,3257482239,FR +3257482752,3257483007,NL +3257483008,3257491455,CH +3257491456,3257495551,BE +3257495552,3257497855,CH +3257497856,3257499647,NL +3257499648,3257525495,CH +3257525496,3257525503,DK +3257525504,3257532415,CH +3257532416,3257542655,CY +3257542656,3257542911,PL +3257542912,3257543423,IT +3257543424,3257543679,PT +3257543680,3257544191,RO +3257544192,3257544447,DE +3257544448,3257544575,DK +3257544576,3257544703,DE +3257544704,3257544959,CH +3257544960,3257545215,DK +3257545216,3257546495,GR +3257546496,3257546527,DE +3257546528,3257546623,CH +3257546624,3257546655,ES +3257546656,3257546687,SE +3257546688,3257546719,DE +3257546720,3257546751,DK +3257546752,3257548799,FI +3257548800,3257556991,DE +3257556992,3257557503,MW +3257557504,3257558015,LU +3257558016,3257559551,RO +3257559552,3257560063,UA +3257560064,3257560575,DE +3257560576,3257561087,PL +3257561088,3257561599,RU +3257561600,3257562111,DE +3257562112,3257563647,PL +3257563648,3257564159,DE +3257564160,3257564671,GB +3257564672,3257565183,RO +3257565184,3257570303,CY +3257570304,3257570307,GR +3257570308,3257570311,CY +3257570312,3257570327,GR +3257570328,3257570367,CY +3257570368,3257570431,GR +3257570432,3257570495,CY +3257570496,3257570527,GR +3257570528,3257573375,CY +3257573376,3257574015,CH +3257574016,3257574143,BE +3257574144,3257574399,GB +3257574400,3257574655,IT +3257574656,3257576191,BE +3257576192,3257577471,AT +3257577472,3257581567,DE +3257581568,3257585663,UA +3257585664,3257586175,BE +3257586176,3257586687,NL +3257586688,3257586943,LU +3257586944,3257587455,ES +3257587456,3257587711,GB +3257587712,3257587967,US +3257587968,3257588223,FR +3257588224,3257588735,BE +3257588736,3257589759,NL +3257589760,3257663487,GB +3257663488,3257729023,UA +3257729024,3257731071,DE +3257731072,3257731399,NL +3257731400,3257731407,DE +3257731408,3257731415,NL +3257731416,3257731423,DE +3257731424,3257731543,NL +3257731544,3257731551,DE +3257731552,3257732095,NL +3257732096,3257732607,DE +3257732608,3257732679,NL +3257732680,3257732687,DE +3257732688,3257732815,NL +3257732816,3257732823,DE +3257732824,3257732919,NL +3257732920,3257732927,DE +3257732928,3257732935,NL +3257732936,3257732943,DE +3257732944,3257733455,NL +3257733456,3257733463,DE +3257733464,3257733911,NL +3257733912,3257733919,DE +3257733920,3257734143,NL +3257734144,3257736191,DE +3257736192,3257736207,NL +3257736208,3257736215,DE +3257736216,3257736871,NL +3257736872,3257736879,DE +3257736880,3257736999,NL +3257737000,3257737007,DE +3257737008,3257737471,NL +3257737472,3257743615,DE +3257743616,3257743703,NL +3257743704,3257743711,DE +3257743712,3257743847,NL +3257743848,3257743855,DE +3257743856,3257743959,NL +3257743960,3257743967,DE +3257743968,3257744071,NL +3257744072,3257744079,DE +3257744080,3257744087,NL +3257744088,3257744095,DE +3257744096,3257744183,NL +3257744184,3257744191,DE +3257744192,3257744199,NL +3257744200,3257744207,DE +3257744208,3257744231,NL +3257744232,3257744239,DE +3257744240,3257744343,NL +3257744344,3257744351,DE +3257744352,3257744487,NL +3257744488,3257744495,DE +3257744496,3257744663,NL +3257744664,3257744671,DE +3257744672,3257744895,NL +3257744896,3257744903,DE +3257744904,3257744983,NL +3257744984,3257744991,DE +3257744992,3257745223,NL +3257745224,3257745231,DE +3257745232,3257745271,NL +3257745272,3257745279,DE +3257745280,3257745287,NL +3257745288,3257745295,DE +3257745296,3257745327,NL +3257745328,3257745335,DE +3257745336,3257745447,NL +3257745448,3257745463,DE +3257745464,3257745479,NL +3257745480,3257745487,DE +3257745488,3257745655,NL +3257745656,3257745663,DE +3257745664,3257745759,NL +3257745760,3257745767,DE +3257745768,3257745839,NL +3257745840,3257745847,DE +3257745848,3257746079,NL +3257746080,3257746087,DE +3257746088,3257746671,NL +3257746672,3257746679,DE +3257746680,3257746919,NL +3257746920,3257746927,DE +3257746928,3257746943,NL +3257746944,3257747455,DE +3257747456,3257748071,NL +3257748072,3257748079,DE +3257748080,3257748479,NL +3257748480,3257749503,DE +3257749504,3257750015,NL +3257750016,3257750023,DE +3257750024,3257750359,NL +3257750360,3257750367,DE +3257750368,3257750615,NL +3257750616,3257750623,DE +3257750624,3257750631,NL +3257750632,3257750639,DE +3257750640,3257750655,NL +3257750656,3257750663,DE +3257750664,3257750671,NL +3257750672,3257750679,DE +3257750680,3257750735,NL +3257750736,3257750743,DE +3257750744,3257750927,NL +3257750928,3257750935,DE +3257750936,3257751199,NL +3257751200,3257751207,DE +3257751208,3257751255,NL +3257751256,3257751263,DE +3257751264,3257751351,NL +3257751352,3257751359,DE +3257751360,3257751711,NL +3257751712,3257751719,DE +3257751720,3257751823,NL +3257751824,3257751831,DE +3257751832,3257751871,NL +3257751872,3257751887,DE +3257751888,3257752007,NL +3257752008,3257752015,DE +3257752016,3257752175,NL +3257752176,3257752183,DE +3257752184,3257752223,NL +3257752224,3257752231,DE +3257752232,3257752399,NL +3257752400,3257752407,DE +3257752408,3257752495,NL +3257752496,3257752503,DE +3257752504,3257752583,NL +3257752584,3257752591,DE +3257752592,3257752623,NL +3257752624,3257752631,DE +3257752632,3257752799,NL +3257752800,3257752807,DE +3257752808,3257752847,NL +3257752848,3257752855,DE +3257752856,3257752927,NL +3257752928,3257752935,DE +3257752936,3257753087,NL +3257753088,3257756671,DE +3257756672,3257756887,NL +3257756888,3257756895,DE +3257756896,3257756919,NL +3257756920,3257756927,DE +3257756928,3257757007,NL +3257757008,3257757015,DE +3257757016,3257757375,NL +3257757376,3257757383,DE +3257757384,3257757743,NL +3257757744,3257757751,DE +3257757752,3257757799,NL +3257757800,3257757807,DE +3257757808,3257757927,NL +3257757928,3257757935,DE +3257757936,3257758375,NL +3257758376,3257758383,DE +3257758384,3257758423,NL +3257758424,3257758431,DE +3257758432,3257758511,NL +3257758512,3257758519,DE +3257758520,3257758567,NL +3257758568,3257758575,DE +3257758576,3257759143,NL +3257759144,3257759151,DE +3257759152,3257759159,NL +3257759160,3257759167,DE +3257759168,3257759255,NL +3257759256,3257759263,DE +3257759264,3257759647,NL +3257759648,3257759655,DE +3257759656,3257759895,NL +3257759896,3257759903,DE +3257759904,3257759975,NL +3257759976,3257759983,DE +3257759984,3257760359,NL +3257760360,3257760367,DE +3257760368,3257760495,NL +3257760496,3257760503,DE +3257760504,3257761279,NL +3257761280,3257761791,DE +3257761792,3257761903,NL +3257761904,3257761911,DE +3257761912,3257762407,NL +3257762408,3257762415,DE +3257762416,3257762799,NL +3257762800,3257762815,DE +3257762816,3257762911,NL +3257762912,3257762919,DE +3257762920,3257763151,NL +3257763152,3257763159,DE +3257763160,3257763247,NL +3257763248,3257763255,DE +3257763256,3257763327,NL +3257763328,3257763839,DE +3257763840,3257764487,NL +3257764488,3257764511,DE +3257764512,3257765375,NL +3257765376,3257768959,DE +3257768960,3257769215,NL +3257769216,3257769223,DE +3257769224,3257769663,NL +3257769664,3257769671,DE +3257769672,3257769903,NL +3257769904,3257769919,DE +3257769920,3257770055,NL +3257770056,3257770079,DE +3257770080,3257771007,NL +3257771008,3257772543,DE +3257772544,3257773391,NL +3257773392,3257773399,DE +3257773400,3257773799,NL +3257773800,3257773807,DE +3257773808,3257773991,NL +3257773992,3257774007,DE +3257774008,3257774055,NL +3257774056,3257774063,DE +3257774064,3257775103,NL +3257775104,3257776639,DE +3257776640,3257777335,NL +3257777336,3257777343,DE +3257777344,3257777991,NL +3257777992,3257777999,DE +3257778000,3257778479,NL +3257778480,3257778487,DE +3257778488,3257779199,NL +3257779200,3257780735,DE +3257780736,3257780775,NL +3257780776,3257780783,DE +3257780784,3257780967,NL +3257780968,3257780975,DE +3257780976,3257781135,NL +3257781136,3257781143,DE +3257781144,3257781279,NL +3257781280,3257781287,DE +3257781288,3257781567,NL +3257781568,3257781575,DE +3257781576,3257781895,NL +3257781896,3257781903,DE +3257781904,3257782271,NL +3257782272,3257784831,DE +3257784832,3257785375,NL +3257785376,3257785383,DE +3257785384,3257785423,NL +3257785424,3257785431,DE +3257785432,3257785679,NL +3257785680,3257785687,DE +3257785688,3257786271,NL +3257786272,3257786279,DE +3257786280,3257786383,NL +3257786384,3257786391,DE +3257786392,3257786559,NL +3257786560,3257786567,DE +3257786568,3257786807,NL +3257786808,3257786815,DE +3257786816,3257786879,NL +3257786880,3257787391,DE +3257787392,3257787503,NL +3257787504,3257787511,DE +3257787512,3257787967,NL +3257787968,3257787975,DE +3257787976,3257788007,NL +3257788008,3257788015,DE +3257788016,3257788119,NL +3257788120,3257788127,DE +3257788128,3257788175,NL +3257788176,3257788183,DE +3257788184,3257788415,NL +3257788416,3257789951,DE +3257789952,3257789999,NL +3257790000,3257790007,DE +3257790008,3257790119,NL +3257790120,3257790127,DE +3257790128,3257790191,NL +3257790192,3257790199,DE +3257790200,3257790479,NL +3257790480,3257790487,DE +3257790488,3257790623,NL +3257790624,3257790631,DE +3257790632,3257790975,NL +3257790976,3257790983,DE +3257790984,3257791015,NL +3257791016,3257791023,DE +3257791024,3257791271,NL +3257791272,3257791279,DE +3257791280,3257791327,NL +3257791328,3257791335,DE +3257791336,3257791367,NL +3257791368,3257791375,DE +3257791376,3257791487,NL +3257791488,3257791495,DE +3257791496,3257791863,NL +3257791864,3257791871,DE +3257791872,3257792607,NL +3257792608,3257792615,DE +3257792616,3257792783,NL +3257792784,3257792791,DE +3257792792,3257793167,NL +3257793168,3257793175,DE +3257793176,3257794351,NL +3257794352,3257794359,DE +3257794360,3257794511,NL +3257794512,3257794519,DE +3257794520,3257794559,NL +3257794560,3257827327,GB +3257827328,3257827839,IE +3257827840,3257829375,GB +3257829376,3257830399,IE +3257830400,3257835519,GB +3257835520,3257844223,IE +3257844224,3257851903,GB +3257851904,3257860095,IE +3257860096,3257925631,SE +3257925632,3257925887,AT +3257925888,3257926143,SE +3257926144,3257970431,AT +3257970432,3257970687,UA +3257970688,3257977855,AT +3257977856,3257978111,GB +3257978112,3257978367,SE +3257978368,3257978623,BG +3257978624,3257978879,ES +3257978880,3257979135,FR +3257979136,3257979647,GB +3257979648,3257979903,DE +3257979904,3257980159,UA +3257980160,3257980415,SE +3257980416,3257980671,NL +3257980672,3257980927,CH +3257980928,3257981183,PL +3257981184,3257981439,GB +3257981440,3257981695,RU +3257981696,3257981951,PL +3257981952,3257987327,AT +3257987328,3257987583,CZ +3257987584,3257991167,AT +3257991168,3258003967,DE +3258003968,3258004479,RU +3258004480,3258005503,DE +3258005760,3258013183,DE +3258013696,3258018815,DE +3258019328,3258021887,DE +3258023168,3258023679,DE +3258023936,3258056703,DE +3258056704,3258056959,UA +3258057216,3258057727,CZ +3258058240,3258058495,RU +3258058496,3258059007,RO +3258059008,3258059263,UA +3258059264,3258059519,RU +3258059520,3258059775,RO +3258062848,3258063871,CZ +3258063872,3258064127,AT +3258064128,3258064383,FR +3258064384,3258065151,GB +3258065152,3258065407,DE +3258065408,3258065663,LI +3258065664,3258065919,SA +3258065920,3258066175,DE +3258066176,3258066431,PL +3258066432,3258066943,FR +3258066944,3258067199,DK +3258067200,3258067455,GB +3258067456,3258067967,GR +3258067968,3258068223,RO +3258068224,3258068479,CH +3258068480,3258068735,GB +3258068736,3258068991,DE +3258068992,3258069247,NL +3258069248,3258069503,PL +3258069504,3258069759,RO +3258069760,3258070015,UA +3258070016,3258070271,GB +3258070272,3258070527,PL +3258070528,3258071295,GB +3258071296,3258071551,DK +3258071552,3258071807,DE +3258071808,3258072063,GB +3258072064,3258072319,FR +3258072320,3258072575,PL +3258072576,3258072831,BE +3258072832,3258073087,RO +3258073088,3258074111,CZ +3258074112,3258074879,DE +3258074880,3258075135,IL +3258075136,3258075391,RO +3258075392,3258075647,BG +3258075648,3258075903,FR +3258075904,3258076159,PL +3258076160,3258076415,BG +3258076416,3258076927,FR +3258076928,3258077183,UA +3258077184,3258077439,GB +3258077440,3258077695,UA +3258077696,3258077951,NL +3258077952,3258078207,PL +3258078208,3258078463,TR +3258078464,3258078719,UA +3258078720,3258078975,GB +3258078976,3258079231,RU +3258079232,3258079487,GB +3258079488,3258079743,PL +3258079744,3258079999,GB +3258080000,3258080255,BE +3258080256,3258080511,FR +3258080512,3258080767,DE +3258080768,3258081023,GB +3258081024,3258081279,FR +3258081280,3258081535,NL +3258081536,3258081791,BE +3258081792,3258082047,UA +3258082048,3258082303,NL +3258082304,3258082559,CZ +3258082560,3258082815,HU +3258082816,3258083071,NL +3258083072,3258083583,RU +3258083584,3258083839,LV +3258083840,3258084351,SE +3258084352,3258084607,GB +3258084608,3258084863,AT +3258084864,3258085119,PL +3258085120,3258085375,LT +3258085376,3258085631,NL +3258085632,3258085887,DE +3258085888,3258086143,UA +3258086144,3258086399,AT +3258086400,3258086655,UA +3258086656,3258087167,GB +3258087168,3258087423,UA +3258087424,3258087679,RU +3258087680,3258087935,GB +3258087936,3258088191,BG +3258088192,3258088447,PL +3258088448,3258088703,BE +3258088704,3258088959,UA +3258088960,3258089215,RO +3258089216,3258089471,FR +3258097664,3258097919,DE +3258097920,3258098175,UA +3258098176,3258098431,DE +3258098432,3258098687,NL +3258098688,3258098943,DE +3258098944,3258099199,GB +3258099200,3258099455,SI +3258099456,3258099711,UA +3258099712,3258099967,FI +3258099968,3258100223,UA +3258100224,3258100479,RO +3258100480,3258100735,DK +3258100736,3258100991,CH +3258100992,3258101247,AT +3258101248,3258101503,RO +3258101504,3258101759,IL +3258101760,3258102015,CH +3258102016,3258102271,BE +3258102272,3258102527,CH +3258102528,3258102783,TR +3258102784,3258103039,PL +3258103040,3258103295,SE +3258103296,3258103551,DE +3258103552,3258103807,GB +3258103808,3258104063,SE +3258104064,3258104319,GB +3258104320,3258104575,PL +3258104576,3258104831,DE +3258105088,3258105599,CZ +3258105600,3258105855,DE +3258105856,3258109951,CZ +3258109952,3258110207,DK +3258110208,3258111487,CZ +3258111488,3258111743,PL +3258111744,3258119679,CZ +3258120192,3258120703,CZ +3258120960,3258121215,CZ +3258121216,3258121471,PL +3258121472,3258121727,AT +3258121728,3258121983,UA +3258121984,3258122239,RU +3258122240,3258128895,FR +3258128896,3258129151,MC +3258129152,3258163967,FR +3258163968,3258164223,BJ +3258164224,3258164479,FR +3258164480,3258164735,MG +3258164736,3258167551,FR +3258167552,3258167807,ES +3258167808,3258187775,FR +3258187776,3258231551,SE +3258231552,3258232831,NO +3258232832,3258250495,SE +3258250496,3258250751,NO +3258250752,3258251007,SE +3258251008,3258251775,NO +3258251776,3258253311,SE +3258253312,3258272767,NL +3258272768,3258273791,FR +3258273792,3258297343,NL +3258297344,3258297599,BE +3258297600,3258298111,NL +3258298112,3258298367,GB +3258298368,3258318847,NL +3258318848,3258320895,DE +3258320896,3258321919,GB +3258321920,3258322943,RU +3258322944,3258326015,PL +3258326016,3258327039,SE +3258327040,3258335231,TR +3258335232,3258336255,RU +3258336256,3258337279,NO +3258337280,3258338303,DE +3258338304,3258340351,UA +3258340352,3258341375,PL +3258341376,3258342399,UA +3258342400,3258343423,DE +3258343424,3258351615,NO +3258351616,3258352639,RO +3258352640,3258353663,RU +3258353664,3258354687,NO +3258354688,3258355711,BG +3258355712,3258356735,NL +3258356736,3258357759,RU +3258357760,3258359807,UA +3258359808,3258360831,RU +3258360832,3258361855,SE +3258361856,3258362879,IL +3258362880,3258363903,IM +3258363904,3258364927,RU +3258364928,3258365951,CS +3258365952,3258366975,UA +3258366976,3258367999,PL +3258368000,3258384383,KW +3258384384,3258419199,DE +3258419456,3258427647,DE +3258427648,3258427903,RO +3258427904,3258428159,DE +3258428416,3258431999,DE +3258432512,3258449919,DE +3258449920,3258502682,CH +3258502683,3258502683,FR +3258502684,3258503935,CH +3258503936,3258504191,PL +3258504192,3258504703,CH +3258504704,3258504959,DE +3258504960,3258505215,IL +3258505216,3258511871,CH +3258512128,3258514687,CH +3258514944,3258515455,CH +3258515456,3258580991,FR +3258580992,3258601983,RU +3258601984,3258602495,UA +3258602496,3258625791,RU +3258625792,3258626047,UA +3258626048,3258646527,RU +3258646528,3258691583,DE +3258691584,3258691839,RU +3258691840,3258692351,AT +3258692352,3258692607,DE +3258692608,3258692863,FR +3258692864,3258693119,DE +3258693120,3258693375,SI +3258693376,3258693631,DE +3258693632,3258693887,RU +3258693888,3258694143,SI +3258694144,3258694399,RU +3258694400,3258694655,DE +3258694656,3258694911,GB +3258694912,3258701567,DE +3258701824,3258710271,DE +3258710528,3258712063,DE +3258712064,3258728447,GB +3258728448,3258729471,FR +3258729472,3258729727,DE +3258729728,3258729983,UA +3258729984,3258730239,CH +3258730240,3258730495,NL +3258730496,3258730751,RO +3258730752,3258731007,TR +3258731008,3258731263,SI +3258731264,3258731519,NO +3258731520,3258731775,ES +3258731776,3258732031,UA +3258732032,3258732287,DE +3258732288,3258732543,PL +3258732544,3258732799,SE +3258732800,3258733055,CH +3258733056,3258733311,RO +3258733312,3258746111,GB +3258746368,3258746623,GB +3258746880,3258748927,DE +3258748928,3258764287,GB +3258764288,3258764543,DE +3258764544,3258764799,RU +3258764800,3258765055,BE +3258765056,3258765311,NL +3258765312,3258767615,GB +3258767616,3258767871,CH +3258767872,3258802175,GB +3258802176,3258806271,LU +3258806272,3258818047,GB +3258818048,3258818303,SE +3258818304,3258843135,GB +3258843136,3258843391,RU +3258843392,3258848767,GB +3258848768,3258849023,RO +3258849024,3258849279,DE +3258849280,3258883297,GB +3258883328,3258902783,GB +3258902784,3258903039,RU +3258903040,3258903295,FR +3258903296,3258903551,GB +3258903552,3258903807,DE +3258903808,3258904063,RU +3258904064,3258941439,GB +3258941440,3258943487,PL +3258943488,3258944511,BG +3258944512,3258945535,UA +3258945536,3258946559,RU +3258946560,3258947583,CH +3258947584,3258948607,RO +3258948608,3258949631,DK +3258949632,3258972159,GR +3258972160,3258974207,NO +3258974208,3259023103,DE +3259023104,3259023119,IT +3259023120,3259032551,DE +3259032552,3259032559,IT +3259032560,3259032831,DE +3259032832,3259032879,GB +3259032880,3259034319,DE +3259034320,3259034327,GB +3259034328,3259039743,DE +3259039744,3259062015,PT +3259062016,3259062271,GW +3259062272,3259105279,PT +3259105280,3259170815,GB +3259170816,3259219967,RU +3259219968,3259220479,BY +3259220480,3259223295,RU +3259223296,3259223807,TM +3259223808,3259224831,KZ +3259224832,3259225343,TJ +3259225344,3259226111,AZ +3259226112,3259226623,UZ +3259226624,3259227135,AM +3259227136,3259227391,RU +3259227392,3259227903,KZ +3259227904,3259228159,DE +3259228160,3259236351,RU +3259236352,3259236863,SE +3259236864,3259237119,CH +3259237120,3259269375,SE +3259269376,3259269631,FR +3259269632,3259301887,SE +3259301888,3259302143,DE +3259302144,3259302399,AE +3259302400,3259303423,CH +3259303424,3259305983,SE +3259305984,3259310079,NL +3259310080,3259310335,FR +3259310336,3259311103,DK +3259311104,3259311615,DE +3259311616,3259311871,CH +3259311872,3259312639,DE +3259312640,3259313151,GB +3259313152,3259313407,SE +3259313408,3259313663,FR +3259313664,3259314175,DE +3259314176,3259316223,BE +3259316224,3259317247,DE +3259317248,3259318271,CH +3259318272,3259318311,GB +3259318312,3259318319,BE +3259318320,3259318343,GB +3259318344,3259318351,FR +3259318352,3259318367,GB +3259318368,3259318399,BE +3259318400,3259318503,GB +3259318504,3259318511,BE +3259318512,3259318527,GB +3259318528,3259318591,CH +3259318592,3259318599,GB +3259318600,3259318607,AT +3259318608,3259318663,GB +3259318664,3259318671,DK +3259318672,3259318679,GB +3259318680,3259318687,IT +3259318688,3259318727,GB +3259318728,3259318735,FR +3259318736,3259319055,GB +3259319056,3259319071,IT +3259319072,3259319087,GB +3259319088,3259319095,SE +3259319096,3259319103,DK +3259319104,3259319111,FR +3259319112,3259319199,GB +3259319200,3259319215,DE +3259319216,3259319255,GB +3259319256,3259319263,DK +3259319264,3259319287,GB +3259319288,3259319295,BE +3259319296,3259319303,GB +3259319304,3259319311,BE +3259319312,3259319319,DK +3259319320,3259319367,GB +3259319368,3259319375,BE +3259319376,3259319407,GB +3259319408,3259319423,LU +3259319424,3259319439,GB +3259319440,3259319447,CH +3259319448,3259319463,GB +3259319464,3259319471,DK +3259319472,3259319587,GB +3259319588,3259319591,NL +3259319592,3259319663,GB +3259319664,3259319667,FR +3259319668,3259319823,GB +3259319824,3259319831,FR +3259319832,3259319879,GB +3259319880,3259319887,BY +3259319888,3259319987,GB +3259319988,3259319991,NL +3259319992,3259320011,GB +3259320012,3259320015,BE +3259320016,3259320055,GB +3259320056,3259320063,AT +3259320064,3259320575,GB +3259320576,3259320583,FR +3259320584,3259320743,GB +3259320744,3259320751,NL +3259320752,3259334655,GB +3259334656,3259338751,DE +3259338752,3259339519,GB +3259339520,3259339775,JP +3259339776,3259340031,US +3259340032,3259342847,GB +3259342848,3259344895,CH +3259344896,3259345151,GB +3259345152,3259345407,IE +3259345408,3259345663,CH +3259345664,3259346943,DE +3259346944,3259347199,SE +3259347200,3259347455,DE +3259347456,3259347967,CH +3259347968,3259348223,SE +3259348224,3259348991,CH +3259348992,3259351039,NL +3259351040,3259351551,IT +3259351552,3259352063,FR +3259352064,3259352575,CH +3259352576,3259353087,IE +3259353088,3259353855,NO +3259353856,3259354111,GB +3259354112,3259354367,NL +3259354368,3259354623,DE +3259354624,3259354879,TR +3259354880,3259355135,PL +3259355136,3259359231,NO +3259359232,3259367423,ES +3259367424,3259432959,GB +3259432960,3259457279,SE +3259457280,3259457535,IT +3259457536,3259465215,SE +3259465216,3259465471,KH +3259465472,3259498495,SE +3259498496,3259506943,GB +3259506944,3259507199,ES +3259507200,3259507711,GB +3259507712,3259507967,CH +3259507968,3259508223,GB +3259508224,3259508479,ES +3259508480,3259515647,GB +3259515648,3259515903,ES +3259515904,3259518207,GB +3259518208,3259518463,ES +3259518464,3259518719,GB +3259518720,3259518975,ES +3259518976,3259521023,GB +3259521024,3259521535,NL +3259521536,3259524863,GB +3259524864,3259525119,ES +3259525120,3259530751,GB +3259530752,3259531007,NL +3259531008,3259531263,GB +3259531264,3259531519,CH +3259531520,3259531663,GB +3259531664,3259531679,NL +3259531680,3259532031,GB +3259532032,3259532047,US +3259532048,3259534847,GB +3259534848,3259534863,IE +3259534864,3259537407,GB +3259537408,3259537919,ES +3259537920,3259538687,GB +3259538688,3259538943,ES +3259538944,3259541503,GB +3259541504,3259543551,NL +3259543552,3259545599,GB +3259545600,3259546111,LB +3259546112,3259555839,GB +3259555840,3259556095,ES +3259556096,3259562495,GB +3259562496,3259562751,ES +3259562752,3259576351,GB +3259576352,3259576359,ES +3259576360,3259576799,GB +3259576800,3259576831,ES +3259576832,3259577247,GB +3259577248,3259577263,IR +3259577264,3259581439,GB +3259581440,3259581951,ES +3259581952,3259587583,GB +3259587584,3259588095,ES +3259588096,3259588607,IT +3259588608,3259596799,GB +3259596800,3259597055,ES +3259597056,3259599359,GB +3259599360,3259599615,FR +3259599616,3259601151,GB +3259601152,3259601407,IE +3259601408,3259614463,GB +3259614464,3259614719,DE +3259614720,3259614975,GB +3259614976,3259615231,DE +3259615232,3259615743,GB +3259615744,3259615999,FR +3259616000,3259620095,GB +3259620096,3259620351,DE +3259620352,3259628031,GB +3259628032,3259628543,CH +3259628544,3259630335,GB +3259630336,3259630591,ES +3259630592,3259633407,GB +3259633408,3259633663,DE +3259633664,3259635711,GB +3259635712,3259635967,ES +3259635968,3259637759,GB +3259637760,3259638015,ES +3259638016,3259638783,GB +3259638784,3259639039,BE +3259639040,3259639551,GB +3259639552,3259639807,DE +3259639808,3259640319,GB +3259640320,3259640575,ES +3259640576,3259640831,GB +3259640832,3259641343,ES +3259641344,3259642367,GB +3259642368,3259642623,BE +3259642624,3259650047,GB +3259650048,3259652095,NL +3259652096,3259656959,GB +3259656960,3259657215,BE +3259657216,3259657727,GB +3259657728,3259657887,BE +3259657888,3259657919,GB +3259657920,3259657983,BE +3259657984,3259660287,GB +3259660288,3259660295,CH +3259660296,3259660327,GB +3259660328,3259660335,CH +3259660336,3259660543,GB +3259660544,3259660799,CH +3259660800,3259695871,GB +3259695872,3259695903,ES +3259695904,3259696639,GB +3259696640,3259696895,ES +3259696896,3259701759,GB +3259701760,3259702303,DE +3259702304,3259751423,GB +3259751424,3259751431,FR +3259751432,3259751551,GB +3259751552,3259751615,FR +3259751616,3259752191,GB +3259752192,3259752447,FR +3259752448,3259760639,GB +3259760640,3259814399,DE +3259814400,3259814655,AT +3259814656,3259821823,DE +3259821824,3259822079,AT +3259822080,3259823103,DE +3259824128,3259851823,DE +3259851824,3259851831,GB +3259851832,3259891711,DE +3259891712,3259957247,BE +3259957248,3259958271,DE +3259958272,3259959295,RU +3259959296,3259960319,UA +3259960320,3259961343,BG +3259961344,3259962367,FI +3259962368,3259963391,UA +3259963392,3259964415,PL +3259964416,3259965439,GB +3259965440,3259966463,RU +3259966464,3259967487,DE +3259967488,3259968511,CS +3259969536,3259970559,FR +3259970560,3259971583,CZ +3259971584,3259972607,IT +3259972608,3259973631,UA +3259973632,3259981823,PT +3259990016,3260006399,FR +3260006400,3260014591,IT +3260014592,3260018687,NL +3260018688,3260019711,GB +3260019712,3260021247,DE +3260021248,3260021759,RU +3260021760,3260022271,GR +3260022272,3260022783,NL +3260022784,3260237775,GB +3260237776,3260237791,GR +3260237792,3260284927,GB +3260284928,3260288767,RU +3260288768,3260289023,KZ +3260289024,3260303935,RU +3260303936,3260304127,BY +3260304128,3260322047,RU +3260322048,3260322303,BY +3260322304,3260339071,RU +3260339072,3260339135,TJ +3260339136,3260353535,RU +3260353536,3260353791,AZ +3260353792,3260354559,RU +3260354560,3260355839,KZ +3260355840,3260415487,RU +3260415488,3260415999,BY +3260416000,3260481535,FI +3260481536,3260547071,RU +3260547072,3260547327,DE +3260547328,3260547583,UA +3260547584,3260547839,NL +3260547840,3260548095,PL +3260548096,3260548351,IE +3260548352,3260548607,DK +3260548608,3260548863,RO +3260548864,3260549119,CH +3260549120,3260549375,AT +3260549376,3260549631,CH +3260549632,3260549887,DE +3260549888,3260550143,RU +3260550144,3260550399,PL +3260550400,3260550655,NL +3260550656,3260550911,RU +3260550912,3260551167,ES +3260551168,3260553983,DE +3260553984,3260554239,GB +3260554240,3260555263,SE +3260555264,3260556703,HU +3260556704,3260556799,SK +3260556800,3260559615,HU +3260559616,3260559647,RO +3260559648,3260559711,HU +3260559712,3260559719,RO +3260559720,3260563455,HU +3260563456,3260571647,GB +3260571648,3260579839,BE +3260579840,3260580351,PL +3260580352,3260580863,HU +3260580864,3260581375,GB +3260581376,3260581887,RO +3260581888,3260582399,IL +3260582400,3260583423,RU +3260583424,3260583935,PT +3260583936,3260584447,NO +3260584448,3260585471,RO +3260585472,3260586495,UA +3260586496,3260587007,PL +3260587008,3260587519,FR +3260587520,3260588031,PL +3260588032,3260596223,DE +3260596224,3260596735,CH +3260596736,3260597247,RO +3260597248,3260597759,CH +3260597760,3260598271,DE +3260598272,3260598783,RU +3260598784,3260599295,RO +3260599296,3260599807,RU +3260599808,3260600319,UA +3260600320,3260601343,RU +3260601344,3260601855,CH +3260601856,3260602367,PL +3260602368,3260602879,AT +3260602880,3260603903,UA +3260603904,3260604415,FR +3260604416,3260604927,PL +3260604928,3260605439,RO +3260605440,3260605951,BG +3260605952,3260606463,NL +3260606464,3260607487,SE +3260607488,3260607999,NL +3260608000,3260608511,RO +3260608512,3260609023,IE +3260609024,3260609535,GB +3260609536,3260610047,PL +3260610048,3260610559,FR +3260610560,3260611071,RO +3260611072,3260611583,BG +3260611584,3260612095,RU +3260612096,3260612607,SE +3260612608,3260613631,FI +3260613632,3260613887,DE +3260613888,3260614143,DK +3260614144,3260626175,FI +3260626176,3260626431,ES +3260626432,3260626943,FI +3260626944,3260627199,SE +3260627200,3260668415,FI +3260668416,3260668671,ES +3260668672,3260668927,GB +3260668928,3260669183,FI +3260669184,3260669695,DE +3260669696,3260669951,IT +3260669952,3260678143,FI +3260678144,3260743679,IL +3260743680,3260800255,IT +3260800256,3260800271,BE +3260800272,3260809215,IT +3260809216,3260874751,PL +3260874752,3260875775,DK +3260875776,3260876031,GB +3260876032,3260891391,DK +3260891392,3260891647,IT +3260891648,3260891903,NL +3260891904,3260892159,ES +3260892160,3260892415,GB +3260892416,3260892671,FI +3260892672,3260892927,PT +3260892928,3260893183,SE +3260893184,3260893439,AT +3260893440,3260894207,SE +3260894208,3260895231,AT +3260895232,3260898303,SE +3260898304,3260899327,ES +3260899328,3260900095,CH +3260900608,3260901119,NL +3260901120,3260903423,DE +3260903424,3260906239,CH +3260906240,3260906367,DE +3260906368,3260906495,SI +3260906496,3260907519,FR +3260907520,3260915711,GB +3260915712,3260923903,UA +3260923904,3261071359,DE +3261071360,3261136895,AT +3261136896,3261150143,DE +3261150144,3261150207,US +3261150208,3261173759,DE +3261173760,3261173767,AT +3261173768,3261173987,DE +3261173988,3261173991,AT +3261173992,3261174007,DE +3261174008,3261174015,AT +3261174016,3261202431,DE +3261202432,3261236863,FR +3261236864,3261236991,GB +3261236992,3261267967,FR +3261267968,3261297663,DE +3261297664,3261297919,RU +3261297920,3261298175,PL +3261298176,3261333503,DE +3261333504,3261399039,FI +3261399040,3261472767,GB +3261472768,3261503487,RO +3261503488,3261503935,MD +3261503936,3261530111,RO +3261530112,3261570303,SE +3261570304,3261570559,IT +3261570560,3261595647,SE +3261595648,3261599743,NL +3261600768,3261661183,NL +3261661184,3261669375,RO +3261669376,3261673471,MT +3261673472,3261675519,IT +3261675520,3261675775,LV +3261675776,3261676031,IT +3261676032,3261676287,GB +3261676288,3261676543,IT +3261676544,3261676799,DK +3261676800,3261677055,IT +3261677056,3261685759,GB +3261685760,3261687807,DE +3261687808,3261689855,RO +3261689856,3261691903,GB +3261693952,3261694463,NL +3261694464,3261694975,RU +3261694976,3261695487,PL +3261695488,3261695999,GB +3261696000,3261696511,UA +3261696512,3261697023,NL +3261697024,3261698047,RO +3261698048,3261698559,UA +3261698560,3261699071,DE +3261699072,3261699583,SA +3261699584,3261700095,NL +3261700096,3261700607,FR +3261700608,3261701119,GB +3261701120,3261701631,RU +3261701632,3261702143,CH +3261702144,3261710335,GB +3261710336,3261718527,RU +3261718528,3261726719,IS +3261726720,3261734911,ES +3261734912,3261743103,GB +3261743104,3261751295,MT +3261751296,3261759487,EE +3261759488,3261767679,IE +3261767680,3261769215,CS +3261769216,3261769343,RS +3261769344,3261771775,CS +3261771776,3261772799,RS +3261772800,3261773855,CS +3261773856,3261773856,RS +3261773857,3261773863,CS +3261773864,3261773888,RS +3261773889,3261773951,CS +3261773952,3261774015,RS +3261774016,3261774079,CS +3261774080,3261774143,CS +3261774144,3261774175,CS +3261774176,3261774191,CS +3261774192,3261774207,RS +3261774208,3261774223,CS +3261774224,3261774239,CS +3261774240,3261774271,CS +3261774272,3261774287,RS +3261774288,3261774351,CS +3261774352,3261774399,RS +3261774400,3261774847,CS +3261774848,3261775871,RS +3261775872,3261776383,PL +3261776384,3261776895,RU +3261776896,3261777407,PL +3261777408,3261777919,KZ +3261777920,3261778431,PL +3261778432,3261778943,RU +3261778944,3261779455,RO +3261779456,3261779967,DE +3261779968,3261780479,UA +3261780480,3261780991,PL +3261780992,3261781503,RO +3261781504,3261782015,PL +3261782016,3261783039,UA +3261783040,3261784063,GB +3261784064,3261796351,AT +3261796352,3261796607,GB +3261796608,3261796863,RU +3261796864,3261797119,PL +3261797120,3261797375,KR +3261797376,3261797631,AT +3261797632,3261797887,RU +3261797888,3261798143,TR +3261798144,3261798399,RU +3261798400,3261812735,AT +3261812736,3261812991,RU +3261812992,3261816575,AT +3261816576,3261816831,DE +3261816832,3261820927,AT +3261820928,3261821183,RO +3261821184,3261821439,AT +3261821440,3261821695,NL +3261821696,3261821951,SI +3261821952,3261822207,RU +3261822208,3261822463,UA +3261822464,3261822719,GB +3261822720,3261822975,SE +3261822976,3261823231,PL +3261823232,3261823743,NL +3261823744,3261823999,BE +3261824000,3261824255,PL +3261824256,3261824511,RU +3261824512,3261824767,FR +3261824768,3261825023,PT +3261825024,3261857791,AT +3261857792,3261867951,CZ +3261867952,3261867955,CR +3261867956,3261923327,CZ +3261923328,3261988863,NL +3261988864,3261989119,SE +3261989120,3261990399,FI +3261990656,3261993471,FI +3261993472,3261993727,RU +3261993728,3261995263,FI +3261995264,3261995519,DE +3261995520,3261995775,PL +3261995776,3261996031,FI +3261996032,3261996287,NL +3261996288,3262005247,FI +3262005760,3262006015,RU +3262006016,3262006271,NL +3262006272,3262006527,RO +3262006528,3262006783,FR +3262006784,3262007039,SE +3262007040,3262007295,IT +3262007296,3262007551,SA +3262007552,3262007807,GR +3262007808,3262008063,RO +3262008064,3262008319,GB +3262008320,3262008575,PT +3262008576,3262008831,PL +3262008832,3262009087,AT +3262009088,3262009343,UA +3262009344,3262013439,FI +3262013440,3262017535,SE +3262017536,3262018559,FI +3262018560,3262018815,PL +3262018816,3262021119,FI +3262021120,3262021375,UA +3262021376,3262021631,PL +3262021632,3262021887,CH +3262021888,3262022143,UA +3262022144,3262022911,FI +3262022912,3262023167,DE +3262023168,3262023679,FI +3262023680,3262023935,DK +3262023936,3262027263,FI +3262027264,3262027519,TR +3262027520,3262027775,BE +3262029824,3262030847,US +3262030848,3262031871,FR +3262031872,3262032383,FI +3262033920,3262034111,FI +3262034112,3262034119,AX +3262034120,3262034123,FI +3262034124,3262034127,AX +3262034128,3262034455,FI +3262034456,3262034463,AX +3262034464,3262034527,FI +3262034528,3262034559,AX +3262034560,3262034687,FI +3262034688,3262034719,AX +3262034720,3262034943,FI +3262034944,3262035455,AX +3262035456,3262035487,FI +3262035488,3262035519,AX +3262035520,3262036287,FI +3262036288,3262036303,AX +3262036304,3262036311,FI +3262036312,3262036335,AX +3262036336,3262036367,FI +3262036368,3262036383,AX +3262036384,3262036415,FI +3262036416,3262036431,AX +3262036432,3262036463,FI +3262036464,3262036479,AX +3262036480,3262036607,FI +3262036608,3262036615,AX +3262036616,3262036719,FI +3262036720,3262038015,AX +3262038016,3262038271,FR +3262038272,3262038527,RU +3262038528,3262038783,GB +3262038784,3262039039,NO +3262039040,3262039295,DE +3262039296,3262039551,GB +3262039552,3262039807,GR +3262039808,3262040063,SI +3262040064,3262040319,PL +3262040320,3262040575,ES +3262040576,3262040831,RU +3262040832,3262041087,GB +3262041088,3262041343,HU +3262041344,3262041599,BG +3262041600,3262041855,DK +3262041856,3262042367,FR +3262042368,3262042623,GB +3262042624,3262042879,UA +3262042880,3262043135,NL +3262043136,3262043391,RO +3262043392,3262043647,TR +3262043648,3262043903,NL +3262043904,3262044159,GB +3262044160,3262044415,CS +3262044416,3262044671,DE +3262044672,3262044927,GR +3262044928,3262045183,UA +3262045184,3262045439,LT +3262045440,3262045695,NL +3262045696,3262045951,SI +3262045952,3262046207,RU +3262046208,3262049279,FI +3262049280,3262049535,JO +3262049536,3262049791,GB +3262049792,3262050559,PL +3262050560,3262050815,GB +3262050816,3262051071,CH +3262051072,3262051583,GB +3262051584,3262051839,FR +3262051840,3262052351,DE +3262052352,3262052607,UA +3262052608,3262052863,IL +3262052864,3262053119,GB +3262053120,3262053375,RU +3262053376,3262053631,UA +3262053632,3262053887,RU +3262053888,3262054143,UA +3262054144,3262054399,RU +3262054400,3262099199,FI +3262099200,3262099455,NL +3262099456,3262108671,FI +3262108672,3262108927,RU +3262108928,3262114047,FI +3262114048,3262114303,SE +3262114304,3262115071,FI +3262115072,3262115327,RU +3262115328,3262119935,FI +3262119936,3262120447,AX +3262120448,3262120703,FI +3262120704,3262121599,AX +3262121600,3262121663,FI +3262121664,3262122007,AX +3262122008,3262122143,FI +3262122144,3262122159,AX +3262122160,3262122239,FI +3262122240,3262122367,AX +3262122368,3262122431,FI +3262122432,3262122455,AX +3262122456,3262122559,FI +3262122560,3262122591,AX +3262122592,3262122631,FI +3262122632,3262122639,AX +3262122640,3262124031,FI +3262124032,3262128127,DE +3262128128,3262136319,GB +3262137600,3262137855,DE +3262139392,3262140415,GB +3262140416,3262140671,DE +3262141184,3262141439,DE +3262141440,3262142463,ES +3262142464,3262142719,DE +3262143488,3262143743,GB +3262144000,3262144047,DE +3262145024,3262145279,DE +3262145552,3262145567,DE +3262145616,3262145631,DE +3262145664,3262145791,DE +3262146048,3262146815,DE +3262147072,3262147327,DE +3262147584,3262147839,DE +3262148608,3262148863,DE +3262148880,3262148919,DE +3262148928,3262149119,DE +3262149120,3262149151,FR +3262149152,3262149159,DE +3262149160,3262149167,GB +3262149168,3262149247,FR +3262149632,3262149887,DE +3262150912,3262151047,DE +3262151072,3262151103,DE +3262151136,3262151151,DE +3262151168,3262151423,DE +3262151936,3262152191,DE +3262152664,3262152671,DE +3262152704,3262185471,AT +3262185472,3262191615,DE +3262192128,3262197503,DE +3262197760,3262209535,DE +3262210048,3262222847,DE +3262223360,3262224895,DE +3262224896,3262225151,AT +3262225152,3262227711,DE +3262227712,3262227967,RO +3262227968,3262283775,DE +3262283776,3262284799,RU +3262284800,3262286847,UA +3262286848,3262287871,SE +3262287872,3262289919,PL +3262289920,3262316543,SE +3262316544,3262348799,DE +3262348800,3262349055,NL +3262349056,3262382079,DE +3262382080,3262414847,IT +3262414848,3262415359,DE +3262415360,3262416895,PL +3262416896,3262417407,RO +3262417408,3262417919,PL +3262417920,3262418431,RU +3262418432,3262419455,FR +3262419456,3262419967,NL +3262419968,3262420479,FR +3262420480,3262420991,CH +3262420992,3262421503,ES +3262421504,3262422015,DE +3262422016,3262422527,SE +3262422528,3262423039,AT +3262423040,3262423551,GB +3262423552,3262424063,UA +3262424064,3262424575,IT +3262424576,3262425087,FR +3262425088,3262425599,RO +3262425600,3262426111,UA +3262426112,3262426623,DE +3262426624,3262427135,GB +3262427136,3262427647,FR +3262427648,3262428159,DK +3262428160,3262428671,CH +3262428672,3262429183,PL +3262429184,3262429695,ES +3262429696,3262430207,DE +3262430208,3262430719,EE +3262430720,3262431231,RO +3262431232,3262431743,PL +3262431744,3262432255,UA +3262432256,3262432767,CH +3262432768,3262433279,GB +3262433280,3262433791,RO +3262433792,3262434303,FR +3262434304,3262434815,SI +3262434816,3262435839,DE +3262435840,3262436351,CH +3262436352,3262436863,SE +3262436864,3262437375,GB +3262437376,3262437887,RO +3262437888,3262438399,FR +3262438400,3262438911,NL +3262438912,3262439423,DK +3262439424,3262439935,AT +3262439936,3262440447,IL +3262440448,3262440959,UA +3262440960,3262441471,IL +3262441472,3262441983,UA +3262441984,3262442495,DE +3262442496,3262443007,RO +3262443008,3262443519,UA +3262443520,3262444031,ES +3262444032,3262444543,AT +3262444544,3262445055,UA +3262445056,3262445567,RO +3262445568,3262446079,PL +3262446080,3262446591,RU +3262446592,3262447103,PL +3262447104,3262447615,GB +3262447616,3262460415,PT +3262460416,3262460543,UA +3262460544,3262460671,RU +3262460672,3262460799,DK +3262460800,3262460927,GB +3262460928,3262461055,HU +3262461056,3262461183,DE +3262461184,3262461311,SN +3262461312,3262461439,NO +3262461440,3262461567,DE +3262461568,3262461695,GB +3262461696,3262461823,UA +3262461824,3262461951,RO +3262461952,3262463999,IQ +3262464000,3262472191,RU +3262472192,3262472207,DE +3262472208,3262472211,FR +3262472212,3262472215,DE +3262472216,3262472219,NL +3262472220,3262472223,AT +3262472224,3262472231,DE +3262472232,3262472235,AT +3262472236,3262472243,DE +3262472244,3262472247,FR +3262472248,3262472251,IT +3262472252,3262472267,DE +3262472268,3262472271,AT +3262472272,3262472275,IT +3262472276,3262472279,BE +3262472280,3262472291,DE +3262472292,3262472295,FR +3262472296,3262472311,DE +3262472312,3262472315,NL +3262472316,3262472331,DE +3262472332,3262472335,SE +3262472336,3262472339,US +3262472340,3262472351,DE +3262472352,3262472355,NL +3262472356,3262472359,ES +3262472360,3262472363,NL +3262472364,3262472367,GB +3262472368,3262472371,NL +3262472372,3262472375,FR +3262472376,3262472379,GB +3262472380,3262472387,DE +3262472388,3262472391,FR +3262472392,3262472395,GB +3262472396,3262472399,DE +3262472400,3262472403,NL +3262472404,3262472407,DE +3262472408,3262472411,US +3262472412,3262472415,DE +3262472416,3262472419,ES +3262472420,3262472423,DE +3262472424,3262472427,BE +3262472428,3262472431,CH +3262472432,3262472435,AE +3262472436,3262472443,DE +3262472444,3262472447,LU +3262472448,3262472459,DE +3262472460,3262472463,CH +3262472464,3262472467,DE +3262472468,3262472471,FR +3262472472,3262472479,DE +3262472480,3262472483,IT +3262472484,3262472495,DE +3262472496,3262472499,CH +3262472500,3262472511,DE +3262472512,3262472515,CA +3262472516,3262472519,GB +3262472520,3262472527,DE +3262472528,3262472531,CH +3262472532,3262472535,NL +3262472536,3262472539,DE +3262472540,3262472543,US +3262472544,3262472547,DE +3262472548,3262472551,NL +3262472552,3262472555,HU +3262472556,3262472563,DE +3262472564,3262472567,DK +3262472568,3262472575,DE +3262472576,3262472579,CA +3262472580,3262472583,AT +3262472584,3262472591,US +3262472592,3262472595,DE +3262472596,3262472599,CH +3262472600,3262472603,FR +3262472604,3262472607,CH +3262472608,3262472615,US +3262472616,3262472619,CA +3262472620,3262472623,TR +3262472624,3262472631,DE +3262472632,3262472635,ES +3262472636,3262472651,DE +3262472652,3262472655,FR +3262472656,3262472659,GB +3262472660,3262472663,IT +3262472664,3262472667,ES +3262472668,3262472675,DE +3262472676,3262472679,FR +3262472680,3262472683,CL +3262472684,3262472691,US +3262472692,3262472695,DE +3262472696,3262472699,IT +3262472700,3262472703,AT +3262472704,3262472707,US +3262472708,3262472711,DE +3262472712,3262472715,US +3262472716,3262472727,NL +3262472728,3262472735,DE +3262472736,3262472739,IT +3262472740,3262472743,PT +3262472744,3262472747,DE +3262472748,3262472751,GB +3262472752,3262472755,DE +3262472756,3262472759,PT +3262472760,3262472763,DE +3262472764,3262472767,CA +3262472768,3262472771,DE +3262472772,3262472775,US +3262472776,3262472779,DE +3262472780,3262472783,US +3262472784,3262472791,DE +3262472792,3262472795,GB +3262472796,3262472799,AT +3262472800,3262472807,DE +3262472808,3262472811,CH +3262472812,3262472819,DE +3262472820,3262472823,CH +3262472824,3262472827,US +3262472828,3262472835,DE +3262472836,3262472839,DK +3262472840,3262472843,DE +3262472844,3262472847,AT +3262472848,3262472851,DE +3262472852,3262472855,IT +3262472856,3262472859,FR +3262472860,3262472863,US +3262472864,3262472867,FR +3262472868,3262472871,GB +3262472872,3262472875,DE +3262472876,3262472879,FR +3262472880,3262472883,DE +3262472884,3262472891,CA +3262472892,3262472899,DE +3262472900,3262472903,AT +3262472904,3262472907,US +3262472908,3262472911,DE +3262472912,3262472915,IT +3262472916,3262472923,DE +3262472924,3262472927,IT +3262472928,3262472931,NL +3262472932,3262472935,LB +3262472936,3262472939,DE +3262472940,3262472943,CH +3262472944,3262472947,PT +3262472948,3262472951,LU +3262472952,3262472955,DE +3262472956,3262472959,CA +3262472960,3262472963,DE +3262472964,3262472967,AT +3262472968,3262472975,DE +3262472976,3262472979,LU +3262472980,3262472983,AT +3262472984,3262472987,PT +3262472988,3262472991,US +3262472992,3262472995,DE +3262472996,3262472999,FR +3262473000,3262473003,HU +3262473004,3262473007,NO +3262473008,3262473011,US +3262473012,3262473015,DE +3262473016,3262473019,AR +3262473020,3262473023,US +3262473024,3262473027,ES +3262473028,3262473031,BM +3262473032,3262473035,DE +3262473036,3262473039,IT +3262473040,3262473043,GB +3262473044,3262473047,US +3262473048,3262473051,DE +3262473052,3262473055,AT +3262473056,3262473075,DE +3262473076,3262473079,GB +3262473080,3262473083,DE +3262473084,3262473087,US +3262473088,3262473091,NL +3262473092,3262473099,DE +3262473100,3262473103,BE +3262473104,3262473107,DE +3262473108,3262473115,ES +3262473116,3262473119,DE +3262473120,3262473127,FR +3262473128,3262473135,DE +3262473136,3262473139,US +3262473140,3262473143,ES +3262473144,3262473151,DE +3262473152,3262473155,FR +3262473156,3262473159,IT +3262473160,3262473163,NL +3262473164,3262473167,CH +3262473168,3262473171,DE +3262473172,3262473175,US +3262473176,3262473195,DE +3262473196,3262473199,AT +3262473200,3262473203,ES +3262473204,3262473207,US +3262473208,3262473211,DE +3262473212,3262473215,FR +3262473216,3262473323,JP +3262473324,3262473327,KR +3262473328,3262473471,JP +3262473472,3262473473,DE +3262473474,3262473478,US +3262473479,3262473480,CA +3262473481,3262473483,US +3262473484,3262473484,VE +3262473485,3262473485,US +3262473486,3262473486,CA +3262473487,3262473516,US +3262473517,3262473517,CN +3262473518,3262473526,US +3262473527,3262473527,CN +3262473528,3262473538,US +3262473539,3262473539,DE +3262473540,3262473540,US +3262473541,3262473541,DE +3262473542,3262473543,US +3262473544,3262473544,CA +3262473545,3262473548,US +3262473549,3262473549,CA +3262473550,3262473557,US +3262473558,3262473558,DE +3262473559,3262473567,US +3262473568,3262473568,CA +3262473569,3262473570,US +3262473571,3262473571,DE +3262473572,3262473582,US +3262473583,3262473583,CA +3262473584,3262473586,US +3262473587,3262473587,CA +3262473588,3262473658,US +3262473659,3262473659,DE +3262473660,3262473663,US +3262473664,3262473664,CA +3262473665,3262473688,US +3262473689,3262473689,CA +3262473690,3262473691,AR +3262473692,3262473692,CA +3262473693,3262473729,DE +3262473730,3262473735,US +3262473736,3262473736,CA +3262473737,3262473771,US +3262473772,3262473772,DE +3262473773,3262473785,US +3262473786,3262473855,DE +3262473856,3262473859,US +3262473860,3262473903,DE +3262473904,3262473907,US +3262473908,3262473931,DE +3262473932,3262473935,US +3262473936,3262473963,DE +3262473964,3262473967,US +3262473968,3262473971,DE +3262473972,3262473983,US +3262473984,3262473985,DE +3262473986,3262473986,TW +3262473987,3262473987,IN +3262473988,3262473988,SG +3262473989,3262473989,IN +3262473990,3262473990,SG +3262473991,3262473991,DE +3262473992,3262473992,SG +3262473993,3262473993,IN +3262473994,3262473995,TW +3262473996,3262473996,MY +3262473997,3262473998,ID +3262473999,3262473999,TW +3262474000,3262474000,SG +3262474001,3262474001,TW +3262474002,3262474002,MY +3262474003,3262474003,TW +3262474004,3262474004,SG +3262474005,3262474005,TW +3262474006,3262474007,SG +3262474008,3262474009,TW +3262474010,3262474010,SG +3262474011,3262474011,ID +3262474012,3262474013,SG +3262474014,3262474014,HK +3262474015,3262474016,SG +3262474017,3262474018,MY +3262474019,3262474026,SG +3262474027,3262474027,CN +3262474028,3262474030,SG +3262474031,3262474031,IN +3262474032,3262474032,MY +3262474033,3262474033,SG +3262474034,3262474034,MY +3262474035,3262474035,SG +3262474036,3262474036,MY +3262474037,3262474037,SG +3262474038,3262474038,MY +3262474039,3262474039,TW +3262474040,3262474041,MY +3262474042,3262474042,CN +3262474043,3262474043,SG +3262474044,3262474044,GB +3262474045,3262474048,SG +3262474049,3262474049,IN +3262474050,3262474061,SG +3262474062,3262474063,CN +3262474064,3262474064,TW +3262474065,3262474065,IN +3262474066,3262474066,SG +3262474067,3262474067,MY +3262474068,3262474068,SG +3262474069,3262474069,MY +3262474070,3262474070,SG +3262474071,3262474071,TW +3262474072,3262474072,IN +3262474073,3262474075,SG +3262474076,3262474076,MY +3262474077,3262474077,SG +3262474078,3262474078,IN +3262474079,3262474079,MY +3262474080,3262474083,SG +3262474084,3262474084,TW +3262474085,3262474087,SG +3262474088,3262474088,MY +3262474089,3262474089,SG +3262474090,3262474091,MY +3262474092,3262474094,SG +3262474095,3262474095,HK +3262474096,3262474097,SG +3262474098,3262474098,MY +3262474099,3262474102,SG +3262474103,3262474103,MY +3262474104,3262474104,CN +3262474105,3262474105,IN +3262474106,3262474106,MY +3262474107,3262474107,CN +3262474108,3262474108,HK +3262474109,3262474110,MY +3262474111,3262474111,TH +3262474112,3262474112,SG +3262474113,3262474113,PH +3262474114,3262474114,IN +3262474115,3262474115,SG +3262474116,3262474116,TW +3262474117,3262474117,IN +3262474118,3262474118,TH +3262474119,3262474119,TW +3262474120,3262474120,BN +3262474121,3262474121,TW +3262474122,3262474122,SG +3262474123,3262474125,MY +3262474126,3262474126,IN +3262474127,3262474128,SG +3262474129,3262474130,MY +3262474131,3262474131,IN +3262474132,3262474133,MY +3262474134,3262474134,CN +3262474135,3262474136,SG +3262474137,3262474137,TW +3262474138,3262474139,CN +3262474140,3262474140,TW +3262474141,3262474142,SG +3262474143,3262474143,PH +3262474144,3262474150,SG +3262474151,3262474151,MY +3262474152,3262474152,SG +3262474153,3262474153,IN +3262474154,3262474154,SG +3262474155,3262474155,MY +3262474156,3262474156,IN +3262474157,3262474157,SG +3262474158,3262474159,MY +3262474160,3262474162,SG +3262474163,3262474163,MY +3262474164,3262474164,IN +3262474165,3262474165,CN +3262474166,3262474166,SG +3262474167,3262474167,HK +3262474168,3262474168,TW +3262474169,3262474169,DE +3262474170,3262474170,SG +3262474171,3262474171,MY +3262474172,3262474172,SG +3262474173,3262474173,CN +3262474174,3262474174,TW +3262474175,3262474175,SG +3262474176,3262474176,MY +3262474177,3262474177,SG +3262474178,3262474178,TW +3262474179,3262474179,CN +3262474180,3262474180,MY +3262474181,3262474181,SG +3262474182,3262474182,MY +3262474183,3262474185,SG +3262474186,3262474186,MY +3262474187,3262474187,SG +3262474188,3262474188,MY +3262474189,3262474189,SG +3262474190,3262474190,CN +3262474191,3262474192,SG +3262474193,3262474193,PH +3262474194,3262474194,SG +3262474195,3262474195,MY +3262474196,3262474196,IN +3262474197,3262474198,SG +3262474199,3262474199,CN +3262474200,3262474200,MY +3262474201,3262474201,SG +3262474202,3262474203,CN +3262474204,3262474204,IN +3262474205,3262474205,SG +3262474206,3262474206,IN +3262474207,3262474207,MY +3262474208,3262474208,SG +3262474209,3262474209,MY +3262474210,3262474210,TW +3262474211,3262474211,SG +3262474212,3262474212,MY +3262474213,3262474213,SG +3262474214,3262474214,CN +3262474215,3262474215,IN +3262474216,3262474216,SG +3262474217,3262474217,MY +3262474218,3262474218,SG +3262474219,3262474219,MY +3262474220,3262474222,IN +3262474223,3262474223,SG +3262474224,3262474224,MY +3262474225,3262474225,SG +3262474226,3262474226,MY +3262474227,3262474227,IN +3262474228,3262474228,SG +3262474229,3262474230,IN +3262474231,3262474231,SG +3262474232,3262474234,IN +3262474235,3262474236,MY +3262474237,3262474238,SG +3262474239,3262474239,DE +3262474240,3262474255,AU +3262474256,3262474259,NZ +3262474260,3262474263,AU +3262474264,3262474267,NZ +3262474268,3262474271,AU +3262474272,3262474275,NZ +3262474276,3262474367,AU +3262474368,3262474371,NZ +3262474372,3262474395,AU +3262474396,3262474399,NZ +3262474400,3262474463,AU +3262474464,3262474467,NZ +3262474468,3262474495,AU +3262474496,3262474631,DE +3262474632,3262474635,DK +3262474636,3262474791,DE +3262474792,3262474815,JP +3262474816,3262474895,DE +3262474896,3262475007,JP +3262475008,3262475009,DE +3262475010,3262475023,US +3262475024,3262475024,CO +3262475025,3262475025,US +3262475026,3262475027,DE +3262475028,3262475029,US +3262475030,3262475033,DE +3262475034,3262475036,US +3262475037,3262475037,DE +3262475038,3262475042,US +3262475043,3262475043,DE +3262475044,3262475044,US +3262475045,3262475045,BR +3262475046,3262475065,US +3262475066,3262475068,MX +3262475069,3262475072,US +3262475073,3262475075,BR +3262475076,3262475076,US +3262475077,3262475077,BR +3262475078,3262475079,US +3262475080,3262475080,CA +3262475081,3262475081,US +3262475082,3262475082,BR +3262475083,3262475083,US +3262475084,3262475084,MX +3262475085,3262475085,BR +3262475086,3262475087,US +3262475088,3262475088,BR +3262475089,3262475090,US +3262475091,3262475092,DE +3262475093,3262475094,BR +3262475095,3262475095,MX +3262475096,3262475140,US +3262475141,3262475141,BR +3262475142,3262475167,US +3262475168,3262475168,DE +3262475169,3262475174,US +3262475175,3262475175,DE +3262475176,3262475185,US +3262475186,3262475186,DE +3262475187,3262475189,US +3262475190,3262475190,MX +3262475191,3262475191,BR +3262475192,3262475192,MX +3262475193,3262475201,US +3262475202,3262475205,BR +3262475206,3262475209,US +3262475210,3262475210,BR +3262475211,3262475213,US +3262475214,3262475214,DE +3262475215,3262475222,US +3262475223,3262475263,DE +3262475264,3262475267,MU +3262475268,3262475271,US +3262475272,3262475275,IT +3262475276,3262475279,US +3262475280,3262475283,DE +3262475284,3262475287,NL +3262475288,3262475295,DE +3262475296,3262475303,NL +3262475304,3262475307,FR +3262475308,3262475311,AR +3262475312,3262475315,FR +3262475316,3262475319,SE +3262475320,3262475323,DE +3262475324,3262475327,MX +3262475328,3262475331,US +3262475332,3262475335,BR +3262475336,3262475339,DE +3262475340,3262475343,FR +3262475344,3262475347,CH +3262475348,3262475351,DE +3262475352,3262475355,ES +3262475356,3262475359,DE +3262475360,3262475363,IT +3262475364,3262475367,DE +3262475368,3262475371,FR +3262475372,3262475375,NL +3262475376,3262475383,DE +3262475384,3262475387,US +3262475388,3262475395,AT +3262475396,3262475399,NL +3262475400,3262475403,US +3262475404,3262475407,SE +3262475408,3262475415,DE +3262475416,3262475419,CH +3262475420,3262475423,DE +3262475424,3262475427,US +3262475428,3262475431,ES +3262475432,3262475435,IT +3262475436,3262475439,GB +3262475440,3262475443,DE +3262475444,3262475447,US +3262475448,3262475451,FR +3262475452,3262475459,DE +3262475460,3262475463,FR +3262475464,3262475467,DE +3262475468,3262475471,ES +3262475472,3262475475,DE +3262475476,3262475479,ES +3262475480,3262475483,US +3262475484,3262475487,IT +3262475488,3262475491,MX +3262475492,3262475495,CH +3262475496,3262475499,NL +3262475500,3262475503,DE +3262475504,3262475507,FR +3262475508,3262475511,DE +3262475512,3262475515,US +3262475516,3262475519,DE +3262475520,3262475527,US +3262475528,3262475531,DE +3262475532,3262475559,US +3262475560,3262475575,DE +3262475576,3262475591,US +3262475592,3262475595,BR +3262475596,3262475607,US +3262475608,3262475611,IE +3262475612,3262475631,DE +3262475632,3262475635,US +3262475636,3262475639,DE +3262475640,3262475683,US +3262475684,3262475687,BR +3262475688,3262475691,DE +3262475692,3262475695,BR +3262475696,3262475715,US +3262475716,3262475719,DE +3262475720,3262475723,BR +3262475724,3262475775,US +3262475776,3262475783,DE +3262475784,3262475787,BE +3262475788,3262475791,DE +3262475792,3262475807,AE +3262475808,3262475811,US +3262475812,3262475815,IE +3262475816,3262475819,FR +3262475820,3262475823,DE +3262475824,3262475839,RO +3262475840,3262475855,DE +3262475856,3262475871,TR +3262475872,3262475875,BE +3262475876,3262475879,NL +3262475880,3262475883,PL +3262475884,3262475887,BE +3262475888,3262475891,DE +3262475892,3262475895,SA +3262475896,3262475903,CY +3262475904,3262475919,GR +3262475920,3262475935,DE +3262475936,3262475951,FR +3262475952,3262475963,US +3262475964,3262475967,HU +3262475968,3262475975,DE +3262475976,3262475983,BG +3262475984,3262475991,SG +3262475992,3262476015,DE +3262476016,3262476019,ES +3262476020,3262476023,FR +3262476024,3262476027,DE +3262476028,3262476031,FR +3262476032,3262476039,DE +3262476040,3262476043,CH +3262476044,3262476047,DE +3262476048,3262476055,IL +3262476056,3262476059,PE +3262476060,3262476063,US +3262476064,3262476067,DE +3262476068,3262476071,PL +3262476072,3262476075,US +3262476076,3262476079,DE +3262476080,3262476083,FR +3262476084,3262476087,DE +3262476088,3262476091,DK +3262476092,3262476095,NL +3262476096,3262476103,US +3262476104,3262476107,DE +3262476108,3262476111,BE +3262476112,3262476115,NL +3262476116,3262476119,DE +3262476120,3262476123,FR +3262476124,3262476127,DE +3262476128,3262476131,GB +3262476132,3262476135,AR +3262476136,3262476139,US +3262476140,3262476143,BE +3262476144,3262476147,CH +3262476148,3262476155,US +3262476156,3262476159,BE +3262476160,3262476163,GR +3262476164,3262476171,DE +3262476172,3262476175,GB +3262476176,3262476179,ES +3262476180,3262476183,DE +3262476184,3262476187,AT +3262476188,3262476191,PT +3262476192,3262476195,DE +3262476196,3262476199,US +3262476200,3262476203,GB +3262476204,3262476207,NA +3262476208,3262476211,US +3262476212,3262476215,CL +3262476216,3262476223,FR +3262476224,3262476227,GR +3262476228,3262476231,SE +3262476232,3262476235,FR +3262476236,3262476239,US +3262476240,3262476243,IT +3262476244,3262476247,ES +3262476248,3262476251,NL +3262476252,3262476255,DE +3262476256,3262476259,US +3262476260,3262476267,DE +3262476268,3262476271,US +3262476272,3262476275,DE +3262476276,3262476279,CA +3262476280,3262476283,BE +3262476284,3262476291,DE +3262476292,3262476295,ZA +3262476296,3262476299,US +3262476300,3262476303,DO +3262476304,3262476307,US +3262476308,3262476315,DE +3262476316,3262476319,BE +3262476320,3262476323,DE +3262476324,3262476327,IT +3262476328,3262476331,NL +3262476332,3262476339,DE +3262476340,3262476343,ES +3262476344,3262476347,DE +3262476348,3262476351,AT +3262476352,3262476355,AR +3262476356,3262476363,US +3262476364,3262476367,PT +3262476368,3262476371,US +3262476372,3262476375,DE +3262476376,3262476387,US +3262476388,3262476391,SK +3262476392,3262476395,DE +3262476396,3262476399,AT +3262476400,3262476403,ES +3262476404,3262476411,DE +3262476412,3262476415,US +3262476416,3262476419,DE +3262476420,3262476423,CH +3262476424,3262476427,ES +3262476428,3262476431,US +3262476432,3262476435,IT +3262476436,3262476439,AT +3262476440,3262476443,DE +3262476444,3262476447,AT +3262476448,3262476455,DE +3262476456,3262476459,CA +3262476460,3262476463,DK +3262476464,3262476467,SK +3262476468,3262476471,IT +3262476472,3262476475,CA +3262476476,3262476483,US +3262476484,3262476487,DE +3262476488,3262476491,US +3262476492,3262476495,BE +3262476496,3262476499,US +3262476500,3262476503,DE +3262476504,3262476507,CH +3262476508,3262476511,DE +3262476512,3262476515,US +3262476516,3262476519,DE +3262476520,3262476523,GB +3262476524,3262476527,MX +3262476528,3262476531,DE +3262476532,3262476535,IL +3262476536,3262476539,US +3262476540,3262476543,DE +3262476544,3262476547,DK +3262476548,3262476551,AR +3262476552,3262476555,IT +3262476556,3262476559,FR +3262476560,3262476567,DE +3262476568,3262476571,US +3262476572,3262476575,DE +3262476576,3262476587,US +3262476588,3262476591,ES +3262476592,3262476595,GB +3262476596,3262476603,DE +3262476604,3262476607,NL +3262476608,3262476611,SK +3262476612,3262476615,GB +3262476616,3262476619,TR +3262476620,3262476623,NL +3262476624,3262476627,US +3262476628,3262476635,DE +3262476636,3262476639,DK +3262476640,3262476643,DE +3262476644,3262476647,ZA +3262476648,3262476651,US +3262476652,3262476655,FR +3262476656,3262476667,US +3262476668,3262476671,GB +3262476672,3262476675,SE +3262476676,3262476679,AT +3262476680,3262476683,NL +3262476684,3262476687,IT +3262476688,3262476691,DE +3262476692,3262476695,FR +3262476696,3262476699,ES +3262476700,3262476707,DE +3262476708,3262476715,US +3262476716,3262476719,FR +3262476720,3262476723,IT +3262476724,3262476727,FR +3262476728,3262476731,US +3262476732,3262476735,DE +3262476736,3262476739,CA +3262476740,3262476743,DE +3262476744,3262476747,CH +3262476748,3262476751,BE +3262476752,3262476755,ES +3262476756,3262476759,DE +3262476760,3262476763,US +3262476764,3262476767,ES +3262476768,3262476771,DK +3262476772,3262476779,US +3262476780,3262476783,DE +3262476784,3262476787,IT +3262476788,3262476791,US +3262476792,3262476795,ES +3262476796,3262476799,DE +3262476800,3262476803,CA +3262476804,3262476807,TR +3262476808,3262476827,DE +3262476828,3262476831,LU +3262476832,3262476839,DE +3262476840,3262476843,IT +3262476844,3262476847,DE +3262476848,3262476851,CH +3262476852,3262476855,US +3262476856,3262476859,ES +3262476860,3262476863,DE +3262476864,3262476867,US +3262476868,3262476883,DE +3262476884,3262476887,FR +3262476888,3262476891,DE +3262476892,3262476895,HU +3262476896,3262476899,SK +3262476900,3262476903,FR +3262476904,3262476907,DE +3262476908,3262476911,NL +3262476912,3262476915,CH +3262476916,3262476919,DE +3262476920,3262476923,US +3262476924,3262476927,AT +3262476928,3262476935,DE +3262476936,3262476939,AT +3262476940,3262476951,DE +3262476952,3262476955,NL +3262476956,3262476971,DE +3262476972,3262476975,US +3262476976,3262476979,BE +3262476980,3262476983,DE +3262476984,3262476987,FR +3262476988,3262476995,DE +3262476996,3262476999,IT +3262477000,3262477003,GB +3262477004,3262477007,DE +3262477008,3262477011,CA +3262477012,3262477015,DE +3262477016,3262477019,CH +3262477020,3262477023,DE +3262477024,3262477035,FR +3262477036,3262477039,DK +3262477040,3262477043,US +3262477044,3262477047,GB +3262477048,3262477059,DE +3262477060,3262477063,US +3262477064,3262477067,DE +3262477068,3262477071,AT +3262477072,3262477075,PT +3262477076,3262477083,FR +3262477084,3262477087,NL +3262477088,3262477091,DE +3262477092,3262477095,BE +3262477096,3262477107,DE +3262477108,3262477111,ES +3262477112,3262477131,DE +3262477132,3262477135,SK +3262477136,3262477147,DE +3262477148,3262477151,FR +3262477152,3262477155,CH +3262477156,3262477159,ES +3262477160,3262477163,US +3262477164,3262477167,FR +3262477168,3262477171,NL +3262477172,3262477175,DE +3262477176,3262477187,US +3262477188,3262477191,IT +3262477192,3262477195,GB +3262477196,3262477199,PL +3262477200,3262477203,GB +3262477204,3262477207,US +3262477208,3262477211,ES +3262477212,3262477215,AT +3262477216,3262477219,US +3262477220,3262477223,KW +3262477224,3262477227,BE +3262477228,3262477231,GB +3262477232,3262477239,DE +3262477240,3262477243,CA +3262477244,3262477247,US +3262477248,3262477251,AR +3262477252,3262477255,ES +3262477256,3262477259,DE +3262477260,3262477263,GB +3262477264,3262477267,GR +3262477268,3262477271,NL +3262477272,3262477275,US +3262477276,3262477279,NL +3262477280,3262477283,DE +3262477284,3262477287,FR +3262477288,3262477291,BM +3262477292,3262477295,US +3262477296,3262477299,DK +3262477300,3262477303,IT +3262477304,3262477307,FR +3262477308,3262477311,DE +3262477312,3262477315,ES +3262477316,3262477319,HU +3262477320,3262477327,US +3262477328,3262477331,HU +3262477332,3262477335,DE +3262477336,3262477339,CA +3262477340,3262477343,US +3262477344,3262477347,CH +3262477348,3262477355,DE +3262477356,3262477359,PL +3262477360,3262477363,LU +3262477364,3262477367,ES +3262477368,3262477371,US +3262477372,3262477375,FR +3262477376,3262477379,AT +3262477380,3262477383,US +3262477384,3262477387,FR +3262477388,3262477399,DE +3262477400,3262477403,CH +3262477404,3262477407,DE +3262477408,3262477411,US +3262477412,3262477415,SA +3262477416,3262477419,DK +3262477420,3262477427,DE +3262477428,3262477431,US +3262477432,3262477439,DE +3262477440,3262477443,CH +3262477444,3262477447,BE +3262477448,3262477451,AR +3262477452,3262477455,PT +3262477456,3262477467,DE +3262477468,3262477471,AT +3262477472,3262477475,HU +3262477476,3262477479,FR +3262477480,3262477483,SE +3262477484,3262477487,NL +3262477488,3262477499,DE +3262477500,3262477503,ES +3262477504,3262477507,FR +3262477508,3262477511,CH +3262477512,3262477519,US +3262477520,3262477523,DE +3262477524,3262477527,IT +3262477528,3262477543,DE +3262477544,3262477547,US +3262477548,3262477551,BE +3262477552,3262477555,BR +3262477556,3262477559,US +3262477560,3262477563,CA +3262477564,3262477571,BE +3262477572,3262477575,NL +3262477576,3262477579,DE +3262477580,3262477583,NO +3262477584,3262477587,CA +3262477588,3262477591,FR +3262477592,3262477595,GB +3262477596,3262477599,CH +3262477600,3262477603,NL +3262477604,3262477607,IT +3262477608,3262477611,DE +3262477612,3262477615,US +3262477616,3262477619,IT +3262477620,3262477623,DE +3262477624,3262477627,FR +3262477628,3262477631,CH +3262477632,3262477635,AT +3262477636,3262477639,VE +3262477640,3262477643,DE +3262477644,3262477647,GB +3262477648,3262477655,DE +3262477656,3262477659,NL +3262477660,3262477671,US +3262477672,3262477675,NL +3262477676,3262477687,DE +3262477688,3262477691,FR +3262477692,3262477695,DE +3262477696,3262477699,NL +3262477700,3262477703,FR +3262477704,3262477707,IT +3262477708,3262477711,GB +3262477712,3262477727,DE +3262477728,3262477731,AT +3262477732,3262477735,NL +3262477736,3262477739,BR +3262477740,3262477743,NL +3262477744,3262477751,CH +3262477752,3262477759,DE +3262477760,3262477763,US +3262477764,3262477767,VE +3262477768,3262477771,DE +3262477772,3262477775,CA +3262477776,3262477779,CZ +3262477780,3262477783,GB +3262477784,3262477787,DE +3262477788,3262477791,US +3262477792,3262477795,GB +3262477796,3262477799,FR +3262477800,3262477803,BE +3262477804,3262477807,CH +3262477808,3262477811,CA +3262477812,3262477819,US +3262477820,3262477823,DE +3262477824,3262477827,GB +3262477828,3262477831,US +3262477832,3262477835,CH +3262477836,3262477839,ES +3262477840,3262477843,GB +3262477844,3262477847,DE +3262477848,3262477851,GB +3262477852,3262477855,DE +3262477856,3262477859,CA +3262477860,3262477863,US +3262477864,3262477867,TR +3262477868,3262477871,HU +3262477872,3262477883,DE +3262477884,3262477891,US +3262477892,3262477895,IT +3262477896,3262477899,US +3262477900,3262477903,DE +3262477904,3262477907,GB +3262477908,3262477911,CH +3262477912,3262477915,US +3262477916,3262477919,DE +3262477920,3262477923,US +3262477924,3262477927,HU +3262477928,3262477931,DE +3262477932,3262477935,US +3262477936,3262477939,DE +3262477940,3262477943,CA +3262477944,3262477955,DE +3262477956,3262477959,US +3262477960,3262477963,CA +3262477964,3262477967,DE +3262477968,3262477971,IT +3262477972,3262477987,DE +3262477988,3262477991,NL +3262477992,3262477999,DE +3262478000,3262478003,US +3262478004,3262478007,FR +3262478008,3262478011,IT +3262478012,3262478015,PE +3262478016,3262478019,CH +3262478020,3262478027,DE +3262478028,3262478031,SE +3262478032,3262478035,AT +3262478036,3262478039,DE +3262478040,3262478043,NL +3262478044,3262478047,IS +3262478048,3262478055,DE +3262478056,3262478063,CH +3262478064,3262478067,DE +3262478068,3262478071,KE +3262478072,3262478081,DE +3262478082,3262478082,ES +3262478083,3262478083,SA +3262478084,3262478084,TR +3262478085,3262478085,FR +3262478086,3262478088,DE +3262478089,3262478089,AT +3262478090,3262478090,DE +3262478091,3262478091,HU +3262478092,3262478092,PT +3262478093,3262478093,SA +3262478094,3262478094,PT +3262478095,3262478095,DE +3262478096,3262478096,PL +3262478097,3262478097,KE +3262478098,3262478098,TR +3262478099,3262478099,DE +3262478100,3262478100,TR +3262478101,3262478101,ZW +3262478102,3262478102,TR +3262478103,3262478103,DE +3262478104,3262478104,TR +3262478105,3262478105,PL +3262478106,3262478106,IT +3262478107,3262478107,TR +3262478108,3262478108,DE +3262478109,3262478109,AE +3262478110,3262478110,PT +3262478111,3262478113,DE +3262478114,3262478114,TR +3262478115,3262478115,DE +3262478116,3262478116,NO +3262478117,3262478117,NA +3262478118,3262478118,DE +3262478119,3262478119,SA +3262478120,3262478120,NA +3262478121,3262478121,AO +3262478122,3262478122,NA +3262478123,3262478123,CY +3262478124,3262478124,DE +3262478125,3262478125,PT +3262478126,3262478126,CY +3262478127,3262478127,GR +3262478128,3262478128,CH +3262478129,3262478129,HU +3262478130,3262478130,FR +3262478131,3262478131,SK +3262478132,3262478132,ES +3262478133,3262478133,TR +3262478134,3262478134,ES +3262478135,3262478135,TR +3262478136,3262478137,HU +3262478138,3262478138,TR +3262478139,3262478139,MZ +3262478140,3262478140,FR +3262478141,3262478143,TR +3262478144,3262478145,DE +3262478146,3262478146,GR +3262478147,3262478147,FR +3262478148,3262478148,KZ +3262478149,3262478149,UA +3262478150,3262478150,SA +3262478151,3262478151,DE +3262478152,3262478152,PL +3262478153,3262478153,TR +3262478154,3262478154,FR +3262478155,3262478155,CU +3262478156,3262478156,TR +3262478157,3262478157,DE +3262478158,3262478158,IT +3262478159,3262478159,IL +3262478160,3262478160,TR +3262478161,3262478161,ZW +3262478162,3262478162,SA +3262478163,3262478163,FR +3262478164,3262478164,ZW +3262478165,3262478165,SK +3262478166,3262478166,TR +3262478167,3262478167,KZ +3262478168,3262478168,ES +3262478169,3262478169,PL +3262478170,3262478171,FR +3262478172,3262478172,GR +3262478173,3262478174,TR +3262478175,3262478175,DE +3262478176,3262478176,TR +3262478177,3262478177,DE +3262478178,3262478178,MZ +3262478179,3262478180,TR +3262478181,3262478181,CN +3262478182,3262478182,ES +3262478183,3262478183,PL +3262478184,3262478184,MZ +3262478185,3262478185,PL +3262478186,3262478186,ES +3262478187,3262478187,PT +3262478188,3262478188,TR +3262478189,3262478189,NA +3262478190,3262478190,DE +3262478191,3262478192,ZA +3262478193,3262478194,NA +3262478195,3262478207,DE +3262478208,3262478211,ES +3262478212,3262478215,NL +3262478216,3262478219,FR +3262478220,3262478223,SE +3262478224,3262478227,GB +3262478228,3262478231,ES +3262478232,3262478235,FR +3262478236,3262478239,IT +3262478240,3262478243,FR +3262478244,3262478247,DE +3262478248,3262478251,IT +3262478252,3262478255,CH +3262478256,3262478259,ES +3262478260,3262478263,DE +3262478264,3262478267,IT +3262478268,3262478271,ES +3262478272,3262478275,CH +3262478276,3262478299,DE +3262478300,3262478303,ES +3262478304,3262478307,PT +3262478308,3262478311,ES +3262478312,3262478315,DE +3262478316,3262478319,BE +3262478320,3262478323,GB +3262478324,3262478327,BE +3262478328,3262478331,ES +3262478332,3262478335,GB +3262478336,3262478337,DE +3262478338,3262478338,PL +3262478339,3262478343,DE +3262478344,3262478344,IT +3262478345,3262478345,CH +3262478346,3262478346,PT +3262478347,3262478347,AO +3262478348,3262478348,DK +3262478349,3262478349,BE +3262478350,3262478350,AT +3262478351,3262478351,TR +3262478352,3262478352,CH +3262478353,3262478353,DK +3262478354,3262478354,FR +3262478355,3262478355,DE +3262478356,3262478356,FR +3262478357,3262478358,DE +3262478359,3262478360,FR +3262478361,3262478361,DE +3262478362,3262478362,FR +3262478363,3262478363,CH +3262478364,3262478364,PT +3262478365,3262478366,DE +3262478367,3262478367,HU +3262478368,3262478368,DE +3262478369,3262478369,NO +3262478370,3262478370,CH +3262478371,3262478371,DE +3262478372,3262478373,CH +3262478374,3262478374,PT +3262478375,3262478376,FR +3262478377,3262478377,DE +3262478378,3262478378,CH +3262478379,3262478379,DE +3262478380,3262478381,FR +3262478382,3262478382,AE +3262478383,3262478383,DE +3262478384,3262478384,AE +3262478385,3262478385,ZA +3262478386,3262478386,DE +3262478387,3262478387,IT +3262478388,3262478388,GR +3262478389,3262478389,CH +3262478390,3262478390,ES +3262478391,3262478391,HU +3262478392,3262478393,DE +3262478394,3262478394,IT +3262478395,3262478396,DE +3262478397,3262478397,PT +3262478398,3262478398,HU +3262478399,3262478399,DE +3262478400,3262478400,GB +3262478401,3262478401,DE +3262478402,3262478402,IT +3262478403,3262478403,CZ +3262478404,3262478404,FI +3262478405,3262478406,GB +3262478407,3262478412,DE +3262478413,3262478413,ES +3262478414,3262478414,PL +3262478415,3262478415,SE +3262478416,3262478416,SA +3262478417,3262478417,DE +3262478418,3262478418,AT +3262478419,3262478419,FR +3262478420,3262478421,DE +3262478422,3262478422,CH +3262478423,3262478423,SA +3262478424,3262478424,FR +3262478425,3262478425,IT +3262478426,3262478426,NO +3262478427,3262478428,FR +3262478429,3262478429,PT +3262478430,3262478430,CH +3262478431,3262478431,HU +3262478432,3262478432,RE +3262478433,3262478433,AT +3262478434,3262478434,PT +3262478435,3262478435,IT +3262478436,3262478437,DE +3262478438,3262478438,ZA +3262478439,3262478439,DE +3262478440,3262478440,SE +3262478441,3262478441,FR +3262478442,3262478442,IT +3262478443,3262478443,DE +3262478444,3262478444,AT +3262478445,3262478445,PT +3262478446,3262478447,DE +3262478448,3262478448,ZA +3262478449,3262478449,DE +3262478450,3262478450,TR +3262478451,3262478451,FR +3262478452,3262478452,IL +3262478453,3262478453,DE +3262478454,3262478454,SE +3262478455,3262478455,IT +3262478456,3262478456,DE +3262478457,3262478457,GB +3262478458,3262478458,HU +3262478459,3262478459,ES +3262478460,3262478460,CY +3262478461,3262478465,DE +3262478466,3262478466,FR +3262478467,3262478467,HU +3262478468,3262478468,DE +3262478469,3262478469,FR +3262478470,3262478470,DE +3262478471,3262478471,ES +3262478472,3262478472,DE +3262478473,3262478473,FR +3262478474,3262478474,HU +3262478475,3262478476,DE +3262478477,3262478478,CH +3262478479,3262478479,DK +3262478480,3262478480,DE +3262478481,3262478481,DK +3262478482,3262478482,IT +3262478483,3262478483,FR +3262478484,3262478484,DE +3262478485,3262478485,CH +3262478486,3262478487,FR +3262478488,3262478488,HU +3262478489,3262478489,HR +3262478490,3262478490,SE +3262478491,3262478491,DE +3262478492,3262478492,CH +3262478493,3262478493,DE +3262478494,3262478494,FR +3262478495,3262478495,DE +3262478496,3262478496,PT +3262478497,3262478500,DE +3262478501,3262478501,CH +3262478502,3262478502,SE +3262478503,3262478503,ZA +3262478504,3262478504,FR +3262478505,3262478505,IT +3262478506,3262478506,PT +3262478507,3262478507,IT +3262478508,3262478508,PT +3262478509,3262478509,NL +3262478510,3262478513,DE +3262478514,3262478514,SE +3262478515,3262478515,PT +3262478516,3262478516,ES +3262478517,3262478519,DE +3262478520,3262478520,CH +3262478521,3262478521,NL +3262478522,3262478522,QA +3262478523,3262478523,FR +3262478524,3262478524,ES +3262478525,3262478526,DE +3262478527,3262478527,ES +3262478528,3262478528,NL +3262478529,3262478529,ES +3262478530,3262478530,DE +3262478531,3262478531,FR +3262478532,3262478536,DE +3262478537,3262478537,HU +3262478538,3262478538,DE +3262478539,3262478539,FI +3262478540,3262478540,HU +3262478541,3262478542,DE +3262478543,3262478543,AT +3262478544,3262478544,NL +3262478545,3262478546,DE +3262478547,3262478547,FR +3262478548,3262478548,ES +3262478549,3262478549,FR +3262478550,3262478550,DE +3262478551,3262478551,PL +3262478552,3262478552,HU +3262478553,3262478553,PL +3262478554,3262478554,SE +3262478555,3262478555,DE +3262478556,3262478556,GB +3262478557,3262478557,DE +3262478558,3262478558,IT +3262478559,3262478560,DE +3262478561,3262478562,FR +3262478563,3262478563,DK +3262478564,3262478564,RU +3262478565,3262478566,FR +3262478567,3262478567,HU +3262478568,3262478568,DE +3262478569,3262478569,TR +3262478570,3262478570,FR +3262478571,3262478594,DE +3262478595,3262478595,CH +3262478596,3262478596,PT +3262478597,3262478597,SE +3262478598,3262478599,DE +3262478600,3262478600,IT +3262478601,3262478601,KW +3262478602,3262478602,FR +3262478603,3262478604,DE +3262478605,3262478605,ES +3262478606,3262478606,FI +3262478607,3262478607,GR +3262478608,3262478608,DE +3262478609,3262478609,IT +3262478610,3262478610,ES +3262478611,3262478611,HU +3262478612,3262478620,DE +3262478621,3262478621,SE +3262478622,3262478622,TR +3262478623,3262478623,ES +3262478624,3262478624,FR +3262478625,3262478625,DE +3262478626,3262478626,HU +3262478627,3262478627,DE +3262478628,3262478628,HU +3262478629,3262478629,DE +3262478630,3262478630,FR +3262478631,3262478631,PL +3262478632,3262478632,AN +3262478633,3262478633,AT +3262478634,3262478634,ES +3262478635,3262478635,SA +3262478636,3262478636,CH +3262478637,3262478637,GB +3262478638,3262478639,DE +3262478640,3262478640,PT +3262478641,3262478641,DE +3262478642,3262478642,CH +3262478643,3262478643,DE +3262478644,3262478644,ES +3262478645,3262478645,DE +3262478646,3262478646,AT +3262478647,3262478647,FR +3262478648,3262478648,PT +3262478649,3262478649,CZ +3262478650,3262478650,ES +3262478651,3262478651,FR +3262478652,3262478653,ES +3262478654,3262478655,DE +3262478656,3262478656,PL +3262478657,3262478657,DE +3262478658,3262478658,ES +3262478659,3262478659,DE +3262478660,3262478660,SK +3262478661,3262478661,BE +3262478662,3262478662,TR +3262478663,3262478663,AT +3262478664,3262478664,ES +3262478665,3262478665,DK +3262478666,3262478666,AT +3262478667,3262478667,DE +3262478668,3262478668,IT +3262478669,3262478670,DE +3262478671,3262478671,FR +3262478672,3262478673,DE +3262478674,3262478674,SK +3262478675,3262478675,PL +3262478676,3262478676,CH +3262478677,3262478677,HU +3262478678,3262478678,IT +3262478679,3262478679,FR +3262478680,3262478680,GB +3262478681,3262478681,ES +3262478682,3262478682,CH +3262478683,3262478683,IT +3262478684,3262478684,BE +3262478685,3262478685,DE +3262478686,3262478686,FR +3262478687,3262478687,ES +3262478688,3262478688,TR +3262478689,3262478689,GB +3262478690,3262478690,AT +3262478691,3262478691,CH +3262478692,3262478692,PL +3262478693,3262478693,TR +3262478694,3262478694,CH +3262478695,3262478695,DE +3262478696,3262478696,LI +3262478697,3262478697,ES +3262478698,3262478698,IT +3262478699,3262478699,ES +3262478700,3262478700,IT +3262478701,3262478701,DE +3262478702,3262478702,CH +3262478703,3262478703,FR +3262478704,3262478704,IT +3262478705,3262478706,PT +3262478707,3262478707,ES +3262478708,3262478721,DE +3262478722,3262478722,FR +3262478723,3262478724,DE +3262478725,3262478725,IT +3262478726,3262478726,FR +3262478727,3262478727,AT +3262478728,3262478728,NL +3262478729,3262478729,SK +3262478730,3262478730,IT +3262478731,3262478731,PT +3262478732,3262478732,PL +3262478733,3262478733,SK +3262478734,3262478734,DE +3262478735,3262478735,FR +3262478736,3262478736,HU +3262478737,3262478737,ES +3262478738,3262478738,SK +3262478739,3262478739,SE +3262478740,3262478740,FR +3262478741,3262478741,DK +3262478742,3262478742,CH +3262478743,3262478743,FR +3262478744,3262478744,GR +3262478745,3262478745,IT +3262478746,3262478746,SE +3262478747,3262478747,FR +3262478748,3262478748,DE +3262478749,3262478751,FR +3262478752,3262478752,PT +3262478753,3262478753,IE +3262478754,3262478754,ES +3262478755,3262478755,DK +3262478756,3262478756,FR +3262478757,3262478757,AT +3262478758,3262478758,FR +3262478759,3262478759,CH +3262478760,3262478760,TR +3262478761,3262478761,HU +3262478762,3262478762,CY +3262478763,3262478763,ES +3262478764,3262478764,DE +3262478765,3262478766,ES +3262478767,3262478767,PT +3262478768,3262478768,PL +3262478769,3262478769,ES +3262478770,3262478770,IT +3262478771,3262478771,SK +3262478772,3262478772,FR +3262478773,3262478773,CZ +3262478774,3262478774,IT +3262478775,3262478775,CH +3262478776,3262478776,ES +3262478777,3262478778,IT +3262478779,3262478779,ES +3262478780,3262478780,PT +3262478781,3262478781,PL +3262478782,3262478782,MA +3262478783,3262478783,ES +3262478784,3262478785,TR +3262478786,3262478786,DE +3262478787,3262478787,PT +3262478788,3262478788,NO +3262478789,3262478789,GR +3262478790,3262478790,DE +3262478791,3262478791,GB +3262478792,3262478792,PT +3262478793,3262478793,FR +3262478794,3262478794,PT +3262478795,3262478795,PL +3262478796,3262478796,HU +3262478797,3262478797,CY +3262478798,3262478798,IT +3262478799,3262478799,HU +3262478800,3262478800,PL +3262478801,3262478801,DE +3262478802,3262478802,IT +3262478803,3262478803,ES +3262478804,3262478804,SK +3262478805,3262478806,GR +3262478807,3262478807,CH +3262478808,3262478808,HU +3262478809,3262478809,TR +3262478810,3262478810,CH +3262478811,3262478811,FR +3262478812,3262478812,PL +3262478813,3262478813,LB +3262478814,3262478851,DE +3262478852,3262478853,CH +3262478854,3262478855,DE +3262478856,3262478856,FR +3262478857,3262478857,LI +3262478858,3262478860,DE +3262478861,3262478861,FR +3262478862,3262478862,DE +3262478863,3262478863,AT +3262478864,3262478864,NL +3262478865,3262478865,DE +3262478866,3262478866,CH +3262478867,3262478867,GB +3262478868,3262478868,IT +3262478869,3262478870,FR +3262478871,3262478872,DE +3262478873,3262478873,NL +3262478874,3262478874,AT +3262478875,3262478875,DE +3262478876,3262478876,GB +3262478877,3262478877,DE +3262478878,3262478878,AT +3262478879,3262478881,DE +3262478882,3262478882,GR +3262478883,3262478886,DE +3262478887,3262478887,NL +3262478888,3262478888,DK +3262478889,3262478890,FR +3262478891,3262478893,DE +3262478894,3262478894,AT +3262478895,3262478895,DE +3262478896,3262478896,NL +3262478897,3262478897,FR +3262478898,3262478898,GB +3262478899,3262478899,SE +3262478900,3262478900,GB +3262478901,3262478901,DE +3262478902,3262478902,IT +3262478903,3262478904,DE +3262478905,3262478905,SE +3262478906,3262478909,DE +3262478910,3262478910,DK +3262478911,3262478911,BH +3262478912,3262478912,NL +3262478913,3262478913,FR +3262478914,3262478914,DE +3262478915,3262478915,NL +3262478916,3262478919,DE +3262478920,3262478920,ZA +3262478921,3262478921,AT +3262478922,3262478924,DE +3262478925,3262478925,NL +3262478926,3262478926,AT +3262478927,3262478927,PT +3262478928,3262478928,DK +3262478929,3262478929,GB +3262478930,3262478931,DE +3262478932,3262478932,CH +3262478933,3262478935,DE +3262478936,3262478937,CH +3262478938,3262478938,NL +3262478939,3262478939,GB +3262478940,3262478940,NL +3262478941,3262478941,DE +3262478942,3262478942,BE +3262478943,3262478943,SI +3262478944,3262478945,DE +3262478946,3262478946,IE +3262478947,3262478947,DE +3262478948,3262478948,IT +3262478949,3262478949,SE +3262478950,3262478952,DE +3262478953,3262478953,AT +3262478954,3262478954,DE +3262478955,3262478955,FR +3262478956,3262478956,DE +3262478957,3262478957,PT +3262478958,3262478958,SE +3262478959,3262478961,NL +3262478962,3262478963,DE +3262478964,3262478964,CH +3262478965,3262478966,DE +3262478967,3262478967,NL +3262478968,3262478968,ES +3262478969,3262478969,DE +3262478970,3262478970,BE +3262478971,3262478971,DE +3262478972,3262478972,NO +3262478973,3262478973,CH +3262478974,3262478974,GB +3262478975,3262478980,DE +3262478981,3262478981,IT +3262478982,3262478982,DE +3262478983,3262478983,NL +3262478984,3262478984,CH +3262478985,3262478985,PT +3262478986,3262478986,NL +3262478987,3262478987,GB +3262478988,3262478988,IE +3262478989,3262478989,NL +3262478990,3262478990,DE +3262478991,3262478992,FR +3262478993,3262478993,NL +3262478994,3262478997,DE +3262478998,3262478998,GB +3262478999,3262478999,AT +3262479000,3262479000,CH +3262479001,3262479001,AT +3262479002,3262479002,DE +3262479003,3262479003,FR +3262479004,3262479007,DE +3262479008,3262479008,NL +3262479009,3262479009,NO +3262479010,3262479011,NL +3262479012,3262479012,DE +3262479013,3262479013,NL +3262479014,3262479014,ES +3262479015,3262479015,CH +3262479016,3262479016,SE +3262479017,3262479017,DK +3262479018,3262479018,IT +3262479019,3262479019,DE +3262479020,3262479022,CH +3262479023,3262479024,DE +3262479025,3262479025,NL +3262479026,3262479027,DE +3262479028,3262479028,CH +3262479029,3262479029,DE +3262479030,3262479030,ES +3262479031,3262479031,AT +3262479032,3262479036,DE +3262479037,3262479037,AT +3262479038,3262479038,DK +3262479039,3262479039,DE +3262479040,3262479040,NL +3262479041,3262479041,CH +3262479042,3262479042,DK +3262479043,3262479043,FR +3262479044,3262479044,DE +3262479045,3262479045,IT +3262479046,3262479046,DE +3262479047,3262479047,AT +3262479048,3262479048,NL +3262479049,3262479050,DE +3262479051,3262479051,GB +3262479052,3262479052,DE +3262479053,3262479053,NL +3262479054,3262479055,DE +3262479056,3262479056,AT +3262479057,3262479057,GB +3262479058,3262479058,FR +3262479059,3262479059,IT +3262479060,3262479062,DE +3262479063,3262479063,CH +3262479064,3262479065,FR +3262479066,3262479066,IT +3262479067,3262479067,DE +3262479068,3262479068,ES +3262479069,3262479069,FR +3262479070,3262479070,ES +3262479071,3262479074,DE +3262479075,3262479075,CH +3262479076,3262479076,BE +3262479077,3262479077,DE +3262479078,3262479078,IT +3262479079,3262479079,ES +3262479080,3262479080,LU +3262479081,3262479081,CH +3262479082,3262479082,IT +3262479083,3262479083,NL +3262479084,3262479084,CH +3262479085,3262479085,IT +3262479086,3262479086,FR +3262479087,3262479088,DE +3262479089,3262479089,CH +3262479090,3262479090,FR +3262479091,3262479091,DE +3262479092,3262479092,IT +3262479093,3262479093,FR +3262479094,3262479095,GB +3262479096,3262479096,ES +3262479097,3262479097,FR +3262479098,3262479098,IT +3262479099,3262479099,DE +3262479100,3262479100,DK +3262479101,3262479101,CH +3262479102,3262479102,IT +3262479103,3262479105,DE +3262479106,3262479106,ES +3262479107,3262479107,IT +3262479108,3262479108,AT +3262479109,3262479109,FR +3262479110,3262479110,DE +3262479111,3262479111,LU +3262479112,3262479115,DE +3262479116,3262479116,IT +3262479117,3262479117,CH +3262479118,3262479118,GR +3262479119,3262479120,DE +3262479121,3262479121,ES +3262479122,3262479122,FR +3262479123,3262479123,DE +3262479124,3262479124,FR +3262479125,3262479125,IL +3262479126,3262479130,DE +3262479131,3262479131,NL +3262479132,3262479132,AT +3262479133,3262479133,NL +3262479134,3262479134,ES +3262479135,3262479139,DE +3262479140,3262479140,NL +3262479141,3262479142,DE +3262479143,3262479143,GB +3262479144,3262479144,CH +3262479145,3262479145,NO +3262479146,3262479146,DE +3262479147,3262479147,IT +3262479148,3262479149,ES +3262479150,3262479151,DE +3262479152,3262479152,NL +3262479153,3262479153,DE +3262479154,3262479154,FR +3262479155,3262479155,NL +3262479156,3262479156,DE +3262479157,3262479157,ES +3262479158,3262479158,DE +3262479159,3262479159,FR +3262479160,3262479160,DE +3262479161,3262479161,FR +3262479162,3262479162,DE +3262479163,3262479163,FR +3262479164,3262479164,DE +3262479165,3262479167,CH +3262479168,3262479168,DE +3262479169,3262479169,IT +3262479170,3262479170,CH +3262479171,3262479171,ES +3262479172,3262479174,DE +3262479175,3262479175,FR +3262479176,3262479178,DE +3262479179,3262479179,AT +3262479180,3262479180,NL +3262479181,3262479181,DE +3262479182,3262479182,LU +3262479183,3262479183,DK +3262479184,3262479184,CH +3262479185,3262479185,IT +3262479186,3262479186,ES +3262479187,3262479187,DE +3262479188,3262479188,CH +3262479189,3262479189,ES +3262479190,3262479191,IT +3262479192,3262479192,FR +3262479193,3262479193,GB +3262479194,3262479194,DE +3262479195,3262479195,BE +3262479196,3262479196,DE +3262479197,3262479197,GB +3262479198,3262479199,DE +3262479200,3262479200,NL +3262479201,3262479201,HU +3262479202,3262479202,FR +3262479203,3262479208,DE +3262479209,3262479209,ES +3262479210,3262479212,DE +3262479213,3262479213,NO +3262479214,3262479214,DE +3262479215,3262479215,IT +3262479216,3262479219,DE +3262479220,3262479220,NL +3262479221,3262479223,DE +3262479224,3262479224,BE +3262479225,3262479225,FR +3262479226,3262479226,DE +3262479227,3262479227,NL +3262479228,3262479228,DK +3262479229,3262479233,DE +3262479234,3262479234,GB +3262479235,3262479236,DE +3262479237,3262479238,NL +3262479239,3262479239,FR +3262479240,3262479240,DE +3262479241,3262479242,FR +3262479243,3262479243,NL +3262479244,3262479244,IT +3262479245,3262479249,DE +3262479250,3262479250,AT +3262479251,3262479252,DE +3262479253,3262479253,NL +3262479254,3262479254,FR +3262479255,3262479255,DE +3262479256,3262479256,IT +3262479257,3262479257,US +3262479258,3262479261,DE +3262479262,3262479262,CH +3262479263,3262479264,DE +3262479265,3262479265,CH +3262479266,3262479266,FR +3262479267,3262479267,DE +3262479268,3262479268,NL +3262479269,3262479269,DE +3262479270,3262479271,DK +3262479272,3262479272,IT +3262479273,3262479273,DE +3262479274,3262479274,ES +3262479275,3262479275,IT +3262479276,3262479276,DE +3262479277,3262479277,NL +3262479278,3262479278,DE +3262479279,3262479279,ES +3262479280,3262479280,DE +3262479281,3262479281,FR +3262479282,3262479282,AD +3262479283,3262479283,IT +3262479284,3262479284,NO +3262479285,3262479289,DE +3262479290,3262479290,BE +3262479291,3262479293,DE +3262479294,3262479294,FR +3262479295,3262479295,DE +3262479296,3262479296,IT +3262479297,3262479298,DE +3262479299,3262479299,ES +3262479300,3262479300,DE +3262479301,3262479301,ES +3262479302,3262479303,DE +3262479304,3262479304,AT +3262479305,3262479307,DE +3262479308,3262479308,DK +3262479309,3262479309,SE +3262479310,3262479310,DE +3262479311,3262479311,ES +3262479312,3262479312,IT +3262479313,3262479313,FR +3262479314,3262479318,DE +3262479319,3262479319,DK +3262479320,3262479320,DE +3262479321,3262479321,GR +3262479322,3262479323,CH +3262479324,3262479324,NL +3262479325,3262479325,ES +3262479326,3262479327,DE +3262479328,3262479328,DK +3262479329,3262479329,ES +3262479330,3262479330,NL +3262479331,3262479332,FR +3262479333,3262479333,HU +3262479334,3262479334,NL +3262479335,3262479335,DE +3262479336,3262479336,FR +3262479337,3262479337,ES +3262479338,3262479338,DE +3262479339,3262479339,NL +3262479340,3262479340,CH +3262479341,3262479341,DE +3262479342,3262479342,PT +3262479343,3262479343,NO +3262479344,3262479344,NL +3262479345,3262479345,DE +3262479346,3262479346,DK +3262479347,3262479347,NO +3262479348,3262479350,IT +3262479351,3262479351,DE +3262479352,3262479352,IT +3262479353,3262479353,CH +3262479354,3262479355,DE +3262479356,3262479356,CH +3262479357,3262479357,FR +3262479358,3262479361,DE +3262479362,3262479362,PT +3262479363,3262479366,DE +3262479367,3262479367,CH +3262479368,3262479368,DE +3262479369,3262479369,FR +3262479370,3262479370,CH +3262479371,3262479371,GB +3262479372,3262479372,DE +3262479373,3262479373,IT +3262479374,3262479374,DE +3262479375,3262479375,NL +3262479376,3262479377,FR +3262479378,3262479378,DE +3262479379,3262479379,CH +3262479380,3262479380,AT +3262479381,3262479381,FR +3262479382,3262479385,DE +3262479386,3262479386,NL +3262479387,3262479387,DK +3262479388,3262479389,DE +3262479390,3262479390,DK +3262479391,3262479391,NO +3262479392,3262479393,DE +3262479394,3262479394,FR +3262479395,3262479395,NL +3262479396,3262479396,CH +3262479397,3262479397,IT +3262479398,3262479399,DE +3262479400,3262479400,NL +3262479401,3262479402,DE +3262479403,3262479403,GB +3262479404,3262479404,DE +3262479405,3262479405,IE +3262479406,3262479406,GB +3262479407,3262479410,DE +3262479411,3262479411,ES +3262479412,3262479413,DE +3262479414,3262479414,CH +3262479415,3262479415,DE +3262479416,3262479416,DK +3262479417,3262479419,DE +3262479420,3262479420,ES +3262479421,3262479421,DE +3262479422,3262479422,SE +3262479423,3262479423,AT +3262479424,3262479426,DE +3262479427,3262479427,IT +3262479428,3262479429,FR +3262479430,3262479430,GB +3262479431,3262479432,DE +3262479433,3262479433,ZA +3262479434,3262479434,IT +3262479435,3262479437,DE +3262479438,3262479438,IT +3262479439,3262479439,DE +3262479440,3262479440,AT +3262479441,3262479441,DK +3262479442,3262479442,IT +3262479443,3262479443,GR +3262479444,3262479444,ES +3262479445,3262479445,DE +3262479446,3262479446,IT +3262479447,3262479448,DE +3262479449,3262479449,GB +3262479450,3262479452,DE +3262479453,3262479453,CH +3262479454,3262479455,DE +3262479456,3262479456,IT +3262479457,3262479462,DE +3262479463,3262479463,IT +3262479464,3262479465,NL +3262479466,3262479466,GB +3262479467,3262479467,CH +3262479468,3262479469,DE +3262479470,3262479471,GB +3262479472,3262479472,DE +3262479473,3262479473,CH +3262479474,3262479474,BE +3262479475,3262479475,CH +3262479476,3262479476,GB +3262479477,3262479477,BE +3262479478,3262479478,IT +3262479479,3262479480,DE +3262479481,3262479481,LI +3262479482,3262479482,IT +3262479483,3262479483,DE +3262479484,3262479484,AT +3262479485,3262479489,DE +3262479490,3262479490,IT +3262479491,3262479492,DE +3262479493,3262479493,CH +3262479494,3262479494,DE +3262479495,3262479495,BE +3262479496,3262479498,DE +3262479499,3262479499,ES +3262479500,3262479502,IT +3262479503,3262479503,DE +3262479504,3262479504,GB +3262479505,3262479507,DE +3262479508,3262479508,HU +3262479509,3262479509,FR +3262479510,3262479513,DE +3262479514,3262479514,FR +3262479515,3262479515,ES +3262479516,3262479516,AT +3262479517,3262479517,DE +3262479518,3262479518,GB +3262479519,3262479519,GR +3262479520,3262479521,DE +3262479522,3262479522,CH +3262479523,3262479526,DE +3262479527,3262479528,NL +3262479529,3262479529,DE +3262479530,3262479530,BE +3262479531,3262479535,DE +3262479536,3262479536,GB +3262479537,3262479538,DE +3262479539,3262479539,IT +3262479540,3262479540,DE +3262479541,3262479541,CH +3262479542,3262479543,DE +3262479544,3262479544,IT +3262479545,3262479545,BE +3262479546,3262479546,GB +3262479547,3262479547,AT +3262479548,3262479548,CH +3262479549,3262479549,IT +3262479550,3262479552,DE +3262479553,3262479553,IL +3262479554,3262479554,DK +3262479555,3262479555,FR +3262479556,3262479556,IE +3262479557,3262479558,DE +3262479559,3262479559,SE +3262479560,3262479560,DE +3262479561,3262479561,BE +3262479562,3262479562,GB +3262479563,3262479563,DE +3262479564,3262479564,GB +3262479565,3262479565,SE +3262479566,3262479566,NL +3262479567,3262479567,CH +3262479568,3262479568,NO +3262479569,3262479572,DE +3262479573,3262479573,IT +3262479574,3262479574,CH +3262479575,3262479575,DE +3262479576,3262479576,NL +3262479577,3262479577,FR +3262479578,3262479578,DE +3262479579,3262479579,ZA +3262479580,3262479580,DE +3262479581,3262479581,IT +3262479582,3262479583,DE +3262479584,3262479584,NL +3262479585,3262479585,DE +3262479586,3262479586,GR +3262479587,3262479588,DE +3262479589,3262479589,IT +3262479590,3262479590,GB +3262479591,3262479591,NL +3262479592,3262479592,DE +3262479593,3262479593,FR +3262479594,3262479594,DE +3262479595,3262479596,FR +3262479597,3262479598,DE +3262479599,3262479600,IT +3262479601,3262479601,DE +3262479602,3262479602,GB +3262479603,3262479604,DE +3262479605,3262479605,SE +3262479606,3262479606,FR +3262479607,3262479607,NL +3262479608,3262479609,DE +3262479610,3262479610,SI +3262479611,3262479611,DE +3262479612,3262479612,ES +3262479613,3262479613,NL +3262479614,3262479617,DE +3262479618,3262479618,NO +3262479619,3262479619,ES +3262479620,3262479620,GB +3262479621,3262479622,DE +3262479623,3262479623,CH +3262479624,3262479624,ES +3262479625,3262479625,NL +3262479626,3262479626,AT +3262479627,3262479628,DE +3262479629,3262479629,SI +3262479630,3262479630,NL +3262479631,3262479631,HU +3262479632,3262479632,DE +3262479633,3262479633,LU +3262479634,3262479634,DE +3262479635,3262479636,GB +3262479637,3262479637,ES +3262479638,3262479638,DE +3262479639,3262479639,AT +3262479640,3262479640,FR +3262479641,3262479641,IT +3262479642,3262479642,GB +3262479643,3262479643,DE +3262479644,3262479644,NL +3262479645,3262479645,DE +3262479646,3262479646,GB +3262479647,3262479647,DE +3262479648,3262479648,NO +3262479649,3262479653,DE +3262479654,3262479654,ES +3262479655,3262479655,NL +3262479656,3262479656,CH +3262479657,3262479657,NL +3262479658,3262479658,DE +3262479659,3262479659,NL +3262479660,3262479660,PT +3262479661,3262479662,FR +3262479663,3262479664,DE +3262479665,3262479665,DK +3262479666,3262479667,DE +3262479668,3262479668,NL +3262479669,3262479669,IT +3262479670,3262479670,DK +3262479671,3262479671,IT +3262479672,3262479673,DE +3262479674,3262479674,BE +3262479675,3262479676,DE +3262479677,3262479677,ES +3262479678,3262479678,IT +3262479679,3262479679,AT +3262479680,3262479680,IT +3262479681,3262479681,DE +3262479682,3262479682,IT +3262479683,3262479683,HU +3262479684,3262479685,DE +3262479686,3262479687,FR +3262479688,3262479688,DE +3262479689,3262479689,NL +3262479690,3262479690,LU +3262479691,3262479691,DE +3262479692,3262479692,LU +3262479693,3262479693,DE +3262479694,3262479694,CH +3262479695,3262479695,ES +3262479696,3262479696,CH +3262479697,3262479697,GB +3262479698,3262479698,FR +3262479699,3262479701,NL +3262479702,3262479702,AT +3262479703,3262479703,FR +3262479704,3262479707,DE +3262479708,3262479708,CH +3262479709,3262479709,NL +3262479710,3262479711,DE +3262479712,3262479712,GB +3262479713,3262479713,DE +3262479714,3262479714,AT +3262479715,3262479715,ES +3262479716,3262479716,DE +3262479717,3262479717,BE +3262479718,3262479720,DE +3262479721,3262479721,AT +3262479722,3262479724,DE +3262479725,3262479725,AT +3262479726,3262479727,DE +3262479728,3262479728,BE +3262479729,3262479730,ES +3262479731,3262479731,CH +3262479732,3262479732,IT +3262479733,3262479734,DE +3262479735,3262479736,CH +3262479737,3262479737,DE +3262479738,3262479738,AT +3262479739,3262479739,DK +3262479740,3262479740,DE +3262479741,3262479741,NL +3262479742,3262479742,FR +3262479743,3262479745,DE +3262479746,3262479746,GB +3262479747,3262479747,CH +3262479748,3262479748,DE +3262479749,3262479749,FR +3262479750,3262479750,AT +3262479751,3262479751,DE +3262479752,3262479752,CH +3262479753,3262479753,DE +3262479754,3262479754,FR +3262479755,3262479755,NL +3262479756,3262479756,FR +3262479757,3262479757,SE +3262479758,3262479762,DE +3262479763,3262479763,NO +3262479764,3262479764,FR +3262479765,3262479765,DE +3262479766,3262479766,CH +3262479767,3262479770,DE +3262479771,3262479771,IT +3262479772,3262479774,DE +3262479775,3262479775,BE +3262479776,3262479776,IT +3262479777,3262479777,BE +3262479778,3262479778,NL +3262479779,3262479782,DE +3262479783,3262479783,GB +3262479784,3262479784,AT +3262479785,3262479785,FR +3262479786,3262479786,CH +3262479787,3262479788,DE +3262479789,3262479789,IT +3262479790,3262479790,DE +3262479791,3262479792,IT +3262479793,3262479793,DE +3262479794,3262479794,FR +3262479795,3262479795,CH +3262479796,3262479797,AT +3262479798,3262479799,GB +3262479800,3262479808,DE +3262479809,3262479809,FR +3262479810,3262479810,NL +3262479811,3262479811,ES +3262479812,3262479812,GB +3262479813,3262479816,DE +3262479817,3262479817,HU +3262479818,3262479818,DE +3262479819,3262479819,NL +3262479820,3262479820,DE +3262479821,3262479822,NL +3262479823,3262479823,ES +3262479824,3262479824,GB +3262479825,3262479825,DE +3262479826,3262479826,BE +3262479827,3262479827,DE +3262479828,3262479829,CH +3262479830,3262479830,GB +3262479831,3262479832,DE +3262479833,3262479833,ES +3262479834,3262479834,DE +3262479835,3262479835,AT +3262479836,3262479836,NL +3262479837,3262479837,HU +3262479838,3262479838,CH +3262479839,3262479839,NL +3262479840,3262479840,DE +3262479841,3262479841,FR +3262479842,3262479842,DK +3262479843,3262479843,GB +3262479844,3262479844,DE +3262479845,3262479845,CH +3262479846,3262479846,DE +3262479847,3262479847,LU +3262479848,3262479852,DE +3262479853,3262479853,IS +3262479854,3262479855,DE +3262479856,3262479856,CH +3262479857,3262479859,DE +3262479860,3262479860,NL +3262479861,3262479861,NO +3262479862,3262479862,BE +3262479863,3262479863,NL +3262479864,3262479864,DE +3262479865,3262479865,FR +3262479866,3262479866,DE +3262479867,3262479867,SE +3262479868,3262479868,DE +3262479869,3262479869,GB +3262479870,3262479873,DE +3262479874,3262479875,FR +3262479876,3262479876,DE +3262479877,3262479877,CH +3262479878,3262479879,DE +3262479880,3262479880,AT +3262479881,3262479881,HU +3262479882,3262479883,DE +3262479884,3262479884,GB +3262479885,3262479886,DE +3262479887,3262479887,GR +3262479888,3262479888,FR +3262479889,3262479889,NL +3262479890,3262479892,DE +3262479893,3262479893,LU +3262479894,3262479894,CH +3262479895,3262479896,ES +3262479897,3262479899,DE +3262479900,3262479900,NL +3262479901,3262479901,AT +3262479902,3262479902,DE +3262479903,3262479903,CH +3262479904,3262479908,DE +3262479909,3262479909,SE +3262479910,3262479912,DE +3262479913,3262479913,NO +3262479914,3262479914,DE +3262479915,3262479915,FR +3262479916,3262479917,DE +3262479918,3262479918,GB +3262479919,3262479922,DE +3262479923,3262479923,AT +3262479924,3262479929,DE +3262479930,3262479930,IT +3262479931,3262479931,DK +3262479932,3262479932,DE +3262479933,3262479933,NL +3262479934,3262479935,DE +3262479936,3262479936,BE +3262479937,3262479937,FR +3262479938,3262479939,DE +3262479940,3262479940,ES +3262479941,3262479941,IT +3262479942,3262479944,DE +3262479945,3262479945,FR +3262479946,3262479946,DE +3262479947,3262479947,HU +3262479948,3262479948,DE +3262479949,3262479949,NL +3262479950,3262479950,CH +3262479951,3262479953,DE +3262479954,3262479954,CH +3262479955,3262479955,DE +3262479956,3262479956,IT +3262479957,3262479957,BE +3262479958,3262479959,DE +3262479960,3262479960,AT +3262479961,3262479961,DE +3262479962,3262479962,GB +3262479963,3262479963,ES +3262479964,3262479964,DE +3262479965,3262479965,ES +3262479966,3262479974,DE +3262479975,3262479975,FR +3262479976,3262479976,NL +3262479977,3262479978,DE +3262479979,3262479979,CH +3262479980,3262479980,AT +3262479981,3262479984,DE +3262479985,3262479985,CH +3262479986,3262479987,DE +3262479988,3262479988,FR +3262479989,3262479989,DE +3262479990,3262479990,NL +3262479991,3262479993,DE +3262479994,3262479994,CH +3262479995,3262479995,DE +3262479996,3262479996,NL +3262479997,3262480001,DE +3262480002,3262480002,BE +3262480003,3262480005,DE +3262480006,3262480006,FR +3262480007,3262480009,DE +3262480010,3262480010,FR +3262480011,3262480011,BE +3262480012,3262480012,NL +3262480013,3262480015,DE +3262480016,3262480016,ES +3262480017,3262480018,DE +3262480019,3262480019,BE +3262480020,3262480020,DE +3262480021,3262480021,DK +3262480022,3262480022,CH +3262480023,3262480029,DE +3262480030,3262480030,GB +3262480031,3262480031,DE +3262480032,3262480032,CH +3262480033,3262480033,GB +3262480034,3262480034,DE +3262480035,3262480035,LU +3262480036,3262480037,DE +3262480038,3262480038,NL +3262480039,3262480039,CH +3262480040,3262480040,DE +3262480041,3262480041,AT +3262480042,3262480042,DE +3262480043,3262480043,GB +3262480044,3262480044,CS +3262480045,3262480045,GB +3262480046,3262480048,DE +3262480049,3262480049,LU +3262480050,3262480051,DE +3262480052,3262480052,NL +3262480053,3262480057,DE +3262480058,3262480058,NL +3262480059,3262480059,CH +3262480060,3262480060,DE +3262480061,3262480062,GB +3262480063,3262480063,SI +3262480064,3262480066,DE +3262480067,3262480067,NL +3262480068,3262480071,DE +3262480072,3262480072,IT +3262480073,3262480073,DE +3262480074,3262480074,AT +3262480075,3262480076,DE +3262480077,3262480078,FR +3262480079,3262480080,DE +3262480081,3262480081,CH +3262480082,3262480082,DE +3262480083,3262480083,NO +3262480084,3262480084,IT +3262480085,3262480085,FR +3262480086,3262480087,DE +3262480088,3262480088,FR +3262480089,3262480089,NL +3262480090,3262480090,CH +3262480091,3262480092,DE +3262480093,3262480093,BE +3262480094,3262480094,DE +3262480095,3262480095,AT +3262480096,3262480097,DE +3262480098,3262480098,GB +3262480099,3262480104,DE +3262480105,3262480105,IT +3262480106,3262480106,DE +3262480107,3262480107,DK +3262480108,3262480109,DE +3262480110,3262480110,GB +3262480111,3262480111,AT +3262480112,3262480112,BE +3262480113,3262480113,DE +3262480114,3262480114,IT +3262480115,3262480116,DE +3262480117,3262480117,BE +3262480118,3262480125,DE +3262480126,3262480126,ES +3262480127,3262480133,DE +3262480134,3262480134,AT +3262480135,3262480135,NL +3262480136,3262480136,FR +3262480137,3262480139,DE +3262480140,3262480140,FR +3262480141,3262480141,AT +3262480142,3262480146,DE +3262480147,3262480147,IT +3262480148,3262480148,GB +3262480149,3262480150,DE +3262480151,3262480151,GB +3262480152,3262480154,DE +3262480155,3262480155,ES +3262480156,3262480158,DE +3262480159,3262480159,IT +3262480160,3262480161,DE +3262480162,3262480162,NO +3262480163,3262480164,DE +3262480165,3262480165,FR +3262480166,3262480172,DE +3262480173,3262480173,NL +3262480174,3262480174,DE +3262480175,3262480175,NL +3262480176,3262480176,DE +3262480177,3262480177,CH +3262480178,3262480178,IT +3262480179,3262480179,DE +3262480180,3262480180,FR +3262480181,3262480181,ES +3262480182,3262480182,DE +3262480183,3262480183,SE +3262480184,3262480184,DE +3262480185,3262480185,FR +3262480186,3262480186,PT +3262480187,3262480187,DE +3262480188,3262480188,FI +3262480189,3262480189,CH +3262480190,3262480190,DE +3262480191,3262480191,NO +3262480192,3262480193,DE +3262480194,3262480194,NL +3262480195,3262480195,GB +3262480196,3262480197,DE +3262480198,3262480198,NL +3262480199,3262480199,GB +3262480200,3262480201,DE +3262480202,3262480202,GB +3262480203,3262480205,DE +3262480206,3262480206,CH +3262480207,3262480212,DE +3262480213,3262480213,FR +3262480214,3262480215,DE +3262480216,3262480216,HU +3262480217,3262480218,DE +3262480219,3262480219,ES +3262480220,3262480220,NL +3262480221,3262480221,BE +3262480222,3262480226,DE +3262480227,3262480227,IE +3262480228,3262480229,DE +3262480230,3262480230,SE +3262480231,3262480232,DE +3262480233,3262480233,SE +3262480234,3262480234,DE +3262480235,3262480235,HU +3262480236,3262480236,DE +3262480237,3262480237,PL +3262480238,3262480238,DE +3262480239,3262480239,NL +3262480240,3262480243,DE +3262480244,3262480244,CH +3262480245,3262480246,DE +3262480247,3262480247,NL +3262480248,3262480248,DE +3262480249,3262480249,NL +3262480250,3262480250,DE +3262480251,3262480251,NL +3262480252,3262480253,DE +3262480254,3262480254,CH +3262480255,3262480259,DE +3262480260,3262480260,NL +3262480261,3262480261,BE +3262480262,3262480264,DE +3262480265,3262480265,GB +3262480266,3262480267,DE +3262480268,3262480268,FR +3262480269,3262480269,NL +3262480270,3262480270,DE +3262480271,3262480271,CH +3262480272,3262480272,DK +3262480273,3262480273,DE +3262480274,3262480274,IT +3262480275,3262480275,BE +3262480276,3262480276,ES +3262480277,3262480277,DE +3262480278,3262480278,CH +3262480279,3262480282,DE +3262480283,3262480283,GB +3262480284,3262480285,DE +3262480286,3262480286,CH +3262480287,3262480293,DE +3262480294,3262480294,FR +3262480295,3262480295,CH +3262480296,3262480296,NO +3262480297,3262480300,DE +3262480301,3262480301,LU +3262480302,3262480302,DE +3262480303,3262480304,IT +3262480305,3262480305,DE +3262480306,3262480306,AT +3262480307,3262480311,DE +3262480312,3262480312,NL +3262480313,3262480313,FR +3262480314,3262480314,NL +3262480315,3262480315,DE +3262480316,3262480316,IT +3262480317,3262480317,NL +3262480318,3262480318,IT +3262480319,3262480319,AT +3262480320,3262480320,DK +3262480321,3262480321,DE +3262480322,3262480322,GB +3262480323,3262480324,DE +3262480325,3262480325,ES +3262480326,3262480329,DE +3262480330,3262480330,FR +3262480331,3262480331,IT +3262480332,3262480332,DE +3262480333,3262480333,CH +3262480334,3262480334,DE +3262480335,3262480335,GB +3262480336,3262480336,DE +3262480337,3262480337,NL +3262480338,3262480340,DE +3262480341,3262480341,CH +3262480342,3262480342,DE +3262480343,3262480343,DK +3262480344,3262480344,DE +3262480345,3262480345,CH +3262480346,3262480346,DE +3262480347,3262480347,NL +3262480348,3262480348,IS +3262480349,3262480349,AT +3262480350,3262480352,DE +3262480353,3262480353,CH +3262480354,3262480354,DE +3262480355,3262480355,GB +3262480356,3262480356,DE +3262480357,3262480357,GB +3262480358,3262480359,CH +3262480360,3262480363,DE +3262480364,3262480364,ES +3262480365,3262480365,DE +3262480366,3262480366,AT +3262480367,3262480367,DE +3262480368,3262480368,GB +3262480369,3262480369,FR +3262480370,3262480370,ES +3262480371,3262480371,GB +3262480372,3262480372,DE +3262480373,3262480373,AT +3262480374,3262480374,ES +3262480375,3262480375,NL +3262480376,3262480376,DE +3262480377,3262480377,IT +3262480378,3262480378,DE +3262480379,3262480379,CH +3262480380,3262480380,GB +3262480381,3262480381,IT +3262480382,3262480382,ES +3262480383,3262480383,DE +3262480384,3262488575,GB +3262488576,3262496767,SE +3262496768,3262504959,FR +3262504960,3262505471,DE +3262505472,3262505983,GB +3262505984,3262506495,PL +3262506496,3262507007,RO +3262507008,3262507519,DK +3262507520,3262509055,RO +3262509056,3262509567,PL +3262509568,3262510079,RO +3262510080,3262511103,FR +3262511104,3262511615,GB +3262511616,3262512127,DE +3262512128,3262512639,GB +3262512640,3262513151,DE +3262513152,3262578687,AT +3262578688,3262611455,FR +3262611456,3262627839,GB +3262627840,3262636031,IT +3262636032,3262644223,BE +3262644224,3262644695,NL +3262644696,3262644703,DE +3262644704,3262645055,NL +3262645056,3262645063,DE +3262645064,3262645631,NL +3262645632,3262645639,DE +3262645640,3262646055,NL +3262646056,3262646063,DE +3262646064,3262646095,NL +3262646096,3262646103,DE +3262646104,3262646367,NL +3262646368,3262646375,DE +3262646376,3262646855,NL +3262646856,3262646863,DE +3262646864,3262646895,NL +3262646896,3262646903,DE +3262646904,3262646911,NL +3262646912,3262646919,DE +3262646920,3262647255,NL +3262647256,3262647263,DE +3262647264,3262647367,NL +3262647368,3262647375,DE +3262647376,3262647391,NL +3262647392,3262647399,DE +3262647400,3262647655,NL +3262647656,3262647663,DE +3262647664,3262647695,NL +3262647696,3262647703,DE +3262647704,3262647807,NL +3262647808,3262647823,DE +3262647824,3262647863,NL +3262647864,3262647871,DE +3262647872,3262647895,NL +3262647896,3262647903,DE +3262647904,3262648255,NL +3262648256,3262648271,DE +3262648272,3262648319,NL +3262648320,3262650623,DE +3262650624,3262650807,NL +3262650808,3262650815,DE +3262650816,3262650871,NL +3262650872,3262650879,DE +3262650880,3262650895,NL +3262650896,3262650903,DE +3262650904,3262650943,NL +3262650944,3262650951,DE +3262650952,3262650999,NL +3262651000,3262651007,DE +3262651008,3262651039,NL +3262651040,3262651047,DE +3262651048,3262651079,NL +3262651080,3262651087,DE +3262651088,3262651103,NL +3262651104,3262651111,DE +3262651112,3262651231,NL +3262651232,3262651239,DE +3262651240,3262651767,NL +3262651768,3262651775,DE +3262651776,3262651919,NL +3262651920,3262651943,DE +3262651944,3262651959,NL +3262651960,3262651967,DE +3262651968,3262652015,NL +3262652016,3262652031,DE +3262652032,3262652631,NL +3262652632,3262652639,DE +3262652640,3262652679,NL +3262652680,3262652687,DE +3262652688,3262652799,NL +3262652800,3262652807,DE +3262652808,3262652895,NL +3262652896,3262652903,DE +3262652904,3262653095,NL +3262653096,3262653103,DE +3262653104,3262653839,NL +3262653840,3262653847,DE +3262653848,3262654463,NL +3262654464,3262655487,DE +3262655488,3262655695,NL +3262655696,3262655703,DE +3262655704,3262656743,NL +3262656744,3262656751,DE +3262656752,3262656863,NL +3262656864,3262656871,DE +3262656872,3262657311,NL +3262657312,3262657319,DE +3262657320,3262657495,NL +3262657496,3262657503,DE +3262657504,3262657727,NL +3262657728,3262657735,DE +3262657736,3262658303,NL +3262658304,3262658559,DE +3262658560,3262658583,NL +3262658584,3262658591,DE +3262658592,3262658623,NL +3262658624,3262658631,DE +3262658632,3262659039,NL +3262659040,3262659047,DE +3262659048,3262659103,NL +3262659104,3262659111,DE +3262659112,3262659191,NL +3262659192,3262659199,DE +3262659200,3262659303,NL +3262659304,3262659311,DE +3262659312,3262659335,NL +3262659336,3262659343,DE +3262659344,3262659615,NL +3262659616,3262659623,DE +3262659624,3262659679,NL +3262659680,3262659687,DE +3262659688,3262659719,NL +3262659720,3262659727,DE +3262659728,3262659807,NL +3262659808,3262659815,DE +3262659816,3262660471,NL +3262660472,3262660479,DE +3262660480,3262660775,NL +3262660776,3262660783,DE +3262660784,3262660903,NL +3262660904,3262660911,DE +3262660912,3262661063,NL +3262661064,3262661079,DE +3262661080,3262661119,NL +3262661120,3262661375,DE +3262661376,3262661847,NL +3262661848,3262661855,DE +3262661856,3262661975,NL +3262661976,3262661983,DE +3262661984,3262662087,NL +3262662088,3262662095,DE +3262662096,3262662607,NL +3262662608,3262662615,DE +3262662616,3262662775,NL +3262662776,3262662783,DE +3262662784,3262663119,NL +3262663120,3262663127,DE +3262663128,3262663831,NL +3262663832,3262663839,DE +3262663840,3262663967,NL +3262663968,3262663975,DE +3262663976,3262664343,NL +3262664344,3262664351,DE +3262664352,3262664463,NL +3262664464,3262664471,DE +3262664472,3262664599,NL +3262664600,3262664607,DE +3262664608,3262664703,NL +3262664704,3262678527,DE +3262678528,3262678559,NL +3262678560,3262678567,DE +3262678568,3262678991,NL +3262678992,3262678999,DE +3262679000,3262679311,NL +3262679312,3262679319,DE +3262679320,3262679423,NL +3262679424,3262679431,DE +3262679432,3262679663,NL +3262679664,3262679671,DE +3262679672,3262679759,NL +3262679760,3262679767,DE +3262679768,3262679815,NL +3262679816,3262679823,DE +3262679824,3262680199,NL +3262680200,3262680207,DE +3262680208,3262680375,NL +3262680376,3262680383,DE +3262680384,3262680495,NL +3262680496,3262680503,DE +3262680504,3262680983,NL +3262680984,3262680991,DE +3262680992,3262681087,NL +3262681088,3262682879,DE +3262682880,3262683063,NL +3262683064,3262683071,DE +3262683072,3262683815,NL +3262683816,3262683823,DE +3262683824,3262683871,NL +3262683872,3262683879,DE +3262683880,3262684599,NL +3262684600,3262684607,DE +3262684608,3262684615,NL +3262684616,3262684623,DE +3262684624,3262684703,NL +3262684704,3262684711,DE +3262684712,3262684991,NL +3262684992,3262685007,DE +3262685008,3262685359,NL +3262685360,3262685367,DE +3262685368,3262685439,NL +3262685440,3262685447,DE +3262685448,3262685623,NL +3262685624,3262685631,DE +3262685632,3262685671,NL +3262685672,3262685679,DE +3262685680,3262685951,NL +3262685952,3262688767,DE +3262688768,3262688823,NL +3262688824,3262688831,DE +3262688832,3262689087,NL +3262689088,3262689095,DE +3262689096,3262689127,NL +3262689128,3262689135,DE +3262689136,3262689191,NL +3262689192,3262689199,DE +3262689200,3262689343,NL +3262689344,3262689351,DE +3262689352,3262689559,NL +3262689560,3262689567,DE +3262689568,3262689847,NL +3262689848,3262689855,DE +3262689856,3262689871,NL +3262689872,3262689879,DE +3262689880,3262689927,NL +3262689928,3262689935,DE +3262689936,3262689959,NL +3262689960,3262689967,DE +3262689968,3262690583,NL +3262690584,3262690591,DE +3262690592,3262690631,NL +3262690632,3262690639,DE +3262690640,3262690679,NL +3262690680,3262690687,DE +3262690688,3262690815,NL +3262690816,3262704383,DE +3262704384,3262704663,NL +3262704664,3262704671,DE +3262704672,3262704735,NL +3262704736,3262704743,DE +3262704744,3262704967,NL +3262704968,3262704975,DE +3262704976,3262705031,NL +3262705032,3262705039,DE +3262705040,3262705063,NL +3262705064,3262705071,DE +3262705072,3262705111,NL +3262705112,3262705119,DE +3262705120,3262705255,NL +3262705256,3262705263,DE +3262705264,3262705303,NL +3262705304,3262705311,DE +3262705312,3262705319,NL +3262705320,3262705327,DE +3262705328,3262705375,NL +3262705376,3262705383,DE +3262705384,3262705447,NL +3262705448,3262705455,DE +3262705456,3262706127,NL +3262706128,3262706135,DE +3262706136,3262706159,NL +3262706160,3262706167,DE +3262706168,3262706247,NL +3262706248,3262706255,DE +3262706256,3262706335,NL +3262706336,3262706343,DE +3262706344,3262706383,NL +3262706384,3262706391,DE +3262706392,3262706439,NL +3262706440,3262706447,DE +3262706448,3262706767,NL +3262706768,3262706775,DE +3262706776,3262706855,NL +3262706856,3262706863,DE +3262706864,3262707159,NL +3262707160,3262707167,DE +3262707168,3262707239,NL +3262707240,3262707247,DE +3262707248,3262707279,NL +3262707280,3262707295,DE +3262707296,3262707383,NL +3262707384,3262707391,DE +3262707392,3262707463,NL +3262707464,3262707471,DE +3262707472,3262707487,NL +3262707488,3262707495,DE +3262707496,3262707519,NL +3262707520,3262707527,DE +3262707528,3262707687,NL +3262707688,3262707695,DE +3262707696,3262707711,NL +3262707712,3262710527,DE +3262710528,3262711223,NL +3262711224,3262711231,DE +3262711232,3262711383,NL +3262711384,3262711391,DE +3262711392,3262711463,NL +3262711464,3262711471,DE +3262711472,3262711887,NL +3262711888,3262711895,DE +3262711896,3262712423,NL +3262712424,3262712431,DE +3262712432,3262712575,NL +3262712576,3262712831,DE +3262712832,3262713295,NL +3262713296,3262713303,DE +3262713304,3262713455,NL +3262713456,3262713463,DE +3262713464,3262714151,NL +3262714152,3262714159,DE +3262714160,3262714367,NL +3262714368,3262714375,DE +3262714376,3262714831,NL +3262714832,3262714839,DE +3262714840,3262714871,NL +3262714872,3262714879,DE +3262714880,3262715135,NL +3262715136,3262716671,DE +3262716672,3262717191,NL +3262717192,3262717199,DE +3262717200,3262717415,NL +3262717416,3262717423,DE +3262717424,3262717487,NL +3262717488,3262717495,DE +3262717496,3262717903,NL +3262717904,3262717911,DE +3262717912,3262718471,NL +3262718472,3262718479,DE +3262718480,3262718487,NL +3262718488,3262718495,DE +3262718496,3262719631,NL +3262719632,3262719639,DE +3262719640,3262719911,NL +3262719912,3262719919,DE +3262719920,3262720055,NL +3262720056,3262720063,DE +3262720064,3262720447,NL +3262720448,3262720455,DE +3262720456,3262720479,NL +3262720480,3262720487,DE +3262720488,3262720623,NL +3262720624,3262720631,DE +3262720632,3262721535,NL +3262721536,3262726911,DE +3262726912,3262727007,NL +3262727008,3262727015,DE +3262727016,3262727671,NL +3262727672,3262727679,DE +3262727680,3262727727,NL +3262727728,3262727735,DE +3262727736,3262728151,NL +3262728152,3262728159,DE +3262728160,3262728543,NL +3262728544,3262728551,DE +3262728552,3262728735,NL +3262728736,3262728743,DE +3262728744,3262729439,NL +3262729440,3262729447,DE +3262729448,3262729575,NL +3262729576,3262729583,DE +3262729584,3262729807,NL +3262729808,3262729815,DE +3262729816,3262730207,NL +3262730208,3262730215,DE +3262730216,3262730359,NL +3262730360,3262730367,DE +3262730368,3262730559,NL +3262730560,3262730567,DE +3262730568,3262731175,NL +3262731176,3262731183,DE +3262731184,3262731255,NL +3262731256,3262731263,DE +3262731264,3262731495,NL +3262731496,3262731503,DE +3262731504,3262731767,NL +3262731768,3262731775,DE +3262731776,3262732303,NL +3262732304,3262732311,DE +3262732312,3262732599,NL +3262732600,3262732607,DE +3262732608,3262732799,NL +3262732800,3262733055,DE +3262733056,3262733391,NL +3262733392,3262733399,DE +3262733400,3262733463,NL +3262733464,3262733471,DE +3262733472,3262734287,NL +3262734288,3262734295,DE +3262734296,3262734799,NL +3262734800,3262734815,DE +3262734816,3262734839,NL +3262734840,3262734847,DE +3262734848,3262734919,NL +3262734920,3262734927,DE +3262734928,3262735511,NL +3262735512,3262735519,DE +3262735520,3262735527,NL +3262735528,3262735535,DE +3262735536,3262735719,NL +3262735720,3262735727,DE +3262735728,3262736255,NL +3262736256,3262736263,DE +3262736264,3262736383,NL +3262736384,3262736895,DE +3262736896,3262737063,NL +3262737064,3262737071,DE +3262737072,3262737319,NL +3262737320,3262737327,DE +3262737328,3262737479,NL +3262737480,3262737487,DE +3262737488,3262737735,NL +3262737736,3262737743,DE +3262737744,3262738047,NL +3262738048,3262738055,DE +3262738056,3262738127,NL +3262738128,3262738135,DE +3262738136,3262738511,NL +3262738512,3262738519,DE +3262738520,3262739223,NL +3262739224,3262739231,DE +3262739232,3262739311,NL +3262739312,3262739319,DE +3262739320,3262739799,NL +3262739800,3262739807,DE +3262739808,3262740223,NL +3262740224,3262740231,DE +3262740232,3262740247,NL +3262740248,3262740255,DE +3262740256,3262740343,NL +3262740344,3262740351,DE +3262740352,3262740775,NL +3262740776,3262740783,DE +3262740784,3262741247,NL +3262741248,3262741503,DE +3262741504,3262741855,NL +3262741856,3262741863,DE +3262741864,3262742287,NL +3262742288,3262742295,DE +3262742296,3262742511,NL +3262742512,3262742519,DE +3262742520,3262742695,NL +3262742696,3262742703,DE +3262742704,3262743023,NL +3262743024,3262743031,DE +3262743032,3262743215,NL +3262743216,3262743223,DE +3262743224,3262743935,NL +3262743936,3262743943,DE +3262743944,3262744647,NL +3262744648,3262744655,DE +3262744656,3262745087,NL +3262745088,3262745103,DE +3262745104,3262745351,NL +3262745352,3262745359,DE +3262745360,3262745751,NL +3262745752,3262745759,DE +3262745760,3262745831,NL +3262745832,3262745839,DE +3262745840,3262746287,NL +3262746288,3262746295,DE +3262746296,3262747135,NL +3262747136,3262747143,DE +3262747144,3262747847,NL +3262747848,3262747855,DE +3262747856,3262748431,NL +3262748432,3262748439,DE +3262748440,3262748999,NL +3262749000,3262749007,DE +3262749008,3262749303,NL +3262749304,3262749311,DE +3262749312,3262749519,NL +3262749520,3262749527,DE +3262749528,3262749927,NL +3262749928,3262749935,DE +3262749936,3262750727,NL +3262750728,3262750735,DE +3262750736,3262750767,NL +3262750768,3262750775,DE +3262750776,3262751015,NL +3262751016,3262751023,DE +3262751024,3262751863,NL +3262751864,3262751871,DE +3262751872,3262752599,NL +3262752600,3262752607,DE +3262752608,3262752663,NL +3262752664,3262752671,DE +3262752672,3262752847,NL +3262752848,3262752855,DE +3262752856,3262752887,NL +3262752888,3262752895,DE +3262752896,3262753519,NL +3262753520,3262753527,DE +3262753528,3262753791,NL +3262753792,3262754815,DE +3262754816,3262754983,NL +3262754984,3262754991,DE +3262754992,3262755055,NL +3262755056,3262755063,DE +3262755064,3262755223,NL +3262755224,3262755231,DE +3262755232,3262755407,NL +3262755408,3262755415,DE +3262755416,3262756087,NL +3262756088,3262756095,DE +3262756096,3262756215,NL +3262756216,3262756223,DE +3262756224,3262756359,NL +3262756360,3262756367,DE +3262756368,3262756967,NL +3262756968,3262756975,DE +3262756976,3262757671,NL +3262757672,3262757679,DE +3262757680,3262758223,NL +3262758224,3262758231,DE +3262758232,3262758551,NL +3262758552,3262758559,DE +3262758560,3262758823,NL +3262758824,3262758831,DE +3262758832,3262759335,NL +3262759336,3262759343,DE +3262759344,3262759351,NL +3262759352,3262759359,DE +3262759360,3262759415,NL +3262759416,3262759423,DE +3262759424,3262759527,NL +3262759528,3262759535,DE +3262759536,3262759575,NL +3262759576,3262759583,DE +3262759584,3262759695,NL +3262759696,3262759703,DE +3262759704,3262759927,NL +3262759928,3262759935,DE +3262759936,3262760471,NL +3262760472,3262760479,DE +3262760480,3262760503,NL +3262760504,3262760511,DE +3262760512,3262760575,NL +3262760576,3262760583,DE +3262760584,3262760791,NL +3262760792,3262760799,DE +3262760800,3262760847,NL +3262760848,3262760855,DE +3262760856,3262760895,NL +3262760896,3262760903,DE +3262760904,3262761711,NL +3262761712,3262761719,DE +3262761720,3262761727,NL +3262761728,3262761983,DE +3262761984,3262761991,NL +3262761992,3262762007,DE +3262762008,3262762079,NL +3262762080,3262762087,DE +3262762088,3262763879,NL +3262763880,3262763887,DE +3262763888,3262764551,NL +3262764552,3262764559,DE +3262764560,3262764719,NL +3262764720,3262764727,DE +3262764728,3262765447,NL +3262765448,3262765455,DE +3262765456,3262765535,NL +3262765536,3262765543,DE +3262765544,3262765607,NL +3262765608,3262765615,DE +3262765616,3262766079,NL +3262766080,3262767103,DE +3262767104,3262767295,NL +3262767296,3262767303,DE +3262767304,3262767535,NL +3262767536,3262767543,DE +3262767544,3262767599,NL +3262767600,3262767607,DE +3262767608,3262768559,NL +3262768560,3262768567,DE +3262768568,3262769943,NL +3262769944,3262769951,DE +3262769952,3262770055,NL +3262770056,3262770063,DE +3262770064,3262770535,NL +3262770536,3262770543,DE +3262770544,3262770551,NL +3262770552,3262770559,DE +3262770560,3262770631,NL +3262770632,3262770639,DE +3262770640,3262770927,NL +3262770928,3262770935,DE +3262770936,3262771255,NL +3262771256,3262771263,DE +3262771264,3262773503,NL +3262773504,3262775295,DE +3262775296,3262776055,NL +3262776056,3262776063,DE +3262776064,3262776287,NL +3262776288,3262776295,DE +3262776296,3262776351,NL +3262776352,3262776359,DE +3262776360,3262776663,NL +3262776664,3262776671,DE +3262776672,3262776687,NL +3262776688,3262776695,DE +3262776696,3262777127,NL +3262777128,3262777135,DE +3262777136,3262777943,NL +3262777944,3262777951,DE +3262777952,3262778063,NL +3262778064,3262778071,DE +3262778072,3262778239,NL +3262778240,3262778247,DE +3262778248,3262780127,NL +3262780128,3262780135,DE +3262780136,3262780399,NL +3262780400,3262780407,DE +3262780408,3262780935,NL +3262780936,3262780943,DE +3262780944,3262781287,NL +3262781288,3262781295,DE +3262781296,3262781503,NL +3262781504,3262781511,DE +3262781512,3262781815,NL +3262781816,3262781823,DE +3262781824,3262781831,NL +3262781832,3262781839,DE +3262781840,3262782159,NL +3262782160,3262782167,DE +3262782168,3262782375,NL +3262782376,3262782383,DE +3262782384,3262783943,NL +3262783944,3262783951,DE +3262783952,3262784359,NL +3262784360,3262784367,DE +3262784368,3262785167,NL +3262785168,3262785175,DE +3262785176,3262785423,NL +3262785424,3262785431,DE +3262785432,3262785455,NL +3262785456,3262785463,DE +3262785464,3262786207,NL +3262786208,3262786215,DE +3262786216,3262786679,NL +3262786680,3262786687,DE +3262786688,3262786759,NL +3262786760,3262786767,DE +3262786768,3262787239,NL +3262787240,3262787247,DE +3262787248,3262787543,NL +3262787544,3262787551,DE +3262787552,3262787623,NL +3262787624,3262787631,DE +3262787632,3262788623,NL +3262788624,3262788631,DE +3262788632,3262788799,NL +3262788800,3262788807,DE +3262788808,3262788919,NL +3262788920,3262788927,DE +3262788928,3262789119,NL +3262789120,3262790143,DE +3262790144,3262790695,NL +3262790696,3262790703,DE +3262790704,3262791751,NL +3262791752,3262791759,DE +3262791760,3262791887,NL +3262791888,3262791895,DE +3262791896,3262791951,NL +3262791952,3262791959,DE +3262791960,3262793215,NL +3262793216,3262793223,DE +3262793224,3262794279,NL +3262794280,3262794287,DE +3262794288,3262794751,NL +3262794752,3262797823,DE +3262797824,3262797967,NL +3262797968,3262797975,DE +3262797976,3262798495,NL +3262798496,3262798503,DE +3262798504,3262798743,NL +3262798744,3262798751,DE +3262798752,3262799863,NL +3262799864,3262799871,DE +3262799872,3262800239,NL +3262800240,3262800247,DE +3262800248,3262800383,NL +3262800384,3262800391,DE +3262800392,3262800431,NL +3262800432,3262800439,DE +3262800440,3262800871,NL +3262800872,3262800879,DE +3262800880,3262801031,NL +3262801032,3262801039,DE +3262801040,3262801223,NL +3262801224,3262801231,DE +3262801232,3262801303,NL +3262801304,3262801311,DE +3262801312,3262801695,NL +3262801696,3262801703,DE +3262801704,3262801791,NL +3262801792,3262801799,DE +3262801800,3262802127,NL +3262802128,3262802135,DE +3262802136,3262802735,NL +3262802736,3262802743,DE +3262802744,3262803375,NL +3262803376,3262803391,DE +3262803392,3262803567,NL +3262803568,3262803575,DE +3262803576,3262803727,NL +3262803728,3262803735,DE +3262803736,3262803895,NL +3262803896,3262803903,DE +3262803904,3262804183,NL +3262804184,3262804191,DE +3262804192,3262804519,NL +3262804520,3262804527,DE +3262804528,3262804831,NL +3262804832,3262804839,DE +3262804840,3262805551,NL +3262805552,3262805559,DE +3262805560,3262805743,NL +3262805744,3262805751,DE +3262805752,3262806015,NL +3262806016,3262809087,DE +3262809088,3262809119,NL +3262809120,3262809127,DE +3262809128,3262810167,NL +3262810168,3262810175,DE +3262810176,3262810191,NL +3262810192,3262810199,DE +3262810200,3262810247,NL +3262810248,3262810255,DE +3262810256,3262810655,NL +3262810656,3262810663,DE +3262810664,3262810727,NL +3262810728,3262810735,DE +3262810736,3262811535,NL +3262811536,3262811543,DE +3262811544,3262811935,NL +3262811936,3262811943,DE +3262811944,3262812063,NL +3262812064,3262812071,DE +3262812072,3262812575,NL +3262812576,3262812583,DE +3262812584,3262813415,NL +3262813416,3262813423,DE +3262813424,3262813455,NL +3262813456,3262813463,DE +3262813464,3262813631,NL +3262813632,3262813639,DE +3262813640,3262814079,NL +3262814080,3262814087,DE +3262814088,3262814519,NL +3262814520,3262814527,DE +3262814528,3262815303,NL +3262815304,3262815311,DE +3262815312,3262815671,NL +3262815672,3262815679,DE +3262815680,3262815791,NL +3262815792,3262815799,DE +3262815800,3262824959,NL +3262824960,3262824975,DE +3262824976,3262825071,NL +3262825072,3262825079,DE +3262825080,3262825223,NL +3262825224,3262825231,DE +3262825232,3262825567,NL +3262825568,3262825575,DE +3262825576,3262825719,NL +3262825720,3262825727,DE +3262825728,3262825879,NL +3262825880,3262825887,DE +3262825888,3262825927,NL +3262825928,3262825935,DE +3262825936,3262826815,NL +3262826816,3262826823,DE +3262826824,3262827039,NL +3262827040,3262827047,DE +3262827048,3262827143,NL +3262827144,3262827151,DE +3262827152,3262827287,NL +3262827288,3262827295,DE +3262827296,3262827303,NL +3262827304,3262827311,DE +3262827312,3262828951,NL +3262828952,3262828959,DE +3262828960,3262829167,NL +3262829168,3262829175,DE +3262829176,3262829527,NL +3262829528,3262829535,DE +3262829536,3262829567,NL +3262829568,3262830599,DE +3262830600,3262830839,NL +3262830840,3262830847,DE +3262830848,3262832055,NL +3262832056,3262832063,DE +3262832064,3262832087,NL +3262832088,3262832095,DE +3262832096,3262832271,NL +3262832272,3262832279,DE +3262832280,3262832639,NL +3262832640,3262840319,DE +3262840320,3262841255,NL +3262841256,3262841263,DE +3262841264,3262841551,NL +3262841552,3262841559,DE +3262841560,3262841743,NL +3262841744,3262841751,DE +3262841752,3262841831,NL +3262841832,3262841847,DE +3262841848,3262842423,NL +3262842424,3262842431,DE +3262842432,3262842623,NL +3262842624,3262842887,DE +3262842888,3262843815,NL +3262843816,3262843823,DE +3262843824,3262844511,NL +3262844512,3262844519,DE +3262844520,3262844855,NL +3262844856,3262844871,DE +3262844872,3262844895,NL +3262844896,3262844903,DE +3262844904,3262845383,NL +3262845384,3262845391,DE +3262845392,3262845407,NL +3262845408,3262845415,DE +3262845416,3262845655,NL +3262845656,3262845663,DE +3262845664,3262845959,NL +3262845960,3262845967,DE +3262845968,3262846687,NL +3262846688,3262846695,DE +3262846696,3262847079,NL +3262847080,3262847087,DE +3262847088,3262848663,NL +3262848664,3262848679,DE +3262848680,3262848879,NL +3262848880,3262848887,DE +3262848888,3262848927,NL +3262848928,3262848935,DE +3262848936,3262848943,NL +3262848944,3262848967,DE +3262848968,3262848975,NL +3262848976,3262848983,DE +3262848984,3262849175,NL +3262849176,3262849183,DE +3262849184,3262849303,NL +3262849304,3262849311,DE +3262849312,3262850071,NL +3262850072,3262850079,DE +3262850080,3262850119,NL +3262850120,3262850127,DE +3262850128,3262850191,NL +3262850192,3262850199,DE +3262850200,3262850263,NL +3262850264,3262850271,DE +3262850272,3262850647,NL +3262850648,3262850655,DE +3262850656,3262850687,NL +3262850688,3262850695,DE +3262850696,3262850967,NL +3262850968,3262850975,DE +3262850976,3262851463,NL +3262851464,3262851471,DE +3262851472,3262851487,NL +3262851488,3262851495,DE +3262851496,3262852351,NL +3262852352,3262852607,DE +3262852608,3262853063,NL +3262853064,3262853071,DE +3262853072,3262853399,NL +3262853400,3262853407,DE +3262853408,3262853431,NL +3262853432,3262853439,DE +3262853440,3262853463,NL +3262853464,3262853471,DE +3262853472,3262854399,NL +3262854400,3262854407,DE +3262854408,3262854863,NL +3262854864,3262854871,DE +3262854872,3262855119,NL +3262855120,3262855127,DE +3262855128,3262855767,NL +3262855768,3262855775,DE +3262855776,3262855935,NL +3262855936,3262857215,DE +3262857216,3262857439,NL +3262857440,3262857447,DE +3262857448,3262857703,NL +3262857704,3262857711,DE +3262857712,3262857919,NL +3262857920,3262857927,DE +3262857928,3262858431,NL +3262858432,3262858439,DE +3262858440,3262858823,NL +3262858824,3262858831,DE +3262858832,3262859071,NL +3262859072,3262859079,DE +3262859080,3262860431,NL +3262860432,3262860439,DE +3262860440,3262860655,NL +3262860656,3262860663,DE +3262860664,3262860751,NL +3262860752,3262860759,DE +3262860760,3262861135,NL +3262861136,3262861143,DE +3262861144,3262861623,NL +3262861624,3262861631,DE +3262861632,3262862247,NL +3262862248,3262862255,DE +3262862256,3262863383,NL +3262863384,3262863391,DE +3262863392,3262865543,NL +3262865544,3262865551,DE +3262865552,3262866375,NL +3262866376,3262866383,DE +3262866384,3262866463,NL +3262866464,3262866471,DE +3262866472,3262867407,NL +3262867408,3262867415,DE +3262867416,3262867703,NL +3262867704,3262867711,DE +3262867712,3262867815,NL +3262867816,3262867823,DE +3262867824,3262868439,NL +3262868440,3262868447,DE +3262868448,3262869439,NL +3262869440,3262869447,DE +3262869448,3262869831,NL +3262869832,3262869839,DE +3262869840,3262870567,NL +3262870568,3262870575,DE +3262870576,3262871223,NL +3262871224,3262871231,DE +3262871232,3262871359,NL +3262871360,3262871367,DE +3262871368,3262871551,NL +3262871552,3262872319,DE +3262872320,3262872399,NL +3262872400,3262872407,DE +3262872408,3262872663,NL +3262872664,3262872671,DE +3262872672,3262872903,NL +3262872904,3262872911,DE +3262872912,3262873303,NL +3262873304,3262873311,DE +3262873312,3262874087,NL +3262874088,3262874095,DE +3262874096,3262875031,NL +3262875032,3262875039,DE +3262875040,3262875199,NL +3262875200,3262875207,DE +3262875208,3262876423,NL +3262876424,3262876431,DE +3262876432,3262876927,NL +3262876928,3262877951,DE +3262877952,3262878015,NL +3262878016,3262878023,DE +3262878024,3262878215,NL +3262878216,3262878223,DE +3262878224,3262878375,NL +3262878376,3262878383,DE +3262878384,3262879167,NL +3262879168,3262879175,DE +3262879176,3262879231,NL +3262879232,3262879239,DE +3262879240,3262879631,NL +3262879632,3262879639,DE +3262879640,3262880239,NL +3262880240,3262880247,DE +3262880248,3262881999,NL +3262882000,3262882007,DE +3262882008,3262882543,NL +3262882544,3262882551,DE +3262882552,3262882559,NL +3262882560,3262883071,DE +3262883072,3262883127,NL +3262883128,3262883135,DE +3262883136,3262883191,NL +3262883192,3262883199,DE +3262883200,3262883399,NL +3262883400,3262883407,DE +3262883408,3262884335,NL +3262884336,3262884343,DE +3262884344,3262884495,NL +3262884496,3262884503,DE +3262884504,3262884615,NL +3262884616,3262884623,DE +3262884624,3262885895,NL +3262885896,3262885903,DE +3262885904,3262886015,NL +3262886016,3262886023,DE +3262886024,3262886191,NL +3262886192,3262886199,DE +3262886200,3262886583,NL +3262886584,3262886591,DE +3262886592,3262886679,NL +3262886680,3262886687,DE +3262886688,3262886799,NL +3262886800,3262886807,DE +3262886808,3262886855,NL +3262886856,3262886863,DE +3262886864,3262887167,NL +3262887168,3262887175,DE +3262887176,3262887247,NL +3262887248,3262887255,DE +3262887256,3262887519,NL +3262887520,3262887527,DE +3262887528,3262888183,NL +3262888184,3262888191,DE +3262888192,3262888207,NL +3262888208,3262888215,DE +3262888216,3262888399,NL +3262888400,3262888407,DE +3262888408,3262888639,NL +3262888640,3262888647,DE +3262888648,3262889111,NL +3262889112,3262889119,DE +3262889120,3262889351,NL +3262889352,3262889359,DE +3262889360,3262889415,NL +3262889416,3262889423,DE +3262889424,3262889519,NL +3262889520,3262889527,DE +3262889528,3262890047,NL +3262890048,3262890055,DE +3262890056,3262890319,NL +3262890320,3262890327,DE +3262890328,3262890623,NL +3262890624,3262890631,DE +3262890632,3262890879,NL +3262890880,3262890887,DE +3262890888,3262891463,NL +3262891464,3262891471,DE +3262891472,3262891871,NL +3262891872,3262891879,DE +3262891880,3262892119,NL +3262892120,3262892127,DE +3262892128,3262892399,NL +3262892400,3262892407,DE +3262892408,3262892671,NL +3262892672,3262892679,DE +3262892680,3262892703,NL +3262892704,3262892711,DE +3262892712,3262892887,NL +3262892888,3262892895,DE +3262892896,3262893127,NL +3262893128,3262893135,DE +3262893136,3262893343,NL +3262893344,3262893351,DE +3262893352,3262893479,NL +3262893480,3262893487,DE +3262893488,3262894039,NL +3262894040,3262894047,DE +3262894048,3262895335,NL +3262895336,3262895343,DE +3262895344,3262895415,NL +3262895416,3262895423,DE +3262895424,3262895495,NL +3262895496,3262895503,DE +3262895504,3262895727,NL +3262895728,3262895735,DE +3262895736,3262895775,NL +3262895776,3262895783,DE +3262895784,3262896183,NL +3262896184,3262896191,DE +3262896192,3262896207,NL +3262896208,3262896215,DE +3262896216,3262896327,NL +3262896328,3262896335,DE +3262896336,3262896943,NL +3262896944,3262896951,DE +3262896952,3262896983,NL +3262896984,3262896991,DE +3262896992,3262897167,NL +3262897168,3262897175,DE +3262897176,3262897447,NL +3262897448,3262897455,DE +3262897456,3262897655,NL +3262897656,3262897663,DE +3262897664,3262898071,NL +3262898072,3262898079,DE +3262898080,3262898103,NL +3262898104,3262898111,DE +3262898112,3262898119,NL +3262898120,3262898127,DE +3262898128,3262898199,NL +3262898200,3262898207,DE +3262898208,3262898359,NL +3262898360,3262898367,DE +3262898368,3262899039,NL +3262899040,3262899047,DE +3262899048,3262899743,NL +3262899744,3262899751,DE +3262899752,3262899959,NL +3262899960,3262899967,DE +3262899968,3262900055,NL +3262900056,3262900063,DE +3262900064,3262900223,NL +3262900224,3262900479,DE +3262900480,3262900487,NL +3262900488,3262900495,DE +3262900496,3262900663,NL +3262900664,3262900671,DE +3262900672,3262901079,NL +3262901080,3262901087,DE +3262901088,3262901511,NL +3262901512,3262901519,DE +3262901520,3262902871,NL +3262902872,3262902879,DE +3262902880,3262902991,NL +3262902992,3262902999,DE +3262903000,3262903047,NL +3262903048,3262903055,DE +3262903056,3262904215,NL +3262904216,3262904223,DE +3262904224,3262904655,NL +3262904656,3262904663,DE +3262904664,3262906367,NL +3262906368,3262964991,CH +3262964992,3262965247,DE +3262965248,3262969599,CH +3262969856,3262971903,CH +3262971904,3263029247,IE +3263029248,3263030271,UA +3263030272,3263031295,GB +3263031296,3263032319,TR +3263032320,3263033343,RU +3263033344,3263033855,LV +3263033856,3263034367,IT +3263034368,3263034879,UA +3263034880,3263035391,GB +3263035392,3263035903,UA +3263035904,3263036415,CH +3263036416,3263036927,GR +3263036928,3263037439,RU +3263037440,3263045631,LB +3263045632,3263047935,KW +3263047936,3263048191,LB +3263048192,3263053823,KW +3263053824,3263062015,GB +3263062016,3263070207,EE +3263070208,3263070719,FR +3263070720,3263070975,NL +3263070976,3263071487,DE +3263071488,3263072255,NL +3263072256,3263074303,LB +3263074304,3263074815,CH +3263075840,3263076351,SE +3263076352,3263076863,RO +3263076864,3263077375,IT +3263077376,3263077887,FR +3263077888,3263078399,DE +3263078400,3263079423,RO +3263079424,3263080447,PL +3263080448,3263081471,RU +3263081472,3263082495,NL +3263082496,3263083519,RO +3263083520,3263084543,UA +3263084544,3263085567,RO +3263085568,3263086591,CH +3263086592,3263086847,DK +3263086848,3263087103,NL +3263087104,3263087871,DE +3263087872,3263088127,SI +3263088128,3263088639,DE +3263088640,3263089151,CH +3263089152,3263089407,RO +3263089408,3263089663,RU +3263089664,3263089919,UA +3263089920,3263090175,RO +3263090176,3263090431,DE +3263090432,3263090687,PL +3263090688,3263090943,DE +3263090944,3263091199,GB +3263091200,3263091455,PL +3263091456,3263091711,NO +3263091712,3263091967,FI +3263091968,3263092479,HR +3263092480,3263092735,ES +3263092736,3263092991,PL +3263092992,3263093247,FR +3263093248,3263093503,CH +3263093504,3263093759,RU +3263093760,3263094015,RO +3263094016,3263094527,PL +3263094528,3263094783,DK +3263094784,3263095039,UA +3263095040,3263095295,ES +3263095296,3263095551,FR +3263095552,3263095807,RO +3263095808,3263096063,DE +3263096064,3263096319,PL +3263096320,3263096575,TR +3263096576,3263096831,SA +3263096832,3263097087,NL +3263097088,3263097343,FR +3263097344,3263097599,DK +3263097600,3263097855,NL +3263097856,3263098111,FR +3263098112,3263098367,DE +3263098368,3263098623,PL +3263098624,3263098879,DE +3263098880,3263099135,GB +3263099136,3263099391,NL +3263099392,3263099903,DE +3263099904,3263100159,RO +3263100160,3263100415,FR +3263100416,3263100671,DE +3263100672,3263100927,GB +3263100928,3263101183,AT +3263101184,3263101439,SE +3263101440,3263101695,DK +3263101696,3263101951,DE +3263101952,3263102207,LT +3263102208,3263102463,RO +3263102464,3263102719,PL +3263102720,3263102975,GR +3263102976,3263128575,DE +3263128832,3263137791,DE +3263137792,3263138303,PL +3263138304,3263138559,DE +3263138560,3263138815,AT +3263138816,3263148543,DE +3263149056,3263155711,DE +3263155968,3263168511,DE +3263168512,3263430655,GB +3263430656,3263436799,SE +3263436800,3263437311,GB +3263437312,3263477759,SE +3263477760,3263478015,JP +3263478016,3263496191,SE +3263497984,3263498239,GB +3263498752,3263498879,US +3263498880,3263498943,GB +3263498960,3263499007,GB +3263499776,3263500031,FR +3263500032,3263500287,GB +3263500800,3263501341,GB +3263501344,3263501439,GB +3263501440,3263501503,US +3263501504,3263501519,GB +3263501520,3263501527,IR +3263501528,3263501535,GB +3263501536,3263501551,DE +3263501552,3263501823,GB +3263501824,3263502079,EG +3263503104,3263503167,DE +3263503200,3263503267,DE +3263503272,3263503279,DE +3263503296,3263503359,DE +3263503872,3263504127,GB +3263504128,3263504255,EG +3263506688,3263506815,DE +3263506816,3263506943,US +3263507200,3263507455,US +3263508224,3263508479,GB +3263509504,3263509759,SE +3263509760,3263509791,GB +3263509792,3263509807,IE +3263509808,3263509831,GB +3263509832,3263509839,FR +3263509840,3263509847,GB +3263509848,3263509887,US +3263509888,3263510023,GB +3263510024,3263510031,BE +3263510032,3263510063,GB +3263510064,3263510079,US +3263510080,3263510271,GB +3263511296,3263511551,GB +3263512064,3263512311,GB +3263513344,3263513599,US +3263513856,3263514111,RU +3263516672,3263516927,US +3263516928,3263517183,GB +3263517696,3263517951,US +3263517952,3263518463,GB +3263518464,3263518719,FR +3263518720,3263518751,IR +3263518976,3263519231,GB +3263519744,3263519759,GB +3263520256,3263520511,FR +3263520512,3263520767,US +3263521792,3263522047,GB +3263523072,3263523583,DE +3263525760,3263525887,DE +3263527424,3263527679,ZW +3263527680,3263527935,DE +3263528192,3263528447,FR +3263528704,3263528959,GB +3263530496,3263530751,GB +3263531520,3263531535,DE +3263531552,3263531775,DE +3263532544,3263532799,GB +3263537664,3263538431,TR +3263540224,3263540479,TR +3263540480,3263540735,GB +3263541504,3263541535,GB +3263557632,3263557887,TR +3263558656,3263558911,TR +3263558912,3263559679,GB +3263559680,3263560191,TR +3263560448,3263560703,TR +3263560960,3263561231,TR +3263561472,3263561727,TR +3263561728,3263627263,NL +3263627264,3263657471,RU +3263657472,3263657727,KZ +3263657728,3263684351,RU +3263684352,3263684607,UA +3263684608,3263688959,RU +3263688960,3263689215,UA +3263689216,3263689471,RU +3263689472,3263689727,UA +3263689728,3263689983,RU +3263689984,3263690239,UA +3263690240,3263691007,RU +3263691008,3263691263,UA +3263691264,3263691775,RU +3263691776,3263692031,UA +3263692032,3263692287,RU +3263692288,3263692799,UA +3263692800,3263760127,FI +3263760128,3263760383,SE +3263760384,3263764991,FI +3263764992,3263765503,BE +3263765504,3263766975,FI +3263766976,3263767039,RU +3263767040,3263773951,FI +3263773952,3263774207,BE +3263774208,3263774463,FI +3263774464,3263774719,BE +3263774720,3263792351,FI +3263792352,3263792367,SE +3263792368,3263793151,FI +3263793152,3263793407,BE +3263793408,3263816703,FI +3263816704,3263816959,ES +3263816960,3263817215,NL +3263817216,3263823871,FI +3263823872,3263954943,DE +3263954944,3263979519,ES +3263979520,3263987711,DE +3263987712,3264004095,ES +3264004096,3264012287,HU +3264012288,3264012543,AT +3264012544,3264012799,FR +3264012800,3264013055,GB +3264013056,3264013311,TR +3264013312,3264013567,UA +3264013568,3264013823,RU +3264013824,3264014079,NL +3264014080,3264014335,DE +3264014336,3264014591,PT +3264014592,3264014847,PL +3264014848,3264015103,IE +3264015104,3264015359,RO +3264015360,3264015615,DK +3264015616,3264015871,UA +3264015872,3264016127,PT +3264016128,3264016383,DE +3264016384,3264016639,SE +3264016640,3264016895,PL +3264016896,3264017151,GB +3264017152,3264017663,SE +3264017664,3264017919,RO +3264017920,3264018175,NL +3264018176,3264018431,FR +3264018432,3264018687,HU +3264018688,3264018943,GB +3264018944,3264019199,PL +3264019200,3264019967,GB +3264019968,3264020223,AT +3264020224,3264020479,PL +3264020480,3264086015,BG +3264086016,3264099839,FI +3264099840,3264100095,GB +3264100096,3264124927,FI +3264124928,3264125183,DE +3264125184,3264125439,NL +3264125440,3264125695,FI +3264125696,3264125951,BE +3264125952,3264133375,FI +3264133376,3264133631,SE +3264133632,3264151551,FI +3264151552,3264184319,NO +3264184320,3264184831,MD +3264184832,3264185343,NL +3264185344,3264185855,FR +3264185856,3264186367,DE +3264186368,3264186879,UA +3264186880,3264187391,RU +3264187392,3264187903,IR +3264187904,3264188415,IT +3264188416,3264189439,UA +3264189440,3264190463,RU +3264190464,3264190975,LV +3264190976,3264191487,GB +3264191488,3264191999,DE +3264192000,3264200703,GB +3264200704,3264208895,ES +3264208896,3264217087,HU +3264217088,3264282623,IS +3264282624,3264290815,GB +3264290816,3264296191,FI +3264296192,3264297727,FR +3264297728,3264298751,PT +3264298752,3264299007,BG +3264299008,3264307199,DE +3264307200,3264311295,PL +3264311296,3264311551,FR +3264311552,3264311807,IT +3264311808,3264312063,DE +3264312064,3264312319,CH +3264312320,3264312575,PL +3264312576,3264312831,UA +3264312832,3264313343,DE +3264313344,3264313599,RO +3264313600,3264313855,PT +3264313856,3264314623,DE +3264314624,3264314879,SE +3264314880,3264315135,GB +3264315136,3264315391,GR +3264315392,3264317439,IE +3264317440,3264318463,SK +3264318464,3264318975,ES +3264318976,3264319487,DE +3264319488,3264319743,FR +3264319744,3264319999,SE +3264320000,3264320255,DE +3264320256,3264321023,GB +3264321024,3264321535,DE +3264321536,3264321791,SE +3264321792,3264322047,RS +3264322048,3264322303,FR +3264322304,3264322559,RO +3264322560,3264322815,HU +3264322816,3264323071,CH +3264323072,3264323327,RU +3264323328,3264323583,RO +3264323584,3264324607,BG +3264324608,3264325631,SE +3264325632,3264326655,RU +3264326656,3264327679,SE +3264327680,3264328703,AT +3264328704,3264329727,CZ +3264329728,3264330751,PL +3264330752,3264331775,GB +3264331776,3264332287,DE +3264332288,3264332799,NL +3264332800,3264333311,GB +3264333312,3264333823,UA +3264333824,3264334335,NL +3264334336,3264334847,RO +3264334848,3264335359,PL +3264335360,3264335871,SK +3264335872,3264336383,CY +3264336384,3264336895,GB +3264336896,3264337407,RU +3264337408,3264338431,UA +3264338432,3264338943,DE +3264338944,3264339455,UA +3264339456,3264339967,GB +3264339968,3264340223,DE +3264340224,3264340479,PL +3264340480,3264340735,DE +3264340736,3264340991,UA +3264340992,3264341503,PL +3264341504,3264341759,DE +3264341760,3264342015,IT +3264342016,3264342783,DE +3264343040,3264343295,DE +3264343296,3264343551,GB +3264343552,3264343807,RO +3264343808,3264344063,DE +3264344064,3264345087,GB +3264345088,3264346111,NL +3264346112,3264347135,SE +3264347136,3264348159,DE +3264348160,3264372223,FR +3264372736,3264375039,FR +3264375040,3264376063,SE +3264376064,3264376319,HR +3264376320,3264376575,UA +3264376576,3264376831,CH +3264376832,3264377087,UA +3264377088,3264377343,RU +3264377344,3264377599,IT +3264377600,3264378111,RU +3264378112,3264378367,SE +3264378368,3264378623,DE +3264378624,3264378879,RU +3264378880,3264379135,PL +3264379136,3264379391,BE +3264379392,3264379647,RU +3264379648,3264380159,DE +3264380160,3264380415,RO +3264380416,3264380671,CH +3264380672,3264380927,NL +3264380928,3264381951,PL +3264381952,3264385023,UA +3264385024,3264386047,DE +3264386048,3264387071,IR +3264387072,3264388095,LB +3264388096,3264389119,UA +3264389120,3264390143,DE +3264390144,3264391167,IR +3264391168,3264392191,SE +3264392192,3264393215,FR +3264393216,3264394239,DE +3264394240,3264395263,UA +3264395264,3264396287,AT +3264396288,3264397311,UA +3264397312,3264398335,GB +3264398336,3264399359,UA +3264399360,3264400383,RU +3264400384,3264401407,PA +3264401408,3264402431,DE +3264402432,3264403455,CH +3264403456,3264404479,PL +3264404480,3264405503,UA +3264405504,3264406527,FR +3264406528,3264407551,UA +3264407552,3264408575,BG +3264408576,3264409599,AE +3264409600,3264410623,RU +3264410624,3264411647,NO +3264411648,3264413695,PL +3264417536,3264431103,CH +3264431104,3264431615,LI +3264431616,3264439039,CH +3264439296,3264439807,CH +3264440320,3264441599,CH +3264442112,3264445439,CH +3264446208,3264446463,FR +3264446464,3264456191,CH +3264456704,3264476671,CH +3264477696,3264483071,CH +3264483072,3264483327,LI +3264483328,3264486527,CH +3264486528,3264486559,LI +3264486560,3264494079,CH +3264494080,3264494335,US +3264494336,3264544767,CH +3264544768,3264561151,HU +3264561152,3264562687,RU +3264562944,3264563183,RU +3264563200,3264564223,ES +3264564224,3264565247,IE +3264565248,3264567295,NL +3264567296,3264567551,PL +3264567552,3264567807,GB +3264567808,3264568319,RU +3264568320,3264568575,DE +3264568576,3264568831,RU +3264568832,3264569087,DE +3264569088,3264569343,RU +3264569344,3264577535,CZ +3264577536,3264585727,MK +3264585728,3264593919,FR +3264593920,3264602111,ES +3264602112,3264603135,RU +3264603136,3264604159,PL +3264604160,3264604671,IT +3264604672,3264605183,RU +3264605184,3264605695,GR +3264605696,3264606207,DK +3264606208,3264606463,PL +3264606464,3264606719,DE +3264606720,3264606975,FR +3264606976,3264607231,BE +3264607232,3264607487,IT +3264607488,3264610303,DE +3264610304,3264626687,FR +3264626688,3264627711,EE +3264627712,3264628735,GR +3264628736,3264630783,UA +3264630784,3264631807,DE +3264631808,3264632831,RO +3264632832,3264633855,RU +3264633856,3264634879,UA +3264634880,3264636927,PL +3264636928,3264637951,UA +3264637952,3264639999,DK +3264640000,3264641023,BG +3264641024,3264642047,GB +3264642048,3264651263,RU +3264651264,3264651775,CH +3264651776,3264652287,IT +3264652288,3264652799,RU +3264652800,3264653311,PL +3264653312,3264653823,DE +3264654336,3264654847,DE +3264654848,3264655359,UA +3264655360,3264655871,GB +3264655872,3264656383,RU +3264656384,3264656895,BG +3264656896,3264657407,GB +3264657408,3264657919,PL +3264657920,3264658431,RO +3264658432,3264659455,DE +3264659456,3264659967,UA +3264659968,3264660479,GB +3264660480,3264660991,PL +3264660992,3264661503,CH +3264661504,3264662015,GB +3264662016,3264662527,RU +3264662528,3264663039,UA +3264663040,3264663551,PL +3264663552,3264664063,NL +3264664064,3264664575,DE +3264664576,3264665087,NO +3264665088,3264665599,SE +3264665600,3264666111,RO +3264666112,3264666623,IL +3264666624,3264667135,UA +3264667136,3264667647,SE +3264667648,3264668159,BE +3264668160,3264669183,DE +3264669184,3264669695,PL +3264669696,3264670207,UA +3264670208,3264670719,RU +3264670720,3264671231,FR +3264671232,3264671743,PL +3264671744,3264672255,DE +3264672256,3264672767,RO +3264672768,3264673279,CH +3264673280,3264673791,PL +3264673792,3264674303,CH +3264674304,3264674815,PL +3264674816,3264675327,GB +3264675840,3264741375,NL +3264741376,3264749567,SI +3264749568,3264750079,LV +3264750080,3264750591,RU +3264750592,3264751103,KG +3264751104,3264751615,DK +3264751616,3264752127,GB +3264752128,3264752639,RO +3264752640,3264753151,NL +3264753152,3264753663,PL +3264753664,3264754175,IT +3264754176,3264754687,PL +3264754688,3264755199,RU +3264755200,3264755711,DE +3264755712,3264756223,PL +3264756224,3264756735,FI +3264756736,3264757247,PL +3264757248,3264757759,RU +3264757760,3264765951,GB +3264765952,3264774143,AT +3264774144,3264782335,HU +3264782336,3264790527,AT +3264790528,3264806911,HR +3264806912,3264815103,GB +3264815104,3264825343,SE +3264825344,3264825599,NO +3264825600,3264825855,IT +3264825856,3264826111,NL +3264826112,3264826879,GB +3264826880,3264827135,NL +3264827136,3264827391,LV +3264827392,3264827647,FR +3264827648,3264828159,GR +3264828160,3264828415,DE +3264828416,3264828671,SE +3264828672,3264828927,MT +3264828928,3264829439,DE +3264829440,3264830207,FR +3264830208,3264830463,SE +3264830464,3264830719,FR +3264830720,3264830975,AT +3264830976,3264831231,CH +3264831232,3264831487,PL +3264831488,3264831743,CH +3264831744,3264831999,FR +3264832000,3264832255,AT +3264832256,3264832511,IT +3264832512,3264832767,DE +3264832768,3264833023,IL +3264833024,3264833535,IT +3264833536,3264834047,DE +3264834048,3264834559,GB +3264834560,3264835327,FR +3264835328,3264835583,AT +3264835584,3264835839,RU +3264835840,3264836351,DE +3264836352,3264836607,PL +3264836608,3264836863,DE +3264836864,3264837119,NL +3264837120,3264837375,BG +3264837376,3264837631,PL +3264837632,3264839679,AT +3264839680,3264840191,UA +3264840192,3264840447,DE +3264840448,3264840703,IT +3264840704,3264840959,PT +3264840960,3264841471,PL +3264841472,3264841727,LV +3264841728,3264844031,GB +3264844032,3264844287,BG +3264844288,3264844799,DE +3264844800,3264845311,UA +3264845312,3264845951,DE +3264845952,3264846079,GB +3264846080,3264846207,UG +3264846208,3264846335,PL +3264846464,3264846591,NO +3264846592,3264846719,US +3264846720,3264846847,RU +3264846848,3264846911,DK +3264846912,3264846975,RU +3264846976,3264847039,DE +3264847040,3264847103,GB +3264847104,3264847135,FR +3264847136,3264847167,ES +3264847168,3264847199,NL +3264847200,3264847231,NO +3264847232,3264847263,NL +3264847264,3264847295,LI +3264847296,3264847327,FR +3264847328,3264847359,NL +3264847360,3264847487,FR +3264847488,3264847615,RU +3264847616,3264847679,PL +3264847680,3264847743,RU +3264847744,3264847807,BE +3264847808,3264847871,SE +3264847872,3264849919,DE +3264849920,3264850431,GB +3264850432,3264850687,PL +3264850688,3264850943,LV +3264850944,3264851967,IT +3264851968,3264854015,CH +3264854016,3264854527,DE +3264854528,3264854783,GR +3264854784,3264855039,IT +3264855040,3264855551,CH +3264855552,3264856063,DE +3264856064,3264861695,IT +3264861696,3264862079,FR +3264862080,3264862207,SE +3264862208,3264862463,PL +3264862464,3264862719,AT +3264862720,3264862975,GB +3264862976,3264863231,DE +3264863232,3264864255,AT +3264864256,3264872447,RO +3264872448,3264888831,GB +3264888832,3264897023,RU +3264897024,3264905215,GB +3264905216,3264906287,CY +3264906288,3264906291,GR +3264906292,3264906295,CY +3264906296,3264906303,GR +3264906304,3264906323,CY +3264906324,3264906327,GR +3264906328,3264906332,CY +3264906333,3264906335,GR +3264906336,3264906339,CY +3264906340,3264906343,GR +3264906344,3264906495,CY +3264906496,3264906623,GR +3264906624,3264906751,CY +3264906752,3264906761,GR +3264906762,3264906879,CY +3264906880,3264906895,GR +3264906896,3264906911,CY +3264906912,3264906919,GR +3264906920,3264906983,CY +3264906984,3264906995,GR +3264906996,3264907135,CY +3264907136,3264907143,GR +3264907144,3264907151,CY +3264907152,3264907155,GR +3264907156,3264907639,CY +3264907640,3264907647,GR +3264907648,3264907663,CY +3264907664,3264907671,GR +3264907672,3264907679,CY +3264907680,3264907683,GR +3264907684,3264907687,CY +3264907688,3264907691,GR +3264907692,3264907695,CY +3264907696,3264907703,GR +3264907704,3264907715,CY +3264907716,3264907719,GR +3264907720,3264907723,CY +3264907724,3264907727,GR +3264907728,3264907735,CY +3264907736,3264907743,GR +3264907744,3264907755,CY +3264907756,3264907759,GR +3264907760,3264907772,CY +3264907773,3264907775,GR +3264907776,3264907919,CY +3264907920,3264907923,GR +3264907924,3264907935,CY +3264907936,3264907939,GR +3264907940,3264907963,CY +3264907964,3264907971,GR +3264907972,3264907987,CY +3264907988,3264907991,GR +3264907992,3264908011,CY +3264908012,3264908019,GR +3264908020,3264908023,CY +3264908024,3264908031,GR +3264908032,3264908095,CY +3264908096,3264908103,GR +3264908104,3264908167,CY +3264908168,3264908175,GR +3264908176,3264908183,CY +3264908184,3264908191,GR +3264908192,3264908286,CY +3264908287,3264908799,GR +3264908800,3264909055,GB +3264909056,3264909311,GR +3264909312,3264909639,CY +3264909640,3264909647,GR +3264909648,3264909655,CY +3264909656,3264909663,GR +3264909664,3264910590,CY +3264910591,3264910591,GR +3264910592,3264910607,CY +3264910608,3264910623,GR +3264910624,3264910655,CY +3264910656,3264910671,GR +3264910672,3264910695,CY +3264910696,3264910699,GR +3264910700,3264910707,CY +3264910708,3264910719,GR +3264910720,3264910815,CY +3264910816,3264911103,GR +3264911104,3264911651,CY +3264911652,3264911655,GR +3264911656,3264911679,CY +3264911680,3264911711,GR +3264911712,3264911743,CY +3264911744,3264911807,GR +3264911808,3264912131,CY +3264912132,3264912135,GR +3264912136,3264912139,CY +3264912140,3264912143,GR +3264912144,3264912147,CY +3264912148,3264912151,GR +3264912152,3264912167,CY +3264912168,3264912219,GR +3264912220,3264912223,CY +3264912224,3264912231,GR +3264912232,3264912235,CY +3264912236,3264912239,GR +3264912240,3264912243,CY +3264912244,3264912251,GR +3264912252,3264912271,CY +3264912272,3264912279,GR +3264912280,3264912283,CY +3264912284,3264912319,GR +3264912320,3264912655,CY +3264912656,3264912663,GR +3264912664,3264912815,CY +3264912816,3264912839,GR +3264912840,3264912843,CY +3264912844,3264912863,GR +3264912864,3264912879,CY +3264912880,3264912895,GR +3264912896,3264913151,CY +3264913152,3264913183,GR +3264913184,3264913191,CY +3264913192,3264913199,GR +3264913200,3264913223,CY +3264913224,3264913231,GR +3264913232,3264913243,CY +3264913244,3264913263,GR +3264913264,3264913279,CY +3264913280,3264913295,GR +3264913296,3264913299,CY +3264913300,3264913303,GR +3264913304,3264913311,CY +3264913312,3264913327,GR +3264913328,3264913375,CY +3264913376,3264913383,GR +3264913384,3264913399,CY +3264913400,3264913407,GR +3264913408,3264917247,GB +3264917248,3264917375,NL +3264917376,3264921599,GB +3264921600,3264922303,LU +3264922304,3264922319,SA +3264922320,3264929791,LU +3264929792,3264937983,SK +3264937984,3265003519,GB +3265003520,3265006335,DE +3265006592,3265010943,DE +3265011200,3265043199,DE +3265043456,3265052671,DE +3265053440,3265055231,DE +3265055232,3265055743,FR +3265055744,3265069055,DE +3265069056,3265134591,FI +3265134592,3265142783,CH +3265142784,3265150975,MT +3265150976,3265159167,AD +3265159168,3265167359,FR +3265167360,3265175551,AT +3265175552,3265183743,NL +3265183744,3265191935,BY +3265191936,3265200127,CH +3265200128,3265216511,GB +3265216512,3265216767,DE +3265216768,3265217023,FR +3265217024,3265218559,GB +3265218560,3265219071,NL +3265219072,3265257471,GB +3265257472,3265259519,NL +3265259520,3265265663,GB +3265265664,3265286463,SK +3265286464,3265286527,SR +3265286528,3265331199,SK +3265331200,3265340415,GB +3265340416,3265340671,DE +3265340672,3265340927,GB +3265340928,3265341183,CH +3265341184,3265341279,AT +3265341312,3265341439,FR +3265341440,3265341695,GB +3265341696,3265341951,DE +3265341952,3265343487,GB +3265343488,3265347583,DE +3265347584,3265352703,FR +3265352704,3265352959,BE +3265352960,3265353215,FR +3265353216,3265355263,DE +3265355264,3265355775,FR +3265355776,3265357055,BE +3265357056,3265357311,FR +3265357312,3265357567,DE +3265357568,3265357823,BE +3265357824,3265358847,NL +3265358848,3265359103,BE +3265359104,3265359871,NL +3265359872,3265360127,CH +3265360128,3265360383,GB +3265360384,3265360895,CH +3265360896,3265361919,GB +3265361920,3265363967,IT +3265363968,3265366015,ES +3265366080,3265366271,BE +3265366272,3265366527,HU +3265366528,3265367039,DK +3265367040,3265367295,AT +3265367296,3265367551,ES +3265367552,3265367807,SE +3265367808,3265369343,DK +3265369344,3265369599,IL +3265369600,3265369855,SE +3265369856,3265370111,DE +3265370112,3265370623,DK +3265370624,3265370879,GB +3265370880,3265376255,DE +3265376256,3265376511,IT +3265376512,3265378303,GB +3265378304,3265380095,NL +3265380096,3265382399,GB +3265382400,3265382911,CH +3265382912,3265384447,GB +3265384448,3265386495,DE +3265386496,3265387519,NL +3265388544,3265396735,GB +3265396736,3265464847,DE +3265464848,3265464863,AT +3265464864,3265465343,DE +3265465344,3265465599,AT +3265465600,3265527807,DE +3265527808,3265569279,GB +3265569280,3265569791,AE +3265569792,3265593343,GB +3265593344,3265594367,RU +3265594368,3265595391,UA +3265595392,3265595903,PL +3265595904,3265596415,RU +3265596416,3265596927,GB +3265596928,3265597439,FR +3265597440,3265599999,RU +3265600000,3265600511,HU +3265600512,3265601023,GB +3265601024,3265601535,RU +3265601536,3265601791,SE +3265601792,3265602047,CH +3265602048,3265602559,NL +3265602560,3265602815,IT +3265602816,3265603071,IE +3265603072,3265603327,DK +3265603328,3265603583,NL +3265603584,3265603839,DE +3265603840,3265604095,PL +3265604096,3265604351,SA +3265604352,3265604607,FR +3265604608,3265604863,CH +3265604864,3265605119,FR +3265605120,3265605375,UA +3265605376,3265605631,CZ +3265605632,3265605887,PL +3265605888,3265606143,FR +3265606400,3265606655,DE +3265606656,3265606911,AT +3265606912,3265607167,FR +3265607168,3265607423,PL +3265607680,3265607935,DK +3265607936,3265608191,CZ +3265608192,3265608447,RU +3265608448,3265608703,SE +3265608704,3265608959,GB +3265608960,3265609215,RU +3265609216,3265609727,UA +3265609728,3265617919,NL +3265617920,3265626111,SI +3265626112,3265634303,JO +3265634304,3265642495,IE +3265642496,3265650687,GB +3265650688,3265658879,SE +3265658880,3265724415,AT +3265724416,3265789951,FR +3265789952,3265824767,GB +3265824768,3265825023,US +3265825024,3265887487,GB +3265887488,3265887743,PT +3265887744,3265888255,PL +3265888256,3265902335,GB +3265902336,3265902591,FR +3265902592,3265904383,GB +3265904384,3265904639,RO +3265904640,3265904895,DE +3265904896,3265905151,UA +3265905152,3265905663,GB +3265905664,3265905919,IE +3265905920,3265906175,GB +3265906176,3265906431,DE +3265906432,3265906687,CH +3265906688,3265906943,AT +3265906944,3265907199,ES +3265907200,3265907455,DE +3265907456,3265907711,FR +3265907712,3265907967,MD +3265907968,3265908735,UA +3265908736,3265908991,NL +3265908992,3265909247,RO +3265909248,3265909503,UA +3265909504,3265909759,DE +3265909760,3265910015,RO +3265910016,3265910271,PL +3265910528,3265910783,RU +3265910784,3265911039,NL +3265911040,3265911551,GB +3265911552,3265911807,CH +3265911808,3265912063,PL +3265912064,3265912319,GB +3265912320,3265912575,DE +3265912576,3265912831,RO +3265912832,3265913087,CZ +3265913088,3265913343,SE +3265913344,3265914367,PL +3265914368,3265914623,RU +3265914624,3265914879,BG +3265914880,3265915135,GR +3265915136,3265915391,RO +3265915392,3265915647,GB +3265915648,3265915903,RO +3265915904,3265916415,PL +3265916416,3265916671,UA +3265916672,3265916927,DE +3265916928,3265917183,FR +3265917184,3265917439,PL +3265917440,3265917695,RU +3265917696,3265917951,SE +3265917952,3265918207,GB +3265918464,3265918719,AT +3265918720,3265918975,RU +3265918976,3265919231,NL +3265919232,3265919487,FR +3265919488,3265919743,RU +3265919744,3265919999,DK +3265920000,3265920255,CZ +3265920256,3265920511,TR +3265920512,3265921023,GB +3265921024,3265986559,AE +3265986560,3266052095,NL +3266052096,3266322431,DE +3266322432,3266330623,LT +3266330624,3266338815,GB +3266338816,3266339071,RU +3266339072,3266339327,UA +3266339328,3266339583,ES +3266339584,3266339839,GB +3266339840,3266340095,RU +3266340096,3266340607,PL +3266340608,3266340863,FI +3266340864,3266341119,CH +3266341120,3266341375,GB +3266341376,3266341631,DE +3266341632,3266341887,GB +3266341888,3266342143,KW +3266342144,3266342399,CH +3266342400,3266342655,BE +3266342656,3266342911,KG +3266342912,3266343167,SI +3266343168,3266343423,GR +3266343424,3266343679,RU +3266343680,3266343935,RO +3266343936,3266344191,CH +3266344192,3266344447,UA +3266344448,3266344703,RU +3266344704,3266344959,ES +3266344960,3266345215,IE +3266345216,3266345727,DE +3266345728,3266345983,DK +3266345984,3266346495,GB +3266346496,3266346751,IT +3266346752,3266347007,FR +3266347008,3266347263,GB +3266351360,3266352623,GB +3266352896,3266353567,GB +3266353584,3266353591,GB +3266353664,3266353671,GB +3266353680,3266353687,GB +3266353776,3266353783,US +3266353856,3266353863,GB +3266353880,3266353887,GB +3266353896,3266353903,GB +3266353920,3266355199,GB +3266355200,3266363391,RO +3266363392,3266371583,GB +3266371584,3266379775,HU +3266379776,3266380799,UA +3266380800,3266381823,PL +3266381824,3266382847,FR +3266382848,3266383871,RU +3266383872,3266384895,IL +3266384896,3266385919,RU +3266385920,3266386943,UA +3266386944,3266387967,PL +3266387968,3266388375,FR +3266388376,3266388378,NL +3266388379,3266389247,FR +3266389248,3266389327,LU +3266389328,3266395647,FR +3266395648,3266395903,NL +3266395904,3266396159,FR +3266396160,3266412543,IT +3266412544,3266420735,AT +3266420736,3266428927,GB +3266428928,3266437119,GR +3266437120,3266445311,GL +3266445312,3266510847,NL +3266510848,3266543615,ES +3266543616,3266576383,IT +3266576384,3266603519,DE +3266604032,3266617327,DE +3266617344,3266634383,DE +3266634392,3266634399,EE +3266634400,3266641919,DE +3266641920,3266707455,PL +3266707456,3266767615,DK +3266767616,3266767871,FO +3266767872,3266772991,DK +3266772992,3266781183,IT +3266781184,3266789375,PL +3266789376,3266797567,SM +3266797568,3266797823,GB +3266797824,3266798079,NL +3266798080,3266799103,GB +3266799104,3266799615,NL +3266799616,3266800127,GB +3266800128,3266800319,NL +3266800320,3266800639,GB +3266800640,3266800703,NL +3266800704,3266800727,GB +3266800728,3266800735,NL +3266800736,3266800895,GB +3266800896,3266801215,NL +3266801216,3266801407,GB +3266801408,3266801471,NL +3266801472,3266801487,GB +3266801488,3266801519,NL +3266801520,3266801535,GB +3266801536,3266801599,NL +3266801600,3266801615,GB +3266801616,3266801647,NL +3266801648,3266801663,GB +3266801664,3266801919,NL +3266801920,3266802943,GB +3266802944,3266803199,NL +3266803200,3266803711,GB +3266803712,3266803831,NL +3266803832,3266804223,GB +3266804224,3266804479,NL +3266804480,3266804735,GB +3266804736,3266804991,NL +3266804992,3266805503,GB +3266805504,3266805759,NL +3266805760,3266809343,AT +3266809344,3266809599,LI +3266809600,3266813951,AT +3266813952,3266822143,UA +3266822144,3266830335,FR +3266830336,3266836479,BE +3266836480,3266837503,LU +3266837504,3266838527,BE +3266838528,3266969599,IT +3266969600,3267008767,RU +3267008768,3267009023,UA +3267009024,3267029247,RU +3267029248,3267029503,KZ +3267029504,3267030095,RU +3267030096,3267030103,KZ +3267030104,3267032575,RU +3267032576,3267032831,KZ +3267032832,3267035135,RU +3267035136,3267039231,NO +3267039232,3267040255,DE +3267040256,3267041279,RO +3267041280,3267043327,UA +3267043328,3267044351,GB +3267044352,3267045375,RU +3267045376,3267046399,PL +3267046400,3267047423,NL +3267047424,3267048447,UA +3267048448,3267049471,PL +3267049472,3267050495,UA +3267050496,3267051519,SE +3267051520,3267052543,DE +3267052544,3267053567,LV +3267053568,3267054591,PL +3267054592,3267055615,NL +3267055616,3267056639,PS +3267056640,3267057663,US +3267057664,3267058687,CH +3267058688,3267059711,AT +3267059712,3267060735,NL +3267060736,3267061759,LV +3267061760,3267063807,UA +3267063808,3267064831,DE +3267064832,3267065855,PL +3267065856,3267066879,RO +3267066880,3267067903,IT +3267067904,3267068927,UA +3267068928,3267069951,BG +3267069952,3267070975,RO +3267070976,3267071999,DE +3267072000,3267073023,PL +3267073024,3267075071,UA +3267075072,3267076095,CH +3267076096,3267078143,DE +3267078144,3267079167,PL +3267079168,3267080191,IT +3267080192,3267081215,AT +3267081216,3267082239,PL +3267082240,3267083263,DE +3267083264,3267084287,RO +3267084288,3267085311,FR +3267085312,3267086335,RU +3267086336,3267087359,PL +3267087360,3267088383,RU +3267088384,3267089407,UA +3267089408,3267090431,FI +3267090432,3267091455,UA +3267091456,3267092479,DE +3267092480,3267093503,FR +3267093504,3267094527,UA +3267094528,3267095551,GB +3267095552,3267096575,PL +3267096576,3267097599,DE +3267097600,3267098623,KZ +3267098624,3267099647,GB +3267099648,3267100671,IT +3267100672,3267166207,FI +3267166208,3267231743,GB +3267231744,3267297279,RU +3267297280,3267362815,CH +3267362816,3267426879,DK +3267426880,3267426943,CH +3267426944,3267428351,DK +3267428352,3267493887,GB +3267493888,3267494143,DE +3267494144,3267498239,GB +3267498240,3267498495,IE +3267498496,3267498751,DE +3267498752,3267504383,GB +3267504384,3267504639,AT +3267504640,3267505151,FR +3267505152,3267507711,DE +3267507712,3267507743,GB +3267507744,3267507775,DE +3267507776,3267507807,GB +3267507808,3267507839,ZA +3267507840,3267508223,GB +3267508224,3267508735,DE +3267508736,3267508991,IL +3267508992,3267509247,GB +3267509248,3267509503,AT +3267509504,3267509695,CH +3267509728,3267509759,CH +3267509760,3267510271,GB +3267510272,3267512831,FR +3267512832,3267513343,GB +3267513344,3267514367,FR +3267514368,3267517951,DE +3267517952,3267518463,GB +3267518464,3267524607,DE +3267526656,3267527679,DE +3267527680,3267529215,FR +3267529216,3267529471,GB +3267529472,3267529727,FR +3267529728,3267530751,AT +3267530752,3267534335,FR +3267534336,3267534527,CS +3267534560,3267534575,FR +3267534576,3267534591,AT +3267534592,3267538943,FR +3267538944,3267540223,NL +3267540224,3267540479,GB +3267540480,3267541759,NL +3267541760,3267542527,GB +3267542528,3267542783,CH +3267542784,3267543039,DE +3267543040,3267543295,IT +3267543296,3267543551,AT +3267543552,3267544319,GB +3267544320,3267544575,DE +3267544576,3267544703,IT +3267544704,3267544831,DE +3267544832,3267545087,FR +3267545088,3267545855,ES +3267545856,3267546111,DE +3267546112,3267546623,ES +3267546624,3267547135,FR +3267547136,3267547391,BE +3267547392,3267547647,DE +3267547648,3267549183,GB +3267549184,3267550463,DK +3267550464,3267550719,NL +3267550720,3267551231,DK +3267551232,3267551743,AT +3267551744,3267551999,SE +3267552000,3267552255,NO +3267552256,3267553023,AT +3267553024,3267553279,NL +3267553280,3267554303,DK +3267554304,3267554815,DE +3267554816,3267555071,FR +3267555200,3267555327,ZA +3267555328,3267555583,FI +3267555584,3267556095,GB +3267556096,3267556351,NO +3267556352,3267556607,GB +3267556608,3267556863,NO +3267556864,3267557375,IL +3267557376,3267557631,NO +3267557632,3267557887,AT +3267557888,3267558399,IL +3267558400,3267558911,CH +3267558912,3267559423,AT +3267559424,3267622527,DE +3267622528,3267622559,GB +3267622560,3267624959,DE +3267624960,3267625471,GB +3267625472,3267625727,FR +3267625728,3267625983,BE +3267625984,3267626239,NL +3267626240,3267626495,BE +3267626496,3267626751,ES +3267626752,3267627007,RU +3267627008,3267627343,DE +3267627360,3267627487,DE +3267627776,3267627807,DE +3267627840,3267628031,DE +3267628032,3267628287,IT +3267628544,3267628799,IT +3267628800,3267629055,HU +3267629056,3267629311,CZ +3267629312,3267629567,DK +3267629568,3267629759,BE +3267629808,3267629823,BE +3267629824,3267630079,GR +3267630080,3267630591,GB +3267630592,3267630847,SK +3267630848,3267630863,IT +3267630864,3267630943,FR +3267630944,3267631055,IT +3267631056,3267631071,GB +3267631088,3267631103,IT +3267631104,3267631615,GB +3267631616,3267631935,DE +3267632000,3267632127,DE +3267632384,3267632511,BE +3267632640,3267632895,IT +3267632896,3267633151,BE +3267633152,3267633679,NO +3267633696,3267633711,NO +3267633728,3267633855,NO +3267634176,3267634431,GB +3267634944,3267635711,GB +3267635968,3267636223,BE +3267636736,3267636783,ZA +3267636800,3267636815,ZA +3267636832,3267636991,ZA +3267636992,3267637247,AT +3267637504,3267637591,IT +3267637600,3267637695,IT +3267637760,3267637823,ES +3267637856,3267637887,ES +3267638016,3267638271,ES +3267638272,3267638527,BE +3267638528,3267638783,DK +3267638784,3267639295,CZ +3267639296,3267639551,NL +3267639552,3267639807,GB +3267639808,3267640063,CH +3267640064,3267640319,GB +3267640320,3267640575,CH +3267640576,3267640831,IT +3267640832,3267641087,GR +3267641344,3267641599,IE +3267641856,3267642111,GB +3267642112,3267642367,SE +3267642368,3267642623,GB +3267642624,3267642879,NO +3267642880,3267643135,SI +3267643136,3267643391,BE +3267643392,3267643439,RU +3267643456,3267643487,RU +3267643520,3267643647,RU +3267643648,3267643903,GB +3267644160,3267644415,BE +3267644416,3267644671,DE +3267644672,3267644927,SI +3267644936,3267644959,BE +3267644960,3267644975,FR +3267644976,3267644983,GB +3267644992,3267645055,BE +3267645056,3267645183,GB +3267645440,3267645695,GB +3267645696,3267645951,DE +3267645952,3267646207,DK +3267647488,3267647743,GB +3267647744,3267647999,SI +3267648000,3267648255,DE +3267648256,3267648383,GB +3267648416,3267648447,BE +3267648448,3267648479,FR +3267648480,3267648511,GB +3267648512,3267648767,DE +3267648768,3267649023,NL +3267649024,3267649279,RU +3267649280,3267649535,DE +3267649792,3267650303,NL +3267650320,3267650367,AT +3267650464,3267650495,AT +3267650528,3267650559,AT +3267650560,3267651071,GB +3267651072,3267651327,DE +3267651584,3267651839,FR +3267652096,3267652351,GB +3267652608,3267652863,DE +3267652864,3267653119,PT +3267653120,3267653375,GB +3267653888,3267654143,GB +3267654912,3267655167,SK +3267655168,3267655679,GB +3267655680,3267656191,IT +3267656192,3267656447,DK +3267657216,3267657471,HU +3267657472,3267657487,RO +3267657504,3267657567,RO +3267657664,3267657679,RO +3267657984,3267658239,GB +3267658240,3267658495,IT +3267658752,3267659263,CH +3267659520,3267659775,IT +3267660288,3267660543,CH +3267660544,3267660671,ES +3267661312,3267661567,SK +3267661568,3267661631,GB +3267661664,3267661679,GB +3267661696,3267661823,GB +3267661824,3267661831,ES +3267661840,3267661887,ES +3267662024,3267662031,ES +3267662040,3267662079,ES +3267662888,3267662895,GB +3267662896,3267662951,IE +3267662952,3267662959,GB +3267662960,3267662991,IE +3267663008,3267663071,IE +3267663088,3267663103,IE +3267663104,3267663327,IT +3267663360,3267663871,GB +3267663872,3267664127,DE +3267664384,3267664639,GB +3267664640,3267664671,SK +3267664800,3267664815,SK +3267664832,3267664879,SK +3267664888,3267664895,SK +3267665920,3267666175,GB +3267666176,3267666207,GR +3267666256,3267666431,GR +3267666432,3267666447,GB +3267666464,3267666543,GB +3267666576,3267667199,GB +3267667200,3267667455,NL +3267667456,3267667967,GB +3267670016,3267671551,ZA +3267671552,3267671807,DE +3267671808,3267672063,NO +3267672064,3267672319,DE +3267672576,3267672831,AT +3267672832,3267672927,FR +3267672936,3267672999,FR +3267673008,3267673015,FR +3267673024,3267673087,FR +3267673088,3267673439,DE +3267673472,3267673503,DE +3267673600,3267673791,DE +3267673808,3267673855,DE +3267674112,3267674127,NL +3267674128,3267674159,GB +3267674160,3267674207,BE +3267674240,3267674303,BE +3267674304,3267674367,GB +3267674368,3267674879,BE +3267675136,3267675391,AT +3267675392,3267675647,CH +3267675648,3267675775,CY +3267675776,3267675903,CH +3267676160,3267676415,GB +3267676672,3267676679,HU +3267676688,3267676711,HU +3267676736,3267676767,HU +3267676784,3267676799,HU +3267676864,3267676879,HU +3267676928,3267677367,GB +3267677376,3267677695,GB +3267678208,3267678719,FR +3267678976,3267679231,NL +3267679488,3267679743,BE +3267680000,3267680255,CZ +3267680256,3267680767,SK +3267681280,3267681503,FR +3267681512,3267681535,FR +3267681792,3267681975,FR +3267682016,3267682047,FR +3267682304,3267682559,BE +3267683328,3267683359,PL +3267683392,3267683471,PL +3267683488,3267683503,PL +3267683512,3267683527,PL +3267683536,3267683551,PL +3267683568,3267683575,PL +3267683712,3267683727,PL +3267684384,3267684447,GB +3267684480,3267685119,GB +3267685120,3267685375,DE +3267685376,3267685887,NL +3267685888,3267686399,GB +3267687936,3267688191,IE +3267688192,3267688703,DE +3267688704,3267688959,SE +3267689216,3267689247,CZ +3267689312,3267689471,CZ +3267689728,3267689983,GB +3267689984,3267690239,FR +3267690272,3267690495,FR +3267690496,3267691519,FI +3267691520,3267692543,SE +3267692544,3267711999,FI +3267712000,3267712255,SE +3267712256,3267741439,FI +3267741440,3267741695,BE +3267741696,3267741759,FI +3267741760,3267741791,SE +3267741792,3267741855,FI +3267741856,3267741919,SE +3267741920,3267743999,FI +3267744000,3267744255,DE +3267744256,3267744511,BE +3267744512,3267746303,FI +3267746304,3267746559,NL +3267746560,3267756031,FI +3267756032,3267760639,SE +3267760640,3267761151,NO +3267761152,3267761919,SE +3267761920,3267762175,NO +3267762176,3267763711,SE +3267763712,3267763967,NO +3267763968,3267764223,SE +3267764224,3267764479,NO +3267764480,3267765775,SE +3267765776,3267765791,NO +3267765792,3267765823,SE +3267765824,3267765855,NO +3267765856,3267766031,SE +3267766032,3267766047,NO +3267766048,3267766303,SE +3267766304,3267766319,NO +3267766320,3267766351,SE +3267766352,3267766367,NO +3267766368,3267766383,SE +3267766384,3267766415,NO +3267766416,3267787007,SE +3267787008,3267787263,NO +3267787264,3267787519,SE +3267787520,3267787775,NO +3267787776,3267793919,SE +3267793920,3267794175,DK +3267794176,3267821567,SE +3267821568,3267887103,FR +3267887104,3268017407,GB +3268017408,3268017663,KE +3268017664,3268149247,GB +3268149248,3268165631,EE +3268165632,3268173823,CH +3268173824,3268182015,MT +3268182016,3268198399,PL +3268215584,3268215615,GB +3268215648,3268215679,GB +3268215712,3268215743,GB +3268215776,3268216063,GB +3268218112,3268218367,GB +3268219808,3268219823,GB +3268219856,3268219871,GB +3268221440,3268221599,GB +3268221696,3268221951,GB +3268222976,3268223167,GB +3268223200,3268223231,GB +3268224768,3268225023,US +3268226368,3268226815,GB +3268227328,3268227391,GB +3268227520,3268227615,GB +3268229632,3268229887,GB +3268230656,3268230911,GB +3268231168,3268231199,GB +3268231320,3268231359,GB +3268231392,3268231423,GB +3268231648,3268231679,GB +3268231744,3268231807,GB +3268232224,3268232243,GB +3268232352,3268232367,GB +3268232384,3268232415,GB +3268232480,3268232575,GB +3268232960,3268233087,GB +3268233920,3268234047,GB +3268234176,3268234239,GB +3268234560,3268234623,GB +3268235008,3268235263,GB +3268235264,3268235519,DE +3268235520,3268235775,GB +3268235936,3268236031,GB +3268236192,3268236207,GB +3268236544,3268236607,GB +3268236672,3268236799,GB +3268237312,3268237567,GB +3268237824,3268237847,GB +3268237856,3268237887,GB +3268238336,3268238359,GB +3268238360,3268238367,DE +3268238368,3268238463,GB +3268238464,3268238471,DE +3268238480,3268238495,GB +3268239104,3268239359,GB +3268239584,3268240127,GB +3268240160,3268240191,GB +3268240256,3268240399,GB +3268240688,3268240695,GB +3268240712,3268240735,GB +3268240744,3268240751,GB +3268240776,3268240783,GB +3268240976,3268240991,GB +3268241008,3268241023,GB +3268241544,3268241551,GB +3268241640,3268241663,GB +3268242496,3268242523,GB +3268242880,3268243103,GB +3268243328,3268243391,GB +3268243744,3268243775,GB +3268243968,3268244031,GB +3268244776,3268244783,GB +3268244792,3268244799,GB +3268245112,3268245115,GB +3268245504,3268245759,GB +3268246272,3268246783,GB +3268246792,3268246807,GB +3268246912,3268246927,GB +3268246960,3268246991,GB +3268248320,3268248447,GB +3268248512,3268248543,GB +3268248832,3268248959,GB +3268249600,3268251311,GB +3268251312,3268251327,IE +3268251328,3268251583,GB +3268251584,3268251615,DE +3268251616,3268251631,CH +3268251632,3268251647,GB +3268253952,3268254015,GB +3268254464,3268254543,GB +3268254592,3268254607,GB +3268254624,3268254639,GB +3268254896,3268254903,GB +3268255824,3268255863,GB +3268255872,3268255887,GB +3268255896,3268255919,GB +3268255952,3268255983,GB +3268256896,3268256959,GB +3268257024,3268257055,GB +3268257088,3268257119,GB +3268257264,3268257271,GB +3268257416,3268257419,GB +3268257424,3268257431,GB +3268257432,3268257439,IT +3268257456,3268257471,GB +3268257488,3268257527,GB +3268258560,3268258623,GB +3268258688,3268258751,GB +3268259264,3268259327,GB +3268259520,3268259527,GB +3268259544,3268259551,GB +3268259560,3268259575,GB +3268259808,3268259823,GB +3268259832,3268260095,GB +3268260352,3268260383,GB +3268260416,3268260479,GB +3268260512,3268260607,GB +3268260640,3268260647,GB +3268260656,3268260671,GB +3268261936,3268261951,GB +3268262768,3268262783,GB +3268262880,3268262887,GB +3268263232,3268263263,GB +3268263392,3268263423,GB +3268263776,3268263783,GB +3268264736,3268264767,GB +3268265416,3268265431,GB +3268265984,3268266495,GB +3268266984,3268266991,GB +3268267536,3268267551,GB +3268267584,3268267599,GB +3268267616,3268267647,GB +3268267744,3268267775,GB +3268267952,3268267959,GB +3268268544,3268268799,GB +3268270352,3268270367,GB +3268270496,3268270511,GB +3268270848,3268271359,GB +3268271912,3268271919,GB +3268271928,3268271935,GB +3268272704,3268272719,GB +3268272728,3268272743,GB +3268272752,3268272759,GB +3268273024,3268273151,GB +3268273920,3268273983,GB +3268274112,3268274175,GB +3268274456,3268274459,GB +3268274528,3268274543,GB +3268274560,3268274591,GB +3268275984,3268275999,GB +3268276640,3268276655,GB +3268276672,3268276687,GB +3268276768,3268276799,GB +3268276864,3268276895,GB +3268277056,3268277119,GB +3268277760,3268278015,GB +3268278464,3268278495,GB +3268280064,3268280319,GB +3268280320,3268299007,FR +3268299008,3268299263,CF +3268299264,3268335615,FR +3268335616,3268335871,CH +3268335872,3268345855,FR +3268345856,3268411391,GB +3268411392,3268424959,AT +3268424960,3268425727,CH +3268425728,3268425983,LI +3268425984,3268426495,AT +3268426496,3268428031,CH +3268428032,3268428287,AT +3268428288,3268428543,CH +3268428544,3268429055,AT +3268429056,3268429311,CH +3268429312,3268429567,AT +3268429568,3268430079,CH +3268430080,3268430847,AT +3268430848,3268431103,LI +3268431104,3268476927,AT +3268476928,3268542463,CH +3268542464,3268607999,PT +3268608000,3268673535,FI +3268673536,3268703799,CZ +3268703800,3268703807,CR +3268703808,3268728287,CZ +3268728288,3268728299,CR +3268728300,3268739071,CZ +3268739072,3268739327,NL +3268739328,3268739583,PL +3268739584,3268739839,DE +3268739840,3268740095,CH +3268740096,3268740351,IL +3268740352,3268740607,DE +3268740608,3268740863,UA +3268740864,3268741119,CH +3268741120,3268741375,FR +3268741376,3268741887,LV +3268741888,3268742143,AT +3268742144,3268742399,RU +3268742400,3268742655,CZ +3268742656,3268742911,BE +3268742912,3268743167,NL +3268743168,3268743423,RO +3268743424,3268743679,PL +3268743680,3268743935,GR +3268743936,3268744191,ES +3268744192,3268744447,DE +3268744448,3268744703,RU +3268744704,3268744959,PL +3268744960,3268745215,UA +3268745216,3268745471,KZ +3268745472,3268745727,RU +3268745728,3268745983,SI +3268745984,3268746239,DE +3268746240,3268746495,GB +3268746496,3268746751,IE +3268746752,3268747007,FR +3268747008,3268747263,DE +3268747264,3268755455,CZ +3268755456,3268763647,SE +3268763648,3268771839,IT +3268771840,3268788223,NO +3268788224,3268804607,CZ +3268804608,3268869375,FR +3268869376,3268870143,PF +3268870144,3268876063,FI +3268876064,3268876127,SE +3268876128,3268876191,FI +3268876192,3268876223,SE +3268876224,3268881151,FI +3268881152,3268881407,SE +3268881408,3268881919,FI +3268881920,3268882175,SE +3268882176,3268916223,FI +3268916224,3268916479,GB +3268916480,3268920575,FI +3268920576,3268920831,SE +3268920832,3268932351,FI +3268932352,3268932607,RU +3268932608,3268935679,FI +3268935680,3269057535,GB +3269057536,3269058047,NL +3269058048,3269066751,GB +3269066752,3269131555,SE +3269131556,3269131559,NO +3269131560,3269132287,SE +3269132288,3269197823,GR +3269197824,3269200639,RU +3269200640,3269200895,UA +3269200896,3269212671,RU +3269212672,3269213183,UA +3269213184,3269231871,RU +3269231872,3269232127,UA +3269232128,3269233407,RU +3269233408,3269233663,UA +3269233664,3269239039,RU +3269239040,3269239295,UA +3269239296,3269263359,RU +3269264640,3269264895,DE +3269265856,3269265919,DE +3269265920,3269266175,GB +3269266688,3269266943,DE +3269266944,3269267455,GB +3269272576,3269272583,DE +3269272704,3269272831,DE +3269272832,3269272847,GB +3269272848,3269272863,NL +3269272896,3269273087,NL +3269273088,3269273343,DE +3269273600,3269273855,GB +3269273856,3269275647,DE +3269275904,3269276159,DE +3269276160,3269276415,GB +3269277184,3269277695,FR +3269277696,3269277759,GB +3269277760,3269278719,NL +3269279232,3269279487,NL +3269279672,3269279679,CH +3269279744,3269279999,GB +3269280000,3269280767,NL +3269280768,3269281023,GB +3269281024,3269281279,DE +3269281536,3269281663,DE +3269282048,3269282303,DE +3269282304,3269282559,GB +3269282560,3269282815,FR +3269283328,3269283583,DE +3269283872,3269283903,DE +3269284096,3269284351,GB +3269284864,3269285055,FR +3269285088,3269285135,DE +3269285152,3269285215,DE +3269285312,3269285327,DE +3269285632,3269285887,DE +3269286400,3269286463,DE +3269288688,3269288959,DE +3269290560,3269290575,DE +3269290592,3269290687,DE +3269290736,3269290743,DE +3269291264,3269291519,DE +3269291520,3269291551,GB +3269291584,3269291647,GB +3269291776,3269292287,ES +3269293120,3269293151,DE +3269293208,3269293215,DE +3269293248,3269293279,DE +3269293376,3269293391,DE +3269293856,3269293887,DE +3269293920,3269293951,DE +3269296232,3269296235,DE +3269296368,3269296375,DE +3269297152,3269297663,GB +3269298664,3269298671,DE +3269303040,3269303295,DE +3269303296,3269303423,GB +3269303552,3269303679,DE +3269305344,3269305351,DE +3269305856,3269306879,DE +3269307648,3269307903,DE +3269310656,3269310671,DE +3269310976,3269311231,DE +3269311872,3269311999,DE +3269313792,3269314175,DE +3269314192,3269314199,DE +3269315584,3269315591,DE +3269317632,3269317663,GB +3269317664,3269317671,IE +3269317672,3269317887,GB +3269317888,3269318399,DE +3269318400,3269318655,GB +3269318656,3269318983,DE +3269319008,3269319047,DE +3269319056,3269319071,DE +3269319136,3269320447,DE +3269320704,3269321727,GB +3269322240,3269322495,DE +3269322680,3269322683,DE +3269322752,3269323263,DE +3269326848,3269326855,DE +3269326960,3269326971,DE +3269326992,3269326999,DE +3269327024,3269327039,DE +3269327056,3269327103,DE +3269327760,3269327767,DE +3269327864,3269328383,DE +3269328896,3269459967,GB +3269459968,3269525503,ES +3269525504,3269556223,IR +3269556224,3269556479,AE +3269556480,3269591039,IR +3269591040,3269621759,RU +3269621760,3269623551,BY +3269623552,3269656575,RU +3269656576,3269722111,GB +3269722112,3269750799,CZ +3269750800,3269750815,CR +3269750816,3269787647,CZ +3269787648,3269853183,NL +3269853184,3269918719,CH +3269918720,3269936063,DE +3269936064,3269936079,NL +3269936080,3269984255,DE +3269984256,3270049791,AT +3270049792,3270115327,DE +3270117504,3270117631,DK +3270122240,3270122495,DK +3270123716,3270123719,DK +3270123776,3270124031,DK +3270124544,3270124799,DK +3270125056,3270125567,DK +3270126080,3270126335,DK +3270126624,3270126655,DK +3270131968,3270132223,NO +3270132992,3270133023,NO +3270136928,3270136959,NO +3270136992,3270137055,NO +3270140928,3270141439,NO +3270142208,3270142463,NO +3270144000,3270144767,NO +3270146816,3270147327,NO +3270147584,3270148095,NO +3270148096,3270151423,FI +3270151936,3270154527,FI +3270155008,3270155775,FI +3270156288,3270156799,DK +3270159616,3270159871,DK +3270164992,3270165247,NO +3270166528,3270167807,NO +3270169088,3270169343,NO +3270170112,3270170623,NO +3270174720,3270174975,NO +3270175744,3270175999,NO +3270181120,3270181375,CH +3270181632,3270181887,CH +3270182144,3270182399,CH +3270182656,3270183679,CH +3270189056,3270189311,BE +3270190080,3270190591,IT +3270190592,3270191103,CH +3270191872,3270192047,CH +3270196992,3270197247,CH +3270200064,3270200319,NL +3270201344,3270201599,NL +3270202880,3270203135,NL +3270205440,3270205695,NL +3270205984,3270205999,ES +3270206064,3270206079,ES +3270206976,3270207231,ES +3270207232,3270207487,CH +3270207744,3270207903,IT +3270208000,3270208255,CH +3270208256,3270208511,LU +3270208768,3270209023,RO +3270209024,3270209279,NL +3270212352,3270212863,NL +3270213120,3270213631,NL +3270213888,3270214279,PT +3270214280,3270214287,US +3270214288,3270214303,PT +3270214320,3270215439,PT +3270215520,3270215935,PT +3270216192,3270216351,PT +3270216384,3270216703,PT +3270216736,3270216751,IT +3270216800,3270216815,IT +3270216832,3270216879,IT +3270217472,3270217727,CH +3270218496,3270218751,CH +3270224640,3270224895,CH +3270230272,3270230783,LU +3270231296,3270231647,LU +3270232576,3270232831,LU +3270234112,3270234367,LU +3270234368,3270234623,NL +3270235136,3270236159,NL +3270238208,3270238719,NL +3270238976,3270239487,CH +3270241792,3270242559,RO +3270243328,3270243839,RO +3270244096,3270244351,NL +3270244352,3270244863,CH +3270245888,3270246143,RO +3270246144,3270246399,CH +3270246400,3270247951,SE +3270247952,3270247955,NO +3270247956,3270369919,SE +3270369920,3270369927,NO +3270369928,3270377471,SE +3270377472,3270443007,GB +3270443008,3270508543,DK +3270508544,3270639615,FI +3270647808,3270648063,TR +3270648064,3270648319,RU +3270648320,3270648575,CH +3270648576,3270648831,AT +3270648832,3270649087,SI +3270649088,3270649343,AT +3270649344,3270649599,DK +3270649600,3270649855,PL +3270649856,3270650111,DK +3270650112,3270650367,AT +3270650368,3270650623,DK +3270650624,3270651391,FR +3270651392,3270651647,DE +3270651648,3270651903,FR +3270651904,3270652415,IT +3270652416,3270652671,DK +3270652672,3270652927,CH +3270652928,3270653183,PL +3270653184,3270653439,UA +3270653440,3270653695,NL +3270653696,3270653951,GB +3270653952,3270654207,ES +3270654464,3270654719,BE +3270654720,3270655231,UA +3270655232,3270655487,IT +3270655488,3270655743,PL +3270655744,3270655999,CH +3270656000,3270664191,NL +3270664192,3270666239,UA +3270666240,3270667263,PL +3270667264,3270668287,SE +3270668288,3270669311,FR +3270669312,3270670335,UA +3270670336,3270672383,RU +3270672384,3270680575,GB +3270680576,3270688767,FR +3270688768,3270772079,IT +3270772080,3270772087,NL +3270772088,3270781343,IT +3270781344,3270781359,RO +3270781360,3270808127,IT +3270808128,3270808159,LU +3270808160,3270836223,IT +3270836224,3270911807,DE +3270911840,3270911935,DE +3270911936,3270911967,PL +3270911968,3270911999,NL +3270912000,3270920191,DE +3270922240,3270926335,DE +3270926336,3270926591,AT +3270926592,3270926847,CH +3270926848,3270927103,PL +3270927104,3270927359,UA +3270927360,3270927615,CH +3270927616,3270927871,FR +3270927872,3270928127,HU +3270928128,3270928383,RO +3270928384,3270928895,UA +3270928896,3270929407,PL +3270929408,3270929919,GB +3270929920,3270930431,BG +3270930432,3270930943,RU +3270931456,3270931967,UA +3270931968,3270932479,CH +3270932480,3270932991,UA +3270932992,3270933503,DE +3270933504,3270934015,PL +3270934016,3270934527,IT +3270934528,3270967295,DE +3270967296,3270975487,IT +3270975488,3270991871,GB +3270991872,3271000063,NL +3271000064,3271008255,RU +3271016448,3271018655,CS +3271018656,3271018671,CS +3271018672,3271019271,CS +3271019272,3271019295,RS +3271019296,3271019903,CS +3271019904,3271019919,RS +3271019920,3271020199,CS +3271020200,3271020207,RS +3271020208,3271020215,CS +3271020216,3271020223,RS +3271020224,3271020247,CS +3271020248,3271020255,RS +3271020256,3271020271,CS +3271020272,3271020279,RS +3271020280,3271020511,CS +3271020512,3271020543,CS +3271020544,3271020671,CS +3271020672,3271020687,RS +3271020688,3271020695,CS +3271020696,3271020703,CS +3271020704,3271020751,CS +3271020752,3271020767,RS +3271020768,3271022159,CS +3271022160,3271022175,RS +3271022176,3271022335,CS +3271022336,3271022463,CY +3271022464,3271022583,CS +3271022584,3271022591,RS +3271022592,3271024395,CS +3271024396,3271024447,CS +3271024448,3271024451,BA +3271024452,3271024455,CS +3271024456,3271024495,CS +3271024496,3271024639,CS +3271024640,3271032831,GB +3271032832,3271098367,NO +3271098368,3271163903,SI +3271163904,3271200767,FR +3271200768,3271200775,GB +3271200776,3271200783,ES +3271200784,3271229439,FR +3271229440,3271249919,FI +3271249920,3271250175,SE +3271250176,3271280351,FI +3271280352,3271280383,RU +3271280384,3271280687,FI +3271280688,3271280703,SE +3271280704,3271280719,FI +3271280720,3271280735,SE +3271280736,3271290623,FI +3271290624,3271290879,BE +3271290880,3271310079,FI +3271310080,3271310335,DE +3271310336,3271341247,FI +3271341248,3271341311,SE +3271341312,3271360511,FI +3271360512,3271363407,GB +3271363408,3271363415,AT +3271363416,3271363423,GB +3271363424,3271363455,IT +3271363456,3271363471,GB +3271363472,3271363487,ZA +3271363488,3271363519,IT +3271363552,3271363583,FR +3271363584,3271365887,GB +3271365888,3271366143,DE +3271366144,3271366399,GB +3271366400,3271366655,NL +3271366656,3271371263,GB +3271371264,3271371519,IE +3271371520,3271371679,ZA +3271371680,3271371711,DE +3271371712,3271371775,CH +3271371776,3271372031,GB +3271372032,3271372287,BE +3271372288,3271372799,FR +3271372800,3271373055,SE +3271373056,3271373311,BE +3271373312,3271373567,GB +3271373568,3271373823,FR +3271373824,3271374079,DE +3271374080,3271374335,BE +3271374336,3271374847,DE +3271374848,3271375359,GB +3271375360,3271375871,CH +3271375872,3271376383,BE +3271376384,3271376447,GB +3271376448,3271376463,FR +3271376464,3271376479,IT +3271376480,3271376511,FR +3271376512,3271376639,DE +3271376640,3271376895,AT +3271376896,3271377407,ES +3271377408,3271377919,NL +3271377920,3271378687,BE +3271378688,3271378943,SE +3271378944,3271380991,GB +3271380992,3271381247,BE +3271381248,3271381503,NO +3271381504,3271381759,SE +3271381760,3271382527,IT +3271382528,3271383039,IL +3271383040,3271383295,CH +3271383296,3271383551,BE +3271383552,3271384063,GB +3271384064,3271384319,CH +3271384320,3271384575,BE +3271384576,3271384831,GB +3271384832,3271385087,BE +3271385088,3271385159,DE +3271385160,3271385183,GB +3271385184,3271385215,ES +3271385216,3271385343,NL +3271385344,3271391231,DE +3271391232,3271391743,NL +3271391744,3271391999,NO +3271392000,3271392255,DE +3271392256,3271392511,FR +3271392512,3271392767,BE +3271392768,3271393279,FR +3271393280,3271393791,AT +3271393792,3271394047,DK +3271394048,3271394303,DE +3271394304,3271394559,BE +3271394560,3271394815,GB +3271394816,3271395071,DE +3271395072,3271395327,GB +3271395328,3271396863,IT +3271396864,3271397119,GB +3271397120,3271397375,NL +3271397376,3271397887,CH +3271397888,3271397951,FR +3271397952,3271397983,IT +3271397984,3271397999,NL +3271398000,3271398015,FR +3271398016,3271398047,NL +3271398048,3271398079,ZA +3271398080,3271398143,GB +3271398144,3271398303,NL +3271398304,3271398335,DE +3271398336,3271398399,IT +3271398400,3271398911,DE +3271398912,3271399167,GB +3271399168,3271400959,BE +3271400960,3271401215,CH +3271401216,3271401471,DE +3271401472,3271403263,DK +3271403264,3271403519,DE +3271403520,3271403775,NL +3271403776,3271403903,ZA +3271403904,3271403919,GB +3271403920,3271403935,IE +3271403936,3271403967,GB +3271403968,3271403983,ZA +3271403984,3271403991,GB +3271403992,3271403999,ZA +3271404000,3271404031,DE +3271404032,3271405311,NL +3271405312,3271405567,FR +3271405568,3271405823,ES +3271405824,3271406079,AT +3271406080,3271406335,ZA +3271406336,3271406591,RO +3271406592,3271406847,GB +3271406848,3271407615,AT +3271407616,3271407871,DE +3271407872,3271408127,AT +3271408128,3271408383,DE +3271408384,3271408639,FR +3271408640,3271408895,BE +3271408896,3271409151,ES +3271409152,3271409407,IT +3271409408,3271409663,GB +3271409664,3271417855,BE +3271417856,3271424071,FR +3271424072,3271424079,IT +3271424080,3271424095,IE +3271424096,3271424111,GB +3271424112,3271424127,BE +3271424128,3271424191,GB +3271424192,3271424511,FR +3271424512,3271425023,GB +3271425024,3271425279,DE +3271425280,3271425535,DK +3271425536,3271426047,DE +3271426048,3271426303,PF +3271426304,3271491583,FR +3271491584,3271557119,DK +3271557120,3271589887,BE +3271589888,3271688191,NO +3271691776,3271692031,US +3271692032,3271692287,GB +3271696384,3271698431,DE +3271704576,3271712767,RU +3271712768,3271716863,LV +3271716864,3271717119,RU +3271717120,3271720959,LV +3271720960,3271729151,GB +3271729152,3271737343,DE +3271737344,3271738367,RU +3271738368,3271738879,RO +3271738880,3271739391,RU +3271739392,3271739903,AT +3271739904,3271740415,IE +3271740416,3271740927,UA +3271740928,3271741439,RU +3271741440,3271741951,PL +3271741952,3271743999,RU +3271744000,3271744511,RO +3271744512,3271745023,AT +3271745024,3271745535,PL +3271745536,3271746047,GB +3271746048,3271746559,IE +3271746560,3271747071,CH +3271747072,3271747583,KZ +3271747584,3271748095,RU +3271748096,3271748607,GR +3271748608,3271749119,UA +3271749120,3271750143,RU +3271750144,3271750655,UA +3271750656,3271750783,NL +3271750784,3271751167,GB +3271751168,3271751679,RO +3271751680,3271752191,NL +3271752192,3271752703,GB +3271752704,3271753215,RU +3271753216,3271753727,PL +3271753728,3271770111,FR +3271770112,3271786495,AT +3271786496,3271788543,UA +3271788544,3271789567,GB +3271789568,3271790591,RU +3271790592,3271791615,LV +3271791616,3271792639,UA +3271792640,3271793663,PL +3271793664,3271794687,UA +3271794688,3271795711,IT +3271795712,3271796735,NL +3271796736,3271797759,SK +3271797760,3271798783,GB +3271798784,3271799807,NL +3271799808,3271800831,RU +3271800832,3271801855,GB +3271801856,3271802879,PS +3271802880,3271803903,DE +3271803904,3271804927,UA +3271804928,3271805951,PL +3271805952,3271806975,UA +3271806976,3271807999,GB +3271808000,3271810047,DE +3271810048,3271811071,PL +3271811072,3271812095,UA +3271812096,3271813119,ES +3271813120,3271814143,PL +3271814144,3271815167,UA +3271815168,3271816191,RU +3271816192,3271817215,UA +3271817216,3271818239,DE +3271818240,3271819263,RU +3271819264,3271821246,DE +3271821247,3271821247,AT +3271821248,3271851879,DE +3271851880,3271851887,NL +3271851888,3271884799,DE +3271884800,3271901183,UA +3271901184,3271909375,ES +3271909376,3271909887,RO +3271909888,3271910399,DE +3271910400,3271910911,DK +3271910912,3271911423,LV +3271911424,3271911935,LI +3271911936,3271912959,UA +3271912960,3271913471,NL +3271913472,3271913983,NO +3271913984,3271914495,RO +3271914496,3271915007,EE +3271915008,3271915519,SE +3271915520,3271916031,IL +3271916032,3271916543,GB +3271916544,3271917055,UA +3271917056,3271917567,RO +3271917568,3271925759,RU +3271925760,3271926015,DE +3271926016,3271926271,MD +3271926272,3271926527,RU +3271926528,3271926783,NL +3271926784,3271927295,SI +3271927296,3271927551,NO +3271927552,3271927807,GB +3271927808,3271928063,TR +3271928064,3271928319,GB +3271928320,3271928575,RU +3271928576,3271928831,CH +3271928832,3271929087,IE +3271929088,3271929343,LB +3271929344,3271929599,NO +3271929600,3271929855,GB +3271929856,3271930111,PL +3271930112,3271930367,HU +3271930368,3271930623,RU +3271930624,3271930879,GB +3271930880,3271931135,CH +3271931136,3271931647,PL +3271931648,3271931903,NO +3271931904,3271932159,UA +3271932160,3271932415,SE +3271932416,3271932671,CZ +3271932672,3271932927,DE +3271932928,3271933183,PL +3271933184,3271933439,GB +3271933440,3271933695,SE +3271933696,3271933951,DE +3271933952,3271977533,FR +3271977534,3271977534,US +3271977535,3272015871,FR +3272015872,3272019967,RO +3272019968,3272020991,IT +3272020992,3272024063,DK +3272024064,3272032255,IE +3272032256,3272040447,SE +3272040448,3272048639,FR +3272048640,3272056831,NL +3272056832,3272065023,RU +3272065024,3272065087,NL +3272065088,3272065151,GB +3272065152,3272065183,NL +3272065184,3272065215,GB +3272065216,3272065279,NL +3272065280,3272065343,GB +3272065344,3272065503,NL +3272065504,3272065535,GB +3272065536,3272065551,NL +3272065552,3272065559,GB +3272065560,3272065575,NL +3272065576,3272065583,GB +3272065584,3272065599,NL +3272065600,3272065615,GB +3272065616,3272065663,NL +3272065664,3272065791,GB +3272065792,3272065823,NL +3272065824,3272066303,GB +3272066304,3272066431,NL +3272066432,3272066815,GB +3272066816,3272066879,NL +3272066880,3272066911,GB +3272066912,3272066943,NL +3272066944,3272067063,GB +3272067064,3272067071,NL +3272067072,3272067327,GB +3272067328,3272067583,NL +3272067584,3272067615,GB +3272067616,3272067647,NL +3272067648,3272067711,GB +3272067712,3272067775,NL +3272067776,3272067807,GB +3272067808,3272067839,NL +3272067840,3272067871,GB +3272067872,3272067887,NL +3272067888,3272067927,GB +3272067928,3272067967,NL +3272067968,3272068095,GB +3272068096,3272068351,NL +3272068352,3272068607,GB +3272068608,3272068863,NL +3272068864,3272069119,GB +3272069120,3272069247,NL +3272069248,3272069343,GB +3272069344,3272069375,IT +3272069376,3272069439,NL +3272069440,3272069503,GB +3272069504,3272069567,NL +3272069568,3272069599,GB +3272069600,3272069603,NL +3272069604,3272069607,GB +3272069608,3272069611,NL +3272069612,3272069615,GB +3272069616,3272069631,NL +3272069632,3272070143,GB +3272070144,3272070255,NL +3272070256,3272070263,GB +3272070264,3272070271,NL +3272070272,3272070399,GB +3272070400,3272070463,NL +3272070464,3272070559,GB +3272070560,3272070591,NL +3272070592,3272070623,GB +3272070624,3272070639,NL +3272070640,3272070647,GB +3272070648,3272070655,NL +3272070656,3272070911,GB +3272070912,3272071167,NL +3272071168,3272071247,GB +3272071248,3272071283,NL +3272071284,3272071287,GB +3272071288,3272071295,NL +3272071296,3272071327,GB +3272071328,3272071551,NL +3272071552,3272071615,GB +3272071616,3272071647,NL +3272071648,3272071935,GB +3272071936,3272072063,NL +3272072064,3272072191,GB +3272072192,3272073215,NL +3272073216,3272081407,GB +3272081408,3272081919,PT +3272081920,3272083455,CV +3272083456,3272083711,ST +3272083712,3272084223,PT +3272084224,3272084991,CV +3272084992,3272085503,GW +3272085504,3272086015,AO +3272086016,3272086527,ST +3272086528,3272086655,AO +3272086656,3272086783,PT +3272086784,3272086807,GH +3272086808,3272086815,RO +3272086816,3272086831,NI +3272086832,3272086879,AO +3272086880,3272086975,PT +3272086976,3272087039,AN +3272087040,3272087295,PT +3272087296,3272087551,AO +3272087552,3272087807,GH +3272087808,3272088063,CV +3272088064,3272088319,GH +3272088320,3272088575,CV +3272088576,3272088831,PT +3272088832,3272089087,GH +3272089088,3272089343,PT +3272089344,3272089479,ST +3272089480,3272089535,PT +3272089536,3272089551,ST +3272089552,3272089599,PT +3272090112,3272091647,RU +3272091648,3272092671,UA +3272092672,3272093183,RU +3272093184,3272094207,RO +3272094208,3272094719,AM +3272094720,3272095231,PL +3272095232,3272095743,FI +3272095744,3272096255,UA +3272096256,3272096767,PT +3272096768,3272097279,FI +3272097280,3272097791,RU +3272097792,3272101375,GB +3272101376,3272101383,FR +3272101384,3272101391,GB +3272101392,3272101399,IT +3272101400,3272101407,NL +3272101408,3272101415,ES +3272101416,3272101423,PT +3272101424,3272106239,GB +3272106240,3272106495,PL +3272106496,3272106751,SE +3272106752,3272107007,PL +3272107008,3272107263,GB +3272107264,3272107519,PL +3272107520,3272107775,RU +3272107776,3272108031,GB +3272108032,3272108287,DE +3272108288,3272108543,RO +3272108544,3272109055,PL +3272109056,3272109311,CH +3272109312,3272109567,TR +3272109568,3272109823,GB +3272109824,3272110079,FR +3272110080,3272110335,SE +3272110336,3272110591,CH +3272110592,3272110847,AT +3272110848,3272111103,LV +3272111104,3272111871,GB +3272111872,3272112383,RO +3272112384,3272113151,DE +3272113408,3272113663,PL +3272113664,3272113919,GB +3272113920,3272114175,AT +3272114176,3272122367,PL +3272122368,3272131071,GB +3272131072,3272131583,RO +3272131584,3272132095,GB +3272132096,3272132607,CH +3272132608,3272133119,UA +3272133120,3272133631,GB +3272133632,3272134143,EE +3272134144,3272134655,RO +3272134656,3272135167,NL +3272135168,3272135679,CH +3272135680,3272136191,AT +3272136192,3272136703,FR +3272136704,3272137215,PL +3272137216,3272137727,UA +3272137728,3272138239,PL +3272138240,3272138751,BG +3272138752,3272146943,DE +3272146944,3272161023,RU +3272161024,3272161279,KZ +3272161280,3272169215,RU +3272169216,3272169471,UA +3272169472,3272178559,RU +3272178560,3272178623,UA +3272178624,3272210175,RU +3272210176,3272210431,UA +3272210432,3272212479,RU +3272212480,3272212991,GB +3272213376,3272213391,IT +3272213392,3272213399,GB +3272213408,3272213415,NL +3272213424,3272213431,NL +3272213432,3272213455,GB +3272213472,3272213487,CY +3272213488,3272213495,GB +3272213504,3272213567,IT +3272213568,3272213575,GB +3272213576,3272213583,IE +3272213584,3272213599,DE +3272213632,3272213639,NL +3272213656,3272213663,IT +3272213672,3272213679,IT +3272213696,3272213735,IT +3272213752,3272213759,IT +3272213760,3272213823,NL +3272213824,3272213831,DE +3272213832,3272213839,NL +3272213840,3272213855,RU +3272213888,3272214015,GB +3272214016,3272214271,ES +3272214272,3272214351,GB +3272214352,3272214407,FR +3272214432,3272214463,SE +3272214656,3272214671,NL +3272214672,3272214679,GB +3272214680,3272214687,FR +3272214816,3272214823,CH +3272214832,3272214847,BE +3272214848,3272214879,NL +3272214884,3272214887,NL +3272214896,3272214903,ES +3272214904,3272214911,SE +3272214944,3272214951,DE +3272214952,3272214959,BE +3272214960,3272215007,NL +3272215008,3272215015,FR +3272215016,3272215023,IT +3272215040,3272215295,ES +3272215296,3272215551,IR +3272215552,3272215807,CH +3272215808,3272215823,NL +3272215872,3272215879,BE +3272215884,3272215919,CH +3272215920,3272215935,NL +3272215936,3272215999,GB +3272216016,3272216031,DE +3272216040,3272216047,GB +3272216192,3272216207,BE +3272216216,3272216223,FR +3272216224,3272216231,DE +3272216240,3272216255,NL +3272216256,3272216287,CH +3272216304,3272216311,ES +3272216320,3272216351,NL +3272216352,3272216383,DE +3272216384,3272216447,CH +3272216452,3272216455,NL +3272216464,3272216479,FR +3272216480,3272216495,IR +3272216512,3272216575,IT +3272216576,3272216895,GB +3272216896,3272216911,FR +3272216912,3272216927,DE +3272216960,3272217007,GB +3272217216,3272217279,BE +3272217280,3272217303,DE +3272217304,3272217311,BE +3272217600,3272217631,CH +3272217856,3272217875,ES +3272217880,3272217895,IT +3272217896,3272217903,ES +3272217920,3272217983,DE +3272217984,3272218079,ES +3272218112,3272218623,GB +3272218624,3272218639,RU +3272218640,3272218671,DE +3272218688,3272218719,DE +3272218880,3272219135,BE +3272219136,3272219391,NL +3272219648,3272219903,FR +3272219904,3272220159,DE +3272220160,3272220415,FR +3272220416,3272221183,GB +3272221184,3272221311,NL +3272221440,3272221447,SE +3272221696,3272221951,NL +3272221952,3272222207,GB +3272222208,3272222463,ES +3272222720,3272222975,DE +3272222976,3272223015,GB +3272223024,3272223039,GB +3272223232,3272223487,NL +3272223488,3272223743,GB +3272223744,3272223775,GI +3272223808,3272223815,CY +3272223824,3272223839,GB +3272224000,3272224255,GB +3272224256,3272224383,GI +3272224512,3272225279,GB +3272225280,3272225791,IT +3272226048,3272226815,FR +3272226816,3272227071,GB +3272227072,3272227327,NL +3272227328,3272227359,US +3272227360,3272227511,GB +3272227520,3272227583,GB +3272227584,3272227839,FR +3272227840,3272228095,ES +3272228096,3272228223,GB +3272228224,3272228351,ES +3272228352,3272228607,FR +3272228608,3272228623,NL +3272228624,3272228631,CY +3272228632,3272228639,NL +3272228640,3272228671,IT +3272228672,3272228703,DE +3272228704,3272228735,FR +3272228736,3272228799,NL +3272228800,3272228863,CH +3272228864,3272237055,LU +3272237056,3272240575,GB +3272240576,3272240639,GH +3272240640,3272245247,GB +3272245248,3272261631,FI +3272261632,3272261887,MT +3272261888,3272262143,BG +3272262144,3272262399,IL +3272262400,3272262655,DE +3272262656,3272262911,NO +3272262912,3272263167,SA +3272263168,3272263423,RU +3272263424,3272263935,GB +3272263936,3272264191,ES +3272264192,3272264447,NL +3272264448,3272264703,DE +3272264704,3272264959,LV +3272264960,3272265215,RU +3272265216,3272265471,AT +3272265472,3272265727,DK +3272265728,3272265983,DE +3272265984,3272266239,GB +3272266240,3272266495,UA +3272266496,3272266751,SE +3272266752,3272267007,RU +3272267008,3272267263,GB +3272267264,3272267519,SE +3272267520,3272267775,GB +3272267776,3272268031,LV +3272268032,3272268287,CH +3272268288,3272268543,UA +3272268544,3272268799,RO +3272268800,3272269055,IL +3272269056,3272269311,GB +3272269312,3272269567,IL +3272269568,3272335359,GB +3272335360,3272343551,NL +3272343552,3272351743,GB +3272351744,3272352767,PL +3272352768,3272353791,UA +3272353792,3272355839,CH +3272355840,3272356863,GB +3272356864,3272357887,RO +3272357888,3272358911,FI +3272358912,3272359935,NL +3272359936,3272368127,RU +3272368128,3272376319,KZ +3272376320,3272384511,SK +3272384512,3272392703,LT +3272392704,3272400895,AT +3272400904,3272400911,GB +3272400920,3272400927,GB +3272401024,3272401119,GB +3272401184,3272401199,GB +3272401280,3272401343,GB +3272401920,3272401967,GB +3272402032,3272402039,GB +3272402040,3272402047,US +3272402176,3272402191,GB +3272402240,3272402303,GB +3272402560,3272402623,GB +3272402816,3272402943,GB +3272403072,3272403199,FR +3272409088,3272417279,BE +3272417280,3272418687,FR +3272418688,3272419327,PL +3272419328,3272420863,DE +3272420864,3272420991,PL +3272420992,3272421119,DK +3272421120,3272421375,UA +3272421376,3272421887,RO +3272421888,3272422399,GB +3272422400,3272422911,CH +3272422912,3272423423,SE +3272423424,3272423935,BE +3272423936,3272424447,FR +3272424448,3272425471,DE +3272425472,3272426655,GB +3272426656,3272426671,IL +3272426672,3272441855,GB +3272441856,3272474623,LV +3272474624,3272474879,FR +3272474880,3272475135,NL +3272475136,3272475391,RU +3272475392,3272475903,PL +3272475904,3272476159,FR +3272476160,3272476671,RO +3272476672,3272476927,DE +3272476928,3272477183,GR +3272477184,3272477439,GB +3272477440,3272477695,PL +3272477696,3272477951,RU +3272477952,3272478207,RO +3272478208,3272478463,DK +3272478464,3272478719,FI +3272478720,3272478975,GB +3272478976,3272479231,UA +3272479232,3272479487,GB +3272479744,3272480255,SE +3272480256,3272480511,FR +3272480512,3272480767,CH +3272480768,3272481023,DE +3272481024,3272481279,SE +3272481280,3272481535,CH +3272481536,3272481791,FR +3272481792,3272482047,IT +3272482048,3272482303,NL +3272482304,3272482559,FR +3272482560,3272482815,BE +3272482816,3272491007,RU +3272491008,3272499199,GB +3272499200,3272507391,IT +3272507392,3272515583,CY +3272515584,3272523775,LT +3272523776,3272540159,DE +3272540160,3272546559,CH +3272546560,3272546815,FR +3272546816,3272547387,CH +3272547388,3272547391,FR +3272547392,3272552735,CH +3272552736,3272552743,FR +3272552744,3272552879,CH +3272552880,3272552887,FR +3272552888,3272553471,CH +3272553472,3272553487,FR +3272553488,3272554779,CH +3272554780,3272554783,FR +3272554784,3272555247,CH +3272555248,3272555255,FR +3272555256,3272555407,CH +3272555408,3272555423,FR +3272555424,3272556599,CH +3272556600,3272556607,FR +3272556608,3272568079,CH +3272568080,3272568095,FR +3272568096,3272572879,CH +3272572880,3272572895,FR +3272572896,3272605695,CH +3272605696,3272613887,BE +3272613888,3272622079,RU +3272622080,3272623103,RO +3272623104,3272624127,DE +3272624128,3272625151,RU +3272625152,3272626175,UA +3272626176,3272627199,DE +3272627200,3272628223,NL +3272628224,3272629247,PL +3272629248,3272633983,RU +3272633984,3272634047,KZ +3272634048,3272638463,RU +3272638464,3272646655,ES +3272646656,3272650623,GB +3272650624,3272650639,FR +3272650640,3272650655,GB +3272650656,3272650751,NL +3272650752,3272651135,GB +3272651136,3272651151,CH +3272651152,3272651183,GB +3272651184,3272651191,NL +3272651192,3272651231,GB +3272651232,3272651239,UZ +3272651240,3272652287,GB +3272652288,3272652799,FR +3272652800,3272653055,GB +3272653056,3272653087,CH +3272653088,3272653247,GB +3272653248,3272653279,FR +3272653280,3272653311,GB +3272653312,3272653439,SE +3272653440,3272653447,GB +3272653448,3272653455,IE +3272653456,3272653463,DE +3272653464,3272653543,GB +3272653544,3272653551,NL +3272653552,3272653567,GB +3272653568,3272653631,SE +3272653632,3272653663,FR +3272653664,3272653695,DE +3272653696,3272653727,IT +3272653728,3272653759,NL +3272653760,3272653791,DK +3272653792,3272653823,GB +3272653824,3272653951,FR +3272653952,3272654207,DE +3272654208,3272654335,FR +3272654336,3272654463,ES +3272654464,3272654591,GB +3272654592,3272654719,NO +3272654720,3272654783,IT +3272654784,3272654847,NL +3272654848,3272663039,FI +3272663040,3272671231,AT +3272671232,3272704255,SE +3272704256,3272705279,IE +3272705280,3272705535,SE +3272705536,3272707071,IE +3272707072,3272707327,SE +3272707328,3272707583,IE +3272707584,3272712191,SE +3272712192,3272712447,GB +3272712448,3272712703,SE +3272712704,3272712959,GB +3272712960,3272713215,SE +3272713216,3272713983,GB +3272713984,3272714495,SE +3272714496,3272714751,GB +3272714752,3272715015,SE +3272715016,3272715023,GB +3272715024,3272715135,SE +3272715136,3272715263,GB +3272715264,3272733119,SE +3272733120,3272733135,DE +3272733136,3272733983,SE +3272733984,3272733991,RU +3272733992,3272736767,SE +3272736768,3272744959,IT +3272744960,3272753151,RU +3272753152,3272769535,NL +3272769536,3272802303,NO +3272802304,3272867839,RU +3272867840,3272868863,PL +3272868864,3272869887,UA +3272869888,3272870911,NL +3272870912,3272871935,FR +3272871936,3272872959,FI +3272872960,3272875007,BG +3272875008,3272876031,UA +3272876032,3272884223,NL +3272884224,3272892415,DE +3272892416,3272892927,UA +3272892928,3272893439,DE +3272893440,3272894463,UA +3272894464,3272894975,FR +3272894976,3272895487,RO +3272895488,3272895999,GB +3272896000,3272896511,PL +3272896512,3272897535,DE +3272897536,3272898047,FI +3272898048,3272898559,UA +3272898560,3272899071,DE +3272899072,3272899583,GB +3272899584,3272900095,UA +3272900096,3272900607,LV +3272900608,3272908799,UA +3272908800,3272910847,SK +3272910848,3272911359,NL +3272911360,3272911871,SK +3272911872,3272912383,CZ +3272912384,3272916991,SK +3272916992,3272917503,MC +3272917504,3272918527,RU +3272918528,3272919039,FR +3272919040,3272919551,GB +3272919552,3272920063,RO +3272920064,3272920575,NL +3272920576,3272921087,SE +3272921088,3272921599,CH +3272921600,3272922111,DE +3272922112,3272922623,PL +3272922624,3272923135,RO +3272923136,3272923647,ES +3272923648,3272924159,PL +3272924160,3272924671,DE +3272924672,3272925183,GB +3272925184,3272933759,DE +3272933760,3272933775,DK +3272933776,3272998911,DE +3272998912,3273007103,PT +3273007104,3273015295,CZ +3273015296,3273023487,SE +3273023488,3273024511,PL +3273024512,3273025535,NL +3273025536,3273027583,RU +3273027584,3273028607,UA +3273028608,3273029631,PL +3273029632,3273030655,DK +3273030656,3273031679,PL +3273031680,3273032191,GB +3273032192,3273033215,UA +3273033216,3273033727,GB +3273033728,3273034239,DE +3273034240,3273034751,BE +3273034752,3273035263,UA +3273035264,3273035775,DE +3273035776,3273036287,FR +3273036288,3273036799,BG +3273036800,3273037311,IL +3273037312,3273037823,GB +3273037824,3273038335,UA +3273038336,3273038847,GR +3273038848,3273039871,GB +3273039872,3273048063,LT +3273048064,3273048831,IT +3273048832,3273049087,US +3273049088,3273049855,IT +3273049856,3273050111,US +3273050112,3273051647,IT +3273051648,3273051903,US +3273051904,3273052039,IT +3273052040,3273052047,NL +3273052048,3273052063,GR +3273052064,3273052079,IT +3273052080,3273052087,CU +3273052088,3273052095,GR +3273052096,3273052111,FR +3273052112,3273052415,IT +3273052416,3273052671,GB +3273052672,3273052927,FR +3273052928,3273053183,DE +3273053184,3273053439,CH +3273053440,3273053695,NL +3273053696,3273053951,BE +3273053952,3273054207,AT +3273054208,3273054463,US +3273054464,3273054719,ES +3273054720,3273054975,IT +3273054976,3273055231,BR +3273055232,3273055487,AR +3273055488,3273055743,CL +3273055744,3273055999,PE +3273056000,3273056255,IT +3273056256,3273064447,MD +3273064448,3273129983,PT +3273129984,3273138175,DK +3273138176,3273146367,BG +3273146368,3273148415,RU +3273148416,3273150463,LU +3273152512,3273154559,BG +3273154560,3273162751,DE +3273162752,3273170943,UA +3273170944,3273179135,SE +3273187328,3273187839,SE +3273187840,3273188351,DK +3273188352,3273188863,RU +3273188864,3273189887,GB +3273189888,3273190399,UA +3273190400,3273191935,RO +3273191936,3273192447,UA +3273192448,3273192959,DK +3273192960,3273193471,FR +3273193472,3273193983,PL +3273193984,3273194495,GB +3273194496,3273195007,UA +3273195008,3273195519,RU +3273195520,3273230983,FR +3273230984,3273230991,DE +3273230992,3273240119,FR +3273240120,3273240127,DE +3273240128,3273240223,FR +3273240224,3273240231,MC +3273240232,3273261055,FR +3273261056,3273261567,NO +3273261568,3273262079,BE +3273262080,3273262591,LU +3273262592,3273263103,RU +3273263104,3273263615,FR +3273263616,3273264127,SE +3273264128,3273264639,PL +3273264640,3273265151,AT +3273265152,3273266175,UA +3273266176,3273266687,LV +3273266688,3273267711,PL +3273267712,3273268223,GB +3273268224,3273268735,SE +3273268736,3273269247,RU +3273269248,3273276119,GB +3273276120,3273276127,US +3273276128,3273277439,GB +3273277440,3273278463,UA +3273278464,3273279487,RU +3273279488,3273281535,PL +3273281536,3273283583,UA +3273283584,3273284607,GB +3273284608,3273285631,UA +3273285632,3273293823,GB +3273293824,3273302015,MK +3273302016,3273310207,RU +3273310208,3273318399,AT +3273318400,3273326591,GB +3273326592,3273326847,IE +3273326984,3273326987,DE +3273326992,3273327047,DE +3273327280,3273327287,DE +3273327360,3273327407,IE +3273327424,3273327487,GB +3273328512,3273328639,DE +3273328640,3273329199,GB +3273329200,3273329215,DE +3273329216,3273329311,GB +3273329408,3273329423,GB +3273329424,3273329439,DE +3273329440,3273330175,GB +3273330176,3273330183,IR +3273330184,3273330191,IE +3273330192,3273330199,GB +3273330200,3273330223,IE +3273330224,3273330271,GB +3273330272,3273330295,IE +3273330296,3273330303,GB +3273330304,3273330431,IE +3273330432,3273331199,GB +3273331712,3273331967,GB +3273331968,3273332031,DE +3273332096,3273332223,DE +3273332544,3273332575,DE +3273332608,3273332671,DE +3273333056,3273333119,DE +3273334272,3273334783,DE +3273335040,3273335295,DE +3273335296,3273335807,GB +3273335936,3273335999,DE +3273336848,3273336863,DE +3273336864,3273336871,GB +3273336872,3273336879,DE +3273336960,3273337087,DE +3273337856,3273338111,DE +3273338624,3273338879,DE +3273339136,3273339391,DE +3273339392,3273339919,GB +3273339920,3273339943,DE +3273339944,3273339955,GB +3273339956,3273339959,DE +3273339960,3273340095,GB +3273340096,3273340111,GI +3273340112,3273340415,GB +3273340928,3273341695,FR +3273341696,3273341951,DE +3273342464,3273342975,DE +3273342976,3273343999,GB +3273344000,3273344767,DE +3273345024,3273345279,DE +3273346816,3273347071,DE +3273347840,3273348351,DE +3273349120,3273349631,DE +3273350272,3273350287,DE +3273350336,3273350351,DE +3273351424,3273351455,DE +3273351504,3273351519,DE +3273351872,3273351903,DE +3273351936,3273352191,DE +3273352928,3273352959,DE +3273352992,3273353023,DE +3273355520,3273356287,DE +3273359888,3273359903,DE +3273360016,3273360079,DE +3273361472,3273361535,DE +3273361632,3273361663,DE +3273361792,3273361823,DE +3273361856,3273361919,DE +3273362048,3273362175,DE +3273362240,3273362255,DE +3273363208,3273363211,DE +3273363328,3273363391,DE +3273364608,3273364735,DE +3273364992,3273365247,DE +3273365504,3273365519,NL +3273365520,3273365527,GB +3273365528,3273365759,NL +3273365760,3273365767,GB +3273365888,3273366015,FR +3273366016,3273366527,DE +3273367296,3273367423,DE +3273367552,3273367567,DE +3273368064,3273368575,DE +3273369344,3273369855,DE +3273370624,3273371135,DE +3273371712,3273371743,DE +3273371760,3273371775,DE +3273371808,3273371823,DE +3273371872,3273371875,DE +3273372000,3273372063,DE +3273372144,3273372151,DE +3273372672,3273372927,GB +3273372928,3273373183,NL +3273373184,3273373455,GB +3273373456,3273373695,DE +3273375232,3273375551,DE +3273375744,3273375871,DE +3273376000,3273376255,DE +3273376536,3273376543,DE +3273377792,3273378095,DE +3273378560,3273378815,DE +3273381888,3273382143,DE +3273382144,3273382399,GB +3273382400,3273382463,DE +3273382480,3273382591,DE +3273382640,3273382687,DE +3273384192,3273384703,DE +3273384960,3273385215,DE +3273385280,3273385343,DE +3273385472,3273385727,DE +3273385760,3273385791,DE +3273385856,3273385919,DE +3273387056,3273387071,DE +3273387216,3273387231,DE +3273387264,3273387519,DE +3273387552,3273387583,DE +3273388160,3273388223,DE +3273388800,3273388807,DE +3273388816,3273388863,DE +3273388872,3273388879,DE +3273388904,3273388911,DE +3273388928,3273389055,DE +3273390080,3273390111,DE +3273390112,3273390143,US +3273390144,3273390207,DE +3273390368,3273390463,DE +3273391296,3273391327,DE +3273391352,3273391359,DE +3273392128,3273392639,UA +3273392640,3273393663,RO +3273393664,3273394175,BG +3273394176,3273394687,RO +3273394688,3273395199,RU +3273395200,3273395711,DE +3273395712,3273396223,RU +3273396224,3273396735,PL +3273396736,3273397247,RO +3273397248,3273397759,RU +3273397760,3273398271,NL +3273398272,3273398783,RO +3273398784,3273399295,LV +3273399296,3273399807,SE +3273399808,3273400319,UA +3273400320,3273408511,RU +3273408512,3273433087,SK +3273433088,3273433599,LU +3273433600,3273434111,RO +3273434112,3273434623,BE +3273434624,3273435135,IL +3273435136,3273435647,GB +3273435648,3273436159,PL +3273436160,3273436671,NO +3273436672,3273437183,DE +3273437184,3273437695,RO +3273437696,3273438207,PL +3273438208,3273438719,IL +3273438720,3273439231,PL +3273439232,3273439743,RO +3273439744,3273440255,UA +3273440256,3273440767,RO +3273440768,3273441279,AT +3273441280,3273449471,FR +3273449472,3273457663,CH +3273457664,3273523199,HR +3273523200,3273532463,DE +3273532464,3273532471,US +3273532472,3273588735,DE +3273588736,3273687039,IT +3273687040,3273719807,DE +3273719808,3273727071,GB +3273727072,3273727079,DK +3273727080,3273727087,FR +3273727088,3273727095,ES +3273727096,3273727103,DE +3273727104,3273727119,GB +3273727120,3273727127,PT +3273727128,3273727135,FI +3273727136,3273727143,NO +3273727144,3273727151,CZ +3273727152,3273727999,GB +3273728000,3273728255,NL +3273728256,3273728511,GB +3273728512,3273732095,NL +3273732096,3273736191,GB +3273736192,3273743359,FR +3273743360,3273743615,JO +3273743616,3273744383,FR +3273744384,3273752575,GB +3273752576,3273760767,NL +3273760768,3273768959,GB +3273768960,3273785343,TR +3273785344,3273801727,RU +3273801728,3273802239,DE +3273802240,3273802751,RO +3273802752,3273803263,SA +3273803264,3273803775,ES +3273803776,3273804287,CH +3273804288,3273804799,UA +3273804800,3273805311,RO +3273805312,3273805823,GB +3273805824,3273806335,PL +3273806336,3273806847,DE +3273806848,3273807359,SE +3273807360,3273807871,LB +3273807872,3273808383,CH +3273808384,3273808895,UA +3273808896,3273809407,GB +3273809408,3273809919,UA +3273809920,3273818111,BG +3273818112,3273826303,AT +3273826304,3273834495,DE +3273834496,3273835519,RU +3273835520,3273838591,UA +3273838592,3273839615,PL +3273839616,3273840639,LT +3273840640,3273841663,PL +3273841664,3273842687,AT +3273842688,3273850879,RU +3273850880,3273867263,DE +3273867264,3273867519,BE +3273867520,3273867775,UA +3273867776,3273868031,PT +3273868032,3273868287,GB +3273868288,3273869311,RU +3273869312,3273871359,DE +3273871360,3273871615,PL +3273871616,3273871871,LU +3273871872,3273872383,SE +3273872384,3273872895,UA +3273872896,3273873151,SE +3273873152,3273873919,DE +3273873920,3273874431,GB +3273874432,3273875455,GR +3273875456,3273875711,PT +3273875712,3273875967,SE +3273875968,3273876223,DE +3273876224,3273876479,IT +3273876480,3273876991,SE +3273876992,3273877247,CH +3273877248,3273877503,DE +3273877504,3273877535,GB +3273877536,3273877567,AT +3273877568,3273877759,IT +3273877760,3273878015,GR +3273878016,3273878271,FR +3273878272,3273878527,LV +3273878528,3273879039,DE +3273879040,3273879551,BE +3273879552,3273880063,GB +3273880064,3273880575,LV +3273880576,3273881087,RU +3273881088,3273881343,RO +3273881344,3273881599,CH +3273881600,3273881855,GB +3273881856,3273882111,CH +3273882112,3273882367,SI +3273882368,3273883135,GB +3273883136,3273883391,GR +3273883392,3273883647,DE +3273883648,3273916415,NL +3273916416,3273932799,IT +3273932800,3273949183,DE +3273949184,3273981951,FR +3273981952,3274047487,DE +3274047488,3274049535,SE +3274049536,3274050559,DE +3274050560,3274051583,PL +3274051584,3274052351,UA +3274052352,3274052607,GB +3274052608,3274052863,DE +3274052864,3274053119,GB +3274053120,3274053375,KZ +3274053376,3274053631,RU +3274053632,3274054655,DE +3274054656,3274055167,GB +3274055168,3274055423,MT +3274055424,3274055679,PL +3274055680,3274063871,RU +3274063872,3274072063,GB +3274072064,3274080255,HU +3274080256,3274088447,DE +3274088448,3274096639,KG +3274096640,3274113023,NL +3274113024,3274145791,CZ +3274145792,3274162175,KW +3274162176,3274162687,GB +3274162688,3274163199,DE +3274163200,3274163711,UA +3274163712,3274164223,BG +3274164224,3274164735,AT +3274164736,3274165759,GB +3274165760,3274166271,RU +3274166272,3274166783,AT +3274166784,3274167295,UA +3274167296,3274167807,BG +3274167808,3274168319,UA +3274168320,3274168831,PL +3274169344,3274170367,DE +3274170368,3274170879,TR +3274170880,3274171391,DE +3274171392,3274171903,RU +3274171904,3274172415,DE +3274172416,3274172927,UA +3274172928,3274173439,DE +3274173440,3274173951,GR +3274173952,3274174463,DE +3274174464,3274175487,UA +3274175488,3274175999,BE +3274176000,3274176511,DE +3274176512,3274177023,UA +3274177024,3274177535,FR +3274177536,3274178047,UA +3274178048,3274178559,NL +3274178560,3274204063,GB +3274204064,3274204095,FR +3274204096,3274244095,GB +3274244096,3274309631,DK +3274309632,3274318031,FR +3274318032,3274318047,RU +3274318048,3274326015,FR +3274326016,3274334719,RU +3274334720,3274335231,PL +3274335232,3274335743,DE +3274335744,3274336255,NL +3274336256,3274336767,SE +3274336768,3274337279,AT +3274337280,3274337791,DE +3274337792,3274338303,SE +3274338304,3274338815,PL +3274338816,3274339327,DE +3274339328,3274339839,RO +3274339840,3274340351,RU +3274340352,3274340863,IE +3274340864,3274341375,RU +3274341376,3274341887,FR +3274341888,3274342399,UA +3274342400,3274342911,RO +3274342912,3274343423,UA +3274343424,3274343935,US +3274343936,3274344447,NL +3274344448,3274344959,UA +3274344960,3274345471,RO +3274345472,3274345983,PL +3274345984,3274346495,BG +3274346496,3274347007,FR +3274347008,3274347519,RU +3274347520,3274348031,IL +3274348032,3274348543,DK +3274348544,3274349055,PL +3274349056,3274358783,RU +3274358784,3274366975,SE +3274366976,3274368511,NL +3274368512,3274368767,AT +3274368768,3274369023,FR +3274369024,3274370047,DE +3274370048,3274371071,GB +3274371072,3274373375,NL +3274373376,3274373631,PL +3274373632,3274374143,FR +3274374144,3274375167,DE +3274375168,3274383359,EG +3274383360,3274384383,RU +3274384384,3274385407,SE +3274385408,3274386431,UA +3274386432,3274388479,GB +3274388480,3274389503,DE +3274389504,3274390527,CH +3274390528,3274391551,NO +3274391552,3274399743,LT +3274399744,3274407935,LU +3274407936,3274408191,ES +3274408192,3274408447,IT +3274408448,3274408703,NL +3274408704,3274408959,SI +3274408960,3274409215,GR +3274409216,3274409471,SI +3274409472,3274409727,CH +3274409728,3274409983,RU +3274409984,3274410239,LT +3274410240,3274410495,SA +3274410496,3274410751,NL +3274410752,3274411007,AT +3274411008,3274411263,CH +3274411264,3274411519,LI +3274411520,3274412031,PL +3274412032,3274412287,RU +3274412288,3274412543,NO +3274412544,3274412799,UA +3274412800,3274413055,RU +3274413056,3274413311,UA +3274413312,3274413567,AT +3274413568,3274413823,FR +3274413824,3274414079,SE +3274414080,3274414335,AT +3274414336,3274414591,CH +3274414592,3274414847,NL +3274414848,3274415103,IE +3274415104,3274415359,GR +3274415360,3274415615,GB +3274415616,3274415871,NL +3274415872,3274416127,SI +3274416128,3274424319,IT +3274424320,3274435711,SE +3274435712,3274435839,US +3274435840,3274440703,SE +3274442752,3274443263,GB +3274443520,3274443647,GB +3274443712,3274443775,GB +3274443808,3274444031,GB +3274446336,3274447871,GB +3274448384,3274448639,GB +3274448896,3274449663,GB +3274449920,3274450231,GB +3274450248,3274450367,GB +3274450376,3274450391,GB +3274450408,3274450415,GB +3274450432,3274450591,GB +3274450656,3274450687,GB +3274451200,3274452255,GB +3274452264,3274452311,GB +3274452320,3274452335,GB +3274452344,3274452367,GB +3274452384,3274452391,GB +3274452400,3274452423,GB +3274452432,3274452439,GB +3274452448,3274452455,GB +3274452464,3274452471,GB +3274452496,3274452543,GB +3274452560,3274452575,GB +3274452656,3274452703,GB +3274452736,3274452927,GB +3274452992,3274453767,GB +3274453784,3274453791,GB +3274453800,3274453847,GB +3274453864,3274453871,GB +3274453888,3274453903,GB +3274453920,3274453935,GB +3274453944,3274453951,GB +3274453960,3274453975,GB +3274453984,3274453991,GB +3274454000,3274454271,GB +3274454656,3274455311,GB +3274455328,3274455335,GB +3274455344,3274455351,GB +3274455360,3274455375,GB +3274455384,3274455391,GB +3274455400,3274455423,GB +3274455432,3274455439,GB +3274455448,3274455503,GB +3274455520,3274455535,GB +3274455744,3274455807,GB +3274455872,3274455935,GB +3274455968,3274456359,GB +3274456368,3274456375,GB +3274456384,3274456391,GB +3274456400,3274456407,GB +3274456416,3274456447,GB +3274456456,3274456511,GB +3274456528,3274456535,GB +3274456544,3274456559,GB +3274456568,3274460223,GB +3274460416,3274462207,GB +3274462464,3274465023,GB +3274465152,3274466351,GB +3274466368,3274466399,GB +3274466416,3274466463,GB +3274466560,3274466735,GB +3274466744,3274466763,GB +3274466768,3274466783,GB +3274466816,3274467099,GB +3274467104,3274467307,GB +3274467328,3274470383,GB +3274470400,3274470535,GB +3274470656,3274471423,GB +3274471536,3274471615,GB +3274471680,3274471935,GB +3274472960,3274483711,GB +3274489600,3274489855,GB +3274490176,3274490895,GB +3274490912,3274491247,GB +3274491256,3274491295,GB +3274491304,3274491319,GB +3274491328,3274491383,GB +3274491392,3274504447,GB +3274505728,3274505791,GB +3274505793,3274505855,GB +3274506240,3274571775,IT +3274571776,3274579967,GR +3274579968,3274580991,RU +3274580992,3274582015,NL +3274582016,3274583039,PL +3274583040,3274584063,DE +3274584064,3274585087,GB +3274585088,3274586111,RS +3274586112,3274587135,UA +3274587136,3274588159,GB +3274588160,3274596351,SK +3274596352,3274604543,RU +3274604544,3274612735,TR +3274612736,3274620927,RU +3274620928,3274629119,FR +3274629120,3274637311,LU +3274637312,3274670079,CZ +3274670080,3274686463,DK +3274686464,3274686719,RU +3274686720,3274686975,BG +3274686976,3274687231,RO +3274687232,3274687487,DE +3274687488,3274687743,RU +3274687744,3274687999,SI +3274688000,3274688255,GB +3274688256,3274688511,IT +3274688512,3274688767,PT +3274688768,3274689023,PL +3274689024,3274689279,UA +3274689280,3274689535,PL +3274689536,3274689791,DE +3274689792,3274690047,SE +3274690048,3274690303,ES +3274690304,3274690559,GB +3274690560,3274690815,GR +3274690816,3274691071,ES +3274691072,3274691327,DK +3274691328,3274691583,SI +3274691584,3274691839,UA +3274691840,3274692095,SI +3274692096,3274692351,RO +3274692352,3274692607,BE +3274692608,3274692863,DK +3274692864,3274693119,AT +3274693120,3274693375,LT +3274693376,3274693631,UA +3274693632,3274693887,NL +3274693888,3274694143,IT +3274694144,3274694399,DK +3274694400,3274694655,GB +3274694656,3274694911,SI +3274694912,3274695167,GB +3274695168,3274695423,SI +3274695424,3274695679,PL +3274695680,3274695935,SI +3274695936,3274696191,DE +3274696192,3274696447,DK +3274696448,3274696703,CH +3274696704,3274696959,IT +3274696960,3274697215,GR +3274697216,3274697471,SA +3274697472,3274697727,CZ +3274697728,3274697983,ES +3274697984,3274698239,GB +3274698240,3274698495,SE +3274698496,3274698751,PL +3274698752,3274699007,GB +3274699008,3274699263,FR +3274699264,3274699519,RO +3274699520,3274700031,GB +3274700032,3274700287,CH +3274700288,3274700543,PL +3274700544,3274700799,DK +3274700800,3274701055,UA +3274701056,3274701311,DE +3274701312,3274701567,TJ +3274701568,3274702079,IT +3274702080,3274702335,UA +3274702336,3274702591,SE +3274702592,3274702847,KZ +3274702848,3274801151,CH +3274801152,3274802175,UA +3274802176,3274803199,FR +3274803200,3274804223,DE +3274804224,3274805247,FR +3274805248,3274806271,GB +3274806272,3274807295,UA +3274807296,3274809343,DE +3274809344,3274810367,SE +3274810368,3274811391,UA +3274811392,3274812415,RU +3274812416,3274813439,SE +3274813440,3274814463,ES +3274814464,3274815487,GB +3274815488,3274816511,RU +3274816512,3274817535,SK +3274817536,3274819583,RU +3274819584,3274821631,UA +3274821632,3274823679,KZ +3274823680,3274825727,TR +3274825728,3274827775,DE +3274827776,3274829823,RU +3274829824,3274831871,SE +3274831872,3274833919,RO +3274833920,3274842111,BY +3274842112,3274850303,DK +3274850304,3274866687,GB +3274866688,3274883071,DE +3274883072,3274891263,EE +3274891264,3274899455,CH +3274899456,3274902399,DE +3274902400,3274902423,AT +3274902528,3274910975,DE +3274911232,3274911743,DE +3274911744,3274911999,FR +3274912000,3274912031,GB +3274912032,3274912063,DE +3274912064,3274912191,FR +3274912192,3274912287,DE +3274912288,3274912295,LU +3274912296,3274912303,GB +3274912304,3274912447,FR +3274912448,3274912511,NL +3274912512,3274912767,FR +3274912768,3274912799,DE +3274912800,3274912831,IT +3274912832,3274912895,FR +3274912896,3274913023,RO +3274913024,3274913279,FR +3274913280,3274914815,DE +3274915072,3274915839,DE +3274915840,3274916735,NL +3274916736,3274916863,DE +3274916864,3274917215,NL +3274917216,3274917311,GB +3274917312,3274917327,ZA +3274917328,3274917335,CH +3274917336,3274917343,GB +3274917344,3274917375,SE +3274917376,3274917887,NL +3274917888,3274918911,BE +3274918912,3274919359,CH +3274919392,3274919423,CH +3274919424,3274919935,GB +3274919936,3274921983,BE +3274921984,3274922847,ZA +3274922848,3274922863,BE +3274922864,3274922871,GB +3274922872,3274922879,IT +3274922880,3274922943,ZA +3274922944,3274923007,NL +3274923264,3274924031,NL +3274924032,3274928127,FR +3274928128,3274928511,ES +3274928512,3274928575,RU +3274928576,3274928639,GB +3274928640,3274929151,ES +3274929408,3274929663,FR +3274929664,3274930175,BE +3274930176,3274932223,IT +3274932224,3274932991,GB +3274932992,3274933151,DE +3274933152,3274933183,CH +3274933184,3274933215,ZA +3274933216,3274933247,BE +3274933248,3274936063,GB +3274936064,3274936159,SE +3274936160,3274936175,GB +3274936192,3274936863,GB +3274936864,3274936871,BE +3274936872,3274936879,CH +3274936880,3274936895,SE +3274936896,3274938367,GB +3274938496,3274938535,GB +3274938536,3274938543,FR +3274938544,3274938559,GB +3274938624,3274938879,GB +3274938880,3274939135,DE +3274939136,3274939391,IT +3274939392,3274940415,ZA +3274940416,3274941055,DE +3274941056,3274941087,NL +3274941088,3274941095,DE +3274941096,3274941103,IT +3274941104,3274942463,DE +3274942464,3274944511,FR +3274944512,3274948607,NL +3274948608,3274952447,DK +3274952448,3274952479,SE +3274952480,3274952511,FR +3274952512,3274952527,GB +3274952528,3274952543,BE +3274952544,3274952575,GB +3274952576,3274952703,IT +3274952704,3274954239,AT +3274954240,3274954399,NL +3274954400,3274954415,BE +3274954416,3274954431,GB +3274954432,3274954495,PT +3274954496,3274954623,AT +3274954624,3274954751,NL +3274954752,3274955007,SE +3274955264,3274956287,SE +3274956288,3274956543,GB +3274956544,3274956615,BE +3274956616,3274956623,AT +3274956624,3274956639,DE +3274956640,3274956655,GB +3274956656,3274956671,FR +3274956672,3274956735,DE +3274956736,3274956767,DK +3274956768,3274956799,SE +3274956800,3274957055,CH +3274957056,3274957567,AT +3274957568,3274957823,CH +3274957824,3274957831,GR +3274957952,3274957959,BE +3274957968,3274957983,FR +3274957984,3274957999,BE +3274958000,3274958007,GB +3274958008,3274958015,BE +3274958080,3274958279,IE +3274958288,3274958335,IE +3274958336,3274959231,AT +3274959232,3274959247,IT +3274959248,3274959255,GB +3274959256,3274959263,ZA +3274959272,3274959279,GB +3274959280,3274959287,DE +3274959288,3274959295,GB +3274959296,3274959327,ES +3274959328,3274959615,DE +3274960384,3274960447,BE +3274960448,3274960511,ES +3274960512,3274960575,GB +3274960576,3274960639,IT +3274960640,3274961407,AT +3274961408,3274961503,CH +3274961504,3274961535,DK +3274961536,3274961559,CH +3274961568,3274961663,CH +3274961664,3274961727,BY +3274961920,3274962111,AT +3274962112,3274962175,GB +3274962176,3274962431,ZA +3274962432,3274962687,BE +3274962688,3274962879,GR +3274962880,3274963167,GB +3274963168,3274963183,IE +3274963184,3274963191,GB +3274963192,3274963199,NL +3274963200,3274963455,DE +3274963456,3274963711,CH +3274963712,3274963743,DE +3274963744,3274963775,FR +3274963776,3274963783,GB +3274963784,3274963791,BE +3274963792,3274963807,NL +3274963808,3274963839,IT +3274963840,3274963967,DE +3274963968,3274964223,FR +3274964224,3274964735,BE +3274964736,3274964863,GB +3274964864,3274964879,HU +3274964880,3274964895,FR +3274964896,3274964927,NL +3274964928,3274964991,GB +3274964992,3275030527,DE +3275030528,3275096063,ES +3275096064,3275104255,RU +3275104256,3275112447,IT +3275112448,3275120639,DK +3275120640,3275136639,SE +3275136640,3275136767,DK +3275136768,3275137023,SE +3275137024,3275145215,AT +3275145216,3275153407,RU +3275153408,3275161599,GB +3275161600,3275227135,ES +3275227136,3275292671,HU +3275292672,3275358207,ES +3275358208,3275371775,RU +3275371776,3275372031,TJ +3275372032,3275374591,RU +3275374592,3275382783,GB +3275382784,3275390975,SE +3275390976,3275399167,GB +3275399168,3275407359,AT +3275407360,3275415551,GB +3275415552,3275423743,UA +3275423744,3275423751,GB +3275423776,3275423807,GB +3275424000,3275424255,GB +3275425792,3275426367,GB +3275426432,3275426559,GB +3275427840,3275428367,GB +3275429888,3275430143,GB +3275430272,3275430399,GB +3275430592,3275430623,GB +3275431936,3275432447,GB +3275433984,3275437567,GB +3275438080,3275438607,GB +3275440128,3275440639,GB +3275442176,3275442719,GB +3275444224,3275444735,GB +3275446272,3275446815,GB +3275446848,3275446911,GB +3275448320,3275449519,GB +3275449520,3275449527,FR +3275449528,3275449927,GB +3275450368,3275450879,GB +3275451232,3275451263,GB +3275452416,3275452943,GB +3275452960,3275453023,GB +3275453056,3275453119,GB +3275454464,3275455231,GB +3275456512,3275457023,GB +3275457024,3275457791,FK +3275457792,3275458559,GB +3275458560,3275459583,IE +3275460608,3275460863,HK +3275460864,3275462655,GB +3275464704,3275468655,GB +3275468656,3275468671,IE +3275468672,3275468735,GB +3275468736,3275468751,IE +3275468752,3275468767,GB +3275468768,3275468799,IE +3275469952,3275469983,GB +3275489280,3275497471,GB +3275497472,3275505663,DE +3275505664,3275506175,PL +3275506176,3275506687,UA +3275506688,3275507199,SE +3275507200,3275507711,UA +3275507712,3275509759,RO +3275509760,3275509855,IT +3275509856,3275509887,PL +3275509888,3275509919,AM +3275509920,3275509951,PL +3275509952,3275509983,GB +3275509984,3275510015,PT +3275510016,3275510079,SE +3275510080,3275510143,ES +3275510144,3275510207,RU +3275510208,3275510271,FR +3275510272,3275510335,LV +3275510528,3275510559,PL +3275510560,3275510591,DE +3275510784,3275510911,RU +3275510912,3275511167,GB +3275511168,3275511295,LV +3275511296,3275511551,GB +3275511552,3275511679,NL +3275511680,3275511807,GB +3275511808,3275511935,CH +3275511936,3275512063,IT +3275512064,3275512191,CZ +3275512192,3275512319,IT +3275512320,3275512447,FI +3275512448,3275512575,DK +3275512576,3275512703,BE +3275512704,3275512831,PL +3275512832,3275512895,SE +3275512896,3275512959,AT +3275512960,3275513023,PL +3275513024,3275513151,UA +3275513152,3275513215,ES +3275513216,3275513279,CH +3275513280,3275513343,DK +3275513344,3275513471,PL +3275513472,3275513599,FR +3275513600,3275513727,PL +3275513728,3275513855,GB +3275513856,3275514615,DE +3275514616,3275514623,CH +3275514624,3275522047,DE +3275522048,3275530239,IT +3275530240,3275530751,DK +3275530752,3275531263,AT +3275531264,3275531775,GB +3275531776,3275532287,IE +3275532288,3275532799,FR +3275532800,3275533823,GB +3275533824,3275534335,UA +3275534336,3275534847,IL +3275534848,3275535359,RO +3275535360,3275535871,DE +3275535872,3275536383,SE +3275536384,3275536895,UA +3275536896,3275537407,DE +3275537408,3275537919,FR +3275537920,3275538431,IT +3275538432,3275539455,CH +3275539456,3275540479,GB +3275540480,3275542527,UA +3275542528,3275543551,DE +3275543552,3275544575,NL +3275544576,3275545599,PL +3275546624,3275547647,UA +3275547648,3275548671,RU +3275548672,3275549695,IL +3275549696,3275550719,SY +3275550720,3275551743,PL +3275551744,3275552767,RU +3275552768,3275553791,LV +3275553792,3275554815,FI +3275555392,3275555455,ES +3275555592,3275555647,ES +3275555744,3275555759,ES +3275555768,3275555776,ES +3275556608,3275556863,ES +3275560960,3275561215,ES +3275561472,3275561727,ES +3275562496,3275562751,ES +3275563008,3275563519,CH +3275563584,3275563647,CH +3275563648,3275563775,DE +3275563776,3275564287,CH +3275564416,3275564495,CH +3275564800,3275565055,CH +3275565312,3275565567,CH +3275565824,3275567487,CH +3275567616,3275568127,CH +3275568384,3275569407,CH +3275569920,3275570687,CH +3275571200,3275571455,PT +3275571968,3275572095,PT +3275572768,3275572863,PT +3275572992,3275573055,PT +3275573120,3275574015,PT +3275574032,3275574047,PT +3275574144,3275574147,PT +3275574152,3275574159,PT +3275574176,3275574191,PT +3275574784,3275575231,PT +3275575424,3275575727,PT +3275575808,3275575935,PT +3275576064,3275577407,PT +3275577472,3275577495,PT +3275577520,3275577567,PT +3275577600,3275577727,PT +3275577792,3275577807,PT +3275577840,3275578623,PT +3275578880,3275579007,PT +3275579136,3275579391,PT +3275579392,3275579519,FR +3275579520,3275579583,NL +3275579600,3275579615,NL +3275579648,3275579703,NL +3275579904,3275580159,NL +3275580928,3275581311,NL +3275581536,3275581671,NL +3275581680,3275581695,NL +3275582224,3275582247,NL +3275582256,3275582287,NL +3275582656,3275582719,NL +3275582976,3275583231,NL +3275584256,3275584287,NL +3275584512,3275584527,NL +3275585024,3275585279,NL +3275587072,3275587136,NL +3275587584,3275587855,BE +3275588096,3275588287,BE +3275588288,3275588319,NL +3275588352,3275588607,BE +3275588640,3275588655,BE +3275588712,3275588719,CH +3275588736,3275588799,BE +3275588848,3275588855,BE +3275588864,3275589119,IT +3275589272,3275589279,BE +3275589376,3275589471,BE +3275589888,3275591167,BE +3275591424,3275591679,BE +3275591680,3275592063,RO +3275592192,3275592959,RO +3275592960,3275593215,MD +3275593344,3275593855,RO +3275593984,3275595007,RO +3275595008,3275595039,BE +3275595264,3275595519,US +3275596168,3275596175,AT +3275599104,3275599231,AT +3275599872,3275600127,AT +3275603968,3275604735,IT +3275604736,3275604767,IL +3275604992,3275606271,IT +3275606528,3275606783,IT +3275608832,3275610063,IT +3275610112,3275610623,IT +3275612160,3275612287,LU +3275612416,3275612671,LU +3275612672,3275612927,BE +3275612928,3275613951,LU +3275620352,3275622399,RU +3275622400,3275623423,GB +3275623424,3275623935,PL +3275623936,3275624447,UA +3275624448,3275624959,SK +3275624960,3275625471,IL +3275625472,3275625983,DE +3275625984,3275626495,BG +3275626496,3275627007,UA +3275627008,3275627519,AT +3275627520,3275628031,GB +3275628544,3275629567,RU +3275629568,3275630079,UA +3275630592,3275631103,PL +3275631104,3275631615,FR +3275631616,3275632127,DE +3275632128,3275633151,RU +3275633152,3275633663,FR +3275633664,3275634687,RU +3275634688,3275635199,RO +3275635200,3275636735,RU +3275636736,3275637247,PL +3275637248,3275637759,SE +3275637760,3275638271,BE +3275638272,3275638783,RU +3275638784,3275639807,FR +3275639808,3275640319,SE +3275640320,3275640831,RU +3275641344,3275641855,NL +3275641856,3275642367,AT +3275642368,3275642879,RU +3275642880,3275643391,RO +3275643392,3275643903,BE +3275643904,3275644415,RU +3275644416,3275644927,RO +3275644928,3275653119,DE +3275653120,3275661311,LV +3275661312,3275669503,IT +3275669504,3275677695,GB +3275677696,3275685887,IT +3275685888,3275751423,DE +3275751424,3275759615,AT +3275759616,3275775999,NL +3275776000,3275784191,DE +3275784192,3275784703,RO +3275784704,3275785215,PL +3275785216,3275785727,RO +3275785728,3275786239,CH +3275786240,3275786751,UA +3275786752,3275787263,CH +3275787264,3275787775,RU +3275787776,3275788287,UA +3275788288,3275788799,SE +3275788800,3275789311,AT +3275789312,3275789823,UA +3275789824,3275790335,PL +3275790336,3275790847,MD +3275790848,3275791359,DK +3275791360,3275791871,RU +3275791872,3275792383,PL +3275792384,3275792895,BG +3275792896,3275793407,UA +3275793408,3275793919,FR +3275793920,3275794431,UA +3275794432,3275794943,IT +3275794944,3275795455,RS +3275795456,3275795967,GR +3275795968,3275796479,PL +3275796480,3275796991,DE +3275796992,3275797503,RO +3275797504,3275798015,DE +3275798016,3275798527,RO +3275799040,3275799551,ES +3275799552,3275800063,IT +3275800064,3275800575,UA +3275800576,3275808767,RU +3275808768,3275816959,UA +3275816960,3275818207,CH +3275818208,3275818215,DE +3275818216,3275881335,CH +3275881336,3275881343,DE +3275881344,3275882495,CH +3275882496,3275884543,DE +3275884544,3275886591,IT +3275886592,3275888639,PL +3275888640,3275890687,GB +3275890688,3275898879,SE +3275898880,3275899135,LV +3275899136,3275899647,UA +3275899648,3275900159,PL +3275900160,3275900415,SI +3275900416,3275900671,DE +3275900672,3275901183,RU +3275901184,3275901439,PL +3275901440,3275901695,DE +3275901696,3275901951,IE +3275901952,3275902207,DE +3275902208,3275902719,RU +3275902720,3275902975,UA +3275902976,3275903231,FR +3275903232,3275903487,GB +3275903488,3275903999,DE +3275904000,3275904255,RU +3275904256,3275904511,CH +3275904512,3275904767,PL +3275904768,3275905023,RU +3275905024,3275905279,PL +3275905280,3275905535,RU +3275905536,3275905791,NL +3275905792,3275906303,AT +3275906304,3275906559,UA +3275906560,3275907071,SE +3275907072,3275907327,RU +3275907328,3275907583,CH +3275907584,3275907839,PL +3275907840,3275908095,DE +3275908096,3275908351,SA +3275908352,3275908607,SE +3275908608,3275908863,US +3275908864,3275909119,PL +3275909120,3275909375,RU +3275909376,3275909631,UA +3275909632,3275909887,EE +3275909888,3275910143,SI +3275910144,3275910399,RU +3275910400,3275910655,DK +3275910656,3275910911,CH +3275910912,3275911167,DE +3275911168,3275911423,FR +3275911424,3275911679,RO +3275911680,3275911935,UA +3275911936,3275912191,BE +3275912192,3275912447,PL +3275912448,3275912703,RU +3275912704,3275912959,IL +3275912960,3275913215,FR +3275913216,3275913471,UA +3275913472,3275913983,DE +3275913984,3275914239,CH +3275914240,3275914495,RO +3275914496,3275914751,BG +3275914752,3275915007,RU +3275915008,3275915263,PT +3275915264,3275915775,FR +3275915776,3275916287,SE +3275916288,3275917311,NL +3275917312,3275918847,UA +3275918848,3275919359,RO +3275919360,3275919871,PL +3275919872,3275920383,RO +3275920384,3275920895,GB +3275920896,3275921407,ES +3275921408,3275921919,UA +3275921920,3275922431,DE +3275922432,3275922943,UA +3275922944,3275923455,GR +3275923456,3275924479,ME +3275924480,3275925759,CS +3275925760,3275925919,ME +3275925920,3275925951,CS +3275925952,3275926287,ME +3275926288,3275926303,CS +3275926304,3275926495,ME +3275926496,3275926783,CS +3275926784,3275927679,ME +3275927680,3275927711,CS +3275927712,3275928319,ME +3275928320,3275928351,CS +3275928352,3275928447,ME +3275928448,3275928511,CS +3275928512,3275928831,ME +3275928832,3275928847,CS +3275928848,3275928927,ME +3275928928,3275928943,CS +3275928944,3275928991,ME +3275928992,3275929023,CS +3275929024,3275929103,ME +3275929104,3275929151,CS +3275929152,3275929159,CS +3275929160,3275929167,ME +3275929168,3275929183,CS +3275929184,3275929215,CS +3275929216,3275929295,ME +3275929296,3275929311,CS +3275929312,3275929343,CS +3275929344,3275929471,ME +3275929472,3275929487,CS +3275929488,3275929503,ME +3275929504,3275929535,CS +3275929536,3275929615,ME +3275929616,3275929663,CS +3275929664,3275929695,ME +3275929696,3275929727,CS +3275929728,3275929791,CS +3275929792,3275929855,ME +3275929856,3275929919,CS +3275929920,3275929935,ME +3275929936,3275929951,CS +3275929952,3275930015,ME +3275930016,3275930023,CS +3275930024,3275930079,ME +3275930080,3275930095,CS +3275930096,3275930239,ME +3275930240,3275930271,CS +3275930272,3275930287,ME +3275930288,3275930295,CS +3275930296,3275930303,CS +3275930304,3275931647,ME +3275931648,3275939839,UA +3275939840,3275948031,GB +3275948032,3275965267,SE +3275965268,3275965271,FI +3275965272,3276013567,SE +3276013568,3276014087,FR +3276014088,3276014095,GB +3276014096,3276014151,FR +3276014152,3276014159,GB +3276014160,3276014191,FR +3276014192,3276014207,GB +3276014208,3276014255,FR +3276014256,3276014263,GB +3276014264,3276014335,FR +3276014336,3276014367,GB +3276014368,3276014391,FR +3276014392,3276014399,GB +3276014400,3276014415,FR +3276014416,3276014439,GB +3276014440,3276014471,FR +3276014472,3276014495,GB +3276014496,3276014503,FR +3276014504,3276014511,GB +3276014512,3276014607,FR +3276014608,3276014623,GB +3276014624,3276014647,FR +3276014648,3276014655,GB +3276014656,3276014671,FR +3276014672,3276014687,GB +3276014688,3276014695,FR +3276014696,3276014719,GB +3276014720,3276014751,FR +3276014752,3276014799,GB +3276014800,3276014815,FR +3276014816,3276014847,GB +3276014848,3276014879,FR +3276014880,3276014895,GB +3276014896,3276014911,FR +3276014912,3276014935,GB +3276014936,3276015007,FR +3276015008,3276015055,GB +3276015056,3276015199,FR +3276015200,3276015231,GB +3276015232,3276015247,FR +3276015248,3276015263,GB +3276015264,3276015295,FR +3276015296,3276015327,GB +3276015328,3276015407,FR +3276015408,3276015423,GB +3276015424,3276015567,FR +3276015568,3276015583,GB +3276015584,3276015615,FR +3276015616,3276015655,GB +3276015656,3276015815,FR +3276015816,3276015855,GB +3276015856,3276015863,FR +3276015864,3276015871,GB +3276015872,3276015929,FR +3276015930,3276015935,GB +3276015936,3276016095,FR +3276016096,3276016103,GB +3276016104,3276016119,FR +3276016120,3276016127,GB +3276016128,3276016391,FR +3276016392,3276016399,GB +3276016400,3276016415,FR +3276016416,3276016463,GB +3276016464,3276016495,FR +3276016496,3276016511,GB +3276016512,3276016527,FR +3276016528,3276016591,GB +3276016592,3276016703,FR +3276016704,3276016735,GB +3276016736,3276016767,FR +3276016768,3276016783,GB +3276016784,3276016815,FR +3276016816,3276016847,GB +3276016848,3276016863,FR +3276016864,3276016879,GB +3276016880,3276016943,FR +3276016944,3276016959,GB +3276016960,3276016975,FR +3276016976,3276016991,GB +3276016992,3276017055,FR +3276017056,3276017071,GB +3276017072,3276017119,FR +3276017120,3276017151,GB +3276017152,3276017551,FR +3276017552,3276017567,GB +3276017568,3276017607,FR +3276017608,3276017663,GB +3276017664,3276018047,FR +3276018048,3276018063,GB +3276018064,3276018095,FR +3276018096,3276018127,GB +3276018128,3276018143,FR +3276018144,3276018159,GB +3276018160,3276018495,FR +3276018496,3276018527,GB +3276018528,3276018543,FR +3276018544,3276018623,GB +3276018624,3276018943,FR +3276018944,3276018975,GB +3276018976,3276018985,FR +3276018986,3276019007,GB +3276019008,3276019023,FR +3276019024,3276019151,GB +3276019152,3276019455,FR +3276019456,3276019479,GB +3276019480,3276019487,FR +3276019488,3276019511,GB +3276019512,3276019535,FR +3276019536,3276019599,GB +3276019600,3276019639,FR +3276019640,3276019647,GB +3276019648,3276019663,FR +3276019664,3276019671,GB +3276019672,3276019679,FR +3276019680,3276019687,GB +3276019688,3276019695,FR +3276019696,3276019703,GB +3276019704,3276019823,FR +3276019824,3276019831,GB +3276019832,3276019839,FR +3276019840,3276019855,GB +3276019856,3276019863,FR +3276019864,3276019871,GB +3276019872,3276019895,FR +3276019896,3276019903,GB +3276019904,3276019911,FR +3276019912,3276019927,GB +3276019928,3276019967,FR +3276019968,3276019975,GB +3276019976,3276020063,FR +3276020064,3276020079,GB +3276020080,3276020127,FR +3276020128,3276020159,GB +3276020160,3276020399,FR +3276020400,3276020431,GB +3276020432,3276020479,FR +3276020480,3276020511,GB +3276020512,3276020527,FR +3276020528,3276020543,GB +3276020544,3276020623,FR +3276020624,3276020631,GB +3276020632,3276020679,FR +3276020680,3276020687,GB +3276020688,3276020703,FR +3276020704,3276020735,GB +3276020736,3276020943,FR +3276020944,3276020991,GB +3276020992,3276021151,FR +3276021152,3276021167,GB +3276021168,3276021215,FR +3276021216,3276021247,GB +3276021248,3276021535,FR +3276021536,3276021543,GB +3276021544,3276021575,FR +3276021576,3276021615,GB +3276021616,3276021655,FR +3276021656,3276021663,GB +3276021664,3276021727,FR +3276021728,3276021767,GB +3276021768,3276021791,FR +3276021792,3276021823,GB +3276021824,3276021855,FR +3276021856,3276021887,GB +3276021888,3276021983,FR +3276021984,3276021999,GB +3276022000,3276022031,FR +3276022032,3276022047,GB +3276022048,3276022087,FR +3276022088,3276022095,GB +3276022096,3276022127,FR +3276022128,3276022143,GB +3276022144,3276022247,FR +3276022248,3276022271,GB +3276022272,3276022479,FR +3276022480,3276022495,GB +3276022496,3276022519,FR +3276022520,3276022527,GB +3276022528,3276022567,FR +3276022568,3276022639,GB +3276022640,3276022655,FR +3276022656,3276022687,GB +3276022688,3276022751,FR +3276022752,3276022783,GB +3276022784,3276022983,FR +3276022984,3276022991,GB +3276022992,3276023031,FR +3276023032,3276023039,GB +3276023040,3276023071,FR +3276023072,3276023079,GB +3276023080,3276023103,FR +3276023104,3276023231,GB +3276023232,3276023247,FR +3276023248,3276023279,GB +3276023280,3276023295,FR +3276023296,3276023343,GB +3276023344,3276023375,FR +3276023376,3276023423,GB +3276023424,3276023455,FR +3276023456,3276023471,GB +3276023472,3276023487,FR +3276023488,3276023519,GB +3276023520,3276023679,FR +3276023680,3276023711,GB +3276023712,3276023759,FR +3276023760,3276023767,GB +3276023768,3276023855,FR +3276023856,3276023887,GB +3276023888,3276023895,FR +3276023896,3276023919,GB +3276023920,3276023943,FR +3276023944,3276023951,GB +3276023952,3276023959,FR +3276023960,3276023967,GB +3276023968,3276025103,FR +3276025104,3276025135,GB +3276025136,3276025151,FR +3276025152,3276025159,GB +3276025160,3276025167,FR +3276025168,3276025175,GB +3276025176,3276025183,FR +3276025184,3276025191,GB +3276025192,3276025247,FR +3276025248,3276025279,GB +3276025280,3276025295,FR +3276025296,3276025327,GB +3276025328,3276026111,FR +3276026112,3276026127,GB +3276026128,3276026167,FR +3276026168,3276026175,GB +3276026176,3276026215,FR +3276026216,3276026223,GB +3276026224,3276026335,FR +3276026336,3276026351,GB +3276026352,3276026399,FR +3276026400,3276026415,GB +3276026416,3276026423,FR +3276026424,3276026431,GB +3276026432,3276026439,FR +3276026440,3276026447,GB +3276026448,3276026527,FR +3276026528,3276026535,GB +3276026536,3276026543,FR +3276026544,3276026575,GB +3276026576,3276026703,FR +3276026704,3276026719,GB +3276026720,3276026727,FR +3276026728,3276026743,GB +3276026744,3276026815,FR +3276026816,3276026823,GB +3276026824,3276026879,FR +3276026880,3276026927,GB +3276026928,3276026943,FR +3276026944,3276026991,GB +3276026992,3276027311,FR +3276027312,3276027327,GB +3276027328,3276027503,FR +3276027504,3276027535,GB +3276027536,3276027551,FR +3276027552,3276027583,GB +3276027584,3276027646,FR +3276027647,3276027647,GB +3276027648,3276027695,FR +3276027696,3276027743,GB +3276027744,3276027791,FR +3276027792,3276027807,GB +3276027808,3276027855,FR +3276027856,3276027871,GB +3276027872,3276027951,FR +3276027952,3276027967,GB +3276027968,3276028047,FR +3276028048,3276028063,GB +3276028064,3276028079,FR +3276028080,3276028111,GB +3276028112,3276028127,FR +3276028128,3276028143,GB +3276028144,3276028159,FR +3276028160,3276028231,GB +3276028232,3276028247,FR +3276028248,3276028255,GB +3276028256,3276028263,FR +3276028264,3276028287,GB +3276028288,3276028415,FR +3276028416,3276028671,GB +3276028672,3276028743,FR +3276028744,3276028751,GB +3276028752,3276028759,FR +3276028760,3276028767,GB +3276028768,3276028791,FR +3276028792,3276028799,GB +3276028800,3276028807,FR +3276028808,3276028815,GB +3276028816,3276028863,FR +3276028864,3276028871,GB +3276028872,3276028879,FR +3276028880,3276028887,GB +3276028888,3276028895,FR +3276028896,3276028927,GB +3276028928,3276029183,FR +3276029184,3276029199,GB +3276029200,3276029247,FR +3276029248,3276029263,GB +3276029264,3276029343,FR +3276029344,3276029359,GB +3276029360,3276029375,FR +3276029376,3276029407,GB +3276029408,3276029423,FR +3276029424,3276029439,GB +3276029440,3276029567,FR +3276029568,3276029599,GB +3276029600,3276029727,FR +3276029728,3276029791,GB +3276029792,3276029871,FR +3276029872,3276029887,GB +3276029888,3276029935,FR +3276029936,3276029967,GB +3276029968,3276030079,FR +3276030080,3276030095,GB +3276030096,3276030191,FR +3276030192,3276030207,GB +3276030208,3276030215,FR +3276030216,3276030247,GB +3276030248,3276030255,FR +3276030256,3276030263,GB +3276030264,3276030271,FR +3276030272,3276030295,GB +3276030296,3276030407,FR +3276030408,3276030415,GB +3276030416,3276030543,FR +3276030544,3276030559,GB +3276030560,3276030607,FR +3276030608,3276030623,GB +3276030624,3276031103,FR +3276031104,3276031231,GB +3276031232,3276031375,FR +3276031376,3276031391,GB +3276031392,3276031423,FR +3276031424,3276031439,GB +3276031440,3276031519,FR +3276031520,3276031535,GB +3276031536,3276031559,FR +3276031560,3276031567,GB +3276031568,3276031575,FR +3276031576,3276031591,GB +3276031592,3276031615,FR +3276031616,3276031679,GB +3276031680,3276031719,FR +3276031720,3276031743,GB +3276031744,3276032007,FR +3276032008,3276032031,GB +3276032032,3276032055,FR +3276032056,3276032079,GB +3276032080,3276032103,FR +3276032104,3276032111,GB +3276032112,3276032271,FR +3276032272,3276032303,GB +3276032304,3276032319,FR +3276032320,3276032343,GB +3276032344,3276032543,FR +3276032544,3276032559,GB +3276032560,3276032591,FR +3276032592,3276032607,GB +3276032608,3276032719,FR +3276032720,3276032735,GB +3276032736,3276033039,FR +3276033040,3276033119,GB +3276033120,3276033151,FR +3276033152,3276033167,GB +3276033168,3276033215,FR +3276033216,3276033231,GB +3276033232,3276033247,FR +3276033248,3276033279,GB +3276033280,3276033535,FR +3276033536,3276033647,GB +3276033648,3276033663,FR +3276033664,3276033695,GB +3276033696,3276033727,FR +3276033728,3276033759,GB +3276033760,3276033791,FR +3276033792,3276033855,GB +3276033856,3276033863,FR +3276033864,3276033895,GB +3276033896,3276033911,FR +3276033912,3276033919,GB +3276033920,3276033927,FR +3276033928,3276033951,GB +3276033952,3276033983,FR +3276033984,3276034015,GB +3276034016,3276035839,FR +3276035840,3276036079,GB +3276036080,3276036095,FR +3276036096,3276036143,GB +3276036144,3276036191,FR +3276036192,3276036207,GB +3276036208,3276036223,FR +3276036224,3276036255,GB +3276036256,3276036271,FR +3276036272,3276036287,GB +3276036288,3276036303,FR +3276036304,3276036335,GB +3276036336,3276036351,FR +3276036352,3276036447,GB +3276036448,3276036479,FR +3276036480,3276036527,GB +3276036528,3276036543,FR +3276036544,3276036607,GB +3276036608,3276037135,FR +3276037136,3276037151,GB +3276037152,3276037199,FR +3276037200,3276037215,GB +3276037216,3276037327,FR +3276037328,3276037343,GB +3276037344,3276037359,FR +3276037360,3276037375,GB +3276037376,3276037695,FR +3276037696,3276037743,GB +3276037744,3276037783,FR +3276037784,3276037791,GB +3276037792,3276037887,FR +3276037888,3276037903,GB +3276037904,3276037959,FR +3276037960,3276037983,GB +3276037984,3276038015,FR +3276038016,3276038031,GB +3276038032,3276038047,FR +3276038048,3276038111,GB +3276038112,3276038127,FR +3276038128,3276038399,GB +3276038400,3276038703,FR +3276038704,3276038719,GB +3276038720,3276038735,FR +3276038736,3276038751,GB +3276038752,3276038799,FR +3276038800,3276038815,GB +3276038816,3276038847,FR +3276038848,3276038911,GB +3276038912,3276039199,FR +3276039200,3276039247,GB +3276039248,3276039279,FR +3276039280,3276039311,GB +3276039312,3276039327,FR +3276039328,3276039359,GB +3276039360,3276039391,FR +3276039392,3276039423,GB +3276039424,3276039551,FR +3276039552,3276039583,GB +3276039584,3276039647,FR +3276039648,3276039663,GB +3276039664,3276039935,FR +3276039936,3276039951,GB +3276039952,3276039967,FR +3276039968,3276040031,GB +3276040032,3276040063,FR +3276040064,3276040095,GB +3276040096,3276040159,FR +3276040160,3276040175,GB +3276040176,3276040207,FR +3276040208,3276040215,GB +3276040216,3276040231,FR +3276040232,3276040319,GB +3276040320,3276040351,FR +3276040352,3276040367,GB +3276040368,3276040439,FR +3276040440,3276040463,GB +3276040464,3276040479,FR +3276040480,3276040495,GB +3276040496,3276040591,FR +3276040592,3276040607,GB +3276040608,3276040639,FR +3276040640,3276040687,GB +3276040688,3276040719,FR +3276040720,3276040735,GB +3276040736,3276040927,FR +3276040928,3276040959,GB +3276040960,3276040991,FR +3276040992,3276041007,GB +3276041008,3276041023,FR +3276041024,3276041055,GB +3276041056,3276041071,FR +3276041072,3276041087,GB +3276041088,3276041199,FR +3276041200,3276041215,GB +3276041216,3276041279,FR +3276041280,3276041311,GB +3276041312,3276041343,FR +3276041344,3276041375,GB +3276041376,3276041391,FR +3276041392,3276041407,GB +3276041408,3276041487,FR +3276041488,3276041535,GB +3276041536,3276041551,FR +3276041552,3276041663,GB +3276041664,3276041759,FR +3276041760,3276041775,GB +3276041776,3276041839,FR +3276041840,3276041887,GB +3276041888,3276041919,FR +3276041920,3276041951,GB +3276041952,3276041967,FR +3276041968,3276041983,GB +3276041984,3276041999,FR +3276042000,3276042007,GB +3276042008,3276042015,FR +3276042016,3276042031,GB +3276042032,3276042111,FR +3276042112,3276042143,GB +3276042144,3276042175,FR +3276042176,3276042239,GB +3276042240,3276042767,FR +3276042768,3276042815,GB +3276042816,3276042831,FR +3276042832,3276042847,GB +3276042848,3276043007,FR +3276043008,3276043263,GB +3276043264,3276044303,FR +3276044304,3276044359,GB +3276044360,3276044447,FR +3276044448,3276044463,GB +3276044464,3276044479,FR +3276044480,3276044495,GB +3276044496,3276044511,FR +3276044512,3276044543,GB +3276044544,3276044607,FR +3276044608,3276044639,GB +3276044640,3276044671,FR +3276044672,3276044703,GB +3276044704,3276044719,FR +3276044720,3276044735,GB +3276044736,3276044815,FR +3276044816,3276044839,GB +3276044840,3276044863,FR +3276044864,3276044879,GB +3276044880,3276044927,FR +3276044928,3276044943,GB +3276044944,3276044967,FR +3276044968,3276044975,GB +3276044976,3276044991,FR +3276044992,3276044999,GB +3276045000,3276045023,FR +3276045024,3276045039,GB +3276045040,3276045055,FR +3276045056,3276045071,GB +3276045072,3276045079,FR +3276045080,3276045095,GB +3276045096,3276045119,FR +3276045120,3276045127,GB +3276045128,3276045143,FR +3276045144,3276045151,GB +3276045152,3276045183,FR +3276045184,3276045199,GB +3276045200,3276045223,FR +3276045224,3276045271,GB +3276045272,3276045287,FR +3276045288,3276045311,GB +3276045312,3276045351,FR +3276045352,3276045359,GB +3276045360,3276045455,FR +3276045456,3276045463,GB +3276045464,3276045567,FR +3276045568,3276045599,GB +3276045600,3276045631,FR +3276045632,3276045647,GB +3276045648,3276045655,FR +3276045656,3276045663,GB +3276045664,3276045767,FR +3276045768,3276045783,GB +3276045784,3276045791,FR +3276045792,3276045807,GB +3276045808,3276045815,FR +3276045816,3276045823,GB +3276045824,3276045919,FR +3276045920,3276045951,GB +3276045952,3276045983,FR +3276045984,3276045991,GB +3276045992,3276046335,FR +3276046336,3276062719,RU +3276062720,3276063231,PL +3276063232,3276063743,FR +3276063744,3276064255,UA +3276064256,3276064767,DE +3276064768,3276065279,BG +3276065280,3276065791,UA +3276065792,3276066303,DE +3276066304,3276066815,GB +3276066816,3276067327,PS +3276067328,3276067839,UA +3276067840,3276068351,AT +3276068352,3276068863,BG +3276068864,3276069887,UA +3276069888,3276070399,GB +3276070400,3276070911,UA +3276070912,3276071423,GB +3276071424,3276071935,PL +3276071936,3276072447,GB +3276072448,3276072959,SK +3276072960,3276073471,PL +3276073472,3276073983,SK +3276073984,3276074495,DE +3276074496,3276075007,GB +3276075008,3276075519,RU +3276075520,3276076031,DE +3276076032,3276076543,GB +3276076544,3276077055,DE +3276077056,3276077567,UA +3276077568,3276078079,FR +3276078080,3276078591,RU +3276078592,3276079103,GB +3276079104,3276095487,NO +3276095488,3276096511,RU +3276096512,3276097535,IT +3276097536,3276098559,NL +3276098560,3276099583,UA +3276099584,3276100607,PL +3276100608,3276101631,UA +3276101632,3276102655,LV +3276102656,3276103679,GB +3276103680,3276104703,SI +3276104704,3276105727,RU +3276105728,3276106751,AT +3276106752,3276107775,BG +3276107776,3276108799,DE +3276108800,3276109823,SE +3276109824,3276110847,BG +3276110848,3276111871,PL +3276111872,3276112895,DK +3276112896,3276114943,UA +3276114944,3276115967,KW +3276115968,3276116991,NL +3276116992,3276118015,RU +3276118016,3276119039,GB +3276119040,3276120063,RU +3276120064,3276121087,GB +3276121088,3276122111,BG +3276122112,3276123135,UA +3276123136,3276124159,AT +3276124160,3276125183,UA +3276125184,3276126207,AT +3276126208,3276127231,UA +3276127232,3276128255,UZ +3276128256,3276129279,AT +3276129280,3276131327,UA +3276131328,3276132351,DK +3276132352,3276133375,TR +3276133376,3276134399,GB +3276134400,3276135423,RU +3276135424,3276136447,UA +3276136448,3276138495,PL +3276138496,3276139519,NL +3276139520,3276140543,IL +3276140544,3276141567,DE +3276141568,3276143615,UA +3276143616,3276144639,GB +3276144640,3276152831,CH +3276152832,3276161023,HU +3276161024,3276169215,GB +3276169216,3276177407,AT +3276177408,3276185599,CZ +3276185600,3276193791,NO +3276193792,3276201983,RU +3276201984,3276210175,AT +3276210176,3276234303,DE +3276234304,3276234367,GB +3276234368,3276235519,DE +3276235520,3276235583,NL +3276235584,3276242871,DE +3276242872,3276242879,NL +3276242880,3276244351,DE +3276244352,3276244367,NL +3276244368,3276244447,DE +3276244448,3276244479,RO +3276244480,3276249279,DE +3276249280,3276249287,FR +3276249288,3276249855,DE +3276249856,3276249983,GB +3276249984,3276250079,DE +3276250080,3276250095,FR +3276250096,3276275711,DE +3276275712,3276283903,SK +3276283904,3276292095,GB +3276292096,3276292479,BE +3276292480,3276292511,LU +3276292512,3276299295,BE +3276299296,3276299327,CH +3276299328,3276300287,BE +3276300288,3276304383,DE +3276304384,3276304639,BG +3276304640,3276305407,GB +3276305408,3276308479,IL +3276308480,3276309503,GB +3276309504,3276310527,AT +3276310528,3276311551,PT +3276311552,3276312575,RU +3276312576,3276313599,UA +3276313600,3276314623,PL +3276314624,3276315647,FR +3276315648,3276316671,UA +3276316672,3276324863,GB +3276324864,3276333055,IT +3276333056,3276341247,RU +3276341248,3276341535,NL +3276341536,3276341543,DE +3276341544,3276343039,NL +3276343040,3276343047,DE +3276343048,3276343071,NL +3276343072,3276343079,DE +3276343080,3276343439,NL +3276343440,3276343447,DE +3276343448,3276343551,NL +3276343552,3276343807,DE +3276343808,3276343871,NL +3276343872,3276343879,DE +3276343880,3276344471,NL +3276344472,3276344479,DE +3276344480,3276345063,NL +3276345064,3276345071,DE +3276345072,3276345775,NL +3276345776,3276345783,DE +3276345784,3276346207,NL +3276346208,3276346215,DE +3276346216,3276346223,NL +3276346224,3276346231,DE +3276346232,3276346359,NL +3276346360,3276346367,DE +3276346368,3276346911,NL +3276346912,3276346919,DE +3276346920,3276347111,NL +3276347112,3276347119,DE +3276347120,3276347959,NL +3276347960,3276347967,DE +3276347968,3276347991,NL +3276347992,3276347999,DE +3276348000,3276348343,NL +3276348344,3276348351,DE +3276348352,3276349063,NL +3276349064,3276349071,DE +3276349072,3276349199,NL +3276349200,3276349207,DE +3276349208,3276349831,NL +3276349832,3276349839,DE +3276349840,3276350031,NL +3276350032,3276350047,DE +3276350048,3276350959,NL +3276350960,3276350967,DE +3276350968,3276351007,NL +3276351008,3276351015,DE +3276351016,3276351119,NL +3276351120,3276351127,DE +3276351128,3276351191,NL +3276351192,3276351199,DE +3276351200,3276351615,NL +3276351616,3276351623,DE +3276351624,3276351703,NL +3276351704,3276351711,DE +3276351712,3276351775,NL +3276351776,3276351783,DE +3276351784,3276351807,NL +3276351808,3276351815,DE +3276351816,3276353343,NL +3276353344,3276353351,DE +3276353352,3276353655,NL +3276353656,3276353663,DE +3276353664,3276353687,NL +3276353688,3276353695,DE +3276353696,3276354183,NL +3276354184,3276354191,DE +3276354192,3276354327,NL +3276354328,3276354335,DE +3276354336,3276354647,NL +3276354648,3276354655,DE +3276354656,3276355263,NL +3276355264,3276355271,DE +3276355272,3276355663,NL +3276355664,3276355671,DE +3276355672,3276356351,NL +3276356352,3276356607,DE +3276356608,3276356799,NL +3276356800,3276356807,DE +3276356808,3276356919,NL +3276356920,3276356927,DE +3276356928,3276357447,NL +3276357448,3276357455,DE +3276357456,3276358279,NL +3276358280,3276358287,DE +3276358288,3276358471,NL +3276358472,3276358479,DE +3276358480,3276358751,NL +3276358752,3276358759,DE +3276358760,3276358927,NL +3276358928,3276358935,DE +3276358936,3276358943,NL +3276358944,3276358951,DE +3276358952,3276359383,NL +3276359384,3276359391,DE +3276359392,3276360007,NL +3276360008,3276360015,DE +3276360016,3276360495,NL +3276360496,3276360503,DE +3276360504,3276360687,NL +3276360688,3276360695,DE +3276360696,3276360855,NL +3276360856,3276360863,DE +3276360864,3276362759,NL +3276362760,3276362767,DE +3276362768,3276362791,NL +3276362792,3276362799,DE +3276362800,3276363335,NL +3276363336,3276363343,DE +3276363344,3276363375,NL +3276363376,3276363383,DE +3276363384,3276363583,NL +3276363584,3276363591,DE +3276363592,3276363647,NL +3276363648,3276363655,DE +3276363656,3276363671,NL +3276363672,3276363679,DE +3276363680,3276363959,NL +3276363960,3276363967,DE +3276363968,3276364183,NL +3276364184,3276364191,DE +3276364192,3276364639,NL +3276364640,3276364647,DE +3276364648,3276364991,NL +3276364992,3276365007,DE +3276365008,3276365383,NL +3276365384,3276365391,DE +3276365392,3276365543,NL +3276365544,3276365551,DE +3276365552,3276365999,NL +3276366000,3276366007,DE +3276366008,3276366119,NL +3276366120,3276366127,DE +3276366128,3276366327,NL +3276366328,3276366335,DE +3276366336,3276366679,NL +3276366680,3276366687,DE +3276366688,3276367079,NL +3276367080,3276367087,DE +3276367088,3276367119,NL +3276367120,3276367127,DE +3276367128,3276367159,NL +3276367160,3276367175,DE +3276367176,3276369167,NL +3276369168,3276369183,DE +3276369184,3276369527,NL +3276369528,3276369535,DE +3276369536,3276369599,NL +3276369600,3276369607,DE +3276369608,3276369623,NL +3276369624,3276369631,DE +3276369632,3276369639,NL +3276369640,3276369647,DE +3276369648,3276369871,NL +3276369872,3276369879,DE +3276369880,3276371327,NL +3276371328,3276371335,DE +3276371336,3276371431,NL +3276371432,3276371439,DE +3276371440,3276373015,NL +3276373016,3276373023,DE +3276373024,3276373119,NL +3276373120,3276373127,DE +3276373128,3276373447,NL +3276373448,3276373455,DE +3276373456,3276373911,NL +3276373912,3276373919,DE +3276373920,3276374143,NL +3276374144,3276374151,DE +3276374152,3276374399,NL +3276374400,3276374407,DE +3276374408,3276374703,NL +3276374704,3276374711,DE +3276374712,3276375343,NL +3276375344,3276375351,DE +3276375352,3276375887,NL +3276375888,3276375895,DE +3276375896,3276376095,NL +3276376096,3276376103,DE +3276376104,3276376871,NL +3276376872,3276376879,DE +3276376880,3276377447,NL +3276377448,3276377455,DE +3276377456,3276378231,NL +3276378232,3276378239,DE +3276378240,3276378351,NL +3276378352,3276378359,DE +3276378360,3276378575,NL +3276378576,3276378583,DE +3276378584,3276379279,NL +3276379280,3276379287,DE +3276379288,3276379463,NL +3276379464,3276379471,DE +3276379472,3276379503,NL +3276379504,3276379511,DE +3276379512,3276379767,NL +3276379768,3276379775,DE +3276379776,3276380471,NL +3276380472,3276380479,DE +3276380480,3276381423,NL +3276381424,3276381431,DE +3276381432,3276381607,NL +3276381608,3276381615,DE +3276381616,3276381895,NL +3276381896,3276381903,DE +3276381904,3276382863,NL +3276382864,3276382871,DE +3276382872,3276383527,NL +3276383528,3276383535,DE +3276383536,3276383783,NL +3276383784,3276383791,DE +3276383792,3276384367,NL +3276384368,3276384375,DE +3276384376,3276384647,NL +3276384648,3276384655,DE +3276384656,3276384895,NL +3276384896,3276384903,DE +3276384904,3276385111,NL +3276385112,3276385119,DE +3276385120,3276385175,NL +3276385176,3276385183,DE +3276385184,3276385215,NL +3276385216,3276385223,DE +3276385224,3276385391,NL +3276385392,3276385399,DE +3276385400,3276385919,NL +3276385920,3276385927,DE +3276385928,3276385935,NL +3276385936,3276385943,DE +3276385944,3276386087,NL +3276386088,3276386095,DE +3276386096,3276386199,NL +3276386200,3276386207,DE +3276386208,3276386559,NL +3276386560,3276386567,DE +3276386568,3276386727,NL +3276386728,3276386735,DE +3276386736,3276386743,NL +3276386744,3276386751,DE +3276386752,3276386847,NL +3276386848,3276386855,DE +3276386856,3276386863,NL +3276386864,3276386871,DE +3276386872,3276386879,NL +3276386880,3276386887,DE +3276386888,3276386927,NL +3276386928,3276386935,DE +3276386936,3276386975,NL +3276386976,3276386983,DE +3276386984,3276387071,NL +3276387072,3276387079,DE +3276387080,3276387199,NL +3276387200,3276387207,DE +3276387208,3276387231,NL +3276387232,3276387239,DE +3276387240,3276387423,NL +3276387424,3276387431,DE +3276387432,3276387471,NL +3276387472,3276387479,DE +3276387480,3276387559,NL +3276387560,3276387567,DE +3276387568,3276387575,NL +3276387576,3276387591,DE +3276387592,3276387607,NL +3276387608,3276387615,DE +3276387616,3276387919,NL +3276387920,3276387927,DE +3276387928,3276388191,NL +3276388192,3276388199,DE +3276388200,3276388279,NL +3276388280,3276388287,DE +3276388288,3276388303,NL +3276388304,3276388311,DE +3276388312,3276388319,NL +3276388320,3276388327,DE +3276388328,3276388823,NL +3276388824,3276388831,DE +3276388832,3276389055,NL +3276389056,3276389063,DE +3276389064,3276389159,NL +3276389160,3276389167,DE +3276389168,3276389351,NL +3276389352,3276389359,DE +3276389360,3276389407,NL +3276389408,3276389415,DE +3276389416,3276389447,NL +3276389448,3276389455,DE +3276389456,3276389575,NL +3276389576,3276389591,DE +3276389592,3276389799,NL +3276389800,3276389807,DE +3276389808,3276389887,NL +3276389888,3276389895,DE +3276389896,3276389951,NL +3276389952,3276389959,DE +3276389960,3276390407,NL +3276390408,3276390423,DE +3276390424,3276390463,NL +3276390464,3276390471,DE +3276390472,3276390687,NL +3276390688,3276390695,DE +3276390696,3276390727,NL +3276390728,3276390735,DE +3276390736,3276390807,NL +3276390808,3276390815,DE +3276390816,3276390983,NL +3276390984,3276390991,DE +3276390992,3276391023,NL +3276391024,3276391031,DE +3276391032,3276391111,NL +3276391112,3276391119,DE +3276391120,3276391191,NL +3276391192,3276391199,DE +3276391200,3276391343,NL +3276391344,3276391351,DE +3276391352,3276391495,NL +3276391496,3276391503,DE +3276391504,3276391535,NL +3276391536,3276391543,DE +3276391544,3276391591,NL +3276391592,3276391599,DE +3276391600,3276391791,NL +3276391792,3276391799,DE +3276391800,3276392079,NL +3276392080,3276392087,DE +3276392088,3276392143,NL +3276392144,3276392151,DE +3276392152,3276392255,NL +3276392256,3276392263,DE +3276392264,3276392903,NL +3276392904,3276392911,DE +3276392912,3276392991,NL +3276392992,3276392999,DE +3276393000,3276393159,NL +3276393160,3276393167,DE +3276393168,3276393447,NL +3276393448,3276393455,DE +3276393456,3276393783,NL +3276393784,3276393791,DE +3276393792,3276393807,NL +3276393808,3276393815,DE +3276393816,3276393903,NL +3276393904,3276393911,DE +3276393912,3276394015,NL +3276394016,3276394023,DE +3276394024,3276394063,NL +3276394064,3276394071,DE +3276394072,3276394471,NL +3276394472,3276394487,DE +3276394488,3276394495,NL +3276394496,3276394503,DE +3276394504,3276394583,NL +3276394584,3276394591,DE +3276394592,3276394815,NL +3276394816,3276394823,DE +3276394824,3276394871,NL +3276394872,3276394879,DE +3276394880,3276394951,NL +3276394952,3276394959,DE +3276394960,3276395063,NL +3276395064,3276395071,DE +3276395072,3276395095,NL +3276395096,3276395103,DE +3276395104,3276395295,NL +3276395296,3276395303,DE +3276395304,3276395319,NL +3276395320,3276395327,DE +3276395328,3276395543,NL +3276395544,3276395551,DE +3276395552,3276395599,NL +3276395600,3276395607,DE +3276395608,3276395647,NL +3276395648,3276395655,DE +3276395656,3276395759,NL +3276395760,3276395767,DE +3276395768,3276395967,NL +3276395968,3276395975,DE +3276395976,3276396207,NL +3276396208,3276396215,DE +3276396216,3276396407,NL +3276396408,3276396415,DE +3276396416,3276396471,NL +3276396472,3276396479,DE +3276396480,3276396583,NL +3276396584,3276396591,DE +3276396592,3276396615,NL +3276396616,3276396623,DE +3276396624,3276396655,NL +3276396656,3276396663,DE +3276396664,3276396719,NL +3276396720,3276396735,DE +3276396736,3276396759,NL +3276396760,3276396767,DE +3276396768,3276396783,NL +3276396784,3276396791,DE +3276396792,3276396999,NL +3276397000,3276397007,DE +3276397008,3276397031,NL +3276397032,3276397039,DE +3276397040,3276397055,NL +3276397056,3276397063,DE +3276397064,3276397327,NL +3276397328,3276397335,DE +3276397336,3276397871,NL +3276397872,3276397879,DE +3276397880,3276398071,NL +3276398072,3276398079,DE +3276398080,3276398575,NL +3276398576,3276398583,DE +3276398584,3276398591,NL +3276398592,3276398599,DE +3276398600,3276398623,NL +3276398624,3276398631,DE +3276398632,3276398679,NL +3276398680,3276398687,DE +3276398688,3276398783,NL +3276398784,3276398791,DE +3276398792,3276398839,NL +3276398840,3276398855,DE +3276398856,3276398927,NL +3276398928,3276398935,DE +3276398936,3276398983,NL +3276398984,3276398991,DE +3276398992,3276399031,NL +3276399032,3276399039,DE +3276399040,3276399079,NL +3276399080,3276399087,DE +3276399088,3276399191,NL +3276399192,3276399199,DE +3276399200,3276399527,NL +3276399528,3276399535,DE +3276399536,3276399583,NL +3276399584,3276399591,DE +3276399592,3276399815,NL +3276399816,3276399823,DE +3276399824,3276399895,NL +3276399896,3276399903,DE +3276399904,3276399983,NL +3276399984,3276399991,DE +3276399992,3276400223,NL +3276400224,3276400231,DE +3276400232,3276400295,NL +3276400296,3276400303,DE +3276400304,3276400487,NL +3276400488,3276400495,DE +3276400496,3276400511,NL +3276400512,3276400519,DE +3276400520,3276400527,NL +3276400528,3276400535,DE +3276400536,3276400895,NL +3276400896,3276400903,DE +3276400904,3276401023,NL +3276401024,3276401031,DE +3276401032,3276401167,NL +3276401168,3276401175,DE +3276401176,3276401215,NL +3276401216,3276401223,DE +3276401224,3276401535,NL +3276401536,3276401543,DE +3276401544,3276401583,NL +3276401584,3276401591,DE +3276401592,3276401751,NL +3276401752,3276401759,DE +3276401760,3276401855,NL +3276401856,3276401863,DE +3276401864,3276401919,NL +3276401920,3276401927,DE +3276401928,3276401943,NL +3276401944,3276401951,DE +3276401952,3276401991,NL +3276401992,3276402007,DE +3276402008,3276402055,NL +3276402056,3276402063,DE +3276402064,3276402503,NL +3276402504,3276402511,DE +3276402512,3276402519,NL +3276402520,3276402527,DE +3276402528,3276402639,NL +3276402640,3276402647,DE +3276402648,3276402759,NL +3276402760,3276402767,DE +3276402768,3276402975,NL +3276402976,3276402983,DE +3276402984,3276403239,NL +3276403240,3276403247,DE +3276403248,3276403287,NL +3276403288,3276403295,DE +3276403296,3276403367,NL +3276403368,3276403375,DE +3276403376,3276403399,NL +3276403400,3276403407,DE +3276403408,3276403479,NL +3276403480,3276403487,DE +3276403488,3276403575,NL +3276403576,3276403583,DE +3276403584,3276403679,NL +3276403680,3276403687,DE +3276403688,3276403839,NL +3276403840,3276403847,DE +3276403848,3276404399,NL +3276404400,3276404407,DE +3276404408,3276404719,NL +3276404720,3276404727,DE +3276404728,3276405679,NL +3276405680,3276405687,DE +3276405688,3276405719,NL +3276405720,3276405727,DE +3276405728,3276406375,NL +3276406376,3276406383,DE +3276406384,3276406759,NL +3276406760,3276406767,DE +3276406768,3276406783,NL +3276406784,3276414975,FI +3276414976,3276415999,DK +3276416000,3276417023,SE +3276417024,3276419071,DE +3276419072,3276420095,PL +3276420096,3276421119,GB +3276421120,3276422143,PL +3276422144,3276422655,GB +3276422656,3276423167,RU +3276423168,3276423423,PL +3276423424,3276423679,NL +3276423680,3276423935,SE +3276423936,3276424191,UA +3276424192,3276424447,GB +3276424448,3276424703,PL +3276424704,3276424959,DE +3276424960,3276425215,RO +3276425216,3276425471,UA +3276425472,3276425727,DE +3276425728,3276425983,RU +3276425984,3276426239,IT +3276426240,3276426751,DK +3276426752,3276427007,RO +3276427008,3276427263,PL +3276427264,3276427519,FR +3276427520,3276427775,IT +3276427776,3276428031,RU +3276428032,3276428287,GB +3276428288,3276428543,RU +3276428544,3276428799,BG +3276428800,3276429055,DE +3276429312,3276430079,RU +3276430080,3276430591,PL +3276430592,3276430847,GB +3276430848,3276431103,DE +3276431104,3276431359,RU +3276431360,3276447743,GB +3276447744,3276451583,DE +3276455936,3276464127,BE +3276464128,3276472319,GR +3276472576,3276472831,AT +3276472864,3276472895,AT +3276473104,3276473111,AT +3276473120,3276473135,AT +3276473144,3276473199,AT +3276473216,3276473279,AT +3276473296,3276473311,AT +3276473344,3276473855,AT +3276474272,3276474295,AT +3276474320,3276474367,AT +3276475008,3276475023,IT +3276475040,3276475063,IT +3276475072,3276475135,IT +3276475904,3276475951,IT +3276475984,3276476055,IT +3276476064,3276476071,IT +3276476080,3276476095,IT +3276476112,3276476119,GB +3276476120,3276476159,IT +3276476160,3276476287,GB +3276476416,3276476671,CH +3276477440,3276477967,CH +3276477976,3276477983,CH +3276478304,3276478311,CH +3276478320,3276478335,CH +3276478464,3276478855,FR +3276478864,3276479127,FR +3276479136,3276479167,FR +3276479200,3276479215,FR +3276479224,3276479343,FR +3276479344,3276479351,GB +3276479352,3276479615,FR +3276479648,3276479743,FR +3276480016,3276480031,FR +3276480064,3276480095,FR +3276480112,3276480127,FR +3276480144,3276480159,FR +3276480176,3276480271,FR +3276480304,3276480319,FR +3276480352,3276480375,FR +3276480400,3276480439,FR +3276480448,3276480479,FR +3276480512,3276480767,RU +3276481024,3276481535,RU +3276482560,3276482815,GR +3276483072,3276483359,GR +3276483392,3276483519,GR +3276483584,3276483711,GR +3276483840,3276484351,GR +3276484384,3276484479,GR +3276484608,3276484863,SK +3276485632,3276486655,GB +3276486912,3276487167,GR +3276488960,3276489215,CZ +3276490752,3276491263,NL +3276491264,3276491327,CZ +3276491392,3276491775,CZ +3276491776,3276491847,GB +3276491856,3276492055,GB +3276492064,3276492127,GB +3276492288,3276492431,GB +3276492440,3276492479,GB +3276492488,3276493183,GB +3276493248,3276494383,GB +3276494416,3276494559,GB +3276494592,3276495679,GB +3276495776,3276495823,GB +3276495832,3276496639,GB +3276496896,3276497151,DE +3276497216,3276497295,DE +3276497304,3276497311,DE +3276497344,3276497375,DE +3276497408,3276497599,DE +3276497616,3276497919,DE +3276497920,3276498047,GB +3276498304,3276498319,GB +3276498328,3276498431,GB +3276498432,3276499199,DE +3276499456,3276499503,DE +3276499520,3276499615,DE +3276499680,3276499695,DE +3276499712,3276499759,DE +3276499776,3276499791,DE +3276499800,3276499815,DE +3276499936,3276499999,DE +3276500000,3276500031,CH +3276500032,3276500095,DE +3276500128,3276500159,DE +3276500480,3276500735,DE +3276500992,3276501023,DE +3276501024,3276501055,FR +3276501120,3276501167,DE +3276501248,3276501503,DE +3276502272,3276505087,DE +3276505088,3276505599,ZA +3276505856,3276505919,ZA +3276505984,3276506063,ZA +3276506072,3276506079,ZA +3276506096,3276506159,ZA +3276506176,3276506191,ZA +3276506208,3276506367,ZA +3276506624,3276507135,ZA +3276507136,3276507231,CH +3276507392,3276507647,CH +3276508160,3276508327,GB +3276508352,3276508415,FR +3276508416,3276508671,GB +3276508680,3276509183,GB +3276509184,3276510207,IT +3276510720,3276510735,IT +3276510784,3276510815,IT +3276510848,3276510911,GB +3276511488,3276511775,ZA +3276511824,3276511839,ZA +3276511872,3276511919,ZA +3276511928,3276511951,ZA +3276511968,3276512191,ZA +3276512200,3276512207,ZA +3276512256,3276513023,ZA +3276513536,3276513567,CH +3276514336,3276514367,CH +3276514560,3276514815,CH +3276515328,3276515583,ES +3276517376,3276517503,NL +3276517632,3276517647,NL +3276517656,3276517759,NL +3276517792,3276517823,NL +3276517832,3276517887,NL +3276517904,3276517951,NL +3276518016,3276518023,NL +3276518056,3276518063,NL +3276518096,3276518111,NL +3276518128,3276518175,NL +3276518184,3276518271,NL +3276518304,3276518335,NL +3276518352,3276518367,NL +3276518400,3276518527,BE +3276518592,3276518655,BE +3276518912,3276519423,BE +3276519424,3276520191,DK +3276520192,3276520223,BE +3276520224,3276520255,GB +3276520256,3276520415,BE +3276520432,3276520447,BE +3276520464,3276520591,SE +3276520608,3276520623,SE +3276520640,3276520727,SE +3276520784,3276520815,SE +3276520832,3276520927,SE +3276520944,3276521215,SE +3276521984,3276523519,NL +3276523776,3276523911,NO +3276523928,3276523951,NO +3276523968,3276524031,NO +3276524064,3276524095,TR +3276524160,3276524279,TR +3276524544,3276524799,GB +3276524800,3276524823,PT +3276524832,3276524847,PT +3276525024,3276525039,PT +3276525056,3276525311,FI +3276525504,3276525527,HR +3276525528,3276525535,PL +3276525536,3276525567,HR +3276526080,3276526095,CH +3276526104,3276526111,CH +3276526144,3276526175,CH +3276526336,3276526591,CH +3276527104,3276527135,SI +3276527168,3276527199,SI +3276527216,3276527231,SI +3276527360,3276527615,SI +3276527616,3276527743,PK +3276527872,3276527999,PK +3276528128,3276528223,BE +3276528224,3276528239,GB +3276528240,3276528247,BE +3276528256,3276528351,BE +3276528368,3276528399,BE +3276528448,3276528503,BE +3276528520,3276528527,GB +3276528544,3276528567,BE +3276528576,3276528719,BE +3276528720,3276528727,FR +3276528728,3276528799,BE +3276528816,3276528831,FR +3276528832,3276528895,BE +3276528896,3276528903,IE +3276528912,3276528927,IE +3276528936,3276528943,IE +3276528960,3276529151,IE +3276529152,3276529167,TR +3276529184,3276529279,TR +3276529328,3276529375,TR +3276529392,3276529407,TR +3276529664,3276530495,NL +3276530560,3276532735,NL +3276532736,3276532775,TR +3276532784,3276532791,TR +3276532856,3276532991,TR +3276532992,3276533023,HU +3276533072,3276533087,HU +3276533104,3276533183,HU +3276533248,3276533375,TR +3276533760,3276533775,IE +3276533776,3276533791,GB +3276533824,3276533887,IE +3276533920,3276534015,IE +3276534016,3276534271,NL +3276534400,3276534415,GB +3276534416,3276534431,NL +3276534432,3276534463,GB +3276534464,3276534495,FR +3276534512,3276534527,NL +3276534544,3276534591,NL +3276534624,3276534671,NL +3276534688,3276534719,NL +3276534784,3276534879,NL +3276534888,3276534895,NL +3276534928,3276534975,NL +3276535040,3276535063,RU +3276535064,3276535071,LV +3276535072,3276535103,RU +3276535296,3276535319,FI +3276535336,3276535359,FI +3276535376,3276535423,FI +3276535552,3276535807,PK +3276535808,3276536063,FI +3276536320,3276536415,ES +3276536448,3276536511,ES +3276536584,3276536591,HR +3276536640,3276536671,HU +3276536688,3276536711,HU +3276536736,3276536743,HU +3276536864,3276536895,ES +3276536968,3276536991,ES +3276537152,3276537215,AT +3276537344,3276537599,AT +3276537600,3276537663,GR +3276537856,3276668927,ES +3276668928,3276677119,MC +3276677120,3276678143,HR +3276678144,3276678655,SE +3276678656,3276679167,UA +3276679168,3276679679,DE +3276679680,3276680191,RO +3276680192,3276680703,SK +3276680704,3276681215,AT +3276681216,3276681727,PL +3276681728,3276682239,BE +3276682240,3276682751,AT +3276682752,3276683263,GB +3276683264,3276684799,UA +3276684800,3276685311,DE +3276685312,3276685823,RO +3276685824,3276686335,PL +3276686336,3276686847,UA +3276686848,3276687359,FI +3276687360,3276687871,RU +3276687872,3276688383,KW +3276688384,3276688895,DE +3276688896,3276689407,ES +3276689408,3276690431,GB +3276690432,3276690943,NL +3276690944,3276691455,GR +3276691456,3276691967,RO +3276691968,3276692479,RU +3276692480,3276692991,UA +3276692992,3276693503,GB +3276701696,3276709887,SE +3276709888,3276718079,DE +3276718080,3276726271,IT +3276726272,3276727295,DE +3276727296,3276728319,ES +3276728320,3276729343,UA +3276729344,3276730367,PL +3276730368,3276731391,DE +3276731392,3276732415,UA +3276732416,3276733439,DE +3276733440,3276734463,UA +3276734464,3276734735,AT +3276734736,3276734751,DK +3276734752,3276734815,AT +3276734816,3276734847,DE +3276734880,3276734895,GB +3276734896,3276734911,NL +3276734912,3276734943,FR +3276734944,3276735455,AT +3276735456,3276735487,NL +3276735488,3276735871,AT +3276735936,3276735999,ES +3276736000,3276736511,AT +3276736512,3276736575,IT +3276736576,3276736735,GB +3276736768,3276736799,IT +3276736800,3276736815,DE +3276736816,3276736831,CZ +3276736832,3276736863,NL +3276736864,3276736871,DE +3276736872,3276736879,NL +3276736880,3276736959,DK +3276736960,3276736991,CH +3276736992,3276737015,GB +3276737016,3276737023,BE +3276737024,3276737343,IT +3276737344,3276737407,DE +3276737408,3276737535,ES +3276737536,3276737615,IT +3276737616,3276737631,DE +3276737632,3276737791,RU +3276737792,3276737935,NL +3276737936,3276737943,DE +3276737944,3276737991,GB +3276737992,3276737999,IT +3276738000,3276738015,GB +3276738016,3276738047,BE +3276738048,3276738079,GB +3276738080,3276738111,ES +3276738112,3276738143,GB +3276738144,3276738175,IT +3276738176,3276738559,GB +3276738560,3276738847,CH +3276739072,3276739151,CH +3276739168,3276740127,CH +3276740128,3276740167,GB +3276740168,3276740175,DE +3276740176,3276740191,NL +3276740224,3276740351,CH +3276740352,3276740703,FR +3276740704,3276740719,IT +3276740720,3276740735,CZ +3276740736,3276740799,PT +3276740800,3276740815,SI +3276740816,3276740831,SK +3276740832,3276740863,DE +3276740864,3276741375,FR +3276741632,3276742655,FR +3276742656,3276742735,RU +3276742736,3276742751,NL +3276742752,3276742783,GR +3276742784,3276742911,HU +3276742912,3276743071,AT +3276743072,3276743103,DE +3276743104,3276743135,HU +3276743136,3276743167,NL +3276743424,3276743903,AT +3276743904,3276743935,BE +3276743936,3276744191,AT +3276744192,3276744703,BE +3276744704,3276744959,IT +3276744960,3276745215,GR +3276745216,3276745295,DK +3276745296,3276745311,NL +3276745312,3276745343,DK +3276745344,3276745407,DE +3276745408,3276745655,DK +3276745664,3276745727,DK +3276745728,3276746047,GB +3276746048,3276746111,DE +3276746112,3276746239,IT +3276746240,3276746335,GB +3276746336,3276746351,BE +3276746352,3276746367,NL +3276746368,3276746751,GB +3276746752,3276748287,CH +3276748288,3276748799,GB +3276748800,3276748951,AT +3276748952,3276748959,GB +3276748960,3276749023,AT +3276749024,3276749055,IT +3276749056,3276749087,AT +3276749088,3276749103,FR +3276749120,3276749183,NL +3276749184,3276749311,DE +3276749312,3276749343,BE +3276749344,3276749375,DE +3276749376,3276749823,BE +3276749824,3276750151,NL +3276750152,3276750159,GB +3276750160,3276750175,FR +3276750176,3276750207,BE +3276750208,3276750335,FR +3276750336,3276750431,GB +3276750464,3276751039,GB +3276751040,3276751071,FR +3276751072,3276751087,GB +3276751088,3276751103,NL +3276751104,3276751175,GB +3276751176,3276751199,SE +3276751232,3276751295,IL +3276751296,3276751359,AT +3276751360,3276753055,GB +3276753056,3276753071,NO +3276753072,3276753119,GB +3276753120,3276753151,IT +3276753152,3276753375,GB +3276753376,3276753407,FI +3276753408,3276753951,GB +3276753952,3276753983,HU +3276753984,3276754991,GB +3276754992,3276755007,DE +3276755008,3276755071,HU +3276755072,3276755199,DE +3276755200,3276755775,GB +3276755776,3276755791,NO +3276755792,3276755807,RU +3276755808,3276755839,GB +3276755840,3276755967,ES +3276755968,3276756031,GB +3276756032,3276756063,NL +3276756064,3276756095,BE +3276756096,3276756287,GB +3276756288,3276756319,SE +3276756320,3276756351,FR +3276756352,3276756671,GB +3276756672,3276756735,DE +3276756736,3276757119,GB +3276757120,3276757135,NO +3276757136,3276757151,NL +3276757152,3276757183,GB +3276757248,3276757503,GB +3276757760,3276757823,GB +3276757824,3276757839,DE +3276757840,3276757855,ES +3276757856,3276757887,CH +3276757888,3276759039,GB +3276759040,3276759695,DE +3276759696,3276759711,NL +3276759712,3276759743,DE +3276759744,3276759775,CH +3276759808,3276761215,DE +3276761216,3276761279,ES +3276761280,3276761919,DE +3276761920,3276761983,GB +3276761984,3276762015,DK +3276762016,3276762111,FR +3276762112,3276762623,DE +3276762880,3276762943,DE +3276762944,3276762959,GB +3276762960,3276762975,IT +3276762976,3276763007,NO +3276763008,3276763327,DE +3276763328,3276763391,SE +3276763392,3276763519,DE +3276763520,3276763551,IT +3276763552,3276763567,CH +3276763568,3276763583,GR +3276763584,3276763647,GB +3276763648,3276763967,DE +3276763968,3276763983,DK +3276763984,3276763991,GB +3276763992,3276763999,BE +3276764000,3276764031,IT +3276764160,3276765183,DE +3276765184,3276766975,GB +3276766976,3276766983,FR +3276766992,3276767015,FR +3276767016,3276767023,DK +3276767024,3276767039,BE +3276767040,3276767079,FR +3276767080,3276767087,GB +3276767088,3276767103,NL +3276767104,3276767231,FR +3276767232,3276767743,ZA +3276767744,3276767807,NL +3276767808,3276767871,DK +3276767872,3276767935,NL +3276767936,3276767967,FR +3276767968,3276767999,AT +3276768000,3276768511,NL +3276768512,3276768767,DE +3276768768,3276768863,ES +3276768864,3276768895,AT +3276768896,3276769023,HU +3276769024,3276769279,DE +3276769280,3276769295,ES +3276769296,3276769311,DE +3276769312,3276769343,CH +3276769344,3276769407,NL +3276769408,3276769919,ES +3276769984,3276770015,AT +3276770016,3276770031,IT +3276770032,3276770047,CH +3276770048,3276770143,ES +3276770144,3276770175,FI +3276770176,3276770239,ES +3276770240,3276770303,DK +3276770304,3276770815,ES +3276770944,3276771135,ES +3276771200,3276771327,ES +3276771328,3276771455,NL +3276771456,3276771583,GB +3276771584,3276772287,NL +3276772288,3276772351,AT +3276772352,3276772567,BE +3276772576,3276773375,BE +3276773376,3276774047,DK +3276774048,3276774079,FI +3276774080,3276774095,DK +3276774112,3276774143,IE +3276774144,3276774271,DK +3276774272,3276774303,DE +3276774304,3276774335,FR +3276774336,3276774399,GB +3276774400,3276774543,SE +3276774544,3276774559,GB +3276774560,3276774591,DE +3276774592,3276774655,CH +3276774656,3276775103,SE +3276775104,3276775167,NL +3276775168,3276775295,SE +3276775296,3276775359,FR +3276775360,3276775391,DK +3276775392,3276775423,DE +3276775424,3276781151,NL +3276781152,3276781247,FR +3276781248,3276781311,BE +3276781312,3276781503,NL +3276781504,3276781567,FR +3276781568,3276782719,BE +3276782784,3276782799,FR +3276782800,3276782815,CZ +3276782816,3276782847,ES +3276782848,3276782975,BE +3276782976,3276783039,GR +3276783040,3276783055,DK +3276783056,3276783071,GB +3276783072,3276783087,PT +3276783088,3276783103,CH +3276783104,3276783615,IT +3276783616,3276784383,FR +3276784640,3276784895,FR +3276784896,3276785151,NO +3276785152,3276785407,IE +3276785408,3276785439,PT +3276785440,3276785455,GR +3276785456,3276785463,GB +3276785464,3276785471,IE +3276785472,3276785535,PT +3276785536,3276785567,BE +3276785568,3276785599,PT +3276785600,3276785607,TR +3276785608,3276785615,PL +3276785616,3276785631,CZ +3276785632,3276785663,IT +3276785664,3276785791,IL +3276785792,3276785823,NL +3276785856,3276785919,GB +3276785920,3276786175,AT +3276786176,3276786431,NO +3276786688,3276786815,HU +3276786816,3276786879,SE +3276786880,3276786911,TR +3276786912,3276786943,BE +3276786944,3276787359,AT +3276787360,3276787391,DE +3276787392,3276787455,BE +3276787456,3276787775,FR +3276787968,3276788735,FR +3276788736,3276788863,IE +3276788864,3276788895,DE +3276788928,3276788991,NL +3276788992,3276789247,NO +3276789248,3276789439,FI +3276789504,3276789567,FR +3276789568,3276789583,ES +3276789584,3276789599,FR +3276789600,3276789615,ES +3276789616,3276789631,NL +3276789632,3276789759,FR +3276789760,3276790015,IT +3276790016,3276790111,ES +3276790112,3276790127,FR +3276790128,3276790143,NL +3276790144,3276790175,IT +3276790176,3276790199,NL +3276790200,3276790207,DE +3276790208,3276790223,NL +3276790224,3276790271,GB +3276790272,3276790527,IE +3276790528,3276790783,HU +3276790784,3276790943,PK +3276790944,3276791007,IT +3276791008,3276791039,NL +3276791040,3276791295,GB +3276791296,3276791327,PT +3276791552,3276792831,GB +3276792832,3276793087,FR +3276793088,3276793279,GB +3276793280,3276793343,IE +3276793344,3276793735,FR +3276793736,3276793743,NL +3276793744,3276793751,BE +3276793752,3276793759,FR +3276793760,3276793791,PL +3276793792,3276793855,FR +3276794112,3276794255,NL +3276794256,3276794271,DE +3276794304,3276794335,DK +3276794336,3276794367,NL +3276794368,3276795903,BE +3276795904,3276797951,AT +3276799104,3276799231,GB +3276799296,3276799359,GB +3276799360,3276799391,NL +3276799392,3276799455,AT +3276799456,3276799471,PL +3276799472,3276799487,NL +3276799488,3276799743,DE +3276799744,3276799775,NL +3276799776,3276799807,GB +3276799808,3276799839,FR +3276799840,3276799871,ES +3276799872,3276799999,NL +3276800000,3276824575,GB +3276824576,3276832767,EE +3276832768,3276840959,FR +3276840960,3276849151,SK +3276849152,3276857343,DE +3276857344,3276857599,RU +3276857600,3276857855,SI +3276857856,3276858111,NL +3276858112,3276858367,KW +3276858368,3276858623,RU +3276858624,3276858879,PL +3276858880,3276859135,DE +3276859136,3276859647,UA +3276859648,3276859903,CH +3276859904,3276860159,AT +3276860160,3276860415,CH +3276860416,3276860927,PL +3276860928,3276861183,BE +3276861184,3276861439,DE +3276861440,3276865535,DK +3276865536,3276866559,NL +3276866560,3276866815,IT +3276866816,3276867071,DE +3276867072,3276868606,IT +3276868607,3276868607,GB +3276868608,3276868863,NL +3276868864,3276869631,IT +3276869632,3276869759,GB +3276869760,3276869855,IT +3276869856,3276869887,GB +3276869888,3276870143,NL +3276870144,3276871679,IT +3276871680,3276871935,DE +3276871936,3276872447,GB +3276872448,3276872463,DE +3276872464,3276873727,GB +3276873728,3276873735,ES +3276873736,3276873791,GB +3276873792,3276873983,ES +3276873984,3276875263,GB +3276875264,3276875775,NL +3276875776,3276876799,GB +3276876800,3276876823,AT +3276876824,3276877303,GB +3276877304,3276877311,AT +3276877312,3276877535,GB +3276877536,3276877551,AT +3276877552,3276877559,GB +3276877560,3276877567,AT +3276877568,3276877815,GB +3276877816,3276877823,AT +3276877824,3276877831,BG +3276877832,3276878079,GB +3276878080,3276878335,BG +3276878336,3276879871,GB +3276879872,3276880639,DK +3276880640,3276883967,GB +3276883968,3276884231,PL +3276884232,3276886015,GB +3276886016,3276886271,RO +3276886272,3276888575,GB +3276888576,3276888831,AT +3276888832,3276889087,GB +3276889088,3276890111,AT +3276890112,3276890135,US +3276890136,3276890143,GB +3276890144,3276890175,US +3276890176,3276890367,GB +3276890368,3276890623,US +3276890624,3276891903,GB +3276891904,3276892159,US +3276892160,3276895999,GB +3276896000,3276896255,CZ +3276896256,3276896831,BE +3276896832,3276896847,SE +3276896848,3276897023,GB +3276897024,3276897279,BE +3276897280,3276898303,GB +3276898304,3276898671,CH +3276898672,3276898815,GB +3276898816,3276899847,CH +3276899848,3276902399,GB +3276902400,3276902559,SE +3276902560,3276902655,GB +3276902656,3276903295,SE +3276903296,3276906495,GB +3276906496,3276906511,NL +3276906512,3276906519,GB +3276906520,3276906847,NL +3276906848,3276907007,GB +3276907008,3276907263,NL +3276907264,3276910591,GB +3276910592,3276910847,IT +3276910848,3276910879,GB +3276910880,3276911103,IT +3276911104,3276911359,GB +3276911360,3276913919,IT +3276913920,3276913983,US +3276913984,3276914687,IT +3276914688,3276914943,ES +3276914944,3276915199,GB +3276915200,3276915455,ES +3276915456,3276915487,GB +3276915488,3276916175,ES +3276916176,3276916183,GB +3276916184,3276916479,ES +3276916480,3276916735,GB +3276916736,3276917183,ES +3276917184,3276917215,SE +3276917216,3276917231,ES +3276917232,3276917247,GB +3276917248,3276917279,ES +3276917280,3276917287,GB +3276917288,3276917343,ES +3276917344,3276917503,GB +3276917504,3276917759,ES +3276917760,3276918783,GB +3276918784,3276919471,DE +3276919472,3276919479,GB +3276919480,3276919551,DE +3276919552,3276919807,GB +3276919808,3276920543,DE +3276920544,3276920575,GB +3276920576,3276920831,DE +3276920832,3276922623,GB +3276922624,3276923391,FR +3276923392,3276923647,GB +3276923648,3276924031,FR +3276924032,3276924159,GB +3276924160,3276924287,FR +3276924288,3276924415,GB +3276924416,3276924671,FR +3276924672,3276931071,GB +3276931072,3276939263,KZ +3276939264,3276955647,DE +3276955648,3276963839,GB +3276963840,3276964351,IL +3276964352,3276965375,RO +3276965376,3276966399,RU +3276966400,3276966911,BH +3276966912,3276968959,RU +3276968960,3276969471,RO +3276969472,3276969983,UA +3276969984,3276970495,NL +3276970496,3276971519,RU +3276971520,3276972031,DE +3276972032,3276980223,PL +3276980224,3276988415,DK +3276988416,3276996607,AT +3276996608,3277062143,FR +3277062144,3277127679,SE +3277127680,3277160447,DK +3277160448,3277176831,NL +3277176832,3277177087,SI +3277177088,3277177343,GB +3277177344,3277177599,RO +3277177600,3277178111,PL +3277178112,3277178623,UA +3277178624,3277178879,PL +3277178880,3277179135,ES +3277179136,3277179391,RO +3277179392,3277179647,DE +3277179648,3277180159,BE +3277180160,3277180415,NL +3277180416,3277180671,GB +3277180672,3277180927,FR +3277180928,3277181183,DE +3277181184,3277181439,PL +3277181440,3277181695,DE +3277181696,3277181951,RO +3277181952,3277182207,IT +3277182208,3277182463,RU +3277182464,3277182719,UA +3277182720,3277182975,BG +3277182976,3277183231,UA +3277183232,3277183487,DE +3277183488,3277183743,DK +3277183744,3277183999,UA +3277184000,3277184255,DE +3277184256,3277184511,PT +3277184512,3277184767,DE +3277184768,3277185023,UA +3277185024,3277185279,SA +3277185280,3277185535,NL +3277185536,3277185791,DE +3277185792,3277186047,PL +3277186048,3277186303,IT +3277186304,3277186559,DE +3277186560,3277186815,PL +3277186816,3277187071,RU +3277187072,3277187327,GB +3277187328,3277187583,UA +3277187584,3277188351,RU +3277188352,3277188607,GB +3277188608,3277188863,RU +3277188864,3277189119,RO +3277189120,3277189375,DE +3277189376,3277189631,PL +3277189632,3277189887,TR +3277189888,3277190143,PL +3277190144,3277190399,SE +3277190400,3277190655,GB +3277190656,3277190911,BE +3277190912,3277191167,FR +3277191168,3277191423,DK +3277191424,3277191679,PL +3277191680,3277191935,UA +3277191936,3277192191,DK +3277192192,3277192447,PL +3277192448,3277192703,DK +3277192704,3277192959,IL +3277192960,3277193215,TR +3277193216,3277254727,NL +3277254728,3277254735,DE +3277254736,3277258751,NL +3277258752,3277324287,TR +3277324288,3277325311,RU +3277325312,3277326335,IT +3277326336,3277326847,GB +3277326848,3277327359,AT +3277327360,3277327871,RS +3277327872,3277328383,UA +3277328384,3277328895,RU +3277328896,3277329407,NL +3277329408,3277329919,GB +3277329920,3277330431,RU +3277330432,3277330943,RO +3277330944,3277331455,UA +3277331456,3277332479,PL +3277332480,3277332991,LV +3277332992,3277333503,AT +3277333504,3277334015,EE +3277334016,3277334527,RO +3277334528,3277335039,RU +3277335040,3277335551,UA +3277335552,3277336063,DE +3277336064,3277336575,HR +3277336576,3277337087,AT +3277337088,3277337599,PL +3277337600,3277338111,UA +3277338112,3277338623,NO +3277338624,3277339647,RU +3277339648,3277340159,RO +3277340160,3277340671,RU +3277340672,3277341183,RO +3277341184,3277341695,AM +3277341696,3277342207,RU +3277342208,3277342719,GB +3277342720,3277343231,UA +3277343232,3277343743,BG +3277343744,3277344767,UA +3277344768,3277345279,LV +3277345280,3277345791,SI +3277345792,3277346303,FR +3277346304,3277346815,GB +3277346816,3277347327,DE +3277347328,3277347839,PL +3277347840,3277348351,RU +3277348352,3277348863,FR +3277348864,3277349887,RO +3277349888,3277350399,GB +3277350400,3277351423,RU +3277351424,3277351935,NO +3277351936,3277352447,DE +3277352448,3277352959,SE +3277352960,3277353471,UA +3277353472,3277353983,PL +3277353984,3277354495,DE +3277354496,3277355007,GB +3277355008,3277355519,RU +3277355520,3277356031,MK +3277356032,3277356543,UA +3277356544,3277357055,RU +3277357056,3277357567,PL +3277357568,3277358079,SE +3277358080,3277359103,RU +3277359104,3277359615,NL +3277359616,3277360127,UA +3277360128,3277360639,BG +3277360640,3277361151,CZ +3277361152,3277361663,UA +3277361664,3277362175,RU +3277362176,3277362687,ES +3277362688,3277363199,AR +3277363200,3277363711,ES +3277363712,3277364223,RU +3277364224,3277364735,GB +3277364736,3277365247,UA +3277365248,3277365759,NL +3277365760,3277366271,GR +3277366272,3277366783,CZ +3277366784,3277367295,AT +3277367296,3277367807,PL +3277367808,3277368319,RU +3277368320,3277369343,RO +3277369344,3277369855,CY +3277369856,3277370367,RU +3277370368,3277370879,SE +3277370880,3277371391,RO +3277371392,3277371903,RU +3277371904,3277372415,PL +3277372416,3277373951,RU +3277373952,3277374463,FR +3277374464,3277375999,RU +3277376000,3277376511,NL +3277376512,3277377023,RO +3277377024,3277378559,RU +3277378560,3277379071,HR +3277379072,3277379583,UZ +3277379584,3277380095,RS +3277380096,3277380607,RO +3277380608,3277381119,RU +3277381120,3277381631,KW +3277381632,3277382143,RU +3277382144,3277382655,UA +3277382656,3277383167,GB +3277383168,3277383679,UA +3277383680,3277384191,PL +3277384192,3277384703,IL +3277384704,3277385215,GB +3277385216,3277385727,AT +3277385728,3277386239,RU +3277386240,3277386751,UA +3277386752,3277387263,SA +3277387264,3277388287,RU +3277388288,3277388799,GB +3277388800,3277389311,RU +3277389312,3277389823,AM +3277389824,3277395951,GB +3277395952,3277395967,IE +3277395968,3277452647,GB +3277452648,3277452655,DK +3277452656,3277455359,GB +3277455360,3277463551,DE +3277463552,3277463807,GB +3277463808,3277464063,US +3277464064,3277464575,FR +3277464576,3277464831,BE +3277464832,3277465087,IL +3277465088,3277465599,FR +3277466368,3277466495,US +3277466624,3277466879,US +3277467472,3277467551,CA +3277467648,3277467663,US +3277467904,3277467919,US +3277468096,3277468607,US +3277468672,3277468735,US +3277468928,3277469056,US +3277469184,3277469439,US +3277471744,3277472607,NL +3277472608,3277472623,IL +3277472624,3277474815,NL +3277474816,3277475711,BE +3277475712,3277476607,NL +3277476608,3277477631,BE +3277477632,3277479935,NL +3277479936,3277480959,GB +3277480960,3277481471,DK +3277481472,3277481983,PL +3277481984,3277482495,SE +3277482496,3277483007,PL +3277483008,3277483519,IT +3277483520,3277484031,RO +3277484032,3277484543,CH +3277484544,3277485055,RO +3277485056,3277485567,CH +3277485568,3277486591,GB +3277486592,3277487103,UA +3277487104,3277487615,RO +3277487616,3277488127,PL +3277488128,3277504511,RU +3277504512,3277520895,DE +3277520896,3277553663,SK +3277553664,3277586431,RU +3277586432,3277651967,GB +3277651968,3277684735,US +3277684736,3277685247,RU +3277685248,3277685759,DE +3277685760,3277686271,IE +3277686272,3277686783,PL +3277686784,3277687295,RO +3277687296,3277687807,UA +3277687808,3277688319,RO +3277688320,3277688831,PL +3277688832,3277689343,RU +3277689344,3277689855,AT +3277689856,3277690879,RU +3277690880,3277691391,KZ +3277691392,3277691903,UA +3277691904,3277692415,GB +3277692416,3277692927,DE +3277692928,3277693439,UA +3277693440,3277693951,PL +3277693952,3277694463,RU +3277694464,3277694975,DE +3277694976,3277695487,IT +3277695488,3277695999,ES +3277696000,3277696511,UA +3277696512,3277697023,AT +3277697024,3277697535,RO +3277697536,3277698047,PL +3277698048,3277698559,RU +3277698560,3277699071,DE +3277699072,3277699583,UA +3277699584,3277700607,RU +3277700608,3277701119,UA +3277701120,3277701631,DK +3277701632,3277702143,AT +3277702144,3277702655,GB +3277702656,3277703167,RO +3277703168,3277703679,DE +3277703680,3277704191,PL +3277704192,3277704703,UA +3277704704,3277705215,RU +3277705216,3277705727,UA +3277705728,3277706239,ES +3277706240,3277707263,UA +3277707264,3277707775,CZ +3277707776,3277708287,MD +3277708288,3277708799,AT +3277708800,3277709311,PL +3277709312,3277709823,NL +3277709824,3277710335,GB +3277710336,3277710847,RU +3277710848,3277711359,PL +3277711360,3277711871,NO +3277711872,3277712383,IL +3277712384,3277712895,FR +3277712896,3277713407,NL +3277713408,3277713919,RU +3277713920,3277714943,DE +3277714944,3277715967,RU +3277715968,3277716479,PL +3277716480,3277716991,SE +3277716992,3277717503,IT +3277717504,3277725695,YE +3277725696,3277728367,CH +3277728368,3277728383,NL +3277728384,3277733887,CH +3277733888,3277742079,DE +3277742080,3277750271,FI +3277750272,3277766655,IT +3277766656,3277774847,PL +3277774848,3277783039,RU +3277783040,3277815807,BE +3277815808,3277816063,RO +3277816064,3277816319,PL +3277816320,3277816575,CM +3277816576,3277816831,GB +3277816832,3277817087,CH +3277817088,3277817343,GB +3277817344,3277817855,FR +3277817856,3277818111,BE +3277818112,3277818367,DE +3277818368,3277818623,CY +3277818624,3277818879,UA +3277818880,3277819135,SE +3277819136,3277819391,CH +3277819392,3277819647,IT +3277819648,3277819903,GB +3277819904,3277820159,PL +3277820160,3277820415,RO +3277820416,3277820671,DE +3277820672,3277820927,UA +3277820928,3277821183,CH +3277821184,3277821439,TR +3277821440,3277821695,NL +3277821696,3277821951,UA +3277821952,3277822207,RO +3277822208,3277822463,ES +3277822464,3277822719,PL +3277822720,3277822975,RU +3277822976,3277823231,FR +3277823232,3277823487,UA +3277823488,3277823743,SI +3277823744,3277823999,UA +3277824000,3277824255,TR +3277824512,3277824767,UA +3277824768,3277825023,AT +3277825024,3277825279,PL +3277825280,3277825535,UA +3277825536,3277826047,RO +3277826048,3277826303,FR +3277826304,3277826815,PL +3277826816,3277827071,UA +3277827072,3277827327,DK +3277827328,3277827583,SI +3277827584,3277828095,NL +3277828096,3277828351,AT +3277828352,3277828607,NL +3277828608,3277828863,RO +3277828864,3277829119,TR +3277829120,3277829375,RO +3277829376,3277829631,DK +3277829632,3277829887,PL +3277829888,3277830143,IL +3277830144,3277830399,SE +3277830400,3277830655,UA +3277830656,3277830911,PL +3277830912,3277831167,GB +3277831168,3277831423,PL +3277831424,3277831679,UA +3277831680,3277832191,IE +3277833216,3277833727,BE +3277833728,3277834239,NL +3277834240,3277834751,RU +3277834752,3277835263,UA +3277835264,3277835775,SK +3277835776,3277836287,UA +3277836288,3277836799,FI +3277836800,3277837311,UA +3277837312,3277838847,RU +3277839360,3277839871,DE +3277839872,3277840383,UA +3277840384,3277840895,FR +3277840896,3277841407,GR +3277841408,3277841919,RO +3277841920,3277842431,IL +3277842432,3277842943,UA +3277842944,3277843455,PL +3277843456,3277843967,PT +3277843968,3277845503,DK +3277845504,3277847039,NL +3277847040,3277847551,DK +3277847552,3277848063,RU +3277848064,3277848575,RO +3277848576,3277856767,AT +3277856768,3277864959,DE +3277864960,3277873151,RU +3277873152,3277881343,NL +3277881344,3277882111,IT +3277882112,3277882367,AE +3277882368,3277884175,IQ +3277884176,3277884191,IR +3277884192,3277886207,IQ +3277886208,3277886975,IR +3277886976,3277889535,IT +3277889536,3277897727,RU +3277897728,3277905919,IT +3277905920,3277914111,BG +3277914112,3277946879,GR +3277946880,3277963263,DK +3277963264,3277979647,GB +3277979648,3277987839,SK +3277987840,3278004223,RU +3278004224,3278012415,FR +3278012416,3278020607,SK +3278020608,3278028799,RU +3278028800,3278036991,DE +3278036992,3278045183,FR +3278045184,3278054911,GB +3278054912,3278055423,NL +3278055424,3278061567,GB +3278061568,3278065663,NL +3278065664,3278067967,GB +3278067968,3278068223,BE +3278068224,3278103039,GB +3278103040,3278103295,FR +3278103296,3278110719,GB +3278110720,3278110751,SE +3278110752,3278110767,ES +3278110768,3278111239,SE +3278111240,3278111247,ES +3278111248,3278114815,SE +3278114816,3278115071,ES +3278115072,3278115327,SE +3278115328,3278116607,ES +3278116608,3278116735,SE +3278116736,3278117119,ES +3278117120,3278118143,SE +3278118144,3278118175,ES +3278118176,3278119423,SE +3278119424,3278119935,NL +3278119936,3278119943,DE +3278119944,3278119967,SE +3278119968,3278119975,NO +3278119976,3278120151,SE +3278120152,3278120159,DE +3278120160,3278160107,SE +3278160108,3278160111,GB +3278160112,3278161631,SE +3278161632,3278161647,DE +3278161648,3278168063,SE +3278168064,3278168071,DM +3278168072,3278168111,SE +3278168112,3278168119,DK +3278168120,3278168175,SE +3278168176,3278168191,DK +3278168192,3278176255,SE +3278176256,3278232511,FR +3278232512,3278232575,MC +3278232576,3278241791,FR +3278241792,3278307327,GB +3278307328,3278372863,IT +3278372864,3278635007,GB +3278635008,3278766079,NL +3278766080,3278766591,RO +3278766592,3278767103,RU +3278767104,3278767615,RO +3278767616,3278768127,UA +3278768128,3278769151,GB +3278769152,3278769663,FR +3278769664,3278770175,DE +3278770176,3278770687,DK +3278770688,3278771199,DE +3278771200,3278771711,GB +3278771712,3278772223,NL +3278772224,3278772735,BG +3278772736,3278773247,DE +3278773248,3278773759,NO +3278773760,3278774271,FR +3278782464,3278782975,GB +3278782976,3278783231,DE +3278783232,3278790655,GB +3278790656,3278807039,IT +3278807040,3278815231,GB +3278815232,3278823423,AT +3278823424,3278831615,FR +3278831616,3278865663,HU +3278865664,3278865919,SK +3278865920,3278897151,HU +3278897152,3278913535,GB +3278913536,3278921727,CH +3278921728,3278929919,RU +3278929920,3278938111,TR +3278938112,3278938119,DE +3278938120,3278938123,DK +3278938124,3278938127,ES +3278938128,3278938131,TR +3278938132,3278938151,DE +3278938152,3278938155,GB +3278938156,3278938159,DE +3278938160,3278938163,ES +3278938164,3278938167,CH +3278938168,3278938171,DE +3278938172,3278938175,NL +3278938176,3278938179,FR +3278938180,3278938183,NL +3278938184,3278938187,DE +3278938188,3278938191,PT +3278938192,3278938195,ES +3278938196,3278938199,NL +3278938200,3278938203,CH +3278938204,3278938207,DE +3278938208,3278938219,IT +3278938220,3278938223,FR +3278938224,3278938227,DE +3278938228,3278938231,FR +3278938232,3278938235,DE +3278938236,3278938239,FR +3278938240,3278938243,LI +3278938244,3278938247,IT +3278938248,3278938251,AT +3278938252,3278938255,GR +3278938256,3278938263,CH +3278938264,3278938267,PL +3278938268,3278938275,FR +3278938276,3278938279,NL +3278938280,3278938283,AT +3278938284,3278938287,FR +3278938288,3278938291,ES +3278938292,3278938299,DE +3278938300,3278938303,ES +3278938304,3278938307,DE +3278938308,3278938311,GB +3278938312,3278938315,DE +3278938316,3278938323,FR +3278938324,3278938335,DE +3278938336,3278938339,CH +3278938340,3278938343,DE +3278938344,3278938347,NL +3278938348,3278938351,FR +3278938352,3278938355,DE +3278938356,3278938359,ES +3278938360,3278938363,DK +3278938364,3278938367,BH +3278938368,3278938375,FR +3278938376,3278938379,DE +3278938380,3278938383,FR +3278938384,3278938387,ZA +3278938388,3278938399,DE +3278938400,3278938403,AT +3278938404,3278938407,GB +3278938408,3278938411,CH +3278938412,3278938415,DE +3278938416,3278938419,CH +3278938420,3278938423,GB +3278938424,3278938427,DE +3278938428,3278938431,FR +3278938432,3278938435,SI +3278938436,3278938439,DE +3278938440,3278938443,IT +3278938444,3278938447,DE +3278938448,3278938451,IT +3278938452,3278938455,GB +3278938456,3278938459,ES +3278938460,3278938463,FR +3278938464,3278938467,DE +3278938468,3278938471,NL +3278938472,3278938479,DE +3278938480,3278938483,CH +3278938484,3278938487,DE +3278938488,3278938491,NL +3278938492,3278938495,ES +3278938496,3278938499,NL +3278938500,3278938503,DE +3278938504,3278938507,SE +3278938508,3278938511,IT +3278938512,3278938515,DE +3278938516,3278938523,NL +3278938524,3278938527,FR +3278938528,3278938531,NO +3278938532,3278938535,DK +3278938536,3278938555,DE +3278938556,3278938559,HU +3278938560,3278938563,CY +3278938564,3278938567,FR +3278938568,3278938575,DE +3278938576,3278938579,CZ +3278938580,3278938583,DE +3278938584,3278938587,GB +3278938588,3278938591,CH +3278938592,3278938595,DE +3278938596,3278938599,DK +3278938600,3278938603,DE +3278938604,3278938607,IT +3278938608,3278938611,AT +3278938612,3278938615,NL +3278938616,3278938619,DK +3278938620,3278938627,FR +3278938628,3278938631,DE +3278938632,3278938635,NL +3278938636,3278938639,GB +3278938640,3278938643,DE +3278938644,3278938647,GB +3278938648,3278938659,DE +3278938660,3278938663,CH +3278938664,3278938667,GB +3278938668,3278938671,AT +3278938672,3278938675,IT +3278938676,3278938679,FR +3278938680,3278938683,NO +3278938684,3278938687,DE +3278938688,3278938691,CH +3278938692,3278938695,DE +3278938696,3278938699,IT +3278938700,3278938703,ES +3278938704,3278938707,FR +3278938708,3278938715,DE +3278938716,3278938719,CH +3278938720,3278938723,NL +3278938724,3278938727,BE +3278938728,3278938731,ES +3278938732,3278938735,CH +3278938736,3278938739,IT +3278938740,3278938743,FR +3278938744,3278938751,DE +3278938752,3278938755,CH +3278938756,3278938759,DE +3278938760,3278938763,GB +3278938764,3278938767,FR +3278938768,3278938771,GB +3278938772,3278938775,SE +3278938776,3278938779,GB +3278938780,3278938783,IT +3278938784,3278938787,BE +3278938788,3278938791,ES +3278938792,3278938795,DE +3278938796,3278938799,GR +3278938800,3278938803,DE +3278938804,3278938807,IT +3278938808,3278938815,GB +3278938816,3278938819,ES +3278938820,3278938827,DE +3278938828,3278938831,GB +3278938832,3278938835,IT +3278938836,3278938839,FR +3278938840,3278938843,DE +3278938844,3278938847,HU +3278938848,3278938851,CH +3278938852,3278938855,DE +3278938856,3278938859,PT +3278938860,3278938863,DE +3278938864,3278938871,IT +3278938872,3278938875,DE +3278938876,3278938879,NL +3278938880,3278938887,FR +3278938888,3278938891,ES +3278938892,3278938895,DE +3278938896,3278938903,FR +3278938904,3278938911,GB +3278938912,3278938919,DE +3278938920,3278938923,SK +3278938924,3278938927,DE +3278938928,3278938935,GB +3278938936,3278938939,CH +3278938940,3278938943,GR +3278938944,3278938947,IT +3278938948,3278938951,DE +3278938952,3278938955,FR +3278938956,3278938959,GB +3278938960,3278938967,DE +3278938968,3278938971,BE +3278938972,3278938975,DE +3278938976,3278938979,NL +3278938980,3278938987,FR +3278938988,3278938991,AT +3278938992,3278938995,FR +3278938996,3278938999,DE +3278939000,3278939003,ES +3278939004,3278939007,NL +3278939008,3278939011,IE +3278939012,3278939015,RU +3278939016,3278939019,ES +3278939020,3278939023,NL +3278939024,3278939027,IT +3278939028,3278939031,CY +3278939032,3278939035,DE +3278939036,3278939039,HU +3278939040,3278939047,DE +3278939048,3278939055,FR +3278939056,3278939063,DE +3278939064,3278939067,ES +3278939068,3278939071,IT +3278939072,3278939075,DE +3278939076,3278939079,CH +3278939080,3278939083,DE +3278939084,3278939087,IT +3278939088,3278939091,IS +3278939092,3278939095,DE +3278939096,3278939099,IT +3278939100,3278939103,DE +3278939104,3278939107,CH +3278939108,3278939111,FR +3278939112,3278939115,DE +3278939116,3278939119,NL +3278939120,3278939131,DE +3278939132,3278939135,NL +3278939136,3278939147,US +3278939148,3278939151,AR +3278939152,3278939155,ES +3278939156,3278939195,US +3278939196,3278939199,CL +3278939200,3278939259,US +3278939260,3278939263,BR +3278939264,3278939271,AR +3278939272,3278939279,US +3278939280,3278939283,CO +3278939284,3278939291,US +3278939292,3278939295,AR +3278939296,3278939307,US +3278939308,3278939311,MX +3278939312,3278939315,US +3278939316,3278939319,AR +3278939320,3278939323,US +3278939324,3278939327,CA +3278939328,3278939331,US +3278939332,3278939335,BR +3278939336,3278939339,CA +3278939340,3278939351,US +3278939352,3278939355,BR +3278939356,3278939379,US +3278939380,3278939383,BR +3278939384,3278939391,US +3278939392,3278939395,DE +3278939396,3278939399,GB +3278939400,3278939403,DE +3278939404,3278939407,CH +3278939408,3278939415,DE +3278939416,3278939419,ZW +3278939420,3278939423,IE +3278939424,3278939427,GB +3278939428,3278939435,DE +3278939436,3278939439,ES +3278939440,3278939443,IT +3278939444,3278939447,DE +3278939448,3278939451,PL +3278939452,3278939459,DE +3278939460,3278939463,DK +3278939464,3278939467,CY +3278939468,3278939471,DE +3278939472,3278939475,PL +3278939476,3278939479,BE +3278939480,3278939483,IT +3278939484,3278939491,NL +3278939492,3278939495,DE +3278939496,3278939499,CH +3278939500,3278939503,ES +3278939504,3278939511,DE +3278939512,3278939515,LU +3278939516,3278939523,NL +3278939524,3278939527,LU +3278939528,3278939531,FR +3278939532,3278939535,DE +3278939536,3278939539,BE +3278939540,3278939555,DE +3278939556,3278939559,IT +3278939560,3278939563,DE +3278939564,3278939567,FR +3278939568,3278939571,PT +3278939572,3278939575,ES +3278939576,3278939579,DE +3278939580,3278939583,NL +3278939584,3278939587,IT +3278939588,3278939591,LU +3278939592,3278939595,AO +3278939596,3278939599,NL +3278939600,3278939603,GB +3278939604,3278939607,DE +3278939608,3278939611,DK +3278939612,3278939615,FR +3278939616,3278939631,DE +3278939632,3278939635,GB +3278939636,3278939639,DK +3278939640,3278939643,DE +3278939644,3278939647,UA +3278939648,3278939651,FR +3278939652,3278939655,DE +3278939656,3278939659,FR +3278939660,3278939663,TR +3278939664,3278939667,IT +3278939668,3278939671,GB +3278939672,3278939679,FR +3278939680,3278939683,GR +3278939684,3278939687,FR +3278939688,3278939691,DE +3278939692,3278939695,FR +3278939696,3278939699,GR +3278939700,3278939703,TR +3278939704,3278939707,KE +3278939708,3278939711,TR +3278939712,3278939715,CY +3278939716,3278939723,TR +3278939724,3278939727,MC +3278939728,3278939731,TR +3278939732,3278939735,AT +3278939736,3278939739,RU +3278939740,3278939743,HU +3278939744,3278939747,GB +3278939748,3278939751,ES +3278939752,3278939755,GR +3278939756,3278939759,AO +3278939760,3278939763,FR +3278939764,3278939767,GR +3278939768,3278939771,ES +3278939772,3278939775,IT +3278939776,3278939779,GR +3278939780,3278939783,FR +3278939784,3278939787,BE +3278939788,3278939791,DE +3278939792,3278939803,ES +3278939804,3278939807,GB +3278939808,3278939815,DE +3278939816,3278939819,NL +3278939820,3278939823,DE +3278939824,3278939827,HU +3278939828,3278939835,DE +3278939836,3278939839,FR +3278939840,3278939843,IT +3278939844,3278939847,BE +3278939848,3278939851,CH +3278939852,3278939855,HU +3278939856,3278939859,FR +3278939860,3278939863,GB +3278939864,3278939867,IT +3278939868,3278939871,CH +3278939872,3278939875,ES +3278939876,3278939879,IT +3278939880,3278939883,ES +3278939884,3278939887,DE +3278939888,3278939891,PL +3278939892,3278939899,ES +3278939900,3278939903,IT +3278939904,3278939907,HK +3278939908,3278939911,MY +3278939912,3278939915,TH +3278939916,3278939923,SG +3278939924,3278939927,CN +3278939928,3278939931,SG +3278939932,3278939935,IN +3278939936,3278939939,MY +3278939940,3278939943,SG +3278939944,3278939947,TW +3278939948,3278939951,SG +3278939952,3278939955,MY +3278939956,3278939959,SG +3278939960,3278939963,CN +3278939964,3278939967,MY +3278939968,3278939971,TW +3278939972,3278939979,MY +3278939980,3278939983,TH +3278939984,3278939987,DE +3278939988,3278939991,CN +3278939992,3278939995,SG +3278939996,3278939999,MY +3278940000,3278940011,SG +3278940012,3278940015,ID +3278940016,3278940059,SG +3278940060,3278940067,CN +3278940068,3278940071,TW +3278940072,3278940083,SG +3278940084,3278940091,MY +3278940092,3278940095,SG +3278940096,3278940099,IN +3278940100,3278940103,SG +3278940104,3278940107,MY +3278940108,3278940127,SG +3278940128,3278940131,TW +3278940132,3278940135,BD +3278940136,3278940139,SG +3278940140,3278940143,IN +3278940144,3278940151,MY +3278940152,3278940155,IN +3278940156,3278940159,PH +3278940160,3278940163,GR +3278940164,3278940167,CH +3278940168,3278940171,DK +3278940172,3278940175,FR +3278940176,3278940179,GB +3278940180,3278940183,CH +3278940184,3278940187,DE +3278940188,3278940195,GB +3278940196,3278940211,DE +3278940212,3278940215,PT +3278940216,3278940219,NL +3278940220,3278940223,GB +3278940224,3278940227,CH +3278940228,3278940231,DE +3278940232,3278940235,CH +3278940236,3278940239,ES +3278940240,3278940243,CY +3278940244,3278940247,DE +3278940248,3278940251,FR +3278940252,3278940255,IT +3278940256,3278940259,BE +3278940260,3278940263,DE +3278940264,3278940267,ES +3278940268,3278940275,DE +3278940276,3278940279,GB +3278940280,3278940283,CH +3278940284,3278940291,NL +3278940292,3278940295,DE +3278940296,3278940299,IT +3278940300,3278940303,FR +3278940304,3278940307,DE +3278940308,3278940311,CH +3278940312,3278940315,IT +3278940316,3278940319,DE +3278940320,3278940323,NL +3278940324,3278940327,ES +3278940328,3278940335,DE +3278940336,3278940339,NL +3278940340,3278940347,DE +3278940348,3278940355,GB +3278940356,3278940359,NL +3278940360,3278940363,GR +3278940364,3278940367,IT +3278940368,3278940371,FR +3278940372,3278940375,GB +3278940376,3278940379,PT +3278940380,3278940383,FR +3278940384,3278940387,NL +3278940388,3278940391,IE +3278940392,3278940395,FR +3278940396,3278940399,NL +3278940400,3278940403,DE +3278940404,3278940407,FR +3278940408,3278940411,IT +3278940412,3278940412,CH +3278940413,3278940415,DE +3278940416,3278940419,BE +3278940420,3278940423,DE +3278940424,3278940427,CH +3278940428,3278940431,DE +3278940432,3278940443,CH +3278940444,3278940447,DE +3278940448,3278940451,GB +3278940452,3278940455,DE +3278940456,3278940459,GB +3278940460,3278940463,DE +3278940464,3278940467,FR +3278940468,3278940471,DE +3278940472,3278940475,ES +3278940476,3278940479,FR +3278940480,3278940483,CH +3278940484,3278940487,FR +3278940488,3278940491,ES +3278940492,3278940495,IT +3278940496,3278940499,NL +3278940500,3278940503,FR +3278940504,3278940507,DK +3278940508,3278940511,FR +3278940512,3278940515,DE +3278940516,3278940523,CH +3278940524,3278940531,ES +3278940532,3278940535,DE +3278940536,3278940539,CH +3278940540,3278940543,ES +3278940544,3278940551,DE +3278940552,3278940555,GB +3278940556,3278940559,DE +3278940560,3278940563,AT +3278940564,3278940571,FR +3278940572,3278940579,CH +3278940580,3278940587,DE +3278940588,3278940591,IT +3278940592,3278940595,FR +3278940596,3278940599,BE +3278940600,3278940603,DE +3278940604,3278940607,FR +3278940608,3278940611,ES +3278940612,3278940615,PT +3278940616,3278940619,IT +3278940620,3278940623,DE +3278940624,3278940631,IT +3278940632,3278940635,GB +3278940636,3278940639,BE +3278940640,3278940643,CH +3278940644,3278940647,IT +3278940648,3278940651,DE +3278940652,3278940655,FR +3278940656,3278940663,IT +3278940664,3278940671,FR +3278940672,3278940679,DE +3278940680,3278940683,CH +3278940684,3278940691,NL +3278940692,3278940695,SE +3278940696,3278940707,DE +3278940708,3278940711,ES +3278940712,3278940715,BE +3278940716,3278940723,ES +3278940724,3278940727,FR +3278940728,3278940731,DE +3278940732,3278940739,FR +3278940740,3278940743,GB +3278940744,3278940747,ES +3278940748,3278940751,DE +3278940752,3278940759,FR +3278940760,3278940763,NL +3278940764,3278940767,DE +3278940768,3278940771,GB +3278940772,3278940783,DE +3278940784,3278940787,CH +3278940788,3278940791,GB +3278940792,3278940795,NL +3278940796,3278940803,DE +3278940804,3278940807,DK +3278940808,3278940815,DE +3278940816,3278940819,IT +3278940820,3278940823,GB +3278940824,3278940827,IT +3278940828,3278940831,DE +3278940832,3278940835,CH +3278940836,3278940839,IT +3278940840,3278940847,DE +3278940848,3278940851,CH +3278940852,3278940855,DE +3278940856,3278940859,PT +3278940860,3278940863,NL +3278940864,3278940867,CH +3278940868,3278940871,GB +3278940872,3278940875,DE +3278940876,3278940879,IT +3278940880,3278940883,CH +3278940884,3278940887,ES +3278940888,3278940891,BE +3278940892,3278940895,DE +3278940896,3278940899,IT +3278940900,3278940903,FR +3278940904,3278940911,ES +3278940912,3278940915,IT +3278940916,3278940919,DE +3278940920,3278940923,PT +3278940924,3278940927,FR +3278940928,3278940931,DE +3278940932,3278940935,NL +3278940936,3278940939,ES +3278940940,3278940943,FR +3278940944,3278940947,NL +3278940948,3278940951,FR +3278940952,3278940955,IT +3278940956,3278940959,DK +3278940960,3278940963,FR +3278940964,3278940967,IT +3278940968,3278940971,FR +3278940972,3278940983,DE +3278940984,3278940987,IT +3278940988,3278940991,NL +3278940992,3278940995,PT +3278940996,3278940999,DE +3278941000,3278941003,NL +3278941004,3278941007,CH +3278941008,3278941011,ES +3278941012,3278941015,GB +3278941016,3278941023,DE +3278941024,3278941027,IT +3278941028,3278941031,FR +3278941032,3278941035,DE +3278941036,3278941039,IT +3278941040,3278941043,DE +3278941044,3278941047,FR +3278941048,3278941051,ES +3278941052,3278941055,DE +3278941056,3278941059,FR +3278941060,3278941063,GB +3278941064,3278941067,IT +3278941068,3278941071,ES +3278941072,3278941075,IT +3278941076,3278941083,DE +3278941084,3278941087,GB +3278941088,3278941091,BE +3278941092,3278941095,DK +3278941096,3278941099,FR +3278941100,3278941107,DE +3278941108,3278941111,DK +3278941112,3278941119,FR +3278941120,3278941127,DE +3278941128,3278941131,BE +3278941132,3278941135,NL +3278941136,3278941139,GB +3278941140,3278941143,DE +3278941144,3278941151,IT +3278941152,3278941155,PT +3278941156,3278941159,SE +3278941160,3278941167,DE +3278941168,3278941171,GB +3278941172,3278941175,AT +3278941176,3278941179,IT +3278941180,3278941183,FR +3278941184,3278941191,US +3278941192,3278941195,BR +3278941196,3278941215,US +3278941216,3278941219,BR +3278941220,3278941243,US +3278941244,3278941247,CO +3278941248,3278941255,US +3278941256,3278941259,MX +3278941260,3278941279,US +3278941280,3278941283,BR +3278941284,3278941287,AR +3278941288,3278941303,US +3278941304,3278941307,CO +3278941308,3278941319,US +3278941320,3278941323,CA +3278941324,3278941331,US +3278941332,3278941335,BR +3278941336,3278941343,US +3278941344,3278941347,AR +3278941348,3278941371,US +3278941372,3278941375,CA +3278941376,3278941399,US +3278941400,3278941403,VE +3278941404,3278941407,BR +3278941408,3278941419,US +3278941420,3278941423,DE +3278941424,3278941427,CL +3278941428,3278941431,PE +3278941432,3278941439,US +3278941440,3278941443,AR +3278941444,3278941455,US +3278941456,3278941459,JM +3278941460,3278941475,US +3278941476,3278941479,BR +3278941480,3278941491,US +3278941492,3278941495,MX +3278941496,3278941499,US +3278941500,3278941503,CA +3278941504,3278941587,US +3278941588,3278941591,DE +3278941592,3278941595,US +3278941596,3278941599,PE +3278941600,3278941615,US +3278941616,3278941619,CA +3278941620,3278941639,US +3278941640,3278941643,BR +3278941644,3278941651,US +3278941652,3278941655,VE +3278941656,3278941659,US +3278941660,3278941663,BR +3278941664,3278941667,CA +3278941668,3278941671,US +3278941672,3278941675,VE +3278941676,3278941691,US +3278941692,3278941695,MX +3278941696,3278941735,US +3278941736,3278941739,CA +3278941740,3278941743,US +3278941744,3278941747,CA +3278941748,3278941819,US +3278941820,3278941823,CL +3278941824,3278941847,US +3278941848,3278941855,AR +3278941856,3278941891,US +3278941892,3278941895,CA +3278941896,3278941911,US +3278941912,3278941915,MX +3278941916,3278941943,US +3278941944,3278941947,CO +3278941948,3278941951,US +3278941952,3278941955,GB +3278941956,3278941959,FR +3278941960,3278941963,DE +3278941964,3278941971,GB +3278941972,3278941979,DE +3278941980,3278941987,ES +3278941988,3278941995,FR +3278941996,3278941999,ES +3278942000,3278942003,DE +3278942004,3278942011,IT +3278942012,3278942015,DE +3278942016,3278942019,FR +3278942020,3278942023,DE +3278942024,3278942027,FR +3278942028,3278942031,CH +3278942032,3278942035,GR +3278942036,3278942039,CH +3278942040,3278942043,ES +3278942044,3278942047,FR +3278942048,3278942051,DE +3278942052,3278942055,CH +3278942056,3278942059,ES +3278942060,3278942063,DE +3278942064,3278942071,ES +3278942072,3278942075,FR +3278942076,3278942079,DE +3278942080,3278942083,ES +3278942084,3278942087,BE +3278942088,3278942091,ES +3278942092,3278942095,BE +3278942096,3278942099,PL +3278942100,3278942103,GB +3278942104,3278942107,CH +3278942108,3278942111,DE +3278942112,3278942115,FR +3278942116,3278942119,DE +3278942120,3278942123,GB +3278942124,3278942127,AT +3278942128,3278942131,DE +3278942132,3278942135,GB +3278942136,3278942139,UA +3278942140,3278942143,NL +3278942144,3278942147,GB +3278942148,3278942155,DE +3278942156,3278942159,FR +3278942160,3278942163,DE +3278942164,3278942167,IT +3278942168,3278942171,CH +3278942172,3278942175,GB +3278942176,3278942179,DE +3278942180,3278942183,FR +3278942184,3278942187,DK +3278942188,3278942191,IT +3278942192,3278942199,DE +3278942200,3278942203,GB +3278942204,3278942207,CH +3278942208,3278942211,TW +3278942212,3278942227,AU +3278942228,3278942231,NZ +3278942232,3278942243,AU +3278942244,3278942247,NZ +3278942248,3278942255,AU +3278942256,3278942259,NZ +3278942260,3278942271,AU +3278942272,3278942275,NZ +3278942276,3278942291,AU +3278942292,3278942295,NZ +3278942296,3278942299,PG +3278942300,3278942355,AU +3278942356,3278942359,NZ +3278942360,3278942383,AU +3278942384,3278942387,NZ +3278942388,3278942399,AU +3278942400,3278942403,NZ +3278942404,3278942435,AU +3278942436,3278942439,DE +3278942440,3278942443,AU +3278942444,3278942447,NZ +3278942448,3278942455,AU +3278942456,3278942463,DE +3278942464,3278942467,SG +3278942468,3278942471,MY +3278942472,3278942475,IN +3278942476,3278942483,SG +3278942484,3278942487,CN +3278942488,3278942491,IN +3278942492,3278942495,MY +3278942496,3278942499,CN +3278942500,3278942507,MY +3278942508,3278942511,TH +3278942512,3278942515,SG +3278942516,3278942519,PH +3278942520,3278942539,IN +3278942540,3278942543,TW +3278942544,3278942547,PK +3278942548,3278942551,MY +3278942552,3278942555,TW +3278942556,3278942559,IN +3278942560,3278942571,MY +3278942572,3278942575,IN +3278942576,3278942579,MY +3278942580,3278942583,TW +3278942584,3278942587,SG +3278942588,3278942591,CN +3278942592,3278942595,TW +3278942596,3278942599,IN +3278942600,3278942603,SG +3278942604,3278942607,TW +3278942608,3278942611,TH +3278942612,3278942615,PH +3278942616,3278942627,SG +3278942628,3278942635,MY +3278942636,3278942643,SG +3278942644,3278942647,MY +3278942648,3278942651,IN +3278942652,3278942655,MY +3278942656,3278942667,SG +3278942668,3278942671,MY +3278942672,3278942675,SG +3278942676,3278942679,HK +3278942680,3278942683,TW +3278942684,3278942687,DE +3278942688,3278942691,SG +3278942692,3278942695,IN +3278942696,3278942699,SG +3278942700,3278942703,TW +3278942704,3278942707,MY +3278942708,3278942719,SG +3278942720,3278942721,DE +3278942722,3278942722,GB +3278942723,3278942724,DE +3278942725,3278942725,GB +3278942726,3278942726,IT +3278942727,3278942727,DE +3278942728,3278942728,CH +3278942729,3278942730,BE +3278942731,3278942731,DE +3278942732,3278942732,ES +3278942733,3278942733,LU +3278942734,3278942734,GB +3278942735,3278942735,DE +3278942736,3278942736,IT +3278942737,3278942737,GB +3278942738,3278942739,DE +3278942740,3278942740,NL +3278942741,3278942741,GB +3278942742,3278942742,SE +3278942743,3278942743,ES +3278942744,3278942748,DE +3278942749,3278942749,GB +3278942750,3278942750,IT +3278942751,3278942751,FR +3278942752,3278942753,CH +3278942754,3278942754,DE +3278942755,3278942755,GB +3278942756,3278942756,DE +3278942757,3278942757,GB +3278942758,3278942759,IT +3278942760,3278942760,ES +3278942761,3278942761,DE +3278942762,3278942762,GB +3278942763,3278942763,NL +3278942764,3278942764,FR +3278942765,3278942765,CH +3278942766,3278942766,PL +3278942767,3278942767,FR +3278942768,3278942768,NO +3278942769,3278942769,GB +3278942770,3278942771,DE +3278942772,3278942772,BE +3278942773,3278942773,DE +3278942774,3278942774,CH +3278942775,3278942775,FR +3278942776,3278942776,DE +3278942777,3278942778,GB +3278942779,3278942779,SE +3278942780,3278942781,DE +3278942782,3278942782,ES +3278942783,3278942784,DE +3278942785,3278942785,GR +3278942786,3278942786,SI +3278942787,3278942787,IT +3278942788,3278942789,DE +3278942790,3278942790,ES +3278942791,3278942791,IT +3278942792,3278942792,US +3278942793,3278942793,CH +3278942794,3278942794,DE +3278942795,3278942795,GB +3278942796,3278942796,IT +3278942797,3278942797,GB +3278942798,3278942798,DE +3278942799,3278942799,IT +3278942800,3278942800,FR +3278942801,3278942801,GB +3278942802,3278942803,DE +3278942804,3278942804,IT +3278942805,3278942805,DE +3278942806,3278942806,BE +3278942807,3278942807,AT +3278942808,3278942809,DE +3278942810,3278942810,ES +3278942811,3278942811,NL +3278942812,3278942813,DE +3278942814,3278942814,CH +3278942815,3278942815,DE +3278942816,3278942816,AT +3278942817,3278942817,FR +3278942818,3278942818,DK +3278942819,3278942819,DE +3278942820,3278942820,IT +3278942821,3278942821,NL +3278942822,3278942824,DE +3278942825,3278942825,NL +3278942826,3278942826,RU +3278942827,3278942827,FR +3278942828,3278942828,ES +3278942829,3278942829,NL +3278942830,3278942830,IT +3278942831,3278942831,CH +3278942832,3278942832,IT +3278942833,3278942833,DE +3278942834,3278942834,NL +3278942835,3278942835,AT +3278942836,3278942836,DE +3278942837,3278942837,IT +3278942838,3278942838,ES +3278942839,3278942839,FR +3278942840,3278942841,DE +3278942842,3278942843,IT +3278942844,3278942844,ES +3278942845,3278942850,DE +3278942851,3278942851,HU +3278942852,3278942852,DE +3278942853,3278942853,ES +3278942854,3278942854,GB +3278942855,3278942855,ES +3278942856,3278942856,NO +3278942857,3278942857,DE +3278942858,3278942858,IT +3278942859,3278942859,DE +3278942860,3278942860,IT +3278942861,3278942861,FR +3278942862,3278942863,DE +3278942864,3278942864,ES +3278942865,3278942865,GB +3278942866,3278942867,NL +3278942868,3278942868,DE +3278942869,3278942869,IT +3278942870,3278942870,CH +3278942871,3278942871,IS +3278942872,3278942872,ES +3278942873,3278942873,IT +3278942874,3278942875,DE +3278942876,3278942876,PL +3278942877,3278942877,DE +3278942878,3278942878,NL +3278942879,3278942879,DK +3278942880,3278942881,DE +3278942882,3278942882,CH +3278942883,3278942883,GB +3278942884,3278942884,DE +3278942885,3278942885,NL +3278942886,3278942886,DE +3278942887,3278942887,IT +3278942888,3278942889,DE +3278942890,3278942890,ES +3278942891,3278942894,DE +3278942895,3278942895,NL +3278942896,3278942896,GB +3278942897,3278942897,CH +3278942898,3278942899,NL +3278942900,3278942903,DE +3278942904,3278942904,BE +3278942905,3278942905,IE +3278942906,3278942907,DE +3278942908,3278942908,GB +3278942909,3278942910,DE +3278942911,3278942911,IT +3278942912,3278942913,DE +3278942914,3278942914,CH +3278942915,3278942915,DE +3278942916,3278942916,CH +3278942917,3278942922,DE +3278942923,3278942923,NL +3278942924,3278942924,DE +3278942925,3278942925,GB +3278942926,3278942930,DE +3278942931,3278942931,CH +3278942932,3278942932,NL +3278942933,3278942933,BE +3278942934,3278942934,IT +3278942935,3278942936,NL +3278942937,3278942937,DE +3278942938,3278942938,CH +3278942939,3278942939,ES +3278942940,3278942940,DE +3278942941,3278942941,IT +3278942942,3278942942,DE +3278942943,3278942944,NL +3278942945,3278942946,DE +3278942947,3278942947,BE +3278942948,3278942948,AT +3278942949,3278942949,CH +3278942950,3278942950,DE +3278942951,3278942951,IT +3278942952,3278942953,DE +3278942954,3278942954,AT +3278942955,3278942955,DE +3278942956,3278942956,IT +3278942957,3278942957,DE +3278942958,3278942958,CH +3278942959,3278942959,DE +3278942960,3278942960,FR +3278942961,3278942961,PT +3278942962,3278942963,NL +3278942964,3278942966,DE +3278942967,3278942967,NO +3278942968,3278942968,NL +3278942969,3278942969,AT +3278942970,3278942970,ES +3278942971,3278942972,IT +3278942973,3278942977,DE +3278942978,3278942978,BE +3278942979,3278942979,FR +3278942980,3278942980,IT +3278942981,3278942983,DE +3278942984,3278942984,IT +3278942985,3278942985,ES +3278942986,3278942986,CH +3278942987,3278942987,BE +3278942988,3278942990,CH +3278942991,3278942991,GB +3278942992,3278942992,DE +3278942993,3278942993,GB +3278942994,3278942994,CH +3278942995,3278942997,DE +3278942998,3278942998,CH +3278942999,3278942999,GB +3278943000,3278943002,DE +3278943003,3278943003,CH +3278943004,3278943005,DE +3278943006,3278943006,FR +3278943007,3278943007,DE +3278943008,3278943008,IT +3278943009,3278943009,DE +3278943010,3278943010,NL +3278943011,3278943011,DE +3278943012,3278943012,CZ +3278943013,3278943013,IT +3278943014,3278943014,AT +3278943015,3278943016,ES +3278943017,3278943017,FR +3278943018,3278943018,CH +3278943019,3278943019,DE +3278943020,3278943020,CH +3278943021,3278943021,BE +3278943022,3278943022,ES +3278943023,3278943023,BE +3278943024,3278943024,FR +3278943025,3278943025,DE +3278943026,3278943026,DK +3278943027,3278943027,DE +3278943028,3278943029,GB +3278943030,3278943030,ES +3278943031,3278943031,NL +3278943032,3278943032,FR +3278943033,3278943033,IT +3278943034,3278943034,DE +3278943035,3278943035,ES +3278943036,3278943036,DE +3278943037,3278943037,FR +3278943038,3278943038,DE +3278943039,3278943039,CH +3278943040,3278943040,IT +3278943041,3278943041,DE +3278943042,3278943042,BE +3278943043,3278943043,SI +3278943044,3278943044,FR +3278943045,3278943048,DE +3278943049,3278943049,GB +3278943050,3278943050,IT +3278943051,3278943051,AT +3278943052,3278943053,IT +3278943054,3278943056,DE +3278943057,3278943057,CH +3278943058,3278943058,FR +3278943059,3278943059,CH +3278943060,3278943065,DE +3278943066,3278943066,GB +3278943067,3278943069,DE +3278943070,3278943070,PL +3278943071,3278943072,DE +3278943073,3278943073,AT +3278943074,3278943074,ES +3278943075,3278943076,FR +3278943077,3278943077,DE +3278943078,3278943079,CH +3278943080,3278943080,BE +3278943081,3278943081,FR +3278943082,3278943082,CH +3278943083,3278943084,DE +3278943085,3278943085,NL +3278943086,3278943087,DE +3278943088,3278943088,NL +3278943089,3278943090,DE +3278943091,3278943091,IT +3278943092,3278943092,ES +3278943093,3278943096,DE +3278943097,3278943097,BE +3278943098,3278943098,DE +3278943099,3278943099,AT +3278943100,3278943100,SE +3278943101,3278943101,AT +3278943102,3278943102,ZA +3278943103,3278943105,DE +3278943106,3278943106,FR +3278943107,3278943107,DE +3278943108,3278943108,FR +3278943109,3278943109,IT +3278943110,3278943110,DK +3278943111,3278943111,GB +3278943112,3278943112,PT +3278943113,3278943113,ES +3278943114,3278943114,CH +3278943115,3278943115,PT +3278943116,3278943116,CH +3278943117,3278943117,DE +3278943118,3278943119,IT +3278943120,3278943120,FR +3278943121,3278943121,AT +3278943122,3278943122,GB +3278943123,3278943123,FR +3278943124,3278943124,BE +3278943125,3278943125,CH +3278943126,3278943126,IT +3278943127,3278943127,DE +3278943128,3278943128,GB +3278943129,3278943130,DE +3278943131,3278943131,BE +3278943132,3278943132,FR +3278943133,3278943133,IT +3278943134,3278943135,NL +3278943136,3278943136,FR +3278943137,3278943137,CH +3278943138,3278943138,BE +3278943139,3278943139,IT +3278943140,3278943140,ES +3278943141,3278943141,NL +3278943142,3278943142,FR +3278943143,3278943143,ES +3278943144,3278943145,DE +3278943146,3278943146,CH +3278943147,3278943147,NL +3278943148,3278943148,FR +3278943149,3278943149,BE +3278943150,3278943150,DE +3278943151,3278943151,NL +3278943152,3278943153,DE +3278943154,3278943154,SE +3278943155,3278943159,DE +3278943160,3278943160,ES +3278943161,3278943161,BE +3278943162,3278943162,ES +3278943163,3278943163,DE +3278943164,3278943164,NL +3278943165,3278943165,SE +3278943166,3278943168,DE +3278943169,3278943169,BE +3278943170,3278943172,FR +3278943173,3278943173,NL +3278943174,3278943174,DE +3278943175,3278943177,ES +3278943178,3278943178,DE +3278943179,3278943179,CH +3278943180,3278943181,DE +3278943182,3278943182,SE +3278943183,3278943183,FR +3278943184,3278943184,DE +3278943185,3278943185,BE +3278943186,3278943186,NL +3278943187,3278943187,DE +3278943188,3278943188,GB +3278943189,3278943191,DE +3278943192,3278943192,LU +3278943193,3278943193,DE +3278943194,3278943194,IT +3278943195,3278943195,DE +3278943196,3278943196,CH +3278943197,3278943197,NL +3278943198,3278943198,GR +3278943199,3278943199,GB +3278943200,3278943200,DE +3278943201,3278943202,CH +3278943203,3278943203,SE +3278943204,3278943206,DE +3278943207,3278943207,IT +3278943208,3278943208,GB +3278943209,3278943209,ES +3278943210,3278943212,IT +3278943213,3278943213,DE +3278943214,3278943214,IT +3278943215,3278943215,GB +3278943216,3278943216,CH +3278943217,3278943217,GB +3278943218,3278943218,IT +3278943219,3278943220,DE +3278943221,3278943221,CH +3278943222,3278943222,DE +3278943223,3278943223,NL +3278943224,3278943225,DE +3278943226,3278943226,FR +3278943227,3278943227,GB +3278943228,3278943228,ES +3278943229,3278943235,DE +3278943236,3278943236,ES +3278943237,3278943237,FR +3278943238,3278943239,DE +3278943240,3278943240,NL +3278943241,3278943241,FR +3278943242,3278943242,DE +3278943243,3278943243,ES +3278943244,3278943244,FR +3278943245,3278943245,DE +3278943246,3278943246,NL +3278943247,3278943247,CH +3278943248,3278943248,DE +3278943249,3278943249,ES +3278943250,3278943251,FR +3278943252,3278943252,IT +3278943253,3278943253,DE +3278943254,3278943254,DK +3278943255,3278943255,DE +3278943256,3278943256,FR +3278943257,3278943257,IT +3278943258,3278943260,DE +3278943261,3278943261,ES +3278943262,3278943262,NL +3278943263,3278943263,FR +3278943264,3278943265,DE +3278943266,3278943266,FR +3278943267,3278943267,NL +3278943268,3278943268,DE +3278943269,3278943270,CH +3278943271,3278943271,ES +3278943272,3278943274,DE +3278943275,3278943275,IT +3278943276,3278943277,DE +3278943278,3278943278,GB +3278943279,3278943279,DE +3278943280,3278943280,FR +3278943281,3278943281,IT +3278943282,3278943283,DE +3278943284,3278943284,IT +3278943285,3278943287,DE +3278943288,3278943288,FR +3278943289,3278943289,DE +3278943290,3278943290,IT +3278943291,3278943292,DE +3278943293,3278943293,GB +3278943294,3278943294,IT +3278943295,3278943296,ES +3278943297,3278943297,IT +3278943298,3278943298,PT +3278943299,3278943299,DK +3278943300,3278943300,GB +3278943301,3278943301,CH +3278943302,3278943302,BE +3278943303,3278943303,DK +3278943304,3278943304,FR +3278943305,3278943305,LU +3278943306,3278943306,AT +3278943307,3278943308,DE +3278943309,3278943309,PT +3278943310,3278943310,ES +3278943311,3278943311,BE +3278943312,3278943314,DE +3278943315,3278943316,FR +3278943317,3278943318,DE +3278943319,3278943319,NL +3278943320,3278943320,BE +3278943321,3278943321,DE +3278943322,3278943322,NL +3278943323,3278943323,FR +3278943324,3278943324,GB +3278943325,3278943326,DE +3278943327,3278943328,IT +3278943329,3278943329,PT +3278943330,3278943330,ES +3278943331,3278943331,PL +3278943332,3278943333,DE +3278943334,3278943334,FR +3278943335,3278943335,AT +3278943336,3278943337,IT +3278943338,3278943338,DE +3278943339,3278943339,PT +3278943340,3278943340,ES +3278943341,3278943341,CH +3278943342,3278943343,DE +3278943344,3278943344,GB +3278943345,3278943345,DE +3278943346,3278943346,FR +3278943347,3278943347,DE +3278943348,3278943349,GB +3278943350,3278943351,DE +3278943352,3278943352,NL +3278943353,3278943353,DE +3278943354,3278943355,ES +3278943356,3278943356,FR +3278943357,3278943357,ES +3278943358,3278943358,FR +3278943359,3278943359,ES +3278943360,3278943360,CH +3278943361,3278943361,DE +3278943362,3278943362,IT +3278943363,3278943363,DE +3278943364,3278943364,IT +3278943365,3278943366,DE +3278943367,3278943367,FR +3278943368,3278943369,DE +3278943370,3278943370,FR +3278943371,3278943371,DE +3278943372,3278943372,CH +3278943373,3278943374,GR +3278943375,3278943375,ES +3278943376,3278943376,NO +3278943377,3278943377,IT +3278943378,3278943378,DE +3278943379,3278943379,CH +3278943380,3278943380,ES +3278943381,3278943381,GB +3278943382,3278943382,ES +3278943383,3278943383,PL +3278943384,3278943384,IT +3278943385,3278943385,DE +3278943386,3278943387,FR +3278943388,3278943388,ES +3278943389,3278943389,BE +3278943390,3278943390,ES +3278943391,3278943391,FR +3278943392,3278943392,PL +3278943393,3278943393,CH +3278943394,3278943394,FR +3278943395,3278943395,IT +3278943396,3278943396,NL +3278943397,3278943399,DE +3278943400,3278943400,FR +3278943401,3278943401,DE +3278943402,3278943402,FR +3278943403,3278943403,GB +3278943404,3278943404,DE +3278943405,3278943405,GB +3278943406,3278943406,AT +3278943407,3278943407,DE +3278943408,3278943408,FR +3278943409,3278943409,IT +3278943410,3278943410,NL +3278943411,3278943411,ES +3278943412,3278943412,GB +3278943413,3278943413,NL +3278943414,3278943414,ES +3278943415,3278943415,UA +3278943416,3278943416,NL +3278943417,3278943417,DE +3278943418,3278943418,GB +3278943419,3278943419,ES +3278943420,3278943420,BE +3278943421,3278943422,DE +3278943423,3278943423,IT +3278943424,3278943424,DE +3278943425,3278943425,GB +3278943426,3278943426,DE +3278943427,3278943427,AT +3278943428,3278943428,DE +3278943429,3278943430,IT +3278943431,3278943431,CH +3278943432,3278943432,DE +3278943433,3278943433,GB +3278943434,3278943435,DE +3278943436,3278943436,ES +3278943437,3278943437,FR +3278943438,3278943438,DE +3278943439,3278943439,SE +3278943440,3278943440,DK +3278943441,3278943441,IT +3278943442,3278943442,FR +3278943443,3278943443,DE +3278943444,3278943444,GB +3278943445,3278943445,DE +3278943446,3278943446,CH +3278943447,3278943447,DE +3278943448,3278943448,FR +3278943449,3278943449,DE +3278943450,3278943450,CH +3278943451,3278943451,AT +3278943452,3278943452,DE +3278943453,3278943453,PT +3278943454,3278943455,DE +3278943456,3278943456,IT +3278943457,3278943457,GB +3278943458,3278943459,DE +3278943460,3278943460,FR +3278943461,3278943462,DE +3278943463,3278943463,IT +3278943464,3278943464,DE +3278943465,3278943465,ES +3278943466,3278943466,DE +3278943467,3278943467,ES +3278943468,3278943468,DE +3278943469,3278943469,NL +3278943470,3278943471,ES +3278943472,3278943472,BE +3278943473,3278943473,DE +3278943474,3278943474,BE +3278943475,3278943477,DE +3278943478,3278943478,NL +3278943479,3278943481,DE +3278943482,3278943482,IT +3278943483,3278943489,DE +3278943490,3278943490,BE +3278943491,3278943491,DK +3278943492,3278943492,CH +3278943493,3278943494,DE +3278943495,3278943495,FR +3278943496,3278943496,GB +3278943497,3278943497,AT +3278943498,3278943499,DE +3278943500,3278943500,IT +3278943501,3278943501,FR +3278943502,3278943504,DE +3278943505,3278943505,LI +3278943506,3278943506,AT +3278943507,3278943507,FR +3278943508,3278943509,IT +3278943510,3278943510,DE +3278943511,3278943512,IT +3278943513,3278943513,ES +3278943514,3278943514,BE +3278943515,3278943515,DE +3278943516,3278943517,ES +3278943518,3278943518,FR +3278943519,3278943519,HU +3278943520,3278943520,AT +3278943521,3278943521,ES +3278943522,3278943523,DE +3278943524,3278943524,AT +3278943525,3278943525,BE +3278943526,3278943526,FR +3278943527,3278943527,DE +3278943528,3278943528,CH +3278943529,3278943530,AT +3278943531,3278943531,DE +3278943532,3278943532,NL +3278943533,3278943533,ES +3278943534,3278943534,GB +3278943535,3278943535,BR +3278943536,3278943537,ES +3278943538,3278943538,RE +3278943539,3278943539,IT +3278943540,3278943540,ES +3278943541,3278943542,DE +3278943543,3278943543,IT +3278943544,3278943545,DE +3278943546,3278943546,NL +3278943547,3278943547,CH +3278943548,3278943548,GB +3278943549,3278943549,IL +3278943550,3278943550,IT +3278943551,3278943551,DE +3278943552,3278943552,IT +3278943553,3278943553,DE +3278943554,3278943554,FR +3278943555,3278943555,DE +3278943556,3278943556,FR +3278943557,3278943557,DE +3278943558,3278943558,AT +3278943559,3278943559,DE +3278943560,3278943560,CH +3278943561,3278943561,FR +3278943562,3278943564,DE +3278943565,3278943565,GB +3278943566,3278943566,BE +3278943567,3278943567,AE +3278943568,3278943568,NL +3278943569,3278943569,ES +3278943570,3278943570,DE +3278943571,3278943571,BE +3278943572,3278943572,GB +3278943573,3278943573,DE +3278943574,3278943574,DK +3278943575,3278943575,BE +3278943576,3278943576,NL +3278943577,3278943577,FR +3278943578,3278943578,DE +3278943579,3278943579,BE +3278943580,3278943580,IT +3278943581,3278943581,CH +3278943582,3278943582,DE +3278943583,3278943583,NL +3278943584,3278943585,DE +3278943586,3278943586,NL +3278943587,3278943587,ES +3278943588,3278943588,DE +3278943589,3278943589,IT +3278943590,3278943590,DE +3278943591,3278943591,NL +3278943592,3278943592,DE +3278943593,3278943593,PL +3278943594,3278943594,ES +3278943595,3278943595,GB +3278943596,3278943596,GR +3278943597,3278943598,DE +3278943599,3278943599,ES +3278943600,3278943601,DE +3278943602,3278943602,PL +3278943603,3278943603,FR +3278943604,3278943604,ES +3278943605,3278943605,DE +3278943606,3278943606,AT +3278943607,3278943607,DE +3278943608,3278943608,ES +3278943609,3278943609,DE +3278943610,3278943610,BE +3278943611,3278943611,NL +3278943612,3278943613,DE +3278943614,3278943614,IT +3278943615,3278943615,CH +3278943616,3278943616,DE +3278943617,3278943617,ES +3278943618,3278943619,DE +3278943620,3278943620,IT +3278943621,3278943621,CH +3278943622,3278943622,IT +3278943623,3278943623,DK +3278943624,3278943624,PL +3278943625,3278943625,FR +3278943626,3278943628,DE +3278943629,3278943630,FR +3278943631,3278943631,CH +3278943632,3278943632,DE +3278943633,3278943633,GB +3278943634,3278943634,DE +3278943635,3278943635,IT +3278943636,3278943636,CH +3278943637,3278943638,IT +3278943639,3278943639,HU +3278943640,3278943641,DE +3278943642,3278943642,FR +3278943643,3278943643,NL +3278943644,3278943645,FR +3278943646,3278943646,IT +3278943647,3278943647,DE +3278943648,3278943648,DK +3278943649,3278943649,DE +3278943650,3278943650,ES +3278943651,3278943651,FR +3278943652,3278943653,IT +3278943654,3278943654,BE +3278943655,3278943655,FR +3278943656,3278943656,AT +3278943657,3278943658,DE +3278943659,3278943659,NL +3278943660,3278943660,CY +3278943661,3278943661,DE +3278943662,3278943662,ES +3278943663,3278943663,CH +3278943664,3278943666,ES +3278943667,3278943667,IT +3278943668,3278943669,DE +3278943670,3278943670,IT +3278943671,3278943672,DE +3278943673,3278943673,ES +3278943674,3278943675,DE +3278943676,3278943676,LU +3278943677,3278943677,IT +3278943678,3278943678,BE +3278943679,3278943679,FR +3278943680,3278943680,GB +3278943681,3278943681,CH +3278943682,3278943682,DE +3278943683,3278943683,PT +3278943684,3278943684,AD +3278943685,3278943686,DE +3278943687,3278943687,CH +3278943688,3278943689,IT +3278943690,3278943690,ES +3278943691,3278943692,DE +3278943693,3278943693,PL +3278943694,3278943694,GB +3278943695,3278943695,DE +3278943696,3278943696,GB +3278943697,3278943697,AT +3278943698,3278943698,IT +3278943699,3278943699,FR +3278943700,3278943700,CH +3278943701,3278943701,AT +3278943702,3278943702,FR +3278943703,3278943703,PL +3278943704,3278943705,DE +3278943706,3278943706,ES +3278943707,3278943707,CH +3278943708,3278943710,DE +3278943711,3278943711,IT +3278943712,3278943713,DE +3278943714,3278943714,ES +3278943715,3278943715,DE +3278943716,3278943716,ES +3278943717,3278943719,DE +3278943720,3278943720,CH +3278943721,3278943726,DE +3278943727,3278943727,PL +3278943728,3278943729,DE +3278943730,3278943730,FR +3278943731,3278943731,DK +3278943732,3278943733,CH +3278943734,3278943734,DE +3278943735,3278943735,AD +3278943736,3278943736,DE +3278943737,3278943737,ES +3278943738,3278943740,DE +3278943741,3278943741,PT +3278943742,3278943742,IL +3278943743,3278943745,DE +3278943746,3278943746,CH +3278943747,3278943747,DE +3278943748,3278943749,ES +3278943750,3278943751,DE +3278943752,3278943752,GR +3278943753,3278943753,DE +3278943754,3278943754,FR +3278943755,3278943755,SL +3278943756,3278943756,DE +3278943757,3278943757,FR +3278943758,3278943758,DE +3278943759,3278943759,NL +3278943760,3278943761,DE +3278943762,3278943762,CY +3278943763,3278943763,DE +3278943764,3278943764,FR +3278943765,3278943765,CH +3278943766,3278943766,BE +3278943767,3278943767,ES +3278943768,3278943768,DE +3278943769,3278943769,CZ +3278943770,3278943770,FR +3278943771,3278943771,CH +3278943772,3278943772,ES +3278943773,3278943773,IT +3278943774,3278943774,DE +3278943775,3278943776,PT +3278943777,3278943777,FR +3278943778,3278943778,CH +3278943779,3278943780,DE +3278943781,3278943781,GB +3278943782,3278943782,IT +3278943783,3278943786,DE +3278943787,3278943787,IT +3278943788,3278943788,DE +3278943789,3278943789,ES +3278943790,3278943790,DE +3278943791,3278943791,IT +3278943792,3278943792,FR +3278943793,3278943793,IT +3278943794,3278943794,HU +3278943795,3278943796,DE +3278943797,3278943797,ES +3278943798,3278943798,DE +3278943799,3278943799,IE +3278943800,3278943800,DE +3278943801,3278943801,LU +3278943802,3278943802,DE +3278943803,3278943803,GB +3278943804,3278943804,DE +3278943805,3278943805,DK +3278943806,3278943806,ES +3278943807,3278943807,DE +3278943808,3278943808,IT +3278943809,3278943809,FR +3278943810,3278943810,DE +3278943811,3278943811,GR +3278943812,3278943812,IT +3278943813,3278943813,IN +3278943814,3278943814,ES +3278943815,3278943815,MA +3278943816,3278943816,GB +3278943817,3278943817,FR +3278943818,3278943818,DE +3278943819,3278943819,AT +3278943820,3278943820,DE +3278943821,3278943821,SM +3278943822,3278943822,PL +3278943823,3278943823,DE +3278943824,3278943824,CH +3278943825,3278943826,DE +3278943827,3278943827,AT +3278943828,3278943828,ES +3278943829,3278943829,CH +3278943830,3278943830,ES +3278943831,3278943831,US +3278943832,3278943832,BE +3278943833,3278943833,IT +3278943834,3278943835,GB +3278943836,3278943836,DE +3278943837,3278943837,ES +3278943838,3278943838,DE +3278943839,3278943839,IT +3278943840,3278943845,DE +3278943846,3278943846,GB +3278943847,3278943847,FR +3278943848,3278943848,IT +3278943849,3278943849,DE +3278943850,3278943851,FR +3278943852,3278943852,BE +3278943853,3278943853,GB +3278943854,3278943854,ES +3278943855,3278943855,BE +3278943856,3278943856,DE +3278943857,3278943857,PL +3278943858,3278943858,NL +3278943859,3278943859,DE +3278943860,3278943860,FR +3278943861,3278943862,DE +3278943863,3278943863,IT +3278943864,3278943864,DK +3278943865,3278943865,GB +3278943866,3278943866,IT +3278943867,3278943867,ES +3278943868,3278943868,IT +3278943869,3278943869,IE +3278943870,3278943870,NL +3278943871,3278943871,FR +3278943872,3278943872,DE +3278943873,3278943873,IT +3278943874,3278943874,CH +3278943875,3278943875,IL +3278943876,3278943881,DE +3278943882,3278943882,PL +3278943883,3278943883,CH +3278943884,3278943884,DE +3278943885,3278943885,IT +3278943886,3278943888,DE +3278943889,3278943889,BE +3278943890,3278943890,NL +3278943891,3278943891,ES +3278943892,3278943892,BE +3278943893,3278943893,DE +3278943894,3278943894,IT +3278943895,3278943895,DE +3278943896,3278943896,PL +3278943897,3278943897,ES +3278943898,3278943898,IT +3278943899,3278943899,GB +3278943900,3278943900,ES +3278943901,3278943901,DE +3278943902,3278943902,GB +3278943903,3278943903,IT +3278943904,3278943904,DE +3278943905,3278943905,FR +3278943906,3278943907,IT +3278943908,3278943908,GB +3278943909,3278943909,HU +3278943910,3278943910,FR +3278943911,3278943911,DE +3278943912,3278943913,IT +3278943914,3278943914,DE +3278943915,3278943915,PL +3278943916,3278943916,IT +3278943917,3278943917,FR +3278943918,3278943918,ES +3278943919,3278943920,FR +3278943921,3278943921,DE +3278943922,3278943922,ES +3278943923,3278943923,FR +3278943924,3278943924,IT +3278943925,3278943926,ES +3278943927,3278943927,GB +3278943928,3278943928,DE +3278943929,3278943929,PT +3278943930,3278943930,IT +3278943931,3278943932,DE +3278943933,3278943933,ES +3278943934,3278943934,DE +3278943935,3278943935,GR +3278943936,3278943939,DE +3278943940,3278943940,DK +3278943941,3278943941,GB +3278943942,3278943942,NL +3278943943,3278943943,AT +3278943944,3278943944,IT +3278943945,3278943945,NL +3278943946,3278943946,LU +3278943947,3278943947,DE +3278943948,3278943948,ES +3278943949,3278943949,DE +3278943950,3278943950,BE +3278943951,3278943951,LU +3278943952,3278943953,DE +3278943954,3278943954,FR +3278943955,3278943956,DE +3278943957,3278943957,GB +3278943958,3278943958,DK +3278943959,3278943959,DE +3278943960,3278943960,FR +3278943961,3278943964,DE +3278943965,3278943965,CH +3278943966,3278943967,DE +3278943968,3278943968,ES +3278943969,3278943969,PL +3278943970,3278943970,ES +3278943971,3278943971,BE +3278943972,3278943972,IT +3278943973,3278943973,DE +3278943974,3278943974,GR +3278943975,3278943976,CH +3278943977,3278943977,DK +3278943978,3278943978,DE +3278943979,3278943979,ES +3278943980,3278943980,GB +3278943981,3278943981,DE +3278943982,3278943982,ES +3278943983,3278943983,DE +3278943984,3278943984,AT +3278943985,3278943985,NL +3278943986,3278943987,IT +3278943988,3278943988,ES +3278943989,3278943990,DE +3278943991,3278943991,NL +3278943992,3278943992,IT +3278943993,3278943994,AT +3278943995,3278943995,DE +3278943996,3278943997,CH +3278943998,3278943998,FR +3278943999,3278944001,DE +3278944002,3278944002,GB +3278944003,3278944003,LU +3278944004,3278944004,PT +3278944005,3278944006,DE +3278944007,3278944007,NL +3278944008,3278944008,IT +3278944009,3278944009,CH +3278944010,3278944010,NL +3278944011,3278944012,DE +3278944013,3278944013,DK +3278944014,3278944014,IT +3278944015,3278944015,IS +3278944016,3278944016,PL +3278944017,3278944017,DE +3278944018,3278944018,BE +3278944019,3278944019,FR +3278944020,3278944020,DE +3278944021,3278944021,IT +3278944022,3278944022,FR +3278944023,3278944023,AT +3278944024,3278944025,CH +3278944026,3278944027,FR +3278944028,3278944028,DE +3278944029,3278944029,IT +3278944030,3278944030,DE +3278944031,3278944031,FR +3278944032,3278944033,DE +3278944034,3278944034,GR +3278944035,3278944035,FR +3278944036,3278944036,US +3278944037,3278944037,FR +3278944038,3278944038,GB +3278944039,3278944039,ES +3278944040,3278944040,FR +3278944041,3278944041,DE +3278944042,3278944042,FR +3278944043,3278944043,DE +3278944044,3278944045,FR +3278944046,3278944046,NL +3278944047,3278944047,GB +3278944048,3278944048,BE +3278944049,3278944049,IT +3278944050,3278944050,DE +3278944051,3278944051,BE +3278944052,3278944052,AT +3278944053,3278944053,IT +3278944054,3278944054,DE +3278944055,3278944055,IT +3278944056,3278944058,DE +3278944059,3278944059,ES +3278944060,3278944060,BE +3278944061,3278944061,FR +3278944062,3278944062,NL +3278944063,3278944063,DE +3278944064,3278944064,FR +3278944065,3278944065,IT +3278944066,3278944066,GB +3278944067,3278944067,DE +3278944068,3278944068,ES +3278944069,3278944069,PL +3278944070,3278944070,DE +3278944071,3278944071,DK +3278944072,3278944072,AT +3278944073,3278944073,FR +3278944074,3278944075,ES +3278944076,3278944076,DE +3278944077,3278944077,GB +3278944078,3278944078,DE +3278944079,3278944079,GB +3278944080,3278944080,DE +3278944081,3278944081,GB +3278944082,3278944082,IT +3278944083,3278944084,ES +3278944085,3278944085,PT +3278944086,3278944086,NL +3278944087,3278944087,CH +3278944088,3278944088,IT +3278944089,3278944089,DE +3278944090,3278944090,IT +3278944091,3278944091,MA +3278944092,3278944092,GR +3278944093,3278944094,DE +3278944095,3278944095,AT +3278944096,3278944096,GB +3278944097,3278944097,DE +3278944098,3278944098,SE +3278944099,3278944099,GB +3278944100,3278944102,DE +3278944103,3278944104,IT +3278944105,3278944105,FR +3278944106,3278944106,AT +3278944107,3278944108,DE +3278944109,3278944109,ES +3278944110,3278944111,DE +3278944112,3278944112,NL +3278944113,3278944113,DE +3278944114,3278944114,IT +3278944115,3278944116,ES +3278944117,3278944118,IT +3278944119,3278944119,ES +3278944120,3278944121,DE +3278944122,3278944122,FR +3278944123,3278944123,IT +3278944124,3278944124,DE +3278944125,3278944125,SE +3278944126,3278944126,ES +3278944127,3278944127,IT +3278944128,3278944128,PT +3278944129,3278944129,BE +3278944130,3278944130,DE +3278944131,3278944131,FR +3278944132,3278944132,IE +3278944133,3278944133,IT +3278944134,3278944134,ES +3278944135,3278944135,NL +3278944136,3278944137,DE +3278944138,3278944138,GB +3278944139,3278944139,FR +3278944140,3278944140,PT +3278944141,3278944141,FR +3278944142,3278944142,GB +3278944143,3278944143,AT +3278944144,3278944144,DE +3278944145,3278944145,SE +3278944146,3278944147,DE +3278944148,3278944148,ES +3278944149,3278944149,DE +3278944150,3278944150,IE +3278944151,3278944151,IT +3278944152,3278944152,IS +3278944153,3278944156,DE +3278944157,3278944157,FR +3278944158,3278944158,DE +3278944159,3278944159,CH +3278944160,3278944160,FR +3278944161,3278944161,DE +3278944162,3278944162,GB +3278944163,3278944163,HU +3278944164,3278944164,IT +3278944165,3278944166,DE +3278944167,3278944167,IT +3278944168,3278944168,CH +3278944169,3278944169,DE +3278944170,3278944171,CH +3278944172,3278944172,DE +3278944173,3278944173,FR +3278944174,3278944174,GB +3278944175,3278944175,DE +3278944176,3278944176,ES +3278944177,3278944177,LU +3278944178,3278944179,DE +3278944180,3278944180,GB +3278944181,3278944181,IT +3278944182,3278944182,FR +3278944183,3278944184,ES +3278944185,3278944185,NL +3278944186,3278944192,DE +3278944193,3278944193,FR +3278944194,3278944194,GB +3278944195,3278944195,IT +3278944196,3278944197,DE +3278944198,3278944198,IT +3278944199,3278944199,AT +3278944200,3278944200,DE +3278944201,3278944201,SE +3278944202,3278944202,NO +3278944203,3278944203,NL +3278944204,3278944207,DE +3278944208,3278944208,NL +3278944209,3278944209,PL +3278944210,3278944210,AT +3278944211,3278944211,DE +3278944212,3278944212,FR +3278944213,3278944213,DK +3278944214,3278944214,GB +3278944215,3278944215,IT +3278944216,3278944216,DE +3278944217,3278944217,IT +3278944218,3278944218,ES +3278944219,3278944219,DE +3278944220,3278944220,GB +3278944221,3278944221,GR +3278944222,3278944222,IT +3278944223,3278944224,DE +3278944225,3278944225,NL +3278944226,3278944226,RU +3278944227,3278944227,IT +3278944228,3278944230,DE +3278944231,3278944231,CH +3278944232,3278944232,NL +3278944233,3278944233,GB +3278944234,3278944234,AT +3278944235,3278944235,DE +3278944236,3278944236,IT +3278944237,3278944238,DE +3278944239,3278944239,SE +3278944240,3278944240,FR +3278944241,3278944241,IT +3278944242,3278944242,ES +3278944243,3278944243,DE +3278944244,3278944244,ES +3278944245,3278944245,BE +3278944246,3278944246,NL +3278944247,3278944247,ES +3278944248,3278944248,NL +3278944249,3278944249,ES +3278944250,3278944250,IT +3278944251,3278944251,AT +3278944252,3278944252,IT +3278944253,3278944254,GB +3278944255,3278944256,DE +3278944257,3278944272,US +3278944273,3278944273,CA +3278944274,3278944274,US +3278944275,3278944275,CA +3278944276,3278944277,US +3278944278,3278944278,VE +3278944279,3278944279,DE +3278944280,3278944284,US +3278944285,3278944285,DE +3278944286,3278944286,US +3278944287,3278944288,CA +3278944289,3278944293,US +3278944294,3278944294,CA +3278944295,3278944346,US +3278944347,3278944347,AR +3278944348,3278944360,US +3278944361,3278944361,AR +3278944362,3278944365,US +3278944366,3278944366,MX +3278944367,3278944367,US +3278944368,3278944368,CA +3278944369,3278944379,US +3278944380,3278944380,DE +3278944381,3278944385,US +3278944386,3278944386,DE +3278944387,3278944388,US +3278944389,3278944389,CA +3278944390,3278944390,AR +3278944391,3278944391,CA +3278944392,3278944395,US +3278944396,3278944396,CA +3278944397,3278944399,US +3278944400,3278944400,BR +3278944401,3278944401,US +3278944402,3278944402,CA +3278944403,3278944412,US +3278944413,3278944413,CA +3278944414,3278944418,US +3278944419,3278944419,DE +3278944420,3278944420,CA +3278944421,3278944421,DE +3278944422,3278944432,US +3278944433,3278944433,DE +3278944434,3278944444,US +3278944445,3278944449,DE +3278944450,3278944451,CA +3278944452,3278944460,DE +3278944461,3278944461,US +3278944462,3278944470,DE +3278944471,3278944471,US +3278944472,3278944513,DE +3278944514,3278944517,US +3278944518,3278944518,DE +3278944519,3278944520,US +3278944521,3278944521,CA +3278944522,3278944522,US +3278944523,3278944523,CA +3278944524,3278944524,US +3278944525,3278944525,CL +3278944526,3278944526,US +3278944527,3278944527,CA +3278944528,3278944528,US +3278944529,3278944529,CA +3278944530,3278944537,US +3278944538,3278944538,AR +3278944539,3278944544,US +3278944545,3278944545,CA +3278944546,3278944555,US +3278944556,3278944556,CL +3278944557,3278944559,US +3278944560,3278944560,AR +3278944561,3278944561,US +3278944562,3278944562,CA +3278944563,3278944563,US +3278944564,3278944564,CA +3278944565,3278944569,US +3278944570,3278944570,DE +3278944571,3278944572,US +3278944573,3278944573,DE +3278944574,3278944574,US +3278944575,3278944575,DE +3278944576,3278944578,US +3278944579,3278944579,DE +3278944580,3278944580,AR +3278944581,3278944581,US +3278944582,3278944583,DE +3278944584,3278944588,US +3278944589,3278944589,DE +3278944590,3278944599,US +3278944600,3278944600,SA +3278944601,3278944606,US +3278944607,3278944608,DE +3278944609,3278944611,US +3278944612,3278944612,DE +3278944613,3278944633,US +3278944634,3278944634,DE +3278944635,3278944638,US +3278944639,3278944640,DE +3278944641,3278944642,US +3278944643,3278944643,CL +3278944644,3278944650,US +3278944651,3278944651,DE +3278944652,3278944654,US +3278944655,3278944657,AR +3278944658,3278944659,US +3278944660,3278944660,AR +3278944661,3278944661,US +3278944662,3278944663,DE +3278944664,3278944665,AR +3278944666,3278944667,US +3278944668,3278944668,AR +3278944669,3278944670,US +3278944671,3278944671,CL +3278944672,3278944672,DE +3278944673,3278944673,PE +3278944674,3278944674,DE +3278944675,3278944677,US +3278944678,3278944678,CA +3278944679,3278944679,US +3278944680,3278944680,CA +3278944681,3278944683,US +3278944684,3278944686,DE +3278944687,3278944687,US +3278944688,3278944688,AR +3278944689,3278944693,US +3278944694,3278944695,DE +3278944696,3278944696,US +3278944697,3278944697,CA +3278944698,3278944706,US +3278944707,3278944707,DE +3278944708,3278944708,PE +3278944709,3278944709,US +3278944710,3278944710,DE +3278944711,3278944712,CL +3278944713,3278944713,DE +3278944714,3278944714,JM +3278944715,3278944715,CA +3278944716,3278944716,DE +3278944717,3278944718,US +3278944719,3278944719,CA +3278944720,3278944720,US +3278944721,3278944721,CA +3278944722,3278944727,US +3278944728,3278944728,DE +3278944729,3278944730,US +3278944731,3278944731,DE +3278944732,3278944734,US +3278944735,3278944735,DE +3278944736,3278944736,AR +3278944737,3278944739,US +3278944740,3278944740,CA +3278944741,3278944741,DE +3278944742,3278944743,US +3278944744,3278944745,DE +3278944746,3278944749,US +3278944750,3278944750,DE +3278944751,3278944751,US +3278944752,3278944752,DE +3278944753,3278944753,US +3278944754,3278944754,BR +3278944755,3278944755,AR +3278944756,3278944758,US +3278944759,3278944760,DE +3278944761,3278944761,UY +3278944762,3278944763,DE +3278944764,3278944764,AR +3278944765,3278944765,US +3278944766,3278944767,DE +3278944768,3278944771,DO +3278944772,3278944819,US +3278944820,3278944823,AR +3278944824,3278944827,BR +3278944828,3278944851,US +3278944852,3278944855,CA +3278944856,3278944863,US +3278944864,3278944867,MX +3278944868,3278944871,US +3278944872,3278944875,DE +3278944876,3278944887,US +3278944888,3278944891,CO +3278944892,3278944903,US +3278944904,3278944907,BR +3278944908,3278944919,US +3278944920,3278944923,CO +3278944924,3278944935,US +3278944936,3278944939,BR +3278944940,3278944947,US +3278944948,3278944951,CO +3278944952,3278944963,US +3278944964,3278944971,CA +3278944972,3278944975,US +3278944976,3278944995,CA +3278944996,3278944999,CO +3278945000,3278945007,US +3278945008,3278945011,CO +3278945012,3278945015,PE +3278945016,3278945023,US +3278945024,3278945027,BR +3278945028,3278945031,AN +3278945032,3278945087,US +3278945088,3278945091,BR +3278945092,3278945099,US +3278945100,3278945107,BR +3278945108,3278945111,DO +3278945112,3278945127,US +3278945128,3278945131,AR +3278945132,3278945135,BR +3278945136,3278945151,US +3278945152,3278945155,CA +3278945156,3278945159,BR +3278945160,3278945171,US +3278945172,3278945175,AR +3278945176,3278945191,US +3278945192,3278945199,CA +3278945200,3278945203,US +3278945204,3278945207,AR +3278945208,3278945227,US +3278945228,3278945235,CA +3278945236,3278945247,US +3278945248,3278945255,CA +3278945256,3278945267,US +3278945268,3278945271,AR +3278945272,3278945275,US +3278945276,3278945279,CL +3278945280,3278945283,CA +3278945284,3278945299,US +3278945300,3278945303,DE +3278945304,3278945307,CO +3278945308,3278945311,CA +3278945312,3278945319,US +3278945320,3278945323,MX +3278945324,3278945327,AR +3278945328,3278945331,CA +3278945332,3278945335,US +3278945336,3278945339,CA +3278945340,3278945343,US +3278945344,3278945347,BR +3278945348,3278945363,US +3278945364,3278945367,PR +3278945368,3278945395,US +3278945396,3278945399,AR +3278945400,3278945403,MX +3278945404,3278945427,US +3278945428,3278945431,CA +3278945432,3278945435,AR +3278945436,3278945439,MX +3278945440,3278945451,US +3278945452,3278945455,BR +3278945456,3278945459,US +3278945460,3278945463,MX +3278945464,3278945479,US +3278945480,3278945483,CL +3278945484,3278945491,BR +3278945492,3278945503,US +3278945504,3278945507,MX +3278945508,3278945515,AR +3278945516,3278945519,BR +3278945520,3278945523,US +3278945524,3278945527,CA +3278945528,3278945531,US +3278945532,3278945535,AN +3278945536,3278945539,AR +3278945540,3278945579,US +3278945580,3278945583,AR +3278945584,3278945587,US +3278945588,3278945591,DO +3278945592,3278945659,US +3278945660,3278945663,AR +3278945664,3278945667,US +3278945668,3278945671,UY +3278945672,3278945675,DE +3278945676,3278945687,US +3278945688,3278945691,BR +3278945692,3278945699,US +3278945700,3278945703,AR +3278945704,3278945715,US +3278945716,3278945719,CO +3278945720,3278945723,US +3278945724,3278945727,AR +3278945728,3278945743,US +3278945744,3278945747,MX +3278945748,3278945763,US +3278945764,3278945767,MX +3278945768,3278945771,CO +3278945772,3278945779,US +3278945780,3278945783,PE +3278945784,3278945791,US +3278945792,3278945794,DE +3278945795,3278945795,CH +3278945796,3278945796,DE +3278945797,3278945797,BE +3278945798,3278945798,NL +3278945799,3278945799,LU +3278945800,3278945800,SE +3278945801,3278945801,NL +3278945802,3278945802,PT +3278945803,3278945803,GB +3278945804,3278945804,NL +3278945805,3278945805,DK +3278945806,3278945806,FR +3278945807,3278945807,DE +3278945808,3278945808,RU +3278945809,3278945809,DE +3278945810,3278945810,CH +3278945811,3278945815,DE +3278945816,3278945816,GB +3278945817,3278945821,DE +3278945822,3278945822,GR +3278945823,3278945823,CH +3278945824,3278945826,DE +3278945827,3278945827,DK +3278945828,3278945828,FR +3278945829,3278945829,DE +3278945830,3278945831,NL +3278945832,3278945832,DE +3278945833,3278945833,GB +3278945834,3278945834,NL +3278945835,3278945835,CH +3278945836,3278945838,DE +3278945839,3278945839,CZ +3278945840,3278945840,DE +3278945841,3278945841,CH +3278945842,3278945844,DE +3278945845,3278945845,ES +3278945846,3278945846,CH +3278945847,3278945847,DE +3278945848,3278945848,GB +3278945849,3278945849,DE +3278945850,3278945850,NL +3278945851,3278945852,DE +3278945853,3278945853,CH +3278945854,3278945854,FR +3278945855,3278945855,DE +3278945856,3278945856,DK +3278945857,3278945858,DE +3278945859,3278945859,GB +3278945860,3278945860,FR +3278945861,3278945861,IT +3278945862,3278945862,BE +3278945863,3278945863,ES +3278945864,3278945864,IE +3278945865,3278945866,DE +3278945867,3278945867,FR +3278945868,3278945868,NO +3278945869,3278945870,DE +3278945871,3278945871,IT +3278945872,3278945872,FR +3278945873,3278945873,DE +3278945874,3278945874,IT +3278945875,3278945875,ES +3278945876,3278945876,NL +3278945877,3278945877,SE +3278945878,3278945879,FR +3278945880,3278945880,DE +3278945881,3278945881,BE +3278945882,3278945886,DE +3278945887,3278945888,IT +3278945889,3278945890,DE +3278945891,3278945891,CH +3278945892,3278945892,BE +3278945893,3278945893,DE +3278945894,3278945894,AT +3278945895,3278945895,ES +3278945896,3278945896,GB +3278945897,3278945897,IT +3278945898,3278945898,ES +3278945899,3278945899,DE +3278945900,3278945900,FR +3278945901,3278945904,DE +3278945905,3278945905,PT +3278945906,3278945906,FR +3278945907,3278945907,GB +3278945908,3278945908,DE +3278945909,3278945909,FR +3278945910,3278945910,DE +3278945911,3278945911,NL +3278945912,3278945917,DE +3278945918,3278945918,IT +3278945919,3278946049,DE +3278946050,3278946054,US +3278946055,3278946055,CA +3278946056,3278946059,US +3278946060,3278946060,CN +3278946061,3278946061,US +3278946062,3278946062,DE +3278946063,3278946067,US +3278946068,3278946068,DE +3278946069,3278946084,US +3278946085,3278946085,DE +3278946086,3278946091,US +3278946092,3278946092,DE +3278946093,3278946108,US +3278946109,3278946109,GB +3278946110,3278946166,US +3278946167,3278946167,DE +3278946168,3278946208,US +3278946209,3278946213,DE +3278946214,3278946214,US +3278946215,3278946221,DE +3278946222,3278946222,US +3278946223,3278946224,DE +3278946225,3278946225,US +3278946226,3278946229,DE +3278946230,3278946231,US +3278946232,3278946239,DE +3278946240,3278946263,US +3278946264,3278946267,DE +3278946268,3278946271,US +3278946272,3278946275,SV +3278946276,3278946279,DO +3278946280,3278946283,DE +3278946284,3278946287,US +3278946288,3278946291,DE +3278946292,3278946299,US +3278946300,3278946303,DE +3278946304,3278954495,LB +3278954496,3278962687,RU +3278962688,3279028223,CZ +3279028224,3279028735,PL +3279028736,3279029247,RU +3279029248,3279030271,UA +3279030272,3279030783,RU +3279030784,3279031295,DE +3279031296,3279031807,NL +3279031808,3279032319,RO +3279032320,3279032831,HU +3279032832,3279033343,FR +3279033344,3279033855,RU +3279033856,3279034367,DE +3279034368,3279035391,FR +3279035392,3279035903,PS +3279035904,3279036415,UA +3279036416,3279044607,LV +3279044608,3279052799,FR +3279052800,3279053311,UA +3279053312,3279053823,DE +3279053824,3279054335,NL +3279054336,3279054847,GB +3279054848,3279055359,PL +3279055360,3279055871,SA +3279055872,3279056383,TR +3279056384,3279056895,GB +3279056896,3279057407,BG +3279057408,3279057919,FR +3279057920,3279058431,RO +3279058432,3279058943,RU +3279058944,3279059455,UA +3279059456,3279059967,RU +3279060480,3279060991,PL +3279060992,3279069183,UA +3279069184,3279077375,PL +3279077376,3279078399,ES +3279078400,3279078655,IT +3279078656,3279078911,FR +3279078912,3279081215,ES +3279081216,3279081231,DE +3279081232,3279083583,ES +3279083584,3279083599,NL +3279083600,3279083807,ES +3279083808,3279083839,NL +3279083840,3279084543,ES +3279084544,3279085567,IT +3279085568,3279093759,NL +3279093760,3279103103,FR +3279103104,3279103135,GB +3279103136,3279119295,FR +3279119296,3279119327,GB +3279119328,3279159295,FR +3279159296,3279169279,PL +3279169280,3279169535,GB +3279169536,3279290367,PL +3279290368,3279291391,NL +3279291392,3279291647,GB +3279291648,3279294463,NL +3279294720,3279294975,IE +3279294976,3279295231,SE +3279295232,3279295487,ES +3279295488,3279295743,PT +3279295744,3279295999,IL +3279296000,3279296511,ZA +3279296512,3279297279,ES +3279297280,3279297535,ZA +3279297536,3279298047,SE +3279298048,3279298559,ZA +3279298560,3279305471,DE +3279305488,3279305503,DE +3279305504,3279305535,GB +3279305536,3279305631,DE +3279305632,3279305663,GB +3279305664,3279305727,ES +3279305728,3279306751,DE +3279306752,3279310847,FR +3279310848,3279311871,DE +3279312896,3279313415,DE +3279313424,3279313919,DE +3279313920,3279314943,GB +3279314944,3279315711,CH +3279315712,3279315967,BE +3279315968,3279316223,DE +3279316224,3279316479,BE +3279316480,3279317759,IT +3279317760,3279317887,DE +3279317888,3279317951,IT +3279317952,3279317967,DE +3279317968,3279317983,IT +3279317984,3279318015,NL +3279318016,3279318271,DE +3279318272,3279318527,GB +3279318528,3279318559,CZ +3279318560,3279318655,FR +3279318656,3279318687,CZ +3279318688,3279318719,FR +3279318720,3279318751,ZA +3279318752,3279318783,GB +3279318784,3279319039,NL +3279319040,3279320063,AT +3279320064,3279321087,FR +3279321088,3279322623,DK +3279322624,3279322663,NL +3279322664,3279322671,AT +3279322672,3279322687,GB +3279322688,3279322879,DE +3279322880,3279322975,NL +3279322976,3279323071,DE +3279323072,3279330079,GB +3279330080,3279330111,DK +3279330112,3279330815,GB +3279331072,3279335295,GB +3279335296,3279335423,BE +3279335424,3279339519,GB +3279339520,3279340031,ES +3279340032,3279340543,IT +3279340544,3279340671,FR +3279340800,3279341055,FR +3279341056,3279341567,IT +3279341568,3279341823,SE +3279341824,3279342079,ZA +3279342080,3279342335,IT +3279342336,3279342591,ZA +3279342592,3279342847,SE +3279342848,3279343103,HR +3279343104,3279343359,SI +3279343360,3279343615,ZA +3279343616,3279345151,BE +3279345152,3279345663,SE +3279345664,3279346943,GB +3279346944,3279347711,FR +3279347712,3279348223,SE +3279348224,3279348735,IT +3279348736,3279348991,GB +3279348992,3279349247,ES +3279349248,3279349503,IT +3279349504,3279349759,FR +3279349760,3279351039,DE +3279351040,3279351295,FR +3279351296,3279351807,GB +3279351808,3279352319,DK +3279352320,3279352575,GB +3279352576,3279352831,BE +3279352832,3279352855,SE +3279353088,3279353343,GB +3279353344,3279354879,DK +3279354880,3279355647,AT +3279355648,3279355903,BE +3279356040,3279356047,NO +3279356064,3279356127,NO +3279356160,3279356415,NO +3279356928,3279357439,NO +3279372288,3279372799,FI +3279373056,3279375359,FI +3279380480,3279380991,CH +3279382784,3279383807,CH +3279384064,3279385343,CH +3279386368,3279386495,CH +3279387136,3279387391,CH +3279388672,3279388927,GR +3279389184,3279389243,GR +3279389248,3279389255,GR +3279389260,3279389275,GR +3279389280,3279389359,GR +3279389364,3279389379,GR +3279389384,3279389439,GR +3279389712,3279389727,GR +3279390016,3279390143,GR +3279393792,3279394047,GR +3279394304,3279394559,GR +3279402752,3279403007,CZ +3279403264,3279403903,CZ +3279404288,3279404415,CZ +3279404800,3279405055,CZ +3279421440,3279486975,IT +3279486976,3279552511,NL +3279552512,3279560703,LV +3279560704,3279568895,GB +3279568896,3279577087,IT +3279577088,3279585279,BE +3279585280,3279585991,DE +3279585992,3279585999,GB +3279586000,3279586303,DE +3279586304,3279586559,GB +3279586560,3279588095,DE +3279588096,3279588607,GB +3279588608,3279588863,DE +3279588864,3279589375,GB +3279589376,3279590399,DE +3279590400,3279590655,GB +3279590656,3279590935,DE +3279590936,3279591167,GB +3279591168,3279591935,DE +3279591936,3279592959,GB +3279592960,3279593215,DE +3279593216,3279593247,GB +3279593248,3279593267,DE +3279593268,3279593271,GB +3279593272,3279593275,DE +3279593276,3279593407,GB +3279593408,3279593440,DE +3279593441,3279593471,GB +3279593472,3279593487,DE +3279593488,3279593535,GB +3279593536,3279593567,DE +3279593568,3279595903,GB +3279595904,3279595999,DE +3279596000,3279596023,GB +3279596024,3279596031,DE +3279596032,3279596543,GB +3279596544,3279597311,DE +3279597312,3279600383,GB +3279600384,3279600479,DE +3279600480,3279600487,GB +3279600488,3279600639,DE +3279600640,3279601663,GB +3279601664,3279609855,CZ +3279609856,3279618047,RU +3279618048,3279683583,UA +3279683584,3279752959,DE +3279752960,3279753215,CH +3279753216,3279946751,DE +3279946752,3279947775,SE +3279947776,3279948799,NL +3279948800,3279949823,GB +3279949824,3279950847,UA +3279950848,3279951871,DE +3279951872,3279952895,IQ +3279952896,3279953919,PL +3279953920,3279955967,TR +3279955968,3279958015,DE +3279958016,3279972351,RU +3279972352,3279974399,AT +3279974400,3279976447,PL +3279976448,3279986687,RU +3279986688,3279987199,NL +3279987200,3279987711,RU +3279987712,3279988223,RO +3279988224,3279988735,RU +3279988736,3279989247,RO +3279989248,3279989759,AT +3279989760,3279990271,PL +3279990272,3279990783,DK +3279990784,3279991295,IL +3279991296,3279991807,UA +3279991808,3279992319,PL +3279992320,3279992831,UA +3279992832,3279993855,NL +3279993856,3279994367,RO +3279994368,3279994879,GB +3279994880,3280003071,CZ +3280003072,3280003583,BG +3280003584,3280004095,UA +3280004096,3280004607,PL +3280004608,3280005119,UA +3280005120,3280005631,HU +3280005632,3280006143,IT +3280006144,3280006655,DK +3280006656,3280007167,GB +3280007168,3280007679,SE +3280007680,3280008191,PL +3280008192,3280009215,RU +3280009216,3280009727,UA +3280009728,3280010239,GB +3280010240,3280010751,UA +3280010752,3280011263,TR +3280011264,3280011327,DE +3280011328,3280011391,NL +3280011408,3280011415,GB +3280011552,3280011567,GB +3280011648,3280011775,IT +3280011776,3280011783,NL +3280011784,3280011791,BE +3280011904,3280011951,BE +3280014592,3280015103,FR +3280015104,3280015359,GB +3280015872,3280016383,GB +3280016448,3280016463,BE +3280016544,3280016559,BE +3280016560,3280016575,GR +3280016576,3280016607,NO +3280016608,3280016623,CH +3280016960,3280016991,BE +3280016992,3280017023,FR +3280017024,3280017055,IT +3280017088,3280017151,IE +3280017920,3280018431,IT +3280018432,3280019455,GB +3280019712,3280020479,CH +3280020480,3280020735,IE +3280020736,3280020991,BE +3280020992,3280021087,GB +3280021120,3280021183,NL +3280021248,3280021503,CH +3280021760,3280021823,BE +3280022784,3280023039,IT +3280023552,3280024575,IT +3280024576,3280024831,SE +3280027136,3280027391,IE +3280027648,3280027903,CH +3280028160,3280028415,IT +3280028416,3280028671,BE +3280030208,3280030463,CH +3280031744,3280031999,IE +3280032128,3280032255,CH +3280035328,3280035583,CH +3280036608,3280036863,CH +3280037888,3280038399,CH +3280041472,3280041727,CH +3280076800,3280084991,GB +3280084992,3280093183,BA +3280093184,3280109567,GR +3280109568,3280117759,BE +3280117760,3280125951,CH +3280125952,3280126207,DE +3280126208,3280126463,IS +3280126464,3280126719,SI +3280126720,3280126975,IT +3280126976,3280127231,CH +3280127232,3280127487,PL +3280127488,3280127743,AT +3280128000,3280128255,SE +3280128256,3280128511,GB +3280128512,3280129023,HU +3280129024,3280129279,RU +3280129280,3280129535,LV +3280129536,3280129791,SA +3280129792,3280130047,FR +3280130048,3280130559,RU +3280130560,3280130815,GB +3280130816,3280131071,IS +3280131072,3280131327,PL +3280131328,3280131583,IT +3280131584,3280131839,RU +3280131840,3280132095,RO +3280132096,3280132351,RU +3280132352,3280132607,GB +3280132608,3280132863,CH +3280132864,3280133119,UA +3280133120,3280133375,IT +3280133376,3280133631,DE +3280133632,3280133887,FR +3280133888,3280134143,NL +3280134144,3280142335,IT +3280142336,3280144815,RU +3280144816,3280144823,RO +3280144824,3280207871,RU +3280207872,3280273407,FR +3280273408,3280338943,RU +3280338944,3280347135,GB +3280347136,3280355327,NO +3280355328,3280371711,GR +3280371712,3280379903,CH +3280379904,3280392127,FR +3280392128,3280392191,CH +3280392192,3280396287,FR +3280396288,3280404479,FI +3280404480,3280437247,IT +3280437248,3280453631,DE +3280453632,3280454655,RO +3280454656,3280455679,UA +3280455680,3280456703,IT +3280456704,3280457727,RU +3280457728,3280458751,GB +3280458752,3280459775,RU +3280459776,3280460799,DK +3280460800,3280462847,DE +3280463872,3280466943,RU +3280466944,3280467967,UA +3280468992,3280470015,CY +3280470016,3280535551,PL +3280535552,3280568319,GB +3280568320,3280576511,IT +3280576512,3280576767,BY +3280576768,3280577279,PL +3280577280,3280577535,DE +3280577536,3280577791,IL +3280577792,3280578047,NL +3280578048,3280578303,RO +3280578304,3280578559,UA +3280578560,3280578815,PL +3280578816,3280579071,NL +3280579072,3280579327,DE +3280579328,3280579583,RU +3280579584,3280579839,CH +3280579840,3280580095,HR +3280580096,3280580351,KW +3280580352,3280580607,CH +3280580608,3280580863,GB +3280580864,3280581119,DE +3280581120,3280581375,DK +3280581376,3280581631,EE +3280581632,3280581887,BY +3280581888,3280582143,FR +3280582144,3280582399,CZ +3280582400,3280582655,DK +3280582656,3280582911,FR +3280582912,3280583167,UA +3280583168,3280583423,RO +3280583424,3280583679,RU +3280583680,3280583935,PS +3280583936,3280584191,PL +3280584192,3280584447,RO +3280584448,3280584703,DE +3280584704,3280585215,UA +3280585216,3280585727,DK +3280585728,3280586239,UA +3280586240,3280586751,DE +3280586752,3280587263,RU +3280587264,3280587775,UA +3280587776,3280588287,RO +3280588288,3280588799,UA +3280588800,3280589311,PL +3280589312,3280590335,DE +3280590336,3280590847,NL +3280590848,3280591359,DE +3280591872,3280592383,GB +3280592384,3280592895,TR +3280592896,3280593407,DE +3280593408,3280593919,UA +3280593920,3280594431,LU +3280594432,3280594943,NL +3280594944,3280595455,UA +3280595456,3280595967,DE +3280595968,3280596479,DK +3280596480,3280596991,AT +3280596992,3280597503,UA +3280597504,3280598015,FR +3280598016,3280598527,UA +3280598528,3280599039,PL +3280599040,3280599551,FR +3280599552,3280600063,UA +3280600064,3280600575,BG +3280600576,3280601087,UA +3280601088,3280609279,PT +3280609280,3280617471,DE +3280617472,3280625663,UA +3280625664,3280633855,MD +3280633856,3280635807,BG +3280635808,3280635815,DE +3280635816,3280642047,BG +3280642048,3280650239,UA +3280650240,3280650495,RO +3280650496,3280650751,UA +3280650752,3280651263,GB +3280651264,3280651519,SI +3280651520,3280651775,FR +3280651776,3280652031,UA +3280652032,3280652287,NO +3280652288,3280652543,PL +3280652544,3280652799,SI +3280652800,3280653055,FR +3280653056,3280653311,CH +3280653312,3280653823,GB +3280653824,3280654079,RU +3280654080,3280654335,CH +3280654336,3280654591,PL +3280654592,3280654847,ES +3280654848,3280655103,RU +3280655104,3280655359,PL +3280655360,3280655615,SE +3280655872,3280656127,RO +3280656128,3280656639,CH +3280656640,3280657407,UA +3280657408,3280657663,RU +3280657664,3280657919,SE +3280657920,3280658175,RO +3280658176,3280658431,DE +3280658432,3280666623,GB +3280666624,3280732159,NO +3280732160,3280764927,DE +3280764928,3280765951,RU +3280765952,3280766975,DK +3280766976,3280767999,AT +3280768000,3280769023,FR +3280769024,3280770047,NL +3280770048,3280771071,FR +3280771072,3280772095,PL +3280772096,3280773119,ES +3280773120,3280774143,UA +3280774144,3280775167,ME +3280775168,3280776191,UA +3280776192,3280777215,SE +3280777216,3280778239,UA +3280778240,3280779263,RU +3280779264,3280780287,DE +3280780288,3280781311,PL +3280781312,3280782335,FI +3280782336,3280783359,TR +3280783360,3280784383,SE +3280784384,3280785407,RU +3280785408,3280787455,DE +3280787456,3280788479,GB +3280788480,3280789503,PL +3280789504,3280790527,UA +3280790528,3280791551,NL +3280791552,3280792575,DE +3280792576,3280793599,PL +3280793600,3280794623,NL +3280794624,3280795647,UA +3280795648,3280796671,MZ +3280796672,3280797695,CZ +3280797696,3280810783,CH +3280810784,3280810799,DE +3280810800,3280844292,CH +3280844293,3280844295,GB +3280844296,3280863231,CH +3280863232,3280928767,TR +3280928768,3280994303,DE +3280994304,3280994559,GB +3280994560,3280994815,RU +3280994816,3280995071,NL +3280995072,3280995327,DE +3280995328,3280995583,SE +3280995584,3280995839,GB +3280995840,3280996095,RU +3280996096,3280996351,CH +3280996352,3280996607,GB +3280996608,3280996863,PL +3280996864,3280997119,NL +3280997120,3280997375,FR +3280997376,3280997631,BE +3280997632,3280997887,SE +3280997888,3280998143,UA +3280998144,3280998399,DE +3280998400,3280998655,GR +3280998656,3280999423,GB +3280999424,3280999679,HU +3280999680,3280999935,UA +3280999936,3281000447,DE +3281000448,3281000703,FR +3281000704,3281000959,UA +3281001216,3281001471,RO +3281001472,3281001727,UA +3281001728,3281001983,RU +3281001984,3281002239,CH +3281002240,3281002495,DE +3281002496,3281010687,CH +3281010688,3281018879,BE +3281018880,3281027071,CZ +3281027080,3281027087,GB +3281027136,3281027151,GB +3281027200,3281027215,GB +3281027280,3281027287,GB +3281027304,3281027311,GB +3281027320,3281027327,GB +3281027584,3281027615,GB +3281027632,3281027679,GB +3281027696,3281027743,GB +3281027776,3281027807,GB +3281027840,3281027903,GB +3281028064,3281028223,GB +3281028992,3281029055,GB +3281030400,3281035263,GB +3281035264,3281043455,CH +3281043456,3281059839,RU +3281059840,3281074671,DE +3281074672,3281074679,ES +3281074680,3281093951,DE +3281093952,3281093983,US +3281093984,3281103935,DE +3281103936,3281103943,AT +3281103944,3281104127,DE +3281104128,3281104383,FR +3281104384,3281110015,DE +3281110016,3281110023,BE +3281110024,3281113703,DE +3281113704,3281113711,BE +3281113712,3281125375,DE +3281125376,3281133567,SK +3281133568,3281141759,IR +3281141760,3281149951,RU +3281149952,3281158143,CZ +3281158144,3281166335,SK +3281166336,3281174527,GB +3281174528,3281190911,FR +3281190912,3281256447,GB +3281256448,3281321983,FI +3281321984,3281338367,GB +3281338368,3281338623,PL +3281338624,3281338879,SA +3281338880,3281339135,FR +3281339136,3281339391,RO +3281339392,3281339647,PL +3281339648,3281339903,GB +3281339904,3281340159,UA +3281340416,3281340927,RO +3281340928,3281341183,DE +3281341184,3281341439,AT +3281341440,3281341695,DE +3281341696,3281341951,PL +3281341952,3281342207,DK +3281342464,3281343231,DE +3281343232,3281343487,FI +3281343488,3281343743,GB +3281343744,3281343999,TR +3281344000,3281344255,PL +3281344256,3281344511,RU +3281344512,3281344767,UA +3281344768,3281345023,RU +3281345024,3281345279,UA +3281345280,3281345535,SA +3281345536,3281345791,CH +3281345792,3281346047,RU +3281346048,3281346303,SI +3281346304,3281346559,PL +3281346560,3281346815,UA +3281346816,3281347071,DE +3281347072,3281347327,PL +3281347328,3281347583,DE +3281347584,3281347839,PL +3281347840,3281348095,SE +3281348096,3281348351,DE +3281348352,3281348607,GB +3281348608,3281349119,RU +3281349120,3281349375,UA +3281349376,3281349631,NL +3281349632,3281350143,UA +3281350144,3281350655,RU +3281350656,3281350911,UA +3281350912,3281351167,ES +3281351168,3281351423,UA +3281351424,3281351679,AT +3281351680,3281351935,TR +3281351936,3281352191,DE +3281352192,3281352447,PL +3281352448,3281352703,RO +3281352704,3281352959,DE +3281352960,3281353215,GB +3281353216,3281353471,DE +3281353472,3281353727,SE +3281353728,3281353983,PL +3281353984,3281354239,UA +3281354240,3281354751,GB +3281354752,3281359071,SE +3281359072,3281359103,AN +3281359104,3281371135,SE +3281373184,3281375231,RU +3281375232,3281377279,ES +3281377280,3281379327,AT +3281379328,3281383423,PL +3281383424,3281385471,AT +3281385472,3281387519,BG +3281387520,3281453055,PL +3281453056,3281470975,RU +3281470976,3281471231,UZ +3281471232,3281518591,RU +3281518592,3281578431,GB +3281578432,3281578447,IE +3281578448,3281640959,GB +3281640960,3281640983,SE +3281640984,3281641023,GB +3281641024,3281641039,SE +3281641040,3281641087,GB +3281641088,3281641119,SE +3281641120,3281649663,GB +3281649664,3281699999,FR +3281700000,3281700031,US +3281700032,3281703551,FR +3281703552,3281703615,US +3281703616,3281706687,FR +3281706688,3281706719,US +3281706720,3281710799,FR +3281710800,3281710815,US +3281710816,3281711487,FR +3281711488,3281711519,BE +3281711520,3281712127,FR +3281712128,3281712159,US +3281712160,3281712191,FR +3281712192,3281712255,US +3281712256,3281712831,FR +3281712832,3281712895,US +3281712896,3281715199,FR +3281715200,3281780735,TR +3281780736,3281846271,FI +3281846272,3281911807,GB +3281911808,3281919999,UZ +3281920000,3281928191,DE +3281928192,3281944575,MT +3281944576,3281960959,DE +3281960960,3281969151,JO +3281969152,3281969663,RU +3281969664,3281970175,PL +3281970176,3281970687,RU +3281970688,3281971199,CH +3281971200,3281971711,RU +3281971712,3281972223,RO +3281972224,3281972735,DE +3281972736,3281973247,RU +3281973248,3281973759,FR +3281973760,3281974271,DK +3281974272,3281974783,RU +3281974784,3281975295,PL +3281975296,3281976319,RU +3281976320,3281976831,DE +3281976832,3281977343,RU +3281977344,3281999095,NO +3281999096,3281999103,US +3281999104,3282042879,NO +3282042880,3282083839,CH +3282083840,3282084351,DE +3282084352,3282084863,RO +3282085376,3282085887,BE +3282085888,3282086399,DE +3282086400,3282086911,LV +3282086912,3282087423,DE +3282087424,3282087935,PL +3282087936,3282088447,SE +3282088448,3282089471,PL +3282089472,3282089983,SK +3282089984,3282090495,PL +3282090496,3282091007,GB +3282091008,3282091519,FR +3282091520,3282092031,CH +3282092032,3282093055,UA +3282093056,3282095103,DE +3282096128,3282097151,IT +3282097152,3282098175,GB +3282098176,3282099199,NL +3282099200,3282100223,UA +3282100224,3282101247,ES +3282101248,3282102271,DE +3282102272,3282103295,UA +3282103296,3282104319,GB +3282104320,3282105343,IL +3282105344,3282106367,RU +3282106368,3282107391,DE +3282107392,3282108415,NL +3282108416,3282119423,RU +3282119424,3282119679,KZ +3282119680,3282149455,RU +3282149456,3282149471,KG +3282149472,3282149599,RU +3282149600,3282149631,GB +3282149632,3282173951,RU +3282173952,3282174463,UA +3282174464,3282174975,GB +3282174976,3282177023,RU +3282177024,3282177535,GB +3282177536,3282178047,KZ +3282178048,3282178559,PL +3282178560,3282179071,ES +3282179072,3282179583,GB +3282179584,3282180095,RU +3282180096,3282180607,PL +3282180608,3282181119,KZ +3282181120,3282181631,GB +3282181632,3282182143,DE +3282182144,3282190335,RU +3282190336,3282194431,SE +3282198528,3282206719,GB +3282206720,3282223103,CH +3282223104,3282231295,BE +3282231296,3282239487,DE +3282239488,3282242223,SE +3282242224,3282242227,NO +3282242228,3282284543,SE +3282284544,3282284559,FI +3282284560,3282284567,SE +3282284568,3282284575,FR +3282284576,3282284579,SE +3282284580,3282284591,FI +3282284592,3282284595,FR +3282284596,3282284599,SE +3282284600,3282284603,FR +3282284604,3282284687,SE +3282284688,3282284703,FI +3282284704,3282284735,SE +3282284736,3282284783,FI +3282284784,3282286975,SE +3282286976,3282287007,FI +3282287008,3282287615,SE +3282287616,3282287759,FI +3282287760,3282305023,SE +3282305024,3282370559,PL +3282370560,3282388175,FI +3282388176,3282388191,SE +3282388192,3282390015,FI +3282390016,3282390271,NL +3282390272,3282416383,FI +3282416384,3282416511,RU +3282416512,3282429279,FI +3282429280,3282429311,SE +3282429312,3282429343,NO +3282429344,3282436095,FI +3282436096,3282444159,GB +3282444160,3282444223,US +3282444224,3282449023,GB +3282449024,3282449151,NL +3282449152,3282452479,GB +3282452480,3282452735,DE +3282452736,3282456023,GB +3282456024,3282456031,IT +3282456032,3282461439,GB +3282461440,3282461695,CH +3282461696,3282464767,GB +3282464768,3282465023,SE +3282465024,3282465279,DE +3282465280,3282465535,IT +3282465536,3282466047,GB +3282466048,3282466111,US +3282466112,3282466643,GB +3282466644,3282466655,IT +3282466656,3282466687,GB +3282466688,3282466727,IT +3282466728,3282466815,GB +3282466816,3282467071,US +3282467072,3282467327,GB +3282467328,3282467359,DE +3282467360,3282477055,GB +3282477056,3282485247,RU +3282485248,3282493439,GI +3282501632,3282534399,GR +3282534400,3282550783,GB +3282550784,3282554879,FR +3282554880,3282558975,DE +3282558976,3282563071,FR +3282563072,3282567167,GB +3282567168,3282632703,SK +3282632704,3282698239,NL +3282698240,3282706431,GR +3282706432,3282714623,RU +3282714624,3282722815,AT +3282722816,3282731007,DE +3282731008,3282739199,FI +3282739200,3282739455,CH +3282739456,3282739711,RO +3282739712,3282739967,FR +3282740224,3282740479,FR +3282740480,3282740735,AT +3282740736,3282740991,BG +3282740992,3282741247,DE +3282741248,3282741503,PT +3282741504,3282741759,GB +3282741760,3282742015,ES +3282742016,3282742527,RO +3282742528,3282742783,GB +3282742784,3282743039,RU +3282743040,3282743295,CH +3282743296,3282743551,CY +3282743552,3282743807,SI +3282743808,3282744063,MD +3282744064,3282744319,UA +3282744320,3282744575,SA +3282744576,3282745087,PL +3282745088,3282745343,CS +3282745344,3282745599,HU +3282745600,3282746111,DE +3282746112,3282746367,SE +3282746368,3282746623,PL +3282746624,3282746879,SE +3282746880,3282747135,RO +3282747136,3282747391,PL +3282747392,3282763775,RU +3282763776,3282772991,GB +3282772992,3282773119,BE +3282773120,3282805727,GB +3282805728,3282805759,IE +3282805760,3282952191,GB +3282952192,3282960383,NL +3282960384,3283091455,TR +3283091456,3283156991,CH +3283156992,3283158215,DE +3283158216,3283158219,EE +3283158220,3283160171,DE +3283160172,3283160175,BE +3283160176,3283173375,DE +3283173376,3283174399,PL +3283174400,3283176447,UA +3283176448,3283177471,GB +3283177472,3283178495,BE +3283178496,3283179519,PL +3283179520,3283180543,LU +3283180544,3283181567,UA +3283181568,3283182591,NO +3283182592,3283183615,PL +3283183616,3283184639,RU +3283184640,3283185663,IL +3283185664,3283187711,UA +3283187712,3283188735,RU +3283188736,3283189759,UA +3283189760,3283206143,DE +3283206144,3283206655,GB +3283206656,3283207167,SA +3283207168,3283207679,PL +3283207680,3283208191,AT +3283208192,3283208703,DE +3283208704,3283209215,NO +3283209216,3283209727,RU +3283209728,3283210239,TR +3283210240,3283210751,UA +3283210752,3283211263,PL +3283211264,3283211775,GB +3283211776,3283212287,NL +3283212288,3283212799,RU +3283212800,3283213311,BG +3283213312,3283213823,ES +3283213824,3283214335,UA +3283214336,3283214847,RO +3283214848,3283215359,RU +3283215360,3283215871,AT +3283215872,3283216383,TR +3283216384,3283216895,DE +3283216896,3283217407,CH +3283217408,3283218943,UA +3283218944,3283219455,NL +3283219456,3283219967,GB +3283219968,3283220479,BE +3283220480,3283220991,BG +3283220992,3283221503,AT +3283221504,3283222015,GB +3283222016,3283222527,DE +3283230720,3283232767,CS +3283232768,3283232895,RS +3283232896,3283233023,CS +3283233024,3283233279,CS +3283233280,3283233343,RS +3283233344,3283233479,CS +3283233480,3283233483,RS +3283233484,3283234815,CS +3283234816,3283235071,CS +3283235072,3283235199,RS +3283235200,3283235223,CS +3283235224,3283235227,RS +3283235228,3283235275,CS +3283235276,3283235279,RS +3283235280,3283235303,CS +3283235304,3283235311,RS +3283235312,3283235319,CS +3283235320,3283235327,RS +3283235328,3283235519,CS +3283235520,3283235535,RS +3283235536,3283235647,CS +3283235648,3283235655,RS +3283235656,3283235871,CS +3283235872,3283235875,RS +3283235876,3283235879,CS +3283235880,3283235883,RS +3283235884,3283235891,CS +3283235892,3283235895,RS +3283235896,3283235991,CS +3283235992,3283236007,RS +3283236008,3283236063,CS +3283236064,3283236071,RS +3283236072,3283236159,CS +3283236160,3283236183,RS +3283236184,3283236895,CS +3283236896,3283236903,RS +3283236904,3283236911,CS +3283236912,3283236919,RS +3283236920,3283237103,CS +3283237104,3283237119,RS +3283237120,3283237279,CS +3283237280,3283237283,RS +3283237284,3283237349,CS +3283237350,3283237351,RS +3283237352,3283237631,CS +3283237632,3283237887,RS +3283237888,3283238335,CS +3283238336,3283238399,CS +3283238400,3283238463,RS +3283238464,3283238479,CS +3283238480,3283238495,CS +3283238496,3283238511,RS +3283238512,3283238527,CS +3283238528,3283238623,CS +3283238624,3283238655,CS +3283238656,3283238671,CS +3283238672,3283238687,CS +3283238688,3283238719,CS +3283238720,3283238783,CS +3283238784,3283238911,CS +3283238912,3283247103,CZ +3283247104,3283247615,LV +3283247616,3283248127,BG +3283248128,3283248639,DE +3283248640,3283249151,RO +3283249152,3283249663,UA +3283249664,3283250175,GB +3283250176,3283250687,RU +3283250688,3283251199,RO +3283251200,3283251711,FR +3283251712,3283252223,PL +3283252224,3283252735,BG +3283252736,3283253247,SI +3283253248,3283253759,RO +3283253760,3283254271,PL +3283254272,3283255295,RO +3283255296,3283263487,UA +3283263488,3283271679,SE +3283271680,3283279871,RU +3283279872,3283288063,SE +3283288064,3283288575,DE +3283288576,3283288579,BE +3283288580,3283291999,DE +3283292000,3283292015,CH +3283292016,3283305087,DE +3283305088,3283305127,FR +3283305128,3283321087,DE +3283321088,3283321119,GB +3283321120,3283419135,DE +3283419136,3283484671,DK +3283484672,3283484927,UA +3283484928,3283485183,NL +3283485184,3283485439,DE +3283485440,3283485695,UA +3283485696,3283485951,GB +3283485952,3283486207,SE +3283486208,3283486463,AT +3283486464,3283486719,UA +3283486720,3283486975,RU +3283486976,3283487231,PL +3283487488,3283487743,DE +3283487744,3283487999,CH +3283488256,3283488511,PL +3283488512,3283488767,RU +3283488768,3283489279,FR +3283489280,3283489535,DE +3283489536,3283490047,PL +3283490048,3283490559,UA +3283490560,3283490815,PL +3283490816,3283491071,CH +3283491072,3283491327,TR +3283491328,3283491583,AT +3283491584,3283491839,RO +3283491840,3283492095,RU +3283492096,3283492351,AT +3283492352,3283492607,ES +3283492608,3283492863,SA +3283492864,3283493119,DK +3283493120,3283493375,IL +3283493376,3283493887,PL +3283493888,3283494143,DK +3283494144,3283494399,GB +3283494400,3283494655,PL +3283494656,3283494911,DK +3283494912,3283495167,PL +3283495168,3283495423,BG +3283495424,3283495679,TR +3283495680,3283495935,NL +3283495936,3283496191,BG +3283496192,3283496447,DE +3283496448,3283496703,FR +3283496704,3283496959,LV +3283496960,3283497215,DE +3283497216,3283497471,GB +3283497472,3283497727,DE +3283497728,3283498239,PL +3283498240,3283498495,CH +3283498496,3283498751,PL +3283498752,3283499007,AT +3283499008,3283499263,DE +3283499264,3283499519,GB +3283499520,3283499775,DE +3283499776,3283500031,GB +3283500032,3283500287,DE +3283500288,3283500543,SI +3283500544,3283500799,GB +3283500800,3283501055,UA +3283501056,3283509247,LT +3283509248,3283513375,DE +3283513408,3283513415,DE +3283513432,3283513435,DE +3283513448,3283513855,DE +3283513984,3283514095,DE +3283514112,3283514495,DE +3283514528,3283514547,DE +3283514552,3283516415,DE +3283516736,3283516863,DE +3283516992,3283517055,DE +3283517184,3283517439,DE +3283517440,3283525631,RU +3283525632,3283533823,GB +3283533824,3283534847,UA +3283534848,3283535359,DE +3283535360,3283535871,RO +3283535872,3283536383,GI +3283536384,3283536895,UA +3283536896,3283537407,DK +3283537408,3283537919,PL +3283537920,3283538431,RO +3283538432,3283538943,IT +3283538944,3283539455,RO +3283539968,3283540479,DK +3283540480,3283540991,PL +3283540992,3283541503,RO +3283541504,3283542015,CH +3283542016,3283550207,IT +3283550208,3283550239,AT +3283550288,3283550335,AT +3283550464,3283550623,AT +3283550624,3283550655,FR +3283550656,3283550719,GB +3283550720,3283552255,AT +3283552256,3283552279,IT +3283552288,3283552319,IT +3283552352,3283552415,IT +3283552448,3283552495,IT +3283552512,3283552575,IT +3283552576,3283552639,DE +3283552640,3283552671,IT +3283552672,3283552703,CH +3283552704,3283552735,DE +3283552736,3283552751,FR +3283552752,3283553047,IT +3283553048,3283553055,GB +3283553056,3283553071,ZA +3283553072,3283553079,SE +3283553080,3283553119,DE +3283553120,3283553151,GR +3283553152,3283553279,GB +3283553280,3283553535,IT +3283553792,3283554047,GB +3283554048,3283554079,IT +3283554080,3283554095,ES +3283554096,3283554111,NL +3283554112,3283554175,IT +3283554176,3283554239,FR +3283554240,3283554255,ZA +3283554256,3283554271,RU +3283554272,3283554303,GB +3283554304,3283554327,CH +3283554336,3283554367,CH +3283554432,3283555743,CH +3283555744,3283555759,SE +3283555760,3283555775,DE +3283555776,3283555807,NL +3283555808,3283555839,DE +3283555840,3283556351,CH +3283556352,3283556623,FR +3283556672,3283556735,FR +3283556864,3283558303,FR +3283558304,3283558335,DE +3283558336,3283558367,IT +3283558368,3283558383,ZA +3283558384,3283558399,GB +3283558400,3283558431,RU +3283558432,3283558463,DE +3283558464,3283558535,RU +3283558656,3283558751,FR +3283558752,3283558783,BE +3283558784,3283558799,GB +3283558800,3283558815,BE +3283558816,3283558847,NL +3283558848,3283558863,ZA +3283558864,3283558871,GB +3283558872,3283558879,ZA +3283558880,3283558895,GB +3283558896,3283558911,BE +3283558912,3283559039,DE +3283559040,3283559167,IE +3283559168,3283559231,DE +3283559232,3283559263,GB +3283559264,3283559295,ZA +3283559296,3283559423,DE +3283559424,3283559679,NL +3283559680,3283559935,IT +3283559936,3283560191,GB +3283560192,3283560447,NO +3283560704,3283560847,ZA +3283560864,3283560895,SE +3283560896,3283560959,GB +3283560960,3283561215,BE +3283561376,3283561407,GB +3283561408,3283561471,ES +3283561472,3283562495,GB +3283562496,3283562751,DE +3283562752,3283562895,GB +3283562896,3283562903,NL +3283562904,3283562911,CH +3283562912,3283562943,DE +3283562944,3283563007,IT +3283563008,3283566015,GB +3283566016,3283566079,ZA +3283566080,3283566591,GB +3283566592,3283566719,PL +3283566848,3283567103,NO +3283567104,3283567423,GB +3283567424,3283567455,DE +3283567456,3283567471,GB +3283567472,3283567487,ES +3283567488,3283567615,ZA +3283567616,3283567967,GB +3283567968,3283567999,IT +3283568000,3283568031,GB +3283568032,3283568063,DE +3283568064,3283568079,NL +3283568080,3283568095,ZA +3283568096,3283568127,DK +3283568128,3283569991,GB +3283569992,3283570015,SE +3283570016,3283570047,DK +3283570048,3283570175,DE +3283570176,3283570439,GB +3283570440,3283570447,SE +3283570448,3283570463,IT +3283570464,3283570495,GB +3283570496,3283570559,DE +3283570560,3283570623,FR +3283570624,3283571167,GB +3283571168,3283571199,DE +3283571200,3283571711,GB +3283571712,3283571719,HU +3283571744,3283571775,DE +3283571776,3283571839,GB +3283571840,3283571903,SE +3283571904,3283571967,DE +3283571968,3283572111,GB +3283572112,3283572127,BE +3283572128,3283572159,SE +3283572160,3283572175,GB +3283572176,3283572191,ZA +3283572192,3283572223,CH +3283572224,3283572615,GB +3283572616,3283572623,FR +3283572624,3283572631,GB +3283572632,3283572639,CH +3283572640,3283572671,GB +3283572672,3283572735,DE +3283573248,3283574527,GB +3283574592,3283574607,GB +3283574608,3283574615,NL +3283574616,3283574623,GB +3283574624,3283574639,ZA +3283574640,3283574655,GB +3283574656,3283575071,DE +3283575072,3283575087,NL +3283575088,3283575679,DE +3283575808,3283576415,DE +3283576416,3283576447,ZA +3283576448,3283580159,DE +3283580416,3283580455,DE +3283580464,3283582975,DE +3283582976,3283583039,ZA +3283583072,3283583359,ZA +3283583488,3283583503,ZA +3283583520,3283583615,ZA +3283583744,3283583839,ZA +3283583840,3283583847,IT +3283583848,3283583871,GB +3283583872,3283583999,BE +3283584000,3283584031,ZA +3283584032,3283584063,DE +3283584064,3283584127,IE +3283584128,3283585023,ZA +3283585032,3283585039,ES +3283585056,3283585279,ES +3283585280,3283585535,ZA +3283585536,3283585679,ES +3283585680,3283585695,IE +3283585696,3283585727,FR +3283585728,3283585791,ES +3283585792,3283586047,IE +3283586048,3283586335,ES +3283586344,3283586351,ES +3283586368,3283586407,ES +3283586416,3283586503,ES +3283586560,3283586815,FR +3283586816,3283587071,DE +3283587072,3283587231,NL +3283587328,3283587335,NL +3283587336,3283587343,GB +3283587344,3283587359,NL +3283587360,3283587391,SE +3283587392,3283587423,NL +3283587424,3283587431,SE +3283587440,3283587447,GB +3283587448,3283587455,DE +3283587456,3283587487,CH +3283587520,3283587551,CH +3283587584,3283587647,NL +3283587648,3283587679,DE +3283587680,3283587711,CH +3283587712,3283587839,DE +3283587840,3283587871,NL +3283587872,3283587887,ZA +3283587888,3283587895,SE +3283587896,3283587903,CH +3283587904,3283587967,IE +3283587968,3283588095,DE +3283588096,3283588191,BE +3283588224,3283588479,BE +3283588480,3283588543,AT +3283588544,3283588607,GB +3283588608,3283589119,BE +3283589152,3283589791,DK +3283589792,3283589823,DE +3283589840,3283589887,DE +3283589888,3283590143,DK +3283590144,3283590151,SE +3283590160,3283590167,SE +3283590176,3283590207,SE +3283590224,3283590231,SE +3283590272,3283590311,SE +3283590336,3283590351,SE +3283590368,3283590527,SE +3283590528,3283590543,ZA +3283590544,3283590591,DE +3283590592,3283590623,CH +3283590624,3283590655,GB +3283590656,3283590847,SE +3283590848,3283590879,ZA +3283590880,3283590911,DE +3283590912,3283591167,SE +3283591168,3283591359,DE +3283591360,3283591367,GB +3283591368,3283591375,ZA +3283591376,3283591423,CH +3283591424,3283592191,DE +3283592192,3283592847,CH +3283592848,3283592863,GB +3283592864,3283592895,DE +3283592896,3283592903,SE +3283592904,3283592911,GB +3283592912,3283592927,ZA +3283592928,3283593023,CH +3283593024,3283593055,BE +3283593056,3283593087,IT +3283593088,3283593215,CH +3283593216,3283595263,IT +3283595264,3283596287,DE +3283596288,3283598127,GB +3283598144,3283598175,DE +3283598208,3283598335,DE +3283598336,3283598639,GB +3283598640,3283598655,CH +3283598656,3283598687,IE +3283598688,3283598719,SE +3283598720,3283598735,DE +3283598736,3283598743,DK +3283598744,3283598847,DE +3283598848,3283598879,GB +3283598880,3283598911,CH +3283598912,3283598975,GB +3283598976,3283599103,DK +3283599104,3283599295,GB +3283599296,3283599311,DE +3283599312,3283599327,NL +3283599328,3283599359,GB +3283599360,3283599615,SE +3283599616,3283599871,IE +3283599872,3283600527,ZA +3283600528,3283600543,FR +3283600544,3283600575,DE +3283600576,3283600607,IT +3283600640,3283600671,ZA +3283600672,3283600703,DE +3283600704,3283600767,IT +3283600768,3283600895,ZA +3283600896,3283601343,AT +3283601344,3283601375,IT +3283601376,3283601391,IE +3283601392,3283601399,NL +3283601400,3283601919,AT +3283601920,3283602239,ZA +3283602240,3283602271,GB +3283602272,3283602287,IT +3283602288,3283602303,ZA +3283602304,3283602367,GB +3283602368,3283602431,BE +3283602432,3283602943,ZA +3283602944,3283603007,CH +3283603008,3283603071,IT +3283603072,3283603199,CH +3283603456,3283604479,GB +3283604736,3283605503,GB +3283605504,3283606783,DE +3283606784,3283607359,BE +3283607360,3283607423,NO +3283607424,3283607551,AT +3283607552,3283608575,BE +3283608576,3283608831,DE +3283608896,3283608959,DE +3283608960,3283609087,IT +3283609088,3283610783,DE +3283610784,3283610815,CH +3283610816,3283610879,TR +3283610880,3283611903,DE +3283611904,3283613247,IT +3283613248,3283613311,DE +3283613312,3283613695,IT +3283613696,3283614079,CH +3283614080,3283614207,FR +3283614208,3283614975,CH +3283615232,3283615743,CH +3283615744,3283623935,HU +3283623936,3283632127,DK +3283632128,3283632639,NL +3283632640,3283633151,GB +3283633152,3283633663,SE +3283633664,3283634175,UA +3283634176,3283635199,RU +3283635200,3283635711,GB +3283635712,3283636223,RU +3283636224,3283636735,UA +3283636736,3283637247,PL +3283637248,3283637759,FR +3283637760,3283638271,UA +3283638272,3283638783,PL +3283638784,3283639295,RU +3283639296,3283639807,CH +3283639808,3283640319,DE +3283640320,3283648511,DK +3283648512,3283649023,BE +3283649024,3283649535,GB +3283649536,3283649791,DE +3283649792,3283650047,FR +3283650048,3283650559,DE +3283650560,3283650687,SE +3283650688,3283650815,CH +3283650816,3283650879,SE +3283650880,3283650911,GB +3283650912,3283650927,SE +3283650928,3283650943,GB +3283650944,3283650959,RU +3283650960,3283650975,CH +3283650976,3283651071,GB +3283651072,3283651135,IT +3283651136,3283651167,BE +3283651168,3283651183,ES +3283651184,3283651199,BE +3283651200,3283651263,HU +3283651264,3283651327,ZA +3283651328,3283651423,BE +3283651424,3283651439,DE +3283651440,3283651463,BE +3283651464,3283651471,DE +3283651472,3283651487,BE +3283651488,3283651519,FR +3283651520,3283651583,IL +3283651584,3283651591,GB +3283651592,3283651599,BE +3283651600,3283651615,DE +3283651616,3283651647,BE +3283651648,3283651663,SE +3283651664,3283651671,RO +3283651672,3283651687,BE +3283651688,3283651695,IT +3283651696,3283651711,GB +3283651712,3283651727,CH +3283651728,3283651735,FR +3283651736,3283651743,CH +3283651744,3283651775,FR +3283651776,3283651839,SE +3283651840,3283651967,NL +3283651968,3283652031,DK +3283652032,3283652063,DE +3283652064,3283652071,BE +3283652072,3283652079,GB +3283652080,3283652095,BE +3283652096,3283652351,GB +3283652352,3283652479,IT +3283652480,3283652519,BE +3283652520,3283652527,SE +3283652528,3283652543,BE +3283652544,3283652575,FR +3283652576,3283652607,DE +3283652608,3283652863,NO +3283652864,3283653055,BE +3283653056,3283653087,DE +3283653088,3283653103,GR +3283653104,3283653119,DE +3283653120,3283653247,BE +3283653248,3283653311,NO +3283653312,3283653503,BE +3283653504,3283653631,GB +3283653632,3283653887,FR +3283653888,3283654015,SE +3283654016,3283654143,FR +3283654144,3283654399,DE +3283654400,3283654655,CH +3283654656,3283654911,DK +3283654912,3283655039,BE +3283655040,3283655167,DK +3283655168,3283655295,DE +3283655296,3283655423,BE +3283655424,3283655679,FR +3283655680,3283655935,ES +3283655936,3283656191,ZA +3283656192,3283656223,GB +3283656224,3283656255,BE +3283656256,3283656271,GB +3283656272,3283656303,BE +3283656304,3283656311,GB +3283656312,3283656447,BE +3283656448,3283656559,ES +3283656560,3283656575,FR +3283656576,3283656591,BE +3283656592,3283656599,FR +3283656600,3283656703,BE +3283656704,3283664895,HU +3283664896,3283673087,UA +3283673088,3283681279,GB +3283681280,3283729023,DE +3283729024,3283729151,US +3283729152,3283746815,DE +3283746816,3283812351,CH +3283812352,3283877887,PL +3283877888,3283943423,GB +3283943424,3283944447,CZ +3283944448,3283945471,AT +3283945472,3283946495,UA +3283946496,3283947519,GB +3283947520,3283948543,UA +3283948544,3283949567,NL +3283949568,3283950591,SE +3283950592,3283951615,KZ +3283951616,3283952639,PL +3283952640,3283953663,UA +3283953664,3283954687,PL +3283954688,3283956735,UA +3283956736,3283957759,PL +3283957760,3283958783,GR +3283958784,3283959807,UA +3283959808,3283960831,FR +3283960832,3283961855,KZ +3283961856,3283962879,RU +3283962880,3283963903,PL +3283963904,3283964927,RU +3283964928,3283965951,FR +3283965952,3283966975,RU +3283966976,3283967999,DE +3283968000,3283969023,UA +3283969024,3283970047,RU +3283970048,3283971071,UA +3283971072,3283972095,RU +3283972096,3283973119,SE +3283973120,3283974143,NL +3283974144,3283975167,RU +3283975168,3283976191,NL +3283976192,3283976703,IE +3283976704,3283977215,DK +3283977216,3283977727,UA +3283977728,3283978751,RU +3283978752,3283979263,RO +3283979264,3283979775,IL +3283979776,3283980287,NO +3283980288,3283980799,RO +3283980800,3283981823,CH +3283981824,3283983359,RO +3283983360,3283983871,CY +3283983872,3283984383,GB +3283984384,3283984895,SE +3283984896,3283985407,GR +3283985408,3283985919,RO +3283985920,3283986431,PL +3283986432,3283986943,RU +3283986944,3283987455,AT +3283987456,3283987967,GB +3283987968,3283988991,RO +3283988992,3283989503,FR +3283990016,3283990527,SE +3283990528,3283991551,RO +3283991552,3283992063,SE +3283992064,3283992575,RO +3283993088,3283993599,RO +3283993600,3283994111,UA +3283994112,3283994623,AT +3283994624,3283995135,UA +3283995136,3283995647,BE +3283995648,3283996159,CH +3283996160,3283996671,MK +3283996672,3283997183,RO +3283997184,3283997695,PS +3283997696,3283998207,SA +3283998208,3283998719,UA +3283998720,3283999231,NL +3283999232,3283999743,RU +3283999744,3284000255,GB +3284000256,3284000767,RU +3284000768,3284001279,BG +3284001280,3284002303,UA +3284002304,3284002815,PL +3284002816,3284003327,DK +3284003328,3284003839,UA +3284003840,3284004351,DE +3284004352,3284004863,RU +3284004864,3284005375,UA +3284005376,3284005887,NL +3284005888,3284006399,DE +3284006400,3284007423,UA +3284007424,3284007935,RO +3284007936,3284008447,CH +3284008448,3284008959,NO +3284008960,3284009215,NL +3284009216,3284009471,PL +3284009472,3284009727,DE +3284009728,3284009983,FR +3284009984,3284010239,CH +3284010240,3284010751,FR +3284010752,3284011519,DE +3284011520,3284011775,HR +3284011776,3284012031,DE +3284012032,3284012287,RU +3284012288,3284012543,UA +3284012544,3284012799,RU +3284012800,3284013311,AT +3284013312,3284013567,PL +3284013568,3284013823,DK +3284013824,3284014079,IL +3284014080,3284014335,TR +3284014336,3284014591,IT +3284014592,3284014847,GB +3284014848,3284015103,IL +3284015104,3284015359,US +3284015360,3284015615,DK +3284015616,3284015871,AT +3284015872,3284016127,FR +3284016128,3284016383,NL +3284016384,3284016639,CH +3284016640,3284017151,DK +3284017152,3284025343,GR +3284025344,3284033535,DE +3284033536,3284041727,RU +3284041728,3284041983,DK +3284041984,3284042239,SI +3284042240,3284042495,GB +3284042496,3284042751,AT +3284042752,3284043007,GB +3284043008,3284043263,DE +3284043264,3284043519,EE +3284043520,3284043775,DE +3284043776,3284044031,HR +3284044032,3284044287,FR +3284044288,3284044799,DE +3284044800,3284045055,CH +3284045056,3284045311,LT +3284045312,3284045567,DE +3284045568,3284045823,AT +3284045824,3284046079,UA +3284046080,3284046335,DE +3284046336,3284046591,NL +3284046592,3284046847,SE +3284046848,3284047103,DE +3284047104,3284047359,DK +3284047360,3284047615,DE +3284047616,3284047871,NL +3284048128,3284048383,DK +3284048384,3284048639,GB +3284048640,3284049151,FR +3284049152,3284049407,UA +3284049408,3284049663,SI +3284049664,3284049919,RO +3284049920,3284058111,CH +3284058112,3284066303,SE +3284066304,3284074495,NL +3284140032,3284205567,DK +3284205568,3284271103,NL +3284271104,3284402175,GB +3284402176,3284467711,SE +3284467712,3284531775,FI +3284531776,3284531779,NL +3284531780,3284533247,FI +3284533248,3284598783,SE +3284598784,3284664319,HU +3284664320,3284672511,GB +3284672512,3284680703,DE +3284680704,3284681215,UA +3284681216,3284681727,RO +3284681728,3284682239,FI +3284682240,3284682751,DE +3284682752,3284683263,SE +3284683264,3284683775,KZ +3284683776,3284684287,GB +3284684288,3284684799,FR +3284684800,3284685311,DE +3284685312,3284685823,NL +3284685824,3284686335,US +3284686336,3284686847,RO +3284686848,3284687359,PL +3284687360,3284687871,UA +3284687872,3284688383,NG +3284688384,3284688895,RU +3284688896,3284697087,FR +3284697088,3284705279,GB +3284705280,3284713471,FR +3284713472,3284713727,DE +3284713728,3284713983,GR +3284713984,3284714239,DE +3284714240,3284714495,FR +3284714496,3284714751,UA +3284714752,3284715007,AT +3284715008,3284715263,GB +3284715264,3284715519,PL +3284715520,3284715775,RO +3284715776,3284716031,BE +3284716032,3284716287,IT +3284716288,3284716543,RU +3284716544,3284716799,GR +3284716800,3284717055,IL +3284717056,3284717311,PL +3284717312,3284717567,DE +3284717568,3284717823,FR +3284717824,3284718079,RU +3284718080,3284718591,GB +3284718592,3284718847,PL +3284718848,3284719103,RU +3284719104,3284719359,PL +3284719360,3284719615,DE +3284719616,3284719871,RU +3284719872,3284720127,FR +3284720128,3284720383,CH +3284720384,3284720895,SE +3284720896,3284721151,UA +3284721152,3284721407,TR +3284721408,3284721663,NL +3284721664,3284721919,CA +3284721920,3284722943,IR +3284722944,3284729855,CA +3284729856,3284795391,RU +3284795392,3284803583,FR +3284803584,3284811775,DE +3284819968,3284828159,DE +3284828160,3284844543,AT +3284844544,3284860927,CH +3284860928,3284863743,DE +3284863744,3284863999,FR +3284864000,3284868863,DE +3284868864,3284869375,FR +3284869376,3284869631,DE +3284869632,3284869887,IT +3284869888,3284872959,DE +3284872960,3284873471,IT +3284873472,3284926463,DE +3284926464,3284991999,NO +3284992000,3285057535,PL +3285057536,3285065727,IT +3285065728,3285073919,RU +3285073920,3285076607,NL +3285076608,3285076767,BE +3285076768,3285078111,NL +3285078112,3285078143,GB +3285078144,3285078175,NL +3285078176,3285078191,GB +3285078192,3285079423,NL +3285079424,3285079551,DE +3285079552,3285079967,NL +3285079968,3285079999,DE +3285080000,3285082111,NL +3285082112,3285084159,AT +3285084160,3285085183,LU +3285085184,3285086207,GB +3285086208,3285088255,PL +3285088256,3285089279,RU +3285089280,3285090303,PL +3285090304,3285098495,DE +3285098496,3285114879,GB +3285114880,3285123071,UA +3285123072,3285158639,BE +3285158640,3285158647,FR +3285158648,3285164367,BE +3285164368,3285164375,NL +3285164376,3285188607,BE +3285188608,3285265999,RU +3285266000,3285266007,CH +3285266008,3285319679,RU +3285319680,3285327871,CH +3285327872,3285328383,RU +3285328384,3285328895,PL +3285328896,3285329407,SE +3285329408,3285329919,GB +3285329920,3285330431,RO +3285330432,3285330943,FR +3285330944,3285331455,RO +3285331456,3285331967,KZ +3285331968,3285332991,DE +3285332992,3285333503,SE +3285333504,3285334015,GB +3285334016,3285334527,NL +3285334528,3285335551,DE +3285335552,3285336063,SE +3285336064,3285352447,IT +3285352448,3285368831,RU +3285368832,3285385215,SI +3285450752,3285453055,GB +3285453120,3285453439,GB +3285453568,3285454047,GB +3285454080,3285454175,GB +3285454208,3285454847,GB +3285454848,3285455695,DE +3285455712,3285455743,DE +3285455872,3285455887,DE +3285455888,3285455903,GB +3285455904,3285456255,DE +3285456288,3285456335,DE +3285456344,3285456351,DE +3285456384,3285456639,DE +3285456640,3285456703,DK +3285456704,3285456711,DE +3285456720,3285456743,DK +3285456760,3285456871,DK +3285456880,3285456895,DK +3285456896,3285456959,GB +3285456976,3285457023,GB +3285457056,3285457151,GB +3285457152,3285457183,SE +3285457216,3285457223,SE +3285457232,3285457247,SE +3285457280,3285457407,SE +3285457408,3285457663,GB +3285457664,3285457759,IT +3285457792,3285457919,IT +3285457920,3285458943,GB +3285458944,3285459071,DK +3285459104,3285459327,DK +3285459392,3285459535,DK +3285459544,3285459711,DK +3285459712,3285459967,NO +3285459968,3285460479,FI +3285460480,3285460991,DK +3285460992,3285461007,NL +3285461056,3285461087,NL +3285461104,3285461111,NL +3285461120,3285461215,NL +3285461224,3285461263,NL +3285461264,3285461279,BE +3285461312,3285461375,CH +3285461376,3285461447,NL +3285461448,3285461455,DE +3285461456,3285461503,NL +3285461520,3285461535,NL +3285461568,3285461807,NL +3285461856,3285461877,NL +3285461880,3285461991,NL +3285461992,3285461999,GB +3285462000,3285462007,NL +3285462016,3285462175,DE +3285462192,3285462207,DE +3285462208,3285462223,GB +3285462224,3285462287,DE +3285462296,3285462367,DE +3285462400,3285462527,DE +3285462544,3285462655,DE +3285462784,3285462831,AT +3285462840,3285462847,AT +3285462880,3285462911,AT +3285462952,3285462959,AT +3285463008,3285463039,AT +3285463040,3285463071,LU +3285463080,3285463087,LU +3285463104,3285463135,LU +3285463296,3285463311,FR +3285463320,3285463327,FR +3285463360,3285463455,BE +3285463520,3285463615,BE +3285463616,3285463647,FR +3285463672,3285463759,BE +3285463776,3285463839,BE +3285463856,3285463935,BE +3285463944,3285463991,BE +3285464016,3285464063,BE +3285464072,3285464095,BE +3285464096,3285464127,GB +3285464320,3285464383,BE +3285464384,3285464415,GB +3285464416,3285464431,BE +3285464432,3285464447,DE +3285464448,3285465087,BE +3285465088,3285465103,DK +3285465152,3285465343,DK +3285465664,3285465727,DE +3285465856,3285466367,DE +3285466368,3285466463,CH +3285466528,3285466559,CH +3285466624,3285466879,AT +3285466880,3285466895,BG +3285466912,3285466943,BG +3285466952,3285466967,BG +3285466984,3285467007,BG +3285467016,3285467023,BG +3285467136,3285467391,DE +3285467664,3285467671,DE +3285467832,3285467871,DE +3285467936,3285467951,DE +3285467952,3285467959,GB +3285467968,3285468511,DE +3285468576,3285468591,DE +3285468600,3285468615,DE +3285468616,3285468623,GB +3285468656,3285471007,DE +3285471040,3285471055,DE +3285471104,3285471743,DE +3285471808,3285471871,DE +3285471936,3285471951,DE +3285472000,3285472127,DE +3285472160,3285472175,DE +3285472192,3285472223,DE +3285472256,3285472271,DE +3285472368,3285472383,DE +3285473312,3285473343,DE +3285473440,3285473527,DE +3285473536,3285473567,DE +3285473584,3285473591,GB +3285473592,3285473599,DE +3285473632,3285473663,DE +3285473792,3285474047,DE +3285474080,3285474095,DE +3285474112,3285474143,DE +3285474176,3285474231,DE +3285474240,3285474271,DE +3285474304,3285474319,DE +3285474336,3285474559,DE +3285475072,3285475127,DE +3285475144,3285475207,DE +3285475232,3285475327,DE +3285475624,3285475647,AT +3285475680,3285475711,AT +3285475776,3285475783,AT +3285475808,3285475839,AT +3285475904,3285475951,AT +3285475968,3285476095,AT +3285476352,3285476607,DE +3285476736,3285476863,GB +3285476864,3285476895,AT +3285477024,3285477087,AT +3285477152,3285477247,IT +3285477256,3285477263,IT +3285477280,3285477319,IT +3285477336,3285477343,IT +3285477344,3285477359,FR +3285477360,3285477375,IT +3285477376,3285477631,FR +3285477888,3285477919,FR +3285477952,3285477983,FR +3285478000,3285479399,FR +3285479400,3285479407,GB +3285479408,3285479423,FR +3285479424,3285479807,CH +3285480448,3285480575,CH +3285480704,3285480719,CH +3285480736,3285480767,CH +3285480776,3285480831,CH +3285480864,3285480895,CH +3285480960,3285481215,CH +3285481472,3285481727,IT +3285481728,3285481791,CH +3285481984,3285481999,FR +3285482000,3285482007,CY +3285482016,3285482239,FR +3285482496,3285482527,CH +3285482752,3285482783,CH +3285483008,3285483519,CH +3285484544,3285485055,IE +3285485104,3285485119,SK +3285485640,3285485647,SK +3285485728,3285485743,SK +3285485768,3285485775,SK +3285485800,3285485815,SK +3285486592,3285487103,IT +3285487104,3285487359,HU +3285487360,3285487423,NL +3285487424,3285487487,GB +3285487488,3285487679,NL +3285487744,3285487887,NL +3285487904,3285488127,NL +3285488640,3285489663,GB +3285490176,3285490319,RU +3285490336,3285490463,RU +3285490496,3285490511,RU +3285490520,3285490527,LT +3285490528,3285490535,LV +3285490536,3285490543,RU +3285490560,3285490687,RU +3285490944,3285491007,RU +3285491456,3285491711,RU +3285492224,3285492479,FR +3285492480,3285492687,GB +3285492696,3285492735,GB +3285493760,3285493775,ES +3285493784,3285493791,ES +3285493808,3285493887,ES +3285493952,3285493983,ES +3285493984,3285493991,GB +3285494000,3285494015,ES +3285494016,3285494079,IT +3285494112,3285494783,IT +3285495808,3285496319,DE +3285496320,3285496335,ES +3285496352,3285496383,ES +3285496480,3285496495,ES +3285496496,3285496527,FR +3285496544,3285496575,FR +3285496576,3285496607,GB +3285496608,3285496671,DE +3285496704,3285496783,DE +3285496800,3285496815,DE +3285496832,3285497855,DE +3285497888,3285498031,DE +3285498096,3285498111,DE +3285498112,3285498367,IT +3285498368,3285498623,DE +3285498624,3285498655,CH +3285498656,3285498671,CY +3285498672,3285498687,CH +3285499392,3285499455,FR +3285499488,3285499647,FR +3285499648,3285499903,DE +3285499904,3285500159,CZ +3285500288,3285500415,CZ +3285500416,3285500927,GB +3285500928,3285501183,DK +3285501184,3285501311,CZ +3285501320,3285501327,CZ +3285501336,3285501343,CZ +3285501344,3285501375,GB +3285501376,3285501407,CZ +3285501440,3285501567,CZ +3285501728,3285501759,GB +3285501760,3285501767,CZ +3285502208,3285502463,CZ +3285502464,3285502495,IL +3285502496,3285502503,CY +3285502504,3285502511,IL +3285502512,3285502527,CY +3285502528,3285502591,BY +3285502592,3285502655,GB +3285502656,3285502719,IL +3285503392,3285503423,CZ +3285503488,3285503551,ES +3285503744,3285503999,FI +3285504512,3285504607,CZ +3285505216,3285505279,CZ +3285505440,3285505471,CZ +3285506048,3285506079,CZ +3285507328,3285507391,GR +3285507656,3285507711,CZ +3285507840,3285508095,CZ +3285508096,3285508607,DE +3285508608,3285508623,RU +3285508632,3285508671,RU +3285508736,3285508863,RU +3285508872,3285508927,PT +3285509120,3285509247,SE +3285509280,3285509311,SE +3285509632,3285509887,TR +3285510016,3285510047,HU +3285510080,3285510143,HU +3285510144,3285512191,GB +3285512192,3285512511,GR +3285512576,3285512719,GR +3285512728,3285512735,GR +3285512768,3285512831,GR +3285513216,3285513223,GB +3285513232,3285513247,GR +3285513280,3285513471,GR +3285513728,3285514239,GR +3285515264,3285515519,AT +3285515792,3285515799,GR +3285516160,3285516191,GR +3285516224,3285516287,GR +3285516288,3285516543,DK +3285516544,3285516671,NO +3285516672,3285516687,BE +3285516688,3285516691,NL +3285516692,3285516695,IT +3285516696,3285516703,NL +3285516704,3285516719,GB +3285516720,3285516735,IL +3285516736,3285516799,DE +3285516800,3285516927,GB +3285516928,3285516991,PL +3285516992,3285517023,BE +3285517024,3285517055,SE +3285517056,3285517215,GB +3285517216,3285517247,AT +3285517248,3285518335,GB +3285518336,3285518351,NL +3285518352,3285518367,ES +3285518368,3285518463,BE +3285518464,3285518591,ES +3285518592,3285518847,CH +3285518848,3285519103,BE +3285519104,3285519359,FR +3285519360,3285519615,DE +3285519616,3285520127,GB +3285520128,3285520383,NL +3285520384,3285520527,GB +3285520528,3285520543,CH +3285520544,3285520575,GB +3285520576,3285520639,DE +3285520640,3285520767,NL +3285520768,3285520895,GB +3285520896,3285521167,BE +3285521168,3285521407,GB +3285521408,3285521695,BE +3285521696,3285521791,GB +3285521792,3285522175,BE +3285522176,3285523071,GB +3285523072,3285523079,BE +3285523080,3285523087,ES +3285523088,3285523199,CH +3285523200,3285523231,ZA +3285523232,3285523327,BE +3285523328,3285523335,FI +3285523336,3285523359,BE +3285523360,3285523391,GB +3285523392,3285523455,BE +3285523456,3285523711,FR +3285523712,3285523967,CH +3285523968,3285524063,GB +3285524064,3285524095,LU +3285524096,3285524159,ZA +3285524160,3285524175,GB +3285524176,3285524191,CH +3285524192,3285524223,BE +3285524224,3285524351,GB +3285524352,3285524479,BE +3285524480,3285524735,DK +3285524736,3285524863,GB +3285524864,3285524895,BE +3285524896,3285524927,ES +3285524928,3285524991,GB +3285524992,3285525247,BE +3285525248,3285525503,CH +3285525504,3285526015,BE +3285526016,3285526023,IL +3285526024,3285526035,BE +3285526036,3285526039,FR +3285526040,3285526047,BE +3285526048,3285526079,CZ +3285526080,3285526143,BE +3285526144,3285526175,HU +3285526176,3285526383,BE +3285526384,3285526399,PT +3285526400,3285526527,CH +3285526528,3285526783,ES +3285526784,3285526815,CH +3285526816,3285526847,BE +3285526848,3285526911,CH +3285526912,3285527295,GB +3285527296,3285527423,BE +3285527424,3285527427,GB +3285527428,3285527431,BE +3285527432,3285527439,FR +3285527440,3285527455,LU +3285527456,3285527487,IL +3285527488,3285527495,BE +3285527496,3285527503,DE +3285527504,3285527551,BE +3285527552,3285527615,IL +3285527616,3285527679,GB +3285527680,3285527807,BE +3285527808,3285527811,GB +3285527812,3285527815,PL +3285527816,3285527855,BE +3285527856,3285527871,FR +3285527872,3285527967,BE +3285527968,3285527999,DE +3285528000,3285528319,BE +3285528320,3285528447,DE +3285528448,3285528575,FR +3285528576,3285528799,BE +3285528800,3285528831,GB +3285528832,3285528847,BE +3285528848,3285528863,ZA +3285528864,3285528883,BE +3285528884,3285528887,FR +3285528888,3285528895,BE +3285528896,3285528911,GB +3285528912,3285528931,BE +3285528932,3285528935,FR +3285528936,3285528943,BE +3285528944,3285529071,GB +3285529072,3285529151,BE +3285529152,3285529183,DE +3285529184,3285529199,NL +3285529200,3285529215,IL +3285529216,3285529247,CH +3285529248,3285529263,GB +3285529264,3285529343,BE +3285529344,3285529599,IT +3285529600,3285529631,NO +3285529632,3285529663,IE +3285529664,3285529679,LI +3285529680,3285529687,FI +3285529688,3285529695,IT +3285529696,3285529727,BE +3285529728,3285529855,GB +3285529856,3285529951,LU +3285529952,3285529983,GR +3285529984,3285529999,CZ +3285530000,3285530143,BE +3285530144,3285530175,GB +3285530176,3285530183,NL +3285530184,3285530215,BE +3285530216,3285530223,GB +3285530224,3285530271,FR +3285530272,3285530399,BE +3285530400,3285530431,NL +3285530432,3285530463,IT +3285530464,3285530495,DE +3285530496,3285530559,AT +3285530560,3285530575,BE +3285530576,3285530583,GB +3285530584,3285530591,BE +3285530592,3285530607,GB +3285530608,3285530655,BE +3285530656,3285530687,ZA +3285530688,3285530719,GB +3285530720,3285530723,BE +3285530724,3285530727,GB +3285530728,3285530735,DE +3285530736,3285530739,GB +3285530740,3285530743,BE +3285530744,3285530751,GB +3285530752,3285530767,IT +3285530768,3285530783,DE +3285530784,3285530815,BE +3285530816,3285530831,GB +3285530832,3285530879,BE +3285530880,3285530911,CH +3285530912,3285530975,GB +3285530976,3285530983,BE +3285530984,3285530991,IE +3285530992,3285531007,GB +3285531008,3285531023,FR +3285531024,3285531039,LU +3285531040,3285531071,ES +3285531072,3285531103,NL +3285531104,3285531119,FR +3285531120,3285531263,BE +3285531264,3285531295,GB +3285531296,3285531303,BE +3285531304,3285531311,GB +3285531312,3285531327,DK +3285531328,3285531391,GB +3285531392,3285531423,BE +3285531424,3285531455,DE +3285531456,3285531495,BE +3285531496,3285531503,NL +3285531504,3285531519,FR +3285531520,3285531535,BE +3285531536,3285531551,DE +3285531552,3285531567,IL +3285531568,3285531615,BE +3285531616,3285531647,NL +3285531648,3285531903,BE +3285531904,3285532159,GB +3285532160,3285532223,BE +3285532224,3285532231,ES +3285532232,3285532415,BE +3285532416,3285532687,IT +3285532688,3285532703,DE +3285532704,3285532711,BE +3285532712,3285532719,RU +3285532720,3285532735,IT +3285532736,3285532799,CH +3285532800,3285532831,DE +3285532832,3285532847,FI +3285532848,3285532863,IT +3285532864,3285532895,GB +3285532896,3285532959,IT +3285532960,3285533055,BE +3285533056,3285533059,NL +3285533060,3285533087,BE +3285533088,3285533103,IT +3285533104,3285533119,LU +3285533120,3285533127,BE +3285533128,3285533135,SE +3285533136,3285533151,GB +3285533152,3285533183,BE +3285533184,3285533311,IT +3285533312,3285533343,SE +3285533344,3285533367,BE +3285533368,3285533375,CH +3285533376,3285533471,GB +3285533472,3285533503,BE +3285533504,3285533519,GB +3285533520,3285533535,SE +3285533536,3285533543,BE +3285533544,3285533551,DE +3285533552,3285533567,GB +3285533568,3285533951,IT +3285533952,3285534079,IL +3285534080,3285534095,IT +3285534096,3285534111,TR +3285534112,3285534143,BE +3285534144,3285534207,IT +3285534208,3285534463,PT +3285534464,3285534479,NL +3285534480,3285534527,BE +3285534528,3285534559,FR +3285534560,3285534591,IT +3285534592,3285534627,GB +3285534628,3285534639,BE +3285534640,3285534655,GB +3285534656,3285534719,IT +3285534720,3285534751,GB +3285534752,3285534767,BE +3285534768,3285534783,GB +3285534784,3285534799,DK +3285534800,3285534815,ES +3285534816,3285534831,HU +3285534832,3285534927,IE +3285534928,3285534943,GB +3285534944,3285534975,BE +3285534976,3285535103,IT +3285535104,3285535123,BE +3285535124,3285535127,ES +3285535128,3285535131,BE +3285535132,3285535135,NL +3285535136,3285535139,FR +3285535140,3285535143,BE +3285535144,3285535147,GR +3285535148,3285535151,CZ +3285535152,3285535155,SE +3285535156,3285535231,BE +3285535232,3285535743,NO +3285535744,3285535871,IT +3285535872,3285535903,FR +3285535904,3285535907,DK +3285535908,3285535911,NO +3285535912,3285535919,BE +3285535920,3285535927,NL +3285535928,3285535951,BE +3285535952,3285535967,GB +3285535968,3285535999,BE +3285536000,3285536063,GB +3285536064,3285536079,BE +3285536080,3285536095,IT +3285536096,3285536111,GB +3285536112,3285536255,BE +3285536256,3285536511,GB +3285536512,3285536543,LU +3285536544,3285536575,DE +3285536576,3285536607,IL +3285536608,3285536703,BE +3285536704,3285536735,GB +3285536736,3285536739,IT +3285536740,3285536743,GB +3285536744,3285536747,DE +3285536748,3285536751,AT +3285536752,3285536755,BE +3285536756,3285536759,IL +3285536760,3285536767,BE +3285536768,3285536959,DK +3285536960,3285536991,ES +3285536992,3285537023,GB +3285537024,3285537087,IL +3285537088,3285537127,GB +3285537128,3285537135,BE +3285537136,3285537143,DK +3285537144,3285537151,GB +3285537152,3285537167,DK +3285537168,3285537175,CH +3285537176,3285537183,BE +3285537184,3285537215,DE +3285537216,3285537231,GB +3285537232,3285537535,BE +3285537536,3285537599,RU +3285537600,3285537615,FR +3285537616,3285537631,BE +3285537632,3285537663,SE +3285537664,3285537727,DE +3285537728,3285537759,IT +3285537760,3285537791,LU +3285537792,3285537919,NL +3285537920,3285538047,LU +3285538048,3285538175,NL +3285538176,3285538183,DE +3285538184,3285538187,LU +3285538188,3285538207,BE +3285538208,3285538239,LU +3285538240,3285538271,NO +3285538272,3285538287,FI +3285538288,3285538295,CH +3285538296,3285538299,BE +3285538300,3285538319,GB +3285538320,3285538327,LU +3285538328,3285538335,BE +3285538336,3285538351,GB +3285538352,3285538367,LU +3285538368,3285538375,BE +3285538376,3285538383,AT +3285538384,3285538399,BE +3285538400,3285538431,DK +3285538432,3285538623,BE +3285538624,3285538687,LU +3285538688,3285538719,BE +3285538720,3285538751,DE +3285538752,3285538755,IT +3285538756,3285538759,FR +3285538760,3285538763,IE +3285538764,3285538767,BE +3285538768,3285538783,CZ +3285538784,3285538815,BE +3285538816,3285538847,CH +3285538848,3285538879,BE +3285538880,3285539071,ES +3285539072,3285539327,NL +3285539328,3285539583,BE +3285539584,3285539711,IE +3285539712,3285539839,GB +3285539840,3285539967,IT +3285539968,3285540031,GB +3285540032,3285540095,ZA +3285540096,3285540103,GB +3285540104,3285540107,IT +3285540108,3285540111,BE +3285540112,3285540127,IL +3285540128,3285540159,ZA +3285540160,3285540191,FI +3285540192,3285540207,CH +3285540208,3285540215,IE +3285540216,3285540219,BE +3285540220,3285540223,ZA +3285540224,3285540351,CZ +3285540352,3285540415,PT +3285540416,3285540423,ZA +3285540424,3285540447,BE +3285540448,3285540479,DE +3285540480,3285540607,NL +3285540608,3285540623,FI +3285540624,3285540671,BE +3285540672,3285540735,DE +3285540736,3285540863,BE +3285540864,3285540871,FR +3285540872,3285540879,BE +3285540880,3285541375,FR +3285541376,3285541391,GB +3285541392,3285541439,FR +3285541440,3285541519,GB +3285541520,3285541527,BG +3285541528,3285541535,BE +3285541536,3285541551,FR +3285541552,3285541567,BE +3285541568,3285541599,GB +3285541600,3285541631,BE +3285541632,3285541663,ES +3285541664,3285541695,FR +3285541696,3285541759,BE +3285541760,3285541887,FR +3285541888,3285541919,GB +3285541920,3285541951,FR +3285541952,3285542079,DE +3285542080,3285542143,FR +3285542144,3285542399,BE +3285542400,3285542655,GB +3285542656,3285542911,ZA +3285542912,3285543167,IT +3285543168,3285543423,NL +3285543424,3285543679,SE +3285543680,3285543743,AT +3285543744,3285543759,FR +3285543760,3285543775,BE +3285543776,3285543791,IT +3285543792,3285543795,ES +3285543796,3285543799,BE +3285543800,3285543807,FR +3285543808,3285543871,NL +3285543872,3285543935,FR +3285543936,3285544191,BE +3285544192,3285544255,IL +3285544256,3285544319,DE +3285544320,3285544335,ES +3285544336,3285544351,NL +3285544352,3285544383,BE +3285544384,3285544479,FR +3285544480,3285544511,ES +3285544512,3285544639,FR +3285544640,3285544703,BE +3285544704,3285544959,FR +3285544960,3285545215,GB +3285545216,3285545343,BE +3285545344,3285545379,GB +3285545380,3285545471,BE +3285545472,3285545727,SE +3285545728,3285545983,FI +3285545984,3285545999,IT +3285546000,3285546007,BE +3285546008,3285546015,IT +3285546016,3285546063,ES +3285546064,3285546071,IT +3285546072,3285546111,ES +3285546112,3285546239,AT +3285546240,3285546367,ZA +3285546368,3285546495,FR +3285546496,3285546559,NL +3285546560,3285546623,BE +3285546624,3285546671,FR +3285546672,3285546687,SE +3285546688,3285546751,GB +3285546752,3285547007,DK +3285547008,3285547023,AT +3285547024,3285547039,FR +3285547040,3285547071,AT +3285547072,3285547135,AU +3285547136,3285547167,RU +3285547168,3285547199,LU +3285547200,3285547263,SE +3285547264,3285547519,LU +3285547520,3285547775,NL +3285547776,3285547903,ES +3285547904,3285548031,BE +3285548032,3285548287,FR +3285548288,3285548543,DE +3285548544,3285548607,FR +3285548608,3285548639,LI +3285548640,3285548647,BE +3285548648,3285548655,LI +3285548656,3285548735,GB +3285548736,3285548767,BE +3285548768,3285548799,LU +3285548800,3285548831,IT +3285548832,3285548839,GB +3285548840,3285548847,IL +3285548848,3285548959,IT +3285548960,3285549023,FR +3285549024,3285549039,PT +3285549040,3285549055,FR +3285549056,3285549183,DE +3285549184,3285549215,BE +3285549216,3285549247,CH +3285549248,3285549279,DE +3285549280,3285549311,GB +3285549312,3285549695,DE +3285549696,3285549719,BE +3285549720,3285549727,GB +3285549728,3285549735,SE +3285549736,3285549767,BE +3285549768,3285549775,FI +3285549776,3285549791,DE +3285549792,3285549823,LU +3285549824,3285549871,DE +3285549872,3285549887,DK +3285549888,3285549951,DE +3285549952,3285550335,BE +3285550336,3285550463,GB +3285550464,3285550527,DE +3285550528,3285550591,IT +3285550592,3285550847,FR +3285550848,3285550943,IT +3285550944,3285550975,NL +3285550976,3285551007,BE +3285551008,3285551039,CH +3285551040,3285551071,DE +3285551072,3285551103,BE +3285551104,3285551359,DE +3285551360,3285551391,BE +3285551392,3285551423,DE +3285551424,3285551487,DK +3285551488,3285551551,BE +3285551552,3285551615,DE +3285551616,3285551647,GB +3285551648,3285551679,FR +3285551680,3285551807,GB +3285551808,3285551839,RU +3285551840,3285552127,BE +3285552128,3285552191,DE +3285552192,3285552255,ZA +3285552256,3285552287,CZ +3285552288,3285552319,HU +3285552320,3285552383,GB +3285552384,3285552511,DE +3285552512,3285552639,GB +3285552640,3285552927,DE +3285552928,3285552959,BE +3285552960,3285553023,FR +3285553024,3285553039,BE +3285553040,3285553055,EG +3285553056,3285553087,BE +3285553088,3285553151,IT +3285553152,3285553215,DE +3285553216,3285553247,BE +3285553248,3285553263,PL +3285553264,3285553727,DE +3285553728,3285553759,CH +3285553760,3285553767,GB +3285553768,3285553775,ZA +3285553776,3285553791,FR +3285553792,3285553855,BE +3285553856,3285553887,ZA +3285553888,3285553919,DE +3285553920,3285554047,CH +3285554048,3285554127,DE +3285554128,3285554143,BE +3285554144,3285554175,GB +3285554176,3285554431,AT +3285554432,3285554687,BE +3285554688,3285554703,DE +3285554704,3285554719,BE +3285554720,3285554751,FR +3285554752,3285554815,BE +3285554816,3285554943,CH +3285554944,3285555199,LU +3285555200,3285555231,AT +3285555232,3285555263,NL +3285555264,3285555327,FR +3285555328,3285555455,IL +3285555456,3285555711,BE +3285555712,3285555967,LU +3285555968,3285556223,IT +3285556224,3285556479,BE +3285556480,3285556735,DE +3285556736,3285556767,CH +3285556768,3285556775,BE +3285556776,3285556779,NL +3285556780,3285556799,BE +3285556800,3285556863,DE +3285556864,3285556991,BE +3285556992,3285557055,GB +3285557056,3285557119,NL +3285557120,3285557247,DE +3285557248,3285557363,NL +3285557364,3285557375,BE +3285557376,3285557519,NL +3285557520,3285557535,FI +3285557536,3285557575,NL +3285557576,3285557579,SE +3285557580,3285557583,BE +3285557584,3285557599,NL +3285557600,3285557631,BE +3285557632,3285557791,NL +3285557792,3285557823,NO +3285557824,3285557887,SE +3285557888,3285557911,CH +3285557912,3285557919,CZ +3285557920,3285557951,FR +3285557952,3285558015,DE +3285558016,3285558271,NL +3285558272,3285558463,BE +3285558464,3285558591,NL +3285558592,3285558655,BE +3285558656,3285558783,IT +3285558784,3285559039,GB +3285559040,3285559167,BE +3285559168,3285559231,NL +3285559232,3285559295,BE +3285559296,3285559807,SE +3285559808,3285559839,IE +3285559840,3285559871,CH +3285559872,3285559887,BE +3285559888,3285559903,SE +3285559904,3285559919,NL +3285559920,3285559935,SE +3285559936,3285560063,NO +3285560064,3285560351,SE +3285560352,3285560383,ES +3285560384,3285560447,SE +3285560448,3285560479,LI +3285560480,3285560511,CH +3285560512,3285560575,BE +3285560576,3285560831,DE +3285560832,3285561215,SE +3285561216,3285561343,NO +3285561344,3285561407,GB +3285561408,3285561471,PL +3285561472,3285561599,DK +3285561600,3285561619,NO +3285561620,3285561623,DE +3285561624,3285561647,BE +3285561648,3285561663,NO +3285561664,3285561727,BE +3285561728,3285561791,NO +3285561792,3285561919,BE +3285561920,3285561951,CH +3285561952,3285561967,NO +3285561968,3285561983,BE +3285561984,3285562111,FI +3285562112,3285562367,NO +3285562368,3285562751,FI +3285562752,3285562783,NL +3285562784,3285562815,BE +3285562816,3285562879,IT +3285562880,3285562911,FI +3285562912,3285562943,BE +3285562944,3285562975,DE +3285562976,3285562991,FI +3285562992,3285562999,BE +3285563000,3285563007,GB +3285563008,3285563135,SE +3285563136,3285563391,FI +3285563392,3285563455,BE +3285563456,3285563471,NL +3285563472,3285563487,BE +3285563488,3285563519,SE +3285563520,3285563647,PL +3285563648,3285563903,CH +3285563904,3285564031,SE +3285564032,3285564159,FI +3285564160,3285564415,GB +3285564416,3285564511,CH +3285564512,3285564543,NO +3285564544,3285564671,BE +3285564672,3285564735,CH +3285564736,3285564751,FR +3285564752,3285564767,BE +3285564768,3285564799,SE +3285564800,3285564927,BE +3285564928,3285565183,FR +3285565184,3285565439,NL +3285565440,3285565951,GB +3285565952,3285566015,FR +3285566016,3285566031,IT +3285566032,3285566047,BE +3285566048,3285566079,CH +3285566080,3285566143,FR +3285566144,3285566207,BE +3285566208,3285566495,RU +3285566496,3285566511,SE +3285566512,3285566527,FI +3285566528,3285566559,CH +3285566560,3285566575,BE +3285566576,3285566591,CH +3285566592,3285566655,NL +3285566656,3285566847,BE +3285566848,3285566975,FR +3285566976,3285567231,GB +3285567232,3285567487,PT +3285567488,3285568511,NL +3285568512,3285568671,DE +3285568672,3285568703,CH +3285568704,3285568751,BE +3285568752,3285569023,DE +3285569024,3285569407,BE +3285569408,3285569535,GB +3285569536,3285569791,DE +3285569792,3285570047,FI +3285570048,3285570175,FR +3285570176,3285570207,BE +3285570208,3285570223,PL +3285570224,3285570239,NL +3285570240,3285570559,BE +3285570560,3285570815,SE +3285570816,3285571071,IT +3285571072,3285571327,DE +3285571328,3285571583,FI +3285571584,3285571711,FR +3285571712,3285571775,SE +3285571776,3285571807,BE +3285571808,3285571839,DE +3285571840,3285571903,BE +3285571904,3285571967,SE +3285571968,3285572095,BE +3285572096,3285572223,DE +3285572224,3285572351,FI +3285572352,3285572367,IR +3285572368,3285572383,ES +3285572384,3285572447,BE +3285572448,3285572479,CH +3285572480,3285572607,FR +3285572608,3285572863,DK +3285572864,3285573119,IT +3285573120,3285573375,SE +3285573376,3285573535,BE +3285573536,3285573567,CH +3285573568,3285573631,FR +3285573632,3285573887,NL +3285573888,3285573951,IL +3285573952,3285574143,BE +3285574144,3285574399,RU +3285574400,3285574655,IL +3285574656,3285574911,GB +3285574912,3285575167,IL +3285575168,3285575423,ES +3285575424,3285575679,IL +3285575680,3285575935,BE +3285575936,3285575999,DK +3285576000,3285576063,BE +3285576064,3285576127,FR +3285576128,3285576159,BE +3285576160,3285576191,DK +3285576192,3285576447,BE +3285576448,3285576703,CZ +3285576704,3285576959,HU +3285576960,3285577215,BE +3285577216,3285577471,ZA +3285577472,3285577599,IT +3285577600,3285577983,BE +3285577984,3285578111,IT +3285578112,3285578239,DE +3285578240,3285578367,BE +3285578368,3285578431,FR +3285578432,3285578495,BE +3285578496,3285578751,DE +3285578752,3285579007,BE +3285579008,3285579519,ES +3285579520,3285579775,FR +3285579776,3285580031,US +3285580032,3285580287,HU +3285580288,3285580415,DE +3285580416,3285580543,BE +3285580544,3285580547,NL +3285580548,3285580651,BE +3285580652,3285580655,SE +3285580656,3285580799,BE +3285580800,3285580831,SE +3285580832,3285580847,PL +3285580848,3285580927,BE +3285580928,3285581055,ZA +3285581056,3285581503,BE +3285581504,3285581567,AT +3285581568,3285581599,FR +3285581600,3285581615,GB +3285581616,3285581695,FR +3285581696,3285581759,LV +3285581760,3285581823,FR +3285581824,3285595135,DE +3285595136,3285595167,CZ +3285595168,3285595175,US +3285595176,3285595263,DE +3285595264,3285595423,US +3285595424,3285596159,DE +3285596160,3285596191,US +3285596192,3285596223,DE +3285596224,3285596255,US +3285596256,3285596287,DE +3285596288,3285596319,US +3285596320,3285596351,DE +3285596352,3285596383,FR +3285596384,3285597183,DE +3285597184,3285597215,US +3285597216,3285606399,DE +3285606400,3285614591,GB +3285614592,3285630975,TR +3285630976,3285633023,UA +3285633024,3285635071,NO +3285635072,3285637119,UA +3285637120,3285638143,DE +3285638144,3285639167,UA +3285639168,3285641215,FR +3285641216,3285642239,RU +3285642240,3285643263,UA +3285643264,3285645311,FR +3285645312,3285647359,BG +3285647360,3285712895,DK +3285712896,3285721087,GB +3285721088,3285729279,SE +3285729280,3285734143,CH +3285734144,3285734159,GB +3285734160,3285737471,CH +3285737472,3285745663,PL +3285745664,3285753855,IT +3285753856,3285762047,LV +3285762048,3285762559,FR +3285762560,3285763071,RU +3285763072,3285763583,GB +3285763584,3285764095,DE +3285764096,3285764607,RO +3285764608,3285765119,RU +3285765120,3285766143,UA +3285766144,3285766655,DE +3285766656,3285767679,UA +3285767680,3285768191,FR +3285768192,3285768703,RU +3285768704,3285769215,CH +3285769216,3285769727,DE +3285769728,3285770239,RO +3285770240,3285770495,NL +3285770496,3285770751,US +3285770752,3285771007,UA +3285771008,3285771263,CH +3285771264,3285771519,BG +3285771520,3285771775,AT +3285771776,3285772031,RO +3285772032,3285772287,SE +3285772288,3285772543,TR +3285772544,3285772799,LT +3285772800,3285773055,MT +3285773056,3285773311,DE +3285773312,3285773567,LV +3285773568,3285773823,KG +3285773824,3285774079,RU +3285774080,3285774335,RO +3285774336,3285774591,CZ +3285774592,3285774847,RU +3285774848,3285775103,FR +3285775104,3285775359,GB +3285775360,3285775615,RU +3285775616,3285775871,NG +3285775872,3285776127,NL +3285776128,3285776383,RO +3285776384,3285776639,UA +3285776640,3285776895,FR +3285776896,3285777151,PL +3285777152,3285777407,HU +3285777408,3285777663,IL +3285777664,3285777919,DK +3285777920,3285778175,PL +3285778176,3285778431,DE +3285778432,3285843967,GB +3285843968,3285852159,LU +3285852160,3285860351,GB +3285860352,3285868543,FI +3285868544,3285876735,IE +3285876736,3285909503,RU +3285909504,3285910015,GB +3285910272,3285910303,ES +3285910304,3285910335,GB +3285910336,3285910407,DE +3285910408,3285910415,GB +3285910464,3285910527,ES +3285910528,3285911551,GB +3285912576,3285913087,GB +3285913088,3285913215,ES +3285913344,3285913599,GB +3285915648,3285915903,GB +3285915904,3285916159,AT +3285916160,3285916415,FR +3285916416,3285916671,YE +3285916672,3285916703,BH +3285916704,3285916711,DE +3285916712,3285916719,CY +3285916720,3285916735,ES +3285916736,3285916799,GB +3285916928,3285917183,YE +3285917184,3285917439,ES +3285917440,3285917695,YE +3285918848,3285918975,GB +3285918976,3285919231,YE +3285919232,3285919487,GB +3285919488,3285919743,UA +3285919744,3285921791,QA +3285921792,3285921823,CZ +3285921856,3285921919,DE +3285921920,3285921983,GB +3285921984,3285922047,FR +3285922048,3285922111,GB +3285922112,3285922175,FR +3285922176,3285922183,DE +3285922184,3285922191,RU +3285922192,3285922207,DE +3285922208,3285922239,ES +3285922240,3285922287,RU +3285922288,3285922303,IR +3285922304,3285922559,FR +3285922560,3285922815,GB +3285922816,3285923327,KW +3285923328,3285924415,ES +3285924416,3285924431,DE +3285924432,3285924479,GB +3285924480,3285924863,ES +3285925056,3285925119,FR +3285925888,3285926143,NL +3285926144,3285926399,YE +3285926400,3285926407,DE +3285926408,3285926431,ES +3285926496,3285926527,ES +3285926848,3285926911,GB +3285926912,3285927423,DE +3285927424,3285927679,GB +3285927680,3285927935,IR +3285928064,3285928191,ES +3285928192,3285928207,PL +3285928208,3285928223,GB +3285928224,3285928255,DE +3285928256,3285928271,FR +3285928272,3285928287,DE +3285928288,3285928319,ES +3285929424,3285929439,IT +3285929984,3285930495,GB +3285930560,3285930575,ES +3285930576,3285930623,GB +3285930624,3285930631,DE +3285930632,3285930639,GB +3285930672,3285930687,DE +3285930752,3285931007,GB +3285932032,3285932287,NL +3285932544,3285932799,GB +3285932800,3285933055,ES +3285933056,3285933311,DE +3285933312,3285933567,ES +3285934080,3285934847,GB +3285935104,3285935615,GB +3285938176,3285938431,ES +3285938560,3285938607,GB +3285938608,3285938623,ES +3285938624,3285938631,DE +3285938632,3285938639,ES +3285938656,3285938687,US +3285938688,3285938943,ES +3285938944,3285938951,DE +3285938952,3285938959,NL +3285938976,3285939071,ES +3285939200,3285940735,ES +3285942272,3285942527,IR +3285942656,3285942783,IR +3285942784,3285942784,ES +3285943040,3285943295,SE +3285943296,3285943551,ES +3285943552,3285943559,DK +3285943560,3285943567,DE +3285943568,3285943575,ES +3285943576,3285943583,DE +3285943584,3285943679,ES +3285943680,3285943807,GB +3285944320,3285944831,US +3285944832,3285945343,DK +3285945344,3285945599,ES +3285945664,3285945695,FR +3285945696,3285945727,GB +3285945856,3285946111,GB +3285946112,3285946367,ES +3285946368,3285946879,GB +3285947392,3285947647,DE +3285947648,3285947903,ES +3285947904,3285948159,NL +3285948160,3285948671,GB +3285948672,3285948927,SA +3285948928,3285949183,ML +3285949184,3285949831,ES +3285949856,3285949887,ES +3285949952,3285950463,ES +3285950464,3285950719,GB +3285950720,3285950783,US +3285950976,3285951231,NL +3285951232,3285951487,IT +3285951552,3285951567,GB +3285951568,3285951583,PK +3285951584,3285951615,ES +3285951616,3285951631,PK +3285951632,3285951639,DE +3285951648,3285951679,ES +3285951744,3285951999,GB +3285952000,3285952255,IT +3285952256,3285952511,SA +3285955584,3285955839,DE +3285955840,3285956095,ES +3285956096,3285956351,FR +3285956352,3285956607,DE +3285956608,3285956863,GB +3285956864,3285957631,PT +3285957632,3285957887,PL +3285957888,3285958143,GB +3285958144,3285958655,ES +3285958848,3285958895,NL +3285958896,3285958903,DE +3285958904,3285958911,NL +3285958912,3285959039,GB +3285959040,3285959167,DE +3285959168,3285959423,ES +3285959424,3285959935,GB +3285959936,3285960191,ES +3285960192,3285960447,FR +3285960448,3285960703,GB +3285962752,3285963775,DE +3285963776,3285964287,GB +3285964288,3285964351,KE +3285964544,3285964799,FR +3285966848,3285967103,FR +3285967104,3285967359,PL +3285967360,3285967615,ES +3285967616,3285968383,BE +3285968384,3285968639,ES +3285968640,3285968895,PL +3285971200,3285971455,FR +3285971456,3285971711,DE +3285971712,3285971967,GB +3285971968,3285972223,ES +3285972224,3285972479,CH +3285972480,3285972735,PL +3285972736,3285972991,FR +3285972992,3285975039,GB +3285975040,3286106111,FR +3286106112,3286106687,EE +3286106688,3286106691,FI +3286106692,3286114303,EE +3286114304,3286122495,BA +3286122496,3286130687,BY +3286130688,3286131711,CS +3286131712,3286132735,PL +3286132736,3286133759,RO +3286133760,3286134783,IE +3286134784,3286135807,PL +3286135808,3286136831,NL +3286136832,3286137855,AT +3286137856,3286138879,UA +3286138880,3286155263,RU +3286155264,3286171647,DE +3286171648,3286237183,IT +3286237184,3286243583,GB +3286243584,3286243839,US +3286243840,3286245887,GB +3286245888,3286246143,US +3286246144,3286254167,GB +3286254168,3286254175,NL +3286254176,3286264879,GB +3286264880,3286264895,NL +3286264896,3286279423,GB +3286279424,3286279679,US +3286279680,3286289919,GB +3286289920,3286290175,US +3286290176,3286291807,GB +3286291808,3286291823,US +3286291824,3286302719,GB +3286302720,3286310911,NO +3286310912,3286311423,CH +3286311424,3286311935,NL +3286311936,3286312447,PL +3286312448,3286312959,RU +3286312960,3286313983,RO +3286313984,3286314495,CH +3286314496,3286315007,IL +3286315008,3286315519,PL +3286315520,3286316031,DE +3286316032,3286316543,UA +3286317056,3286317567,RU +3286317568,3286318079,PL +3286318080,3286318591,CH +3286319104,3286320127,RO +3286320128,3286321151,PL +3286321152,3286322175,CZ +3286322176,3286323199,PL +3286323200,3286324223,GB +3286324224,3286325247,RO +3286325248,3286326271,DK +3286326272,3286327295,PL +3286327296,3286328319,UA +3286328320,3286329343,NL +3286329344,3286330367,DE +3286330368,3286331391,RO +3286331392,3286332415,UA +3286332416,3286333439,CH +3286333440,3286334463,PL +3286334464,3286335487,BG +3286335488,3286336511,RU +3286336512,3286337535,DE +3286337536,3286338559,SA +3286338560,3286339583,RO +3286339584,3286340607,UA +3286340608,3286342655,DE +3286342656,3286343679,UA +3286343680,3286344703,RU +3286344704,3286345727,BE +3286345728,3286346751,IT +3286346752,3286347775,UA +3286347776,3286348799,PA +3286348800,3286349823,PL +3286349824,3286350847,SE +3286350848,3286351871,GB +3286351872,3286352895,DK +3286352896,3286353919,DE +3286353920,3286354943,LI +3286354944,3286355967,FR +3286355968,3286356991,DE +3286356992,3286358015,PL +3286358016,3286359039,GB +3286359040,3286360063,PT +3286360064,3286361087,IT +3286361088,3286362111,UA +3286362112,3286363135,RU +3286363136,3286364159,AT +3286364160,3286365183,DE +3286365184,3286367231,PL +3286367232,3286368255,BG +3286368256,3286376447,CH +3286376448,3286384639,GB +3286384640,3286401023,DE +3286401024,3286409215,GB +3286409216,3286417407,DE +3286417408,3286425599,IT +3286425600,3286433791,KW +3286433792,3286499327,DE +3286499328,3286564863,HU +3286564864,3286566143,AE +3286566144,3286566271,TZ +3286566272,3286566655,AE +3286566656,3286567423,KW +3286567424,3286568191,AE +3286568192,3286568703,KW +3286568704,3286571007,AE +3286571008,3286571775,KW +3286571776,3286630399,AE +3286630400,3286638591,BG +3286638592,3286646783,AT +3286646784,3286654975,RU +3286654976,3286655231,UA +3286655232,3286655487,KZ +3286655488,3286655743,LT +3286655744,3286655999,UA +3286656000,3286656255,CH +3286656256,3286656511,RU +3286656512,3286656767,GR +3286656768,3286657023,UA +3286657024,3286657279,BE +3286657280,3286657535,ES +3286657536,3286657791,HU +3286657792,3286658047,RU +3286658048,3286658303,US +3286658304,3286658559,RU +3286658560,3286658815,NL +3286658816,3286659071,RU +3286659072,3286659327,UA +3286659328,3286659583,PL +3286659584,3286659839,DE +3286659840,3286660095,UA +3286660096,3286660351,DE +3286660352,3286660607,CH +3286660608,3286660863,GB +3286660864,3286661119,UA +3286661120,3286661375,PL +3286661376,3286661631,SI +3286661632,3286661887,GB +3286661888,3286662143,RU +3286662144,3286662399,DE +3286662400,3286662655,UA +3286662656,3286662911,DE +3286662912,3286671359,UA +3286671360,3286679551,AT +3286679552,3286681631,IT +3286681632,3286681647,DE +3286681648,3286681655,GB +3286681656,3286681659,BE +3286681660,3286681663,ES +3286681664,3286681695,FR +3286681696,3286681699,ES +3286681700,3286681711,IT +3286681712,3286681727,CH +3286681728,3286681743,HK +3286681744,3286681751,ES +3286681752,3286681767,IT +3286681768,3286681775,DE +3286681776,3286682431,IT +3286682432,3286682463,FR +3286682464,3286682495,RO +3286682496,3286682623,IT +3286682624,3286682879,SM +3286682880,3286695935,IT +3286695936,3286761471,DK +3286761472,3286761727,DE +3286761728,3286769663,GB +3286769664,3286769919,DE +3286769920,3286773759,GB +3286773760,3286777855,DE +3286777856,3286781951,FR +3286781952,3286782207,GB +3286782208,3286782463,DE +3286782464,3286782535,GB +3286782536,3286782543,FR +3286782544,3286782575,GB +3286782576,3286782583,DE +3286782584,3286783599,GB +3286783600,3286783615,CH +3286783616,3286783679,DE +3286783680,3286784511,GB +3286784512,3286784767,CH +3286784768,3286785023,DE +3286785024,3286787071,GB +3286787072,3286787327,FR +3286787328,3286787583,DE +3286787584,3286788095,GB +3286788096,3286788351,DE +3286788352,3286788607,FR +3286788608,3286789119,GB +3286789120,3286789631,DE +3286789632,3286790143,FR +3286790144,3286790655,GB +3286790656,3286790911,DE +3286790912,3286791679,GB +3286791680,3286791935,AT +3286791936,3286794239,GB +3286794240,3286892543,DE +3286900736,3286900991,BE +3286900992,3286901503,DE +3286901504,3286902015,FR +3286902016,3286902527,CH +3286902528,3286902783,GB +3286902784,3286903039,PL +3286903040,3286903551,FR +3286903552,3286903807,CH +3286903808,3286904063,AT +3286904064,3286904319,BE +3286904320,3286904575,FR +3286904576,3286904831,PT +3286904832,3286905087,GB +3286905088,3286905343,GR +3286905344,3286905599,DE +3286905600,3286905855,MT +3286905856,3286906111,TR +3286906112,3286906367,BE +3286906368,3286906879,RO +3286906880,3286907135,RU +3286907136,3286907391,SE +3286907392,3286907647,AT +3286907648,3286907903,ES +3286907904,3286908159,CH +3286908160,3286908415,UA +3286908416,3286908671,FR +3286908672,3286908927,PL +3286908928,3286909951,CH +3286909952,3286913023,UA +3286913024,3286914047,DE +3286914048,3286915071,BG +3286915072,3286916095,FR +3286916096,3286917119,DE +3286917120,3286917631,RU +3286917632,3286918143,LV +3286918144,3286919167,AT +3286919168,3286920191,DE +3286920192,3286921215,RU +3286921216,3286922239,UA +3286922240,3286923263,GB +3286923264,3286924287,CM +3286924288,3286925311,UA +3286925312,3286925567,DE +3286925568,3286925823,CH +3286925824,3286926079,RO +3286926080,3286926335,LV +3286926336,3286926591,UA +3286926592,3286926847,DE +3286926848,3286927103,PT +3286927104,3286927359,FI +3286927360,3286927615,DE +3286927616,3286927871,SI +3286927872,3286928383,DE +3286928384,3286928639,ES +3286928640,3286928895,PL +3286928896,3286929151,FI +3286929152,3286929407,DE +3286929408,3286929663,LV +3286929664,3286929919,BE +3286929920,3286930175,SE +3286930176,3286930431,RU +3286930432,3286930687,UA +3286930688,3286930943,DE +3286930944,3286931199,SE +3286931200,3286931455,AT +3286931456,3286931711,DE +3286931712,3286931967,GB +3286931968,3286932223,FR +3286932224,3286932479,DK +3286932480,3286932735,GB +3286932736,3286932991,AT +3286932992,3286933503,IL +3286933504,3286933759,DK +3286933760,3286934015,RO +3286934016,3286934271,BE +3286934272,3286934527,CH +3286934528,3286934783,PL +3286934784,3286935039,TR +3286935040,3286935551,ES +3286935552,3286935807,EG +3286935808,3286936063,RO +3286936064,3286936319,RU +3286936320,3286936575,IT +3286936576,3286936831,RO +3286936832,3286937087,NL +3286937088,3286937343,UA +3286937344,3286937599,GB +3286937600,3286937855,CH +3286937856,3286938111,RO +3286938112,3286938367,DE +3286938368,3286938623,ES +3286938624,3286938879,CH +3286938880,3286939391,RO +3286939392,3286939647,DE +3286939648,3286939903,BE +3286939904,3286940159,EG +3286940160,3286940415,BE +3286940416,3286940671,CH +3286940672,3286940927,RO +3286940928,3286941183,PL +3286941184,3286941439,RU +3286941440,3286941695,RO +3286941696,3286942719,DE +3286942720,3286943743,FI +3286943744,3286944767,UA +3286944768,3286945791,CZ +3286945792,3286946815,RU +3286946816,3286947839,UA +3286947840,3286948863,DE +3286948864,3286949887,UA +3286949888,3286950911,CH +3286950912,3286951935,DE +3286951936,3286952959,IT +3286952960,3286953983,BG +3286953984,3286955007,GB +3286955008,3286956031,DE +3286956032,3286957055,FR +3286957056,3286958079,EG +3286958080,3287023615,ES +3287023616,3287154687,FI +3287154688,3287162879,BE +3287162880,3287171071,DE +3287171072,3287171583,LT +3287171584,3287172095,PL +3287172096,3287172607,DE +3287172608,3287173119,PL +3287173120,3287173631,RU +3287173632,3287174143,NL +3287174144,3287174655,SE +3287174656,3287175167,GB +3287175168,3287176191,RO +3287176192,3287176703,BG +3287176704,3287177215,NL +3287177216,3287178239,RO +3287178240,3287178751,UA +3287178752,3287179263,RO +3287179264,3287180287,FR +3287180288,3287181311,RU +3287181312,3287182335,UZ +3287182336,3287185407,UA +3287185408,3287186431,SE +3287186432,3287187455,FI +3287187456,3287196671,DE +3287196672,3287198719,PL +3287198720,3287199743,GB +3287199744,3287201791,UA +3287201792,3287202815,PL +3287202816,3287203839,UA +3287203840,3287204895,FI +3287204896,3287204951,EE +3287204952,3287204959,FI +3287204960,3287205055,EE +3287205056,3287212031,FI +3287212032,3287212543,DE +3287212544,3287212799,FR +3287212800,3287213311,PL +3287213312,3287213567,FR +3287213568,3287214079,RU +3287214080,3287214335,GB +3287214336,3287214847,DE +3287214848,3287215103,IT +3287215104,3287215359,PL +3287215360,3287215615,GB +3287215616,3287215871,DE +3287215872,3287216127,RU +3287216128,3287216639,GB +3287216640,3287216895,MD +3287216896,3287217151,GB +3287217152,3287217407,NL +3287217408,3287217663,PL +3287217664,3287217919,RU +3287217920,3287218175,PL +3287218176,3287218431,DE +3287218432,3287218687,GB +3287218688,3287218943,RU +3287218944,3287219199,AT +3287219200,3287219455,DE +3287219456,3287219711,CH +3287219712,3287220223,SE +3287220224,3287223807,RU +3287223808,3287224063,UZ +3287224064,3287259375,RU +3287259376,3287259383,DK +3287259384,3287267191,RU +3287267192,3287267201,KZ +3287267202,3287271119,RU +3287271120,3287271127,UZ +3287271128,3287285759,RU +3287285760,3287416831,NL +3287416832,3287425023,RU +3287425024,3287427759,SE +3287427760,3287427775,GB +3287427776,3287433215,SE +3287433216,3287433727,GB +3287433728,3287434239,DE +3287434240,3287434751,PL +3287434752,3287435263,GB +3287435264,3287435775,NL +3287435776,3287436287,GB +3287436288,3287436799,RS +3287436800,3287437311,RO +3287437312,3287437823,UA +3287437824,3287438335,RU +3287438336,3287438847,CH +3287438848,3287439359,GB +3287439360,3287439871,RO +3287439872,3287440895,PL +3287440896,3287441407,UA +3287441408,3287442431,NL +3287442432,3287442943,PL +3287442944,3287443967,DE +3287443968,3287444479,BG +3287444480,3287444991,PL +3287444992,3287445503,DE +3287445504,3287446527,UA +3287446528,3287447039,PL +3287447040,3287447551,IL +3287447552,3287448063,DK +3287448576,3287449087,PL +3287449088,3287449599,BG +3287449600,3287450111,DE +3287450112,3287450623,DK +3287450624,3287451135,SE +3287451136,3287451647,PL +3287451648,3287452159,ES +3287452160,3287452671,NO +3287452672,3287453183,CH +3287453184,3287453695,RU +3287453696,3287454207,GB +3287454208,3287454719,SE +3287454720,3287455743,UA +3287455744,3287456255,NL +3287456256,3287457279,GB +3287457280,3287457791,RO +3287457792,3287458047,NL +3287458048,3287458303,UA +3287458304,3287458559,DE +3287458560,3287459327,CH +3287459328,3287459583,AT +3287459584,3287459839,DE +3287459840,3287460095,AT +3287460096,3287460351,ME +3287460352,3287460607,CY +3287460608,3287460863,NL +3287460864,3287461119,BE +3287461120,3287461375,DE +3287461376,3287461631,IL +3287461632,3287461887,AT +3287461888,3287462143,PL +3287462144,3287462399,SA +3287462400,3287462655,BE +3287462656,3287462911,UA +3287462912,3287463167,FR +3287463168,3287463423,IT +3287463424,3287463679,RO +3287463680,3287463935,PL +3287463936,3287464191,AT +3287464192,3287464447,SK +3287464448,3287464703,PL +3287464704,3287464959,NL +3287464960,3287465215,SA +3287465216,3287465471,NO +3287465472,3287465727,DE +3287465728,3287465983,FR +3287465984,3287467007,DK +3287467008,3287468031,SA +3287468032,3287469055,UA +3287469056,3287471103,DE +3287471104,3287472127,GB +3287472128,3287473151,FI +3287473152,3287474175,GB +3287474176,3287476223,DE +3287476224,3287477247,PL +3287477248,3287478271,GB +3287478272,3287479295,BG +3287479296,3287480319,RO +3287480320,3287481343,AT +3287481344,3287482367,PL +3287482368,3287499279,DE +3287499280,3287499287,FR +3287499288,3287499295,US +3287499296,3287499439,DE +3287499440,3287499471,GB +3287499472,3287499487,DE +3287499488,3287499503,GB +3287499504,3287501359,DE +3287501360,3287501367,NL +3287501368,3287507983,DE +3287507984,3287507991,FR +3287507992,3287515375,DE +3287515376,3287515383,CZ +3287515384,3287523303,DE +3287523304,3287523311,US +3287523312,3287526303,DE +3287526304,3287526311,LU +3287526312,3287534807,DE +3287534808,3287534815,IT +3287534816,3287541087,DE +3287541088,3287541095,CZ +3287541096,3287542815,DE +3287542816,3287542831,US +3287542832,3287544647,DE +3287544648,3287544655,CH +3287544656,3287548927,DE +3287548928,3287549439,UA +3287549440,3287549951,SE +3287549952,3287550463,UA +3287550464,3287550975,DE +3287550976,3287551487,LT +3287551488,3287551999,RO +3287552000,3287552511,GB +3287552512,3287553023,RO +3287553024,3287553535,FR +3287553536,3287554047,IL +3287554048,3287554559,RU +3287554560,3287555071,PL +3287555072,3287555583,GB +3287555584,3287556095,FR +3287556096,3287564287,TR +3287564288,3287572479,FI +3287572480,3287578863,DE +3287578864,3287578879,LI +3287578880,3287580671,DE +3287580672,3287588863,LV +3287588864,3287597055,BE +3287597056,3287605247,GI +3287605248,3287630335,DE +3287630336,3287630847,AT +3287630848,3287631359,PL +3287631360,3287631871,DE +3287631872,3287632383,RU +3287632384,3287632895,SE +3287632896,3287633407,RU +3287633408,3287633919,SK +3287633920,3287634431,UA +3287634432,3287634943,RO +3287634944,3287635455,PL +3287635456,3287635967,DE +3287635968,3287636479,RO +3287636480,3287636991,IE +3287636992,3287637503,AT +3287637504,3287638015,PL +3287638016,3287638527,UA +3287638528,3287639039,DE +3287639040,3287639551,GB +3287639552,3287640063,RU +3287640064,3287640575,DE +3287640576,3287641087,SI +3287641600,3287642111,FI +3287642112,3287642623,UA +3287642624,3287643135,BE +3287643136,3287643647,IT +3287643648,3287644671,UA +3287644672,3287645183,NL +3287646208,3287662591,PT +3287662592,3287662847,DE +3287662848,3287663103,DK +3287663104,3287663359,LV +3287663360,3287663615,GB +3287663616,3287663871,ES +3287663872,3287664127,PT +3287664128,3287664383,PL +3287664384,3287664639,NL +3287664640,3287664895,UA +3287664896,3287665151,GB +3287665152,3287665407,NO +3287665408,3287665919,PL +3287665920,3287666175,AT +3287666176,3287666431,RU +3287666432,3287666687,DK +3287666688,3287666943,SI +3287666944,3287667199,CZ +3287667200,3287667455,DK +3287667456,3287667711,RU +3287667712,3287667967,ES +3287667968,3287668223,PL +3287668224,3287668479,RO +3287668480,3287668735,UA +3287668736,3287668991,SI +3287668992,3287669247,PL +3287669248,3287669503,LI +3287669504,3287669759,IE +3287669760,3287670015,RO +3287670016,3287670271,UA +3287670272,3287670527,PL +3287670528,3287670783,GB +3287670784,3287671039,PL +3287671040,3287671295,AT +3287671296,3287671551,PL +3287671552,3287671807,TR +3287671808,3287672063,CH +3287672064,3287672319,LT +3287672320,3287672575,DE +3287672576,3287672831,NL +3287672832,3287673087,RU +3287673088,3287673343,SK +3287673344,3287673599,PT +3287673600,3287673855,GB +3287673856,3287674111,NL +3287674112,3287674367,CH +3287674368,3287674623,DE +3287674624,3287674879,RO +3287674880,3287675135,SE +3287675136,3287675391,GB +3287675392,3287675647,SE +3287675648,3287675903,DE +3287675904,3287676159,BE +3287676160,3287676415,DE +3287676416,3287676671,RU +3287676672,3287676927,GB +3287676928,3287677183,ES +3287677184,3287677439,RU +3287677440,3287677695,SI +3287677696,3287677951,RO +3287677952,3287678207,GB +3287678208,3287678463,UA +3287678464,3287678719,DE +3287678720,3287678975,HR +3287678976,3287687167,SI +3287687168,3287695359,EG +3287695360,3287703551,CH +3287703552,3287704063,CZ +3287704064,3287704575,NL +3287704576,3287705087,LU +3287705088,3287705599,RU +3287705600,3287706111,UA +3287706112,3287706623,RU +3287706624,3287707135,GB +3287707136,3287707647,FR +3287707648,3287708159,BE +3287708160,3287708671,NL +3287709184,3287709695,RU +3287709696,3287710207,SE +3287710208,3287710719,RU +3287710720,3287711231,CZ +3287711232,3287711743,PL +3287711744,3287719935,FR +3287719936,3287728127,DE +3287728128,3287729407,IT +3287729408,3287729663,SE +3287729664,3287729919,DK +3287729920,3287730175,HU +3287730176,3287730431,PL +3287730432,3287730687,GB +3287730688,3287732223,DE +3287732224,3287734271,IT +3287734272,3287734527,PL +3287734528,3287734783,UA +3287734784,3287735039,RU +3287735040,3287735295,SE +3287735296,3287736319,IT +3287736320,3287736831,PL +3287736832,3287737343,LV +3287737344,3287737855,GB +3287737856,3287738879,FR +3287738880,3287739391,DE +3287739392,3287739903,NL +3287739904,3287740415,PT +3287740416,3287740927,BG +3287740928,3287741439,RO +3287741440,3287741951,CH +3287741952,3287742463,RO +3287742464,3287742975,RU +3287742976,3287743487,RO +3287743488,3287743999,LV +3287744000,3287744511,FR +3287744512,3287810047,DE +3287810048,3287818239,FR +3287818240,3287826431,AT +3287826432,3287826687,LV +3287826688,3287826943,RO +3287826944,3287827199,RU +3287827200,3287827455,DE +3287827456,3287827711,SI +3287827712,3287827967,RU +3287827968,3287828223,GB +3287828224,3287828479,DE +3287828480,3287828735,PL +3287828736,3287828991,AT +3287828992,3287829247,DE +3287829248,3287829503,GB +3287829504,3287829759,RO +3287829760,3287830015,NL +3287830016,3287830271,NO +3287830272,3287830527,RO +3287830528,3287830783,IE +3287830784,3287831039,GB +3287831040,3287831295,RU +3287831296,3287831551,CH +3287831552,3287831807,RO +3287831808,3287832063,AT +3287832064,3287832319,FI +3287832320,3287832575,NL +3287832576,3287832831,PL +3287832832,3287833087,DE +3287833088,3287833343,GB +3287833344,3287833855,CH +3287833856,3287834111,UA +3287834112,3287834367,RU +3287834368,3287834623,HU +3287834624,3287842815,GB +3287842816,3287851007,DE +3287851008,3287859199,UA +3287859200,3287859455,GB +3287859456,3287859711,FK +3287859968,3287860479,GB +3287861248,3287862015,GB +3287863808,3287864063,GB +3287866384,3287866439,GB +3287866496,3287866591,GB +3287866608,3287866623,GB +3287867392,3287867903,UA +3287867904,3287868415,PL +3287868416,3287868927,RO +3287868928,3287869439,ES +3287869440,3287869951,RU +3287869952,3287870463,UA +3287870464,3287870975,RU +3287870976,3287871487,NL +3287871488,3287871999,PL +3287872000,3287872511,RU +3287872512,3287873023,GB +3287873024,3287873535,PL +3287873536,3287874047,RU +3287874048,3287874559,FR +3287874560,3287875071,DE +3287875072,3287875583,PL +3287875584,3287941119,DK +3287941120,3287949311,IT +3287949312,3287949567,AT +3287949568,3287949823,IL +3287949824,3287950079,IT +3287950080,3287950335,DE +3287950336,3287950591,UA +3287950592,3287950847,PL +3287950848,3287951103,DE +3287951104,3287951359,HU +3287951360,3287951615,FR +3287951616,3287951871,CH +3287951872,3287952127,RU +3287952128,3287952383,UA +3287952384,3287953151,CH +3287953152,3287953407,IL +3287953408,3287953663,DE +3287953664,3287953919,GB +3287953920,3287954175,DE +3287954176,3287954431,RU +3287954432,3287954687,CH +3287954688,3287954943,RO +3287954944,3287955199,PL +3287955200,3287955711,RU +3287955712,3287955967,DE +3287955968,3287956223,SI +3287956224,3287956479,RO +3287956480,3287956735,FR +3287956736,3287956991,SE +3287956992,3287957247,UA +3287957248,3287957503,GB +3287957504,3287965695,AM +3287965696,3287967743,RS +3287967744,3287967871,CS +3287967872,3287967878,RS +3287967879,3287967879,CS +3287967880,3287967883,CS +3287967884,3287967884,CS +3287967885,3287967885,CS +3287967886,3287967886,RS +3287967887,3287967888,CS +3287967889,3287967889,CS +3287967890,3287967905,RS +3287967906,3287967906,CS +3287967907,3287967935,RS +3287967936,3287967967,CS +3287967968,3287967999,CS +3287968000,3287968335,CS +3287968336,3287968463,RS +3287968464,3287968479,CS +3287968480,3287968495,RS +3287968496,3287968543,CS +3287968544,3287968575,RS +3287968576,3287968607,CS +3287968608,3287968639,RS +3287968640,3287969023,CS +3287969024,3287969791,RS +3287969792,3287969951,CS +3287969952,3287969999,RS +3287970000,3287970191,CS +3287970192,3287970207,CS +3287970208,3287970239,CS +3287970240,3287970271,CS +3287970272,3287970527,CS +3287970528,3287970559,CS +3287970560,3287970815,RS +3287970816,3287970943,CS +3287970944,3287971071,CS +3287971072,3287971327,RS +3287971328,3287971391,CS +3287971392,3287971583,RS +3287971584,3287971711,CS +3287971712,3287971839,RS +3287971840,3287972351,CS +3287972352,3287973887,RS +3287973888,3287982079,CZ +3287982080,3287990271,EE +3287990272,3287998463,SI +3287998464,3288006655,IT +3288006656,3288072191,GR +3288072192,3288088575,SE +3288088576,3288090111,RS +3288090112,3288093183,CS +3288093184,3288093439,CS +3288093440,3288096767,CS +3288096768,3288097279,RS +3288097280,3288097727,CS +3288097728,3288097759,CS +3288097760,3288097775,RS +3288097776,3288097791,CS +3288097792,3288099007,CS +3288099008,3288099071,RS +3288099072,3288099327,CS +3288099328,3288099455,CS +3288099456,3288099583,CS +3288099584,3288099719,CS +3288099720,3288099727,CS +3288099728,3288099735,CS +3288099736,3288099775,CS +3288099776,3288099783,RS +3288099784,3288099799,CS +3288099800,3288099839,RS +3288099840,3288100351,CS +3288100352,3288100415,CS +3288100416,3288100431,RS +3288100432,3288100447,CS +3288100448,3288100455,RS +3288100456,3288100463,CS +3288100464,3288100479,RS +3288100480,3288100607,CS +3288100608,3288100719,RS +3288100720,3288100735,CS +3288100736,3288101119,CS +3288101120,3288101135,CS +3288101136,3288101151,RS +3288101152,3288101167,CS +3288101168,3288101503,RS +3288101504,3288101599,CS +3288101600,3288101615,CS +3288101616,3288101887,CS +3288101888,3288102143,RS +3288102144,3288102527,CS +3288102528,3288102543,RS +3288102544,3288102551,DK +3288102552,3288102735,RS +3288102736,3288102743,CS +3288102744,3288102887,RS +3288102888,3288102895,CS +3288102896,3288102911,RS +3288102912,3288103167,CS +3288103168,3288103183,CS +3288103184,3288103199,RS +3288103200,3288103231,CS +3288103232,3288103295,RS +3288103296,3288103399,CS +3288103400,3288103407,RS +3288103408,3288103935,CS +3288103936,3288103967,CS +3288103968,3288103983,CS +3288103984,3288104079,RS +3288104080,3288104111,CS +3288104112,3288104191,RS +3288104192,3288104279,CS +3288104280,3288104287,RS +3288104288,3288104383,CS +3288104384,3288104415,CS +3288104416,3288104767,CS +3288104768,3288104799,RS +3288104800,3288104959,CS +3288104960,3288143615,DE +3288143616,3288143871,CH +3288143872,3288145663,DE +3288145664,3288146175,CH +3288146176,3288150015,DE +3288150016,3288151551,NL +3288151552,3288236031,DE +3288236032,3288236543,LI +3288236544,3288237055,FR +3288237056,3288238591,RO +3288238592,3288239103,PL +3288239104,3288239615,RO +3288239616,3288240127,UA +3288240128,3288240639,CH +3288240640,3288241151,FR +3288241152,3288241663,ES +3288241664,3288242175,UA +3288242176,3288242687,RO +3288242688,3288243199,FR +3288243200,3288243711,PL +3288243712,3288244223,FR +3288244224,3288252415,KG +3288252416,3288260607,NO +3288260608,3288268799,IT +3288268800,3288334335,FI +3288400128,3288400383,IN +3288400384,3288400639,PR +3288400640,3288400895,SA +3288401152,3288401407,RU +3288401408,3288401663,SA +3288416256,3288417279,SA +3288417280,3288417535,IN +3288417536,3288418047,KW +3288418304,3288418815,US +3288426496,3288427263,IN +3288427264,3288427519,BM +3288427520,3288428543,IN +3288428544,3288428799,CU +3288428800,3288429311,IN +3288434176,3288434431,IN +3288434432,3288434687,CU +3288434688,3288434943,JM +3288435200,3288435711,JM +3288435712,3288435967,US +3288435968,3288436223,PR +3288436224,3288436479,US +3288440832,3288441103,VC +3288441104,3288442879,BB +3288442880,3288443135,KN +3288443136,3288443391,BB +3288443392,3288443647,VC +3288443648,3288444927,BB +3288465408,3288465919,JM +3288466432,3288467455,SY +3288530944,3288532991,JM +3288532992,3288534527,PR +3288535040,3288539135,AN +3288539136,3288545535,US +3288547584,3288547839,IN +3288547840,3288548095,SA +3288548096,3288549375,AE +3288549376,3288549631,PK +3288549632,3288549887,GD +3288549888,3288553983,DO +3288554240,3288554495,IR +3288555264,3288555519,JM +3288557568,3288557823,JM +3288558080,3288558335,DO +3288564736,3288568831,TT +3288569856,3288570111,CU +3288570112,3288570367,JM +3288578048,3288580095,JM +3288580096,3288588287,BB +3288608256,3288614655,US +3289120768,3289123327,PR +3289128960,3289137151,IN +3289137152,3289153535,BM +3289161728,3289163263,PR +3289163264,3289163519,US +3289163520,3289169919,PR +3289321472,3289325567,IN +3289325568,3289333759,SA +3290103808,3290104831,US +3290104832,3290105855,VE +3290105856,3290107351,US +3290107352,3290107359,CA +3290107360,3290107375,US +3290107376,3290107383,CA +3290107384,3290111999,US +3290112000,3290112127,CA +3290112128,3290120191,US +3290181632,3290181887,US +3290181888,3290181951,PR +3290181952,3290181959,US +3290181960,3290181967,PR +3290181968,3290182031,US +3290182032,3290182399,PR +3290182400,3290182655,US +3290182656,3290183230,PR +3290183231,3290183262,US +3290183263,3290183326,PR +3290183327,3290183679,US +3290183680,3290185727,PR +3290251264,3290259455,TT +3290431488,3290433535,JM +3290439680,3290447871,TT +3290447872,3290456063,AR +3290464256,3290472447,PR +3290955776,3290980351,CR +3291086848,3291103231,PR +3301507328,3301507583,ZW +3301508096,3301508607,MW +3301510144,3301511167,MW +3301511168,3301513215,ZW +3301539840,3301543935,KE +3301543936,3301543951,NG +3301543952,3301543967,TZ +3301543968,3301544191,UG +3301544192,3301544959,DE +3301544960,3301548031,KE +3302449152,3302449279,DK +3302490368,3302490623,US +3321956352,3321960959,US +3321962496,3321967615,US +3322019840,3322023935,US +3322023936,3322028031,CL +3322085376,3322167295,US +3322167296,3322167807,GB +3322167808,3322351615,US +3322355712,3322372095,US +3322380288,3322396671,US +3322404864,3322427647,US +3322429440,3322430975,US +3322445824,3322609663,US +3322609664,3322610687,SA +3322610688,3322611711,US +3322613760,3322638847,US +3322675200,3322677759,US +3322679296,3322683391,US +3322683392,3322691583,BR +3322740736,3322759679,US +3322806272,3322855423,US +3322872832,3322875903,US +3322875904,3322888191,AU +3322937344,3322938367,US +3322939392,3322943743,US +3323003136,3323003391,JP +3323003392,3323003647,US +3323004160,3323004671,US +3323004672,3323004927,CN +3323004928,3323007743,US +3323009024,3323011071,US +3323011328,3323013631,US +3323013888,3323014143,CA +3323014400,3323015679,US +3323016192,3323017727,US +3323017728,3323017983,CA +3323017984,3323018239,US +3323018752,3323020799,US +3323020800,3323021055,SG +3323021056,3323022591,US +3323022592,3323022847,GB +3323022848,3323024383,US +3323024640,3323025663,US +3323025920,3323027199,US +3323027712,3323030015,US +3323030016,3323030271,AU +3323030272,3323031039,US +3323031808,3323032575,AU +3323032576,3323032831,US +3323032832,3323033087,IT +3323033600,3323034111,BR +3323034112,3323038463,US +3323038720,3323038975,CA +3323038976,3323043839,US +3323044096,3323046399,US +3323046912,3323048447,US +3323048704,3323048959,US +3323048960,3323049727,NL +3323049728,3323056895,US +3323057408,3323058175,US +3323058432,3323058943,US +3323059200,3323061247,US +3323061248,3323061503,SG +3323061504,3323062015,US +3323062016,3323062527,BR +3323062784,3323064319,US +3323064320,3323064831,AU +3323064832,3323066367,US +3323066624,3323067135,US +3323067392,3323068159,US +3323068416,3323199487,US +3323201536,3323203583,CA +3323203584,3323207679,US +3323207680,3323215871,CA +3323267072,3323286015,US +3323330816,3323331071,US +3323331072,3323331839,CA +3323331840,3323333119,US +3323333376,3323339263,US +3323339264,3323339519,AU +3323339520,3323339775,TH +3323340032,3323340287,NZ +3323340288,3323340799,US +3323341056,3323342335,US +3323342592,3323343615,AU +3323343616,3323343871,DE +3323343872,3323345919,US +3323346176,3323346431,AU +3323346432,3323354367,US +3323354368,3323355647,DE +3323355904,3323356671,US +3323356672,3323356927,CA +3323356928,3323357695,US +3323358208,3323365119,US +3323365632,3323365887,US +3323366144,3323367423,US +3323367680,3323374079,US +3323374336,3323376127,US +3323376384,3323376639,US +3323376896,3323378687,US +3323378688,3323378943,CA +3323378944,3323380479,US +3323380736,3323382271,US +3323383552,3323383807,US +3323386112,3323388927,US +3323389184,3323391231,US +3323391232,3323391487,CA +3323391488,3323394559,US +3323394560,3323395071,CL +3323395072,3323395327,US +3323395584,3323395839,US +3323396096,3323402751,US +3323404288,3323408383,US +3323461632,3323464191,US +3323465728,3323469823,US +3323527168,3323658239,US +3323658496,3323659263,US +3323659264,3323660543,NZ +3323662336,3323665407,US +3323666432,3323672831,US +3323723776,3323727103,US +3323727872,3323730943,US +3323731968,3323791103,US +3323791360,3323797503,US +3323805696,3323806207,CA +3323806208,3323854335,US +3323854848,3324051455,US +3324051456,3324182527,CA +3324182528,3324189183,US +3324190720,3324193279,US +3324198912,3324211711,US +3324215296,3324251135,US +3324252160,3324255231,US +3324256256,3324259327,SA +3324259328,3324259583,US +3324259584,3324259839,SA +3324259840,3324260095,US +3324264448,3324277247,US +3324280832,3324315391,US +3324315648,3324320767,US +3324321792,3324325631,US +3324329984,3324337663,US +3324346368,3324347647,US +3324379136,3324380159,CA +3324380160,3324380927,US +3324381184,3324382463,US +3324383232,3324391423,US +3324395520,3324398079,US +3324411904,3324521471,US +3324526592,3324567551,US +3324575744,3324579327,US +3324579840,3324582911,NZ +3324583936,3324587775,CL +3324592128,3324596223,US +3324641280,3324772351,US +3324837888,3324840959,US +3324841984,3324850175,US +3324854272,3324867071,US +3324903424,3324905983,US +3324911616,3324915711,US +3324919808,3324923903,US +3324968960,3324972287,US +3324973056,3324976895,US +3324977152,3324979967,US +3324985344,3324991743,US +3325034496,3325035519,NZ +3325035520,3325045759,US +3325050880,3325059071,US +3325100288,3325100543,US +3325100544,3325100799,HK +3325100800,3325101055,NZ +3325101312,3325102335,US +3325102592,3325105919,US +3325106176,3325108223,US +3325108224,3325110271,AU +3325110272,3325111807,US +3325120768,3325122047,US +3325122304,3325122559,AU +3325123328,3325124351,US +3325124608,3325125375,US +3325125888,3325126143,US +3325126400,3325128703,US +3325128704,3325129215,TH +3325129216,3325131775,US +3325131776,3325132031,AU +3325132032,3325132799,US +3325132800,3325134335,BR +3325134336,3325134591,US +3325134848,3325135359,US +3325136128,3325136383,CA +3325136384,3325136639,US +3325136896,3325137919,US +3325138176,3325141503,US +3325141760,3325142015,US +3325142016,3325142271,AR +3325142272,3325144831,US +3325144832,3325145087,CA +3325145088,3325145599,US +3325145856,3325151231,US +3325151488,3325162239,US +3325162496,3325165311,US +3325165568,3325169663,US +3325169664,3325171711,BR +3325173760,3325190143,US +3325231360,3325232127,US +3325232128,3325233151,AU +3325233408,3325234175,US +3325234176,3325234431,SA +3325234432,3325242367,US +3325242880,3325247231,US +3325247488,3325249279,US +3325249280,3325249535,CO +3325249536,3325250303,US +3325250816,3325253631,US +3325253888,3325256447,US +3325256448,3325256703,HK +3325256960,3325257215,ID +3325257216,3325257727,US +3325258752,3325259775,US +3325259776,3325261311,CA +3325261312,3325264639,US +3325267200,3325267711,US +3325267712,3325268735,SY +3325268736,3325269759,US +3325269760,3325270015,CA +3325270272,3325271039,US +3325271040,3325271295,CA +3325271296,3325271551,US +3325271808,3325272575,US +3325272832,3325274111,US +3325274624,3325278719,US +3325278720,3325278975,AU +3325278976,3325281023,US +3325281024,3325281279,NZ +3325281280,3325281535,AU +3325281536,3325284863,US +3325284864,3325285375,AU +3325285632,3325292543,US +3325292800,3325296383,US +3325296640,3325298687,US +3325300736,3325303295,US +3325304832,3325307647,CA +3325307648,3325307903,BB +3325307904,3325308927,CA +3325313024,3325319423,US +3325362176,3325427711,CA +3325493248,3325497343,US +3325497344,3325499903,PR +3325501440,3325503999,US +3325509632,3325517311,US +3325526016,3325551615,US +3325558784,3325562879,US +3325562880,3325565439,PH +3325566976,3325572095,US +3325575168,3325591551,US +3325626368,3325630975,US +3325632512,3325635583,US +3325640704,3325644799,CA +3325689856,3325690367,JM +3325690368,3325691647,US +3325691904,3325693183,BR +3325693952,3325697023,US +3325698048,3325699839,US +3325706240,3325708287,US +3325755392,3325886463,US +3325886720,3325887487,NZ +3325887488,3325888255,US +3325888512,3325890559,AU +3325890560,3325901055,US +3325902848,3325911039,US +3325952000,3325956095,US +3325956096,3325960191,CA +3325960192,3325967871,US +3325968384,3325976063,US +3325976064,3325976319,CA +3325976320,3325980671,US +3325980672,3325980927,CA +3325980928,3325982719,US +3325983488,3325986815,US +3325987072,3325992447,US +3325992448,3325992959,CA +3325992960,3325993215,US +3325993472,3325993727,US +3325994240,3325996799,US +3325996800,3325997055,CA +3325997056,3326003455,US +3326004224,3326010623,US +3326010880,3326017279,US +3326017536,3326349823,US +3326349824,3326350335,EC +3326350336,3326390527,US +3326390528,3326390535,CA +3326390536,3326492239,US +3326492240,3326492255,CA +3326492256,3326543359,US +3326543872,3326548991,US +3326550016,3326553087,US +3326558208,3326561279,US +3326607360,3326608895,US +3326609408,3326610687,US +3326611456,3326613503,US +3326615552,3326618111,US +3326623744,3326627327,US +3326680832,3326681087,CA +3326681344,3326682623,CA +3326682624,3326682879,US +3326682880,3326697215,CA +3326699776,3326713343,CA +3326713344,3326714111,US +3326714112,3326716927,CA +3326716928,3326717951,US +3326717952,3326726399,CA +3326726912,3326728703,CA +3326728960,3326729215,CA +3326729216,3326729471,JP +3326729472,3326729727,CA +3326729728,3326730495,US +3326731264,3326734335,US +3326734336,3326737663,CA +3326737664,3326737919,US +3326737920,3326738175,CA +3326738432,3326739455,US +3326740480,3326745599,US +3326746624,3326749183,US +3326754816,3326757375,US +3326771200,3326796799,US +3326803968,3327397119,US +3327397888,3327408127,US +3327459328,3327723263,US +3327723520,3327725311,CA +3327725568,3327728127,US +3327729664,3327732735,US +3327737856,3327743231,US +3327754240,3327769087,US +3327770368,3327779839,US +3327787008,3327788287,US +3327789056,3327790591,US +3327791104,3327792127,US +3327795200,3327805695,US +3327819776,3327856127,US +3327856640,3327857919,US +3327860736,3327863295,US +3327868928,3327871487,US +3327918080,3328028671,US +3328028672,3328030719,AN +3328030720,3328180223,US +3328180480,3328181247,CA +3328181760,3328185855,CA +3328186112,3328187647,CA +3328187904,3328196351,CA +3328196608,3328202751,CA +3328204800,3328210175,CA +3328210176,3328210943,AE +3328210944,3328233983,CA +3328233984,3328234239,AE +3328234240,3328235263,CA +3328235520,3328236799,CA +3328237312,3328245759,CA +3328245760,3328249087,US +3328249856,3328253439,US +3328253952,3328259071,US +3328259584,3328265471,US +3328265728,3328271871,US +3328272128,3328297215,US +3328298240,3328298495,US +3328298752,3328299775,US +3328303872,3328304127,US +3328305664,3328306431,US +3328307200,3328307455,US +3328307968,3328309247,US +3328309504,3328311039,US +3328311296,3328313087,US +3328313344,3328314623,US +3328315392,3328316927,US +3328319488,3328323583,US +3328327680,3328332799,US +3328344064,3328356863,US +3328376832,3328383487,US +3328385024,3328412159,US +3328412416,3328412927,US +3328413184,3328414719,US +3328414720,3328414975,CH +3328414976,3328417279,US +3328417792,3328420351,US +3328420352,3328420607,CA +3328420608,3328421119,US +3328421120,3328421375,HK +3328421376,3328427007,US +3328427264,3328432639,US +3328432640,3328433663,CA +3328433664,3328433919,CH +3328433920,3328442111,US +3328442368,3328447999,US +3328450560,3328453119,US +3328458752,3328466431,US +3328475136,3328477183,CA +3328507904,3328509695,US +3328509952,3328511231,US +3328512000,3328514559,US +3328516096,3328520191,US +3328573440,3328574463,US +3328574720,3328575487,US +3328577536,3328580607,US +3328581632,3328591615,US +3328591872,3328592895,US +3328594688,3328617983,US +3328617984,3328618239,CA +3328618240,3328630015,US +3328630272,3328630783,US +3328630784,3328631807,CA +3328631808,3328636671,US +3328636928,3328638719,US +3328638976,3328704511,CA +3328704512,3328771839,US +3328772096,3328773375,US +3328774144,3328776703,US +3328778240,3328782335,US +3328786432,3328790527,US +3328802816,3328810495,US +3328819200,3328821247,US +3328829440,3328830463,US +3328835584,3330607103,US +3330609152,3330614271,US +3330614272,3330614527,CA +3330614528,3330621439,US +3330621440,3330623743,CA +3330623744,3330624255,US +3330624512,3330625535,US +3330625536,3330627071,GB +3330627072,3330637823,US +3330638080,3330640895,US +3330640896,3330641151,CH +3330641152,3330641663,US +3330641920,3330645247,US +3330645504,3330646527,US +3330646528,3330647295,CA +3330647296,3330647807,US +3330648064,3330648831,US +3330649088,3330649343,US +3330649600,3330649855,CA +3330649856,3330657791,US +3330657792,3330658047,JP +3330658048,3330662911,US +3330662912,3330663167,GB +3330663168,3330664191,US +3330664192,3330664447,CA +3330664448,3330665983,US +3330666240,3330668543,US +3330668800,3330670335,US +3330670592,3330671871,US +3330672640,3330674175,US +3330674688,3330677759,US +3330678784,3330697215,US +3330703360,3330714367,US +3330714368,3330714623,CA +3330714624,3330723839,US +3330724096,3330726655,US +3330726656,3330726911,CA +3330726912,3330735871,US +3330736128,3330743295,US +3330744320,3330748159,US +3330752512,3330754559,US +3330754560,3330754815,CA +3330754816,3330755071,US +3330755328,3330756607,US +3330756864,3330763519,US +3330763520,3330763775,CA +3330763776,3330765823,US +3330765824,3330766335,CA +3330766336,3330767871,US +3330768640,3330769151,US +3330769408,3330771199,US +3330771200,3330771711,CH +3330771712,3330778879,US +3330778880,3330779135,GB +3330779136,3330784255,US +3330785792,3330791423,US +3330791424,3330791679,CA +3330791680,3330795775,US +3330796032,3330796543,US +3330796800,3330798847,US +3330799104,3330799871,US +3330800128,3330801407,US +3330801664,3330807807,US +3330809856,3330812415,US +3330818048,3330841599,US +3330841856,3330844159,US +3330844416,3330848767,US +3330849024,3330862591,US +3330862848,3330866943,US +3330867200,3330904575,US +3330904832,3330906623,US +3330906880,3330908415,US +3330908672,3330923263,US +3330923520,3330928127,US +3330928384,3330930175,US +3330930944,3330932479,US +3330932736,3331065343,US +3331065856,3331070463,US +3331072000,3331092991,US +3331096576,3331098111,US +3331098368,3331102463,US +3331102464,3331102719,CA +3331102720,3331103231,US +3331104000,3331110143,US +3331110656,3331117567,US +3331117824,3331125759,US +3331126016,3331129087,US +3331129344,3331194879,US +3331194880,3331260415,AU +3331260416,3331268607,US +3331276800,3331284991,US +3331293184,3331301375,US +3331309568,3331330047,US +3331334144,3331338239,US +3331342336,3331350527,US +3331358720,3331362815,US +3331366912,3331371007,US +3331375104,3331387391,US +3331391488,3331527679,US +3331530752,3331557375,US +3331557632,3331562495,US +3331562752,3331563519,US +3331563520,3331563775,CH +3331563776,3331565567,US +3331566080,3331567615,US +3331567872,3331574271,US +3331574528,3331575295,US +3331577344,3331578623,US +3331578880,3331585791,US +3331586048,3331587839,US +3331588096,3331589631,US +3331590144,3331591935,US +3331592192,3331594751,US +3331596288,3331607807,US +3331620864,3331627007,US +3331627520,3331631359,US +3331632128,3331632383,US +3331632896,3331633407,US +3331633408,3331633919,CH +3331633920,3331647231,US +3331647232,3331647487,CA +3331647488,3331649279,US +3331649280,3331649535,CA +3331649536,3331653375,US +3331653632,3331818495,US +3331818496,3331818751,MX +3331818752,3331819775,US +3331820032,3331821567,US +3331821824,3331825151,US +3331825408,3331837183,US +3331837696,3331839999,US +3331840256,3331849215,US +3331849472,3331849983,US +3331850240,3331930623,US +3331932160,3331934719,US +3331948544,3331962879,US +3331964416,3331968767,US +3331969024,3331971839,US +3331972096,3331972863,US +3331973120,3331981055,US +3331981312,3331983103,US +3331983360,3331987967,US +3331989504,3331996671,US +3331997696,3332001535,US +3332014080,3332026879,US +3332046848,3332375807,US +3332376576,3332381183,US +3332382720,3332389375,US +3332390912,3332418303,US +3332418560,3332418815,US +3332419072,3332423423,US +3332423680,3332430079,US +3332430336,3332435199,US +3332435456,3332438015,US +3332438272,3332439807,US +3332440320,3332460543,CA +3332460544,3332460799,US +3332460800,3332462335,CA +3332462592,3332463615,CA +3332463872,3332473855,CA +3332477952,3332482303,CA +3332484096,3332491263,CA +3332492032,3332500735,CA +3332500992,3332505343,CA +3332505856,3332508671,CA +3332508928,3332528127,CA +3332529664,3332554751,CA +3332558848,3332564479,CA +3332564736,3332570879,CA +3332571392,3332579327,CA +3332581376,3332590079,CA +3332590080,3332590591,US +3332590592,3332594687,CA +3332594944,3332595455,CA +3332595712,3332610559,CA +3332611072,3332611327,CA +3332611584,3332617471,CA +3332618240,3332624383,US +3332624384,3332636415,CA +3332636672,3332833279,CA +3332833536,3332841471,CA +3332841728,3332866303,CA +3332874240,3332875007,CA +3332897280,3332898559,CA +3332899072,3332922879,CA +3332923392,3332925695,CA +3332929024,3332930559,CA +3332931328,3332964095,CA +3332964352,3332966143,CA +3332966144,3332966399,US +3332966400,3332966911,CA +3332967424,3332979967,CA +3332980736,3332988927,CA +3332989952,3332997119,CA +3332997376,3333008383,CA +3333008896,3333012479,CA +3333012480,3333012991,US +3333012992,3333014015,CA +3333014528,3333017599,CA +3333018112,3333023231,CA +3333025280,3333029631,CA +3333029888,3333389311,US +3333390336,3333406463,US +3333406720,3333422847,US +3333423104,3333429759,US +3333431296,3333434111,US +3333439488,3333461247,US +3333461504,3333462527,US +3333462784,3333480191,US +3333480192,3333481471,DE +3333481472,3333482495,US +3333482752,3333488383,US +3333488640,3333490175,US +3333490688,3333495807,US +3333496832,3333501951,US +3333505024,3333517823,US +3333521408,3333534975,US +3333535232,3333535743,US +3333536256,3333541631,US +3333541888,3333550335,US +3333550592,3333553919,US +3333554176,3333561343,US +3333562368,3333568511,US +3333570560,3333583359,US +3333586944,3333591295,US +3333591552,3333593855,US +3333594112,3333595647,US +3333595904,3333619455,US +3333619712,3333620991,US +3333621760,3333624319,US +3333624576,3333627391,US +3333627904,3333633023,US +3333652480,3333654015,US +3333654272,3333665023,US +3333665280,3333669887,US +3333670144,3333675775,US +3333676288,3333684991,US +3333685248,3333723647,US +3333723648,3333724671,JP +3333724672,3333725951,US +3333726208,3333732863,US +3333733376,3333735935,US +3333736192,3333737215,US +3333737472,3333750527,US +3333750784,3333766655,US +3333767168,3333779967,US +3333783552,3333791487,US +3333791744,3333793279,US +3333794048,3333796351,US +3333796608,3333801727,US +3333802496,3333816063,US +3333816320,3333859839,US +3333859840,3333860095,BM +3333860096,3333870847,US +3333871104,3333881343,US +3333881856,3333927423,US +3333927936,3333933823,US +3333934080,3333937919,US +3333939200,3333939455,US +3333939968,3333947135,US +3333947392,3333950719,US +3333951488,3333954047,US +3333955584,3333963263,US +3333963776,3333988607,US +3333988608,3333988863,BR +3333988864,3333997823,US +3333997824,3333998079,CA +3333998080,3334012671,US +3334012928,3334019583,US +3334021120,3334028799,US +3334029312,3334053631,US +3334053888,3334055167,US +3334055680,3334079999,US +3334082560,3334116607,US +3334116864,3334119935,US +3334120448,3334138623,US +3334138624,3334138879,BM +3334139136,3334143743,US +3334144000,3334151167,US +3334152192,3334179071,US +3334180096,3334181631,US +3334182400,3334187775,US +3334187776,3334188031,BM +3334188032,3334196735,US +3334196992,3334201087,US +3334201344,3334205183,US +3334205440,3334209279,US +3334209536,3334343935,US +3334344704,3334348543,US +3334348800,3334355967,US +3334373376,3334374143,US +3334374656,3334391039,US +3334391552,3334392063,US +3334392320,3334400255,US +3334400768,3334405887,US +3334406144,3334932223,US +3334932480,3334934015,US +3334934528,3334943743,US +3334963200,3334974207,US +3334974464,3334977791,US +3334978048,3334979071,US +3334979328,3334983167,US +3334983424,3334987263,US +3334987520,3334988031,US +3334988288,3334993663,US +3334993920,3334995711,US +3334995968,3334998527,PH +3335000064,3335003135,US +3335028736,3335032063,US +3335032320,3335033343,US +3335033600,3335033855,US +3335034112,3335043327,US +3335043584,3335048191,US +3335048448,3335057407,US +3335058176,3335163135,US +3335163904,3335180287,US +3335180544,3335181567,US +3335181824,3335192319,US +3335192576,3335199231,US +3335200768,3335235839,US +3335236096,3335247103,US +3335247360,3335249407,US +3335249664,3335251967,US +3335252224,3335252735,US +3335252736,3335252991,CA +3335252992,3335257855,US +3335258112,3335265535,US +3335266304,3335273983,US +3335274496,3335276287,US +3335276288,3335276799,PR +3335276800,3335310079,US +3335323648,3335324927,US +3335325696,3335327487,US +3335327744,3335349247,US +3335356416,3335422463,US +3335424000,3335439615,US +3335439616,3335439871,CH +3335439872,3335440383,US +3335440384,3335441151,CH +3335441152,3335447039,US +3335447296,3335451903,US +3335452160,3335452671,US +3335453696,3335454463,US +3335454720,3335458815,US +3335458816,3335460863,BM +3335462912,3335487743,US +3335488000,3335501311,US +3335501568,3335502591,US +3335502848,3335511295,US +3335511552,3335519999,US +3335520256,3335654911,US +3335659520,3335667711,US +3335684096,3335716863,US +3335733248,3335741439,US +3335753728,3335784191,US +3335784448,3335789567,US +3335790592,3335795199,US +3335798784,3336111359,US +3336112128,3336116223,US +3336118272,3336139263,US +3336142848,3337029119,US +3337029632,3337031167,US +3337031680,3337034239,US +3337035776,3337055231,US +3337055232,3337060351,CA +3337060352,3337119743,US +3337125888,3337127167,US +3337127424,3337139967,US +3337140224,3337148927,US +3337149696,3337149951,US +3337150464,3337155071,US +3337155328,3337157887,US +3337158656,3337289727,US +3337289984,3337297919,CA +3337297920,3337302015,US +3337302016,3337303551,CA +3337304064,3337323007,CA +3337324544,3337335295,CA +3337335296,3337335807,US +3337335808,3337341951,CA +3337342464,3337355007,CA +3337355264,3337650175,US +3337650176,3337650687,GB +3337650688,3337650943,US +3337650944,3337651199,HK +3337651200,3337651455,CH +3337651456,3337651711,SG +3337651712,3337653503,CH +3337653504,3337653759,JP +3337653760,3337654783,CH +3337654784,3337655039,AU +3337655040,3337682943,CH +3337682944,3337685503,US +3337687040,3337694207,US +3337699328,3337882111,US +3337883648,3337891583,US +3337912320,3337948415,US +3337949184,3337955839,US +3337977856,3337980671,US +3337980672,3337980927,PR +3337980928,3337986047,US +3337986048,3337986303,BB +3337986304,3337989375,US +3337990912,3338010367,US +3338010624,3338017279,US +3338018816,3338021887,US +3338027008,3338051583,US +3338051840,3338058239,US +3338059264,3338063871,US +3338064128,3338069247,US +3338069248,3338069759,BB +3338069760,3338075903,US +3338076160,3338342143,US +3338342400,3338346239,US +3338346496,3338348543,US +3338403840,3338439167,US +3338439424,3338444799,US +3338445056,3338445311,US +3338445824,3338455551,US +3338456576,3338460671,US +3338460928,3338462719,US +3338462976,3338469119,US +3338469376,3338541567,US +3338543104,3338551295,US +3338665984,3338686463,US +3338686464,3338688511,AW +3338688512,3338689535,US +3338689536,3338689791,SL +3338689792,3338825727,US +3338825728,3338827775,AW +3338827776,3338912767,US +3338912768,3338913023,EC +3338913024,3338916351,US +3338916352,3338916479,CN +3338916480,3338963199,US +3338963712,3338964991,US +3338965248,3338969343,US +3338970112,3338976767,US +3338977024,3338993407,US +3338993664,3339000319,US +3339000832,3339028735,US +3339028992,3339031295,US +3339031552,3339042047,US +3339042304,3339043327,US +3339043584,3339045119,US +3339045376,3339050751,US +3339051008,3339055615,US +3339055872,3339058943,US +3339059200,3339063039,US +3339063296,3339076863,US +3339076864,3339077631,JP +3339077632,3339079167,US +3339079168,3339079679,DE +3339079680,3339091967,US +3339091968,3339094015,NL +3339094016,3339136767,US +3339137024,3339142655,US +3339142656,3339142911,NL +3339142912,3339145727,US +3339145728,3339145983,NL +3339145984,3339146239,US +3339146496,3339147007,US +3339147008,3339147775,CA +3339147776,3339148031,MS +3339148032,3339148543,US +3339148800,3339149311,US +3339190272,3339256575,US +3339256832,3339259135,US +3339259904,3339270399,US +3339271168,3339322367,US +3339323392,3339324927,US +3339325440,3339327999,US +3339329536,3339337727,US +3339337984,3339338239,US +3339338496,3339342847,US +3339343104,3339343615,US +3339343872,3339348223,US +3339348480,3339352831,US +3339353088,3339367423,US +3339367680,3339373055,US +3339373568,3339386111,US +3339386880,3339655679,US +3339656192,3339667967,US +3339668480,3339669503,US +3339669504,3339671807,CA +3339672576,3339673599,US +3339714560,3339722495,US +3339722752,3339739135,US +3339780096,3339911167,US +3339913216,3339923455,US +3339923456,3339926015,CA +3339926528,3339927551,CA +3339976704,3340046079,US +3340046336,3340058623,US +3340107776,3340369919,CA +3340369920,3340383487,US +3340384256,3340386559,US +3340387328,3340388351,CA +3340388352,3340390399,US +3340394496,3340404735,US +3340404992,3340411903,US +3340412160,3340414975,US +3340415232,3340419071,US +3340419328,3340425983,US +3340426752,3340429823,US +3340429824,3340430079,PA +3340430080,3340431871,US +3340432384,3340435199,US +3340435456,3340436991,US +3340437504,3340443135,US +3340443648,3340451839,US +3340500992,3340643839,US +3340697600,3340835327,US +3340835840,3340865279,US +3340865536,3340882431,US +3340882688,3340884479,US +3340884992,3340886527,US +3340886784,3340887551,US +3340888576,3340893951,US +3340894208,3340923391,US +3340923904,3340955647,US +3340959744,3341027839,US +3341028352,3341031935,US +3341032448,3341041663,US +3341090816,3341162751,US +3341163520,3341172735,US +3341189120,3341192959,US +3341193216,3341194239,US +3341194496,3341196799,US +3341221888,3341484287,US +3341484288,3341485055,CA +3341485056,3341511679,US +3341511680,3341513215,CA +3341513728,3341517823,CA +3341518848,3341531135,CA +3341531392,3341533951,US +3341534976,3341536767,CA +3341537280,3341541375,US +3341541888,3341546239,US +3341546240,3341547007,CA +3341547008,3341547519,CH +3341547520,3341549311,CA +3341549568,3341705215,US +3341713408,3341750015,US +3341750272,3341755647,US +3341756416,3341758463,US +3341811712,3341815039,US +3341815808,3341823999,US +3341877248,3342139391,US +3342139392,3342204927,CH +3342204928,3342470399,US +3342471168,3342483455,US +3342532608,3342534143,US +3342534656,3342540543,US +3342540800,3342543359,US +3342543872,3342544895,US +3342598144,3342603263,CA +3342603264,3342604799,US +3342604800,3342605311,CA +3342605312,3342605567,US +3342605568,3342614271,CA +3342614528,3342623743,CA +3342624256,3342627839,CA +3342628096,3342657535,CA +3342657792,3342663423,CA +3342663680,3342999039,US +3342999552,3343007743,US +3343056896,3343123967,US +3343124480,3343126015,US +3343126528,3343129087,US +3343129600,3343135999,US +3343136768,3343148543,US +3343149056,3343151103,US +3343187968,3343319295,US +3343319296,3343342847,CA +3343343104,3343346175,CA +3343346688,3343355391,CA +3343355904,3343359743,CA +3343360000,3343364095,CA +3343364096,3343365119,US +3343365632,3343366655,CA +3343366912,3343372543,CA +3343373312,3343376383,US +3343380480,3343384319,CA +3343384576,3343452671,US +3343453184,3343456511,US +3343457280,3343460863,US +3343461376,3343462399,US +3343466496,3343470847,US +3343471616,3343474687,US +3343482880,3343568127,US +3343568384,3343575807,US +3343576064,3343580927,US +3343581184,3343855615,US +3343859712,3343887359,US +3343887616,3343890687,US +3343890944,3343902463,US +3343902720,3343905023,US +3343905280,3343908607,US +3343908864,3344109055,US +3344109568,3344111871,US +3344112640,3344116223,US +3344116736,3344117759,US +3344121856,3344125951,US +3344171264,3344236287,CA +3344237056,3344242175,CA +3344242688,3344252671,CA +3344252928,3344255999,CA +3344256000,3344257023,US +3344261888,3344266239,CA +3344266752,3344268543,CA +3344268544,3344269311,US +3344269312,3344287743,CA +3344288000,3344288767,CA +3344288768,3344289791,PR +3344289792,3344292863,US +3344292864,3344296447,CA +3344296960,3344297983,GD +3344297984,3344299007,US +3344299264,3344299519,CA +3344299520,3344299775,US +3344299776,3344300543,CA +3344300544,3344300799,US +3344300800,3344301823,CA +3344302080,3344374271,US +3344374784,3344379903,US +3344384000,3344388095,US +3344433152,3344466431,US +3344466688,3344467455,US +3344468480,3344469247,US +3344469504,3344482047,US +3344482304,3344486399,US +3344486400,3344488447,NL +3344488448,3344495871,US +3344496640,3344497919,US +3344498176,3344498431,US +3344498688,3344511231,US +3344512000,3344531711,US +3344531968,3344534271,US +3344534528,3344536831,US +3344537088,3344548351,US +3344548608,3344556031,US +3344556288,3344563967,US +3344564224,3344633855,US +3344633856,3344637951,CH +3344637952,3344640511,US +3344641024,3344642047,US +3344695296,3344959999,US +3344960512,3344964607,US +3344964608,3344965631,CA +3344965632,3344969727,US +3345022976,3345291775,US +3345292288,3345295871,US +3345296384,3345297407,US +3345350656,3345362943,US +3345416192,3345418239,US +3345418240,3345419519,NL +3345419520,3345422847,US +3345423360,3345424383,TC +3345424384,3345430527,US +3345430528,3345432575,CA +3345432576,3345433599,GB +3345433600,3345433855,SG +3345433856,3345434879,US +3345434880,3345435135,ES +3345435136,3345435391,LU +3345435392,3345436671,DE +3345436672,3345436927,US +3345436928,3345437183,ES +3345437184,3345437695,GB +3345437696,3345437951,NL +3345438208,3345438463,GB +3345438464,3345438975,FR +3345439232,3345439743,US +3345439744,3345439999,FR +3345440000,3345440255,DE +3345440256,3345440767,US +3345441024,3345441791,DE +3345442304,3345442559,CL +3345442560,3345442815,JP +3345442816,3345443327,AT +3345443328,3345443583,CH +3345443584,3345443839,DE +3345444096,3345444607,US +3345444608,3345445119,CH +3345445120,3345445375,US +3345445376,3345446399,GB +3345446656,3345446911,IT +3345446912,3345447679,US +3345447680,3345448959,BE +3345448960,3346138879,US +3346139136,3346140415,US +3346141184,3346170111,US +3346189312,3346190335,US +3346202624,3346209279,US +3346209792,3346216447,US +3346216960,3346219007,US +3346268160,3346269695,US +3346270208,3346282495,US +3346282496,3346284543,PR +3346333696,3346471423,US +3346471936,3346481151,US +3346530304,3346545151,US +3346545664,3346578431,US +3346578688,3346583807,US +3346584064,3346595583,US +3346596864,3346660863,US +3346661376,3346662143,US +3346662400,3346663167,US +3346663424,3346690047,US +3346694144,3346726911,US +3346727936,3346730239,US +3346731008,3346734591,US +3346735104,3346748159,US +3346748416,3346750207,US +3346750464,3346750719,US +3346751488,3346793215,US +3346793472,3346793983,US +3346794496,3346798847,US +3346799616,3346807039,US +3346807808,3346861823,US +3346862080,3346923519,US +3346923520,3346989055,CA +3346989056,3346996991,US +3346997248,3346999807,US +3347000320,3347001343,US +3347054592,3349446911,US +3349446912,3349447167,CA +3349447168,3349450495,US +3349450752,3349461503,US +3349461760,3349462783,US +3349463296,3349479167,US +3349479424,3349533695,US +3349533952,3349544703,US +3349545216,3349545727,CA +3349545984,3349549567,CA +3349550080,3349551103,CA +3349551104,3349553663,US +3349553664,3349607423,CA +3349607936,3349608447,CA +3349608448,3349609215,US +3349609216,3349610239,CA +3349610496,3349614591,US +3349676032,3349678591,US +3349679104,3349682431,US +3349683200,3349686527,US +3349687296,3349688319,US +3349741568,3349987327,US +3349987328,3349996543,BM +3349996544,3349997055,KY +3349997056,3350003711,BM +3350003712,3350134783,US +3350135040,3350145791,CA +3350146048,3350147071,US +3350151168,3350160639,CA +3350160896,3350175743,CA +3350176512,3350181887,CA +3350181888,3350182911,US +3350183168,3350200063,CA +3350200320,3350466303,US +3350466560,3350469119,US +3350469632,3350470655,CA +3350470656,3350475775,US +3350475776,3350476799,CA +3350476800,3350478847,US +3350528000,3350545151,US +3350545408,3350548735,US +3350549248,3350565887,US +3350566144,3350574591,US +3350575104,3350577151,US +3350577664,3350588927,US +3350589696,3350591231,US +3350591488,3350593279,US +3350614016,3350618111,US +3350630400,3350634495,US +3350654976,3350728191,US +3350728704,3350746367,US +3350746624,3350756607,US +3350757376,3350760959,US +3350766080,3350771967,US +3350772224,3350774271,US +3350774528,3350778623,US +3350778880,3350789887,US +3350790400,3350814975,CA +3350815232,3350825727,CA +3350825728,3350825983,GB +3350825984,3350834687,CA +3350835200,3350836223,CA +3350836992,3350837247,CA +3350837760,3350843391,CA +3350843648,3350855679,CA +3350855680,3350862079,US +3350862080,3350864639,CL +3350864640,3350925055,US +3350925312,3350950399,US +3350950912,3350953983,US +3350986752,3350988031,US +3350988800,3350990335,US +3350990848,3350999039,US +3351052288,3351053823,US +3351054336,3351058943,US +3351060480,3351068159,US +3351117824,3351129087,US +3351134208,3351151359,US +3351151616,3351151871,US +3351152128,3351158527,US +3351158784,3351159295,US +3351159552,3351160063,US +3351160320,3351160575,US +3351161088,3351167487,US +3351168512,3351183103,US +3351183360,3351212031,US +3351216128,3351251967,US +3351252992,3351265279,US +3351314432,3351315967,US +3351316480,3351318015,US +3351318528,3351322367,US +3351322624,3351326719,US +3351379968,3351446783,US +3351447552,3351448831,US +3351449600,3351458815,US +3351459840,3351474687,US +3351476224,3351478271,US +3351511040,3351512319,US +3351513088,3351579135,US +3351580672,3351642111,US +3351642112,3351695871,CA +3351696384,3351696639,CA +3351697408,3351698431,CA +3351698432,3351707391,US +3351707648,3351774463,US +3351775232,3351776767,US +3351777280,3351780351,US +3351781376,3351785471,US +3351789568,3351797759,US +3351805952,3351842815,US +3351843840,3351845631,US +3351846912,3351855103,US +3351871488,3351894015,US +3351894272,3351895295,US +3351895808,3351896319,US +3351896576,3351900671,US +3351900928,3351903999,US +3351912448,3351959551,CA +3351961600,3351963647,CA +3351964160,3351969791,CA +3351969792,3351971839,US +3351971840,3351972095,IL +3351972096,3351972863,US +3351972864,3351973119,IL +3351973120,3351975935,US +3351975936,3351976447,IL +3351976448,3351976703,US +3351976704,3351976959,IL +3351976960,3351979519,US +3351979520,3351979583,IL +3351979584,3351986943,US +3351986944,3351987199,IL +3351987200,3351995647,US +3351995648,3351995903,IL +3351995904,3351996927,US +3351996928,3351997439,IL +3351997440,3352004351,US +3352004352,3352004607,IL +3352004608,3352005887,US +3352005888,3352006143,IL +3352006144,3352006399,US +3352006400,3352006527,IL +3352006528,3352006591,US +3352006592,3352006655,IL +3352006656,3352007359,US +3352007360,3352007367,IL +3352007368,3352007391,US +3352007392,3352007423,IL +3352007424,3352007583,US +3352007584,3352007679,IL +3352007680,3352007967,US +3352007968,3352008063,IL +3352008064,3352009311,US +3352009312,3352009343,IL +3352009344,3352010815,US +3352010816,3352010879,IL +3352010880,3352011199,US +3352011200,3352011263,IL +3352011264,3352014719,US +3352014720,3352014847,IL +3352014848,3352014927,US +3352014928,3352014943,IL +3352014944,3352014975,US +3352014976,3352015103,IL +3352015104,3352015999,US +3352016000,3352016127,IL +3352016128,3352020671,US +3352020672,3352020703,IL +3352020704,3352020735,US +3352020736,3352020863,IL +3352020864,3352023039,US +3352023040,3352023167,IL +3352023168,3352023343,US +3352023344,3352023359,IL +3352023360,3352023679,US +3352023680,3352023807,IL +3352023808,3352024319,US +3352024320,3352024447,IL +3352024448,3352025087,US +3352025088,3352025215,IL +3352025216,3352026623,US +3352026624,3352026751,IL +3352026752,3352027295,US +3352027296,3352027327,IL +3352027328,3352028799,US +3352028800,3352028927,IL +3352028928,3352030047,US +3352030048,3352030079,IL +3352030080,3352030143,US +3352030144,3352030175,IL +3352030176,3352030383,US +3352030384,3352030399,IL +3352030400,3352032719,US +3352032720,3352032735,IL +3352032736,3352034303,US +3352034304,3352034815,IL +3352034816,3352035327,US +3352100864,3352559871,US +3352559872,3352563199,CA +3352563456,3352570111,CA +3352570368,3352573951,CA +3352574208,3352581631,CA +3352582144,3352583935,CA +3352584192,3352591359,CA +3352591616,3352615423,CA +3352615424,3352616959,US +3352616960,3352624895,CA +3352625152,3352887295,CA +3352887296,3352911871,US +3352920064,3353309695,US +3353311232,3353333759,US +3353346048,3353729023,US +3353729024,3353729279,HK +3353729280,3353730047,US +3353739264,3353741823,US +3353743360,3353746943,US +3353747456,3353752575,US +3353753600,3353767935,US +3353772032,3353806335,US +3353806848,3353818111,US +3353819136,3353821183,US +3353837568,3353843455,US +3353843712,3353845759,US +3353870336,3353939455,US +3353939968,3353942527,US +3353944064,3353948159,US +3353952256,3353953279,US +3353953536,3353959423,US +3353959680,3353960191,US +3353960448,3353966079,US +3353966336,3353967871,US +3353968128,3353969663,US +3353969920,3353977343,US +3353977600,3353979647,US +3353979648,3353979903,CA +3353979904,3353982719,US +3353982720,3353983231,CA +3353983232,3353985023,US +3353985280,3353987583,US +3353988352,3353991679,US +3354001408,3354066943,US +3354066944,3354132479,CA +3354132480,3354463743,US +3354464256,3354466815,US +3354468352,3354476031,US +3354476544,3354484735,US +3354525696,3354532351,US +3354533888,3354560255,US +3354560512,3354562559,US +3354562816,3354568703,US +3354568960,3354570239,US +3354570496,3354582527,US +3354582784,3354590975,US +3354591232,3354656767,CA +3354656768,3354660351,US +3354660864,3354663423,US +3354664960,3354670079,US +3354671104,3354673151,US +3354689536,3354707455,US +3354709248,3354720511,US +3354722304,3354735615,US +3354736640,3354747391,US +3354748416,3354751999,US +3354752256,3354758399,US +3354759424,3354767359,US +3354767616,3354770687,US +3354770944,3354775551,US +3354776064,3354782719,US +3354782720,3354782975,CA +3354782976,3354787071,US +3354787328,3354787583,US +3354788096,3354807551,CA +3354807552,3354810367,US +3354810368,3354817535,CA +3354817792,3354823423,CA +3354823680,3354830847,CA +3354831360,3354853119,CA +3354853376,3354918911,CA +3354918912,3354920447,US +3354920960,3354926847,US +3354927104,3354934783,US +3354935296,3354955775,US +3354955776,3354956031,AR +3354956032,3354967295,US +3354967552,3354969855,US +3354970112,3354972159,US +3354972416,3354978303,US +3354978560,3354988031,US +3354988544,3355012351,US +3355013120,3355017215,CA +3355017216,3355025919,US +3355026176,3355032063,US +3355032320,3355043583,US +3355045120,3355049727,US +3355049984,3355052031,US +3355052032,3355053567,CA +3355054080,3355065343,US +3355066368,3355249151,US +3355250688,3355253247,US +3355254784,3355260927,US +3355260928,3355262719,CA +3355262976,3355292927,US +3355293696,3355310335,US +3355310592,3355311103,CA +3355312128,3355319039,US +3355319296,3355320319,CA +3355320320,3355324415,US +3355324416,3355328511,CA +3355328512,3355336703,US +3355344896,3355351039,US +3355351040,3355351295,CA +3355351296,3355372287,US +3355372288,3355372543,CA +3355372544,3355377663,US +3355443200,3355445247,CO +3355445248,3355447295,BR +3355447296,3355447551,CU +3355447552,3355447807,AR +3355447808,3355448063,HT +3355448320,3355449343,AN +3355449344,3355450367,CU +3355450368,3355451391,EC +3355451392,3355459071,BR +3355459328,3355459583,EC +3355459584,3355459839,PA +3355459840,3355460095,VE +3355460096,3355460351,CL +3355460352,3355461887,BR +3355461888,3355463423,EC +3355463424,3355463935,AR +3355463936,3355464191,BR +3355464192,3355464447,CL +3355464448,3355464959,MX +3355464960,3355465727,BR +3355465728,3355465983,MX +3355465984,3355467263,BR +3355467264,3355467519,US +3355467520,3355467775,MX +3355467776,3355468799,AR +3355468800,3355469567,BR +3355469568,3355470591,MX +3355470592,3355470847,PE +3355470848,3355471103,CL +3355471104,3355471359,MX +3355471360,3355471615,PE +3355471616,3355472383,MX +3355472384,3355472639,BR +3355472640,3355473407,CL +3355473408,3355473919,PE +3355473920,3355475199,CL +3355475200,3355477503,MX +3355478016,3355478271,PE +3355478272,3355478783,US +3355478784,3355479039,VE +3355479040,3355479551,CL +3355479552,3355479807,PE +3355479808,3355480063,MX +3355480064,3355485183,CL +3355485184,3355487743,PE +3355487744,3355487999,CL +3355488000,3355488255,AR +3355488256,3355488767,GT +3355488768,3355489023,PA +3355489024,3355489279,CR +3355489280,3355489535,SV +3355489536,3355491071,AR +3355491072,3355491327,CO +3355491328,3355494655,AR +3355494656,3355494911,CO +3355494912,3355495423,PA +3355495424,3355496447,UY +3355496448,3355498495,AR +3355498496,3355500543,US +3355500544,3355508735,AR +3355508736,3355510271,VE +3355510272,3355510527,EC +3355510528,3355510783,AR +3355510784,3355512831,VE +3355512832,3355516927,CL +3355516928,3355525119,AR +3355525120,3355535359,CO +3355535360,3355537407,TT +3355537408,3355537663,CO +3355537664,3355537919,AR +3355537920,3355538175,NI +3355538176,3355538431,CL +3355538432,3355539199,AR +3355539200,3355539455,VE +3355539456,3355540479,CL +3355540480,3355540735,CO +3355540736,3355540991,BZ +3355540992,3355541503,CO +3355541504,3355545599,CL +3355545600,3355547647,VE +3355547648,3355547903,NI +3355547904,3355548159,GT +3355548160,3355548671,DO +3355548672,3355549695,SR +3355549696,3355549951,US +3355549952,3355550207,EC +3355550208,3355552767,VE +3355552768,3355553023,EC +3355553024,3355553279,CO +3355553280,3355553535,CL +3355553536,3355553791,CO +3355553792,3355555839,PE +3355555840,3355557887,VE +3355557888,3355559935,CO +3355559936,3355561983,PY +3355561984,3355564031,SR +3355566080,3355574271,AR +3355574272,3355576319,CL +3355576320,3355578367,VE +3355578368,3355582463,CL +3355582464,3355590655,UY +3355590656,3355592703,CO +3355592704,3355599871,CL +3355600896,3355604991,CL +3355604992,3355607039,AR +3355607040,3355615231,HT +3355615232,3355623423,SR +3355623424,3355639807,CL +3355639808,3355642367,VE +3355642368,3355642879,PA +3355642880,3355643903,UY +3355643904,3355647999,BR +3355648000,3355668991,AR +3355668992,3355669247,PE +3355669248,3355672575,AR +3355672576,3355677183,CO +3355677696,3355682815,CO +3355682816,3355684863,AR +3355684864,3355686911,TT +3355686912,3355688959,AR +3355688960,3355689471,CO +3355689984,3355693055,PA +3355693056,3355695103,CL +3355695104,3355697151,AR +3355697152,3355701503,HN +3355701504,3355701759,PE +3355702272,3355703295,CO +3355703296,3355705343,PY +3355705344,3355709439,MX +3355709440,3355713535,CO +3355713536,3355720447,MX +3355720448,3355720703,AR +3355720704,3355722751,MX +3355723264,3355746303,MX +3355746304,3355754495,HT +3355754496,3355770879,PE +3355770880,3355773183,US +3355773184,3355773439,BR +3355773696,3355773951,US +3355773952,3355774975,CU +3355774976,3355779071,VE +3355781120,3355783167,VE +3355783168,3355785215,AR +3355785216,3355787263,CO +3355787264,3355803647,AR +3355803648,3355820031,VE +3355820032,3355836415,AR +3355836416,3355841023,EC +3355841024,3355841279,CL +3355841280,3355843327,EC +3355843328,3355843583,VE +3355843584,3355844863,EC +3355844864,3355845119,CL +3355845120,3355845375,EC +3355845376,3355848959,BR +3355848960,3355849215,CL +3355849728,3355849983,PA +3355849984,3355850495,CL +3355850496,3355850751,NI +3355850752,3355852799,AN +3355852800,3355856639,CL +3355856640,3355856895,PA +3355856896,3355858943,EC +3355858944,3355860991,DO +3355860992,3355869183,CL +3355869184,3355870719,BR +3355871232,3355871487,US +3355871488,3355873279,AR +3355873280,3355875327,AN +3355875328,3355877375,VE +3355877376,3355885567,CO +3355885568,3355901951,GT +3355901952,3355902975,BR +3355904000,3355905535,BR +3355905536,3355905791,PY +3355905792,3355906047,AR +3355906048,3355910143,CL +3355910144,3355911503,AN +3355911504,3355911519,TF +3355911520,3355918335,AN +3355918336,3355923455,EC +3355923456,3355923967,UY +3355924480,3355926527,TT +3355926528,3355934719,VE +3355934720,3355938815,AR +3355942912,3355947007,BO +3355947008,3355949055,AR +3355949056,3355951103,AN +3355951104,3355959295,EC +3355967488,3356033023,VE +3356033024,3356033791,BR +3356033792,3356034047,CL +3356034048,3356035071,PY +3356035072,3356037119,MX +3356037120,3356041215,CO +3356041216,3356049407,CR +3356049408,3356049663,CL +3356049664,3356051455,BR +3356051456,3356051711,CO +3356051712,3356051967,CL +3356051968,3356052223,GT +3356052224,3356052479,AR +3356052480,3356052991,BR +3356053248,3356054015,CL +3356054016,3356054527,US +3356054528,3356057599,BR +3356057600,3356057855,EC +3356057856,3356059135,CL +3356059136,3356060671,BR +3356060672,3356061695,CL +3356061696,3356062463,BR +3356062464,3356062719,US +3356062720,3356064255,BR +3356064256,3356064511,CL +3356064512,3356065791,BR +3356065792,3356066047,CL +3356066048,3356069119,BR +3356069120,3356069631,CL +3356069632,3356070143,BR +3356070144,3356070655,CL +3356070656,3356070911,AR +3356070912,3356071423,BR +3356071424,3356072447,CL +3356073472,3356075263,BR +3356075264,3356076287,BO +3356076288,3356078079,BR +3356078080,3356078335,EC +3356078336,3356079359,CL +3356079360,3356080895,BR +3356080896,3356082431,NI +3356082432,3356082687,CL +3356082688,3356082943,AR +3356082944,3356083967,CL +3356083968,3356084479,BR +3356084480,3356084735,CL +3356084736,3356085247,BR +3356085248,3356085759,CL +3356085760,3356086271,BR +3356086272,3356086527,AR +3356086528,3356086783,CR +3356086784,3356087039,VE +3356087040,3356087295,CO +3356087296,3356087807,AR +3356087808,3356088063,BR +3356088064,3356088319,CL +3356088320,3356089087,TT +3356089088,3356089343,AR +3356089344,3356090623,BR +3356090624,3356090879,CL +3356090880,3356091135,BR +3356091136,3356091391,AR +3356091392,3356091647,CL +3356091648,3356091903,BR +3356091904,3356092927,CL +3356092928,3356093183,BR +3356093184,3356093951,AR +3356093952,3356094975,CL +3356094976,3356096255,AR +3356096256,3356096511,CL +3356096512,3356096767,EC +3356096768,3356097791,BR +3356097792,3356098303,AR +3356098304,3356098559,GT +3356098560,3356099583,CL +3356099584,3356100607,BR +3356100608,3356102399,CL +3356102400,3356102655,PA +3356102656,3356105727,CL +3356106752,3356113919,BR +3356114944,3356123135,PE +3356123136,3356131839,AR +3356131840,3356132351,PE +3356132352,3356134143,BR +3356134144,3356134655,AR +3356134656,3356134911,BR +3356134912,3356135167,DO +3356135168,3356135423,MX +3356135424,3356135679,BR +3356135680,3356135935,CL +3356135936,3356136191,BR +3356136192,3356137471,EC +3356137472,3356137727,JM +3356137728,3356138239,BR +3356138240,3356138495,US +3356138496,3356139519,BR +3356139520,3356139775,US +3356139776,3356140031,AR +3356140032,3356140287,DO +3356140288,3356140799,BR +3356140800,3356141311,BM +3356141312,3356142847,CL +3356142848,3356145151,BR +3356145152,3356145407,CL +3356145408,3356145663,BR +3356145664,3356145919,CL +3356145920,3356146175,BR +3356146176,3356146431,AR +3356146432,3356146687,BR +3356146688,3356146943,PE +3356146944,3356147199,BR +3356147200,3356147455,CL +3356147456,3356148223,BR +3356148224,3356148479,BZ +3356148480,3356148735,CL +3356148736,3356148991,AR +3356148992,3356149503,MX +3356149504,3356149759,AR +3356149760,3356150015,MX +3356150016,3356150527,AR +3356150528,3356150783,PA +3356150784,3356151039,AR +3356151040,3356151295,NI +3356151296,3356151807,AR +3356151808,3356152063,CL +3356152064,3356152575,BR +3356152576,3356152831,CL +3356152832,3356154623,MX +3356154624,3356154879,AR +3356154880,3356156671,CL +3356156672,3356156927,BR +3356156928,3356157951,PY +3356157952,3356158207,CL +3356158208,3356158463,MX +3356158464,3356158719,CL +3356158720,3356158975,AR +3356158976,3356159743,CL +3356159744,3356160255,MX +3356160256,3356160511,GT +3356160512,3356160767,CL +3356160768,3356161279,MX +3356161280,3356161535,BR +3356161536,3356162559,MX +3356162560,3356162815,PE +3356162816,3356163583,CL +3356163584,3356163839,VE +3356163840,3356164095,CL +3356164096,3356171519,BR +3356171520,3356171775,AR +3356172288,3356172543,PE +3356172800,3356174335,PE +3356174336,3356176383,CO +3356176384,3356180479,PE +3356180480,3356190719,CL +3356190720,3356192767,DO +3356192768,3356194815,AR +3356194816,3356196863,TT +3356196864,3356229631,VE +3356229632,3356233727,BR +3356233728,3356236799,CL +3356237824,3356246015,GT +3356246016,3356262655,MX +3356262656,3356263167,CL +3356263168,3356263423,BR +3356263424,3356263679,CL +3356263680,3356265215,AR +3356265216,3356265471,BR +3356265472,3356267007,CL +3356267264,3356268799,CL +3356269056,3356269311,AR +3356269312,3356269823,UY +3356269824,3356270079,BR +3356270080,3356272383,MX +3356272384,3356272639,CR +3356272640,3356272895,US +3356272896,3356273151,EC +3356273152,3356273407,CO +3356273664,3356274431,SV +3356274432,3356278783,CO +3356279040,3356279295,VE +3356280832,3356282879,AR +3356282880,3356284927,PA +3356284928,3356286975,AR +3356286976,3356286991,US +3356286992,3356287007,GT +3356287008,3356287023,HN +3356287024,3356287039,GT +3356287040,3356287047,US +3356287048,3356287071,GT +3356287072,3356287135,US +3356287136,3356287151,GT +3356287152,3356287359,US +3356287360,3356287367,GT +3356287368,3356287487,US +3356287488,3356287743,SV +3356287744,3356288255,HN +3356288256,3356288767,SV +3356288768,3356289023,GT +3356289024,3356289791,SV +3356289792,3356289799,US +3356289800,3356289807,GT +3356289808,3356289823,SV +3356289824,3356289887,US +3356289888,3356289919,SV +3356289920,3356289951,US +3356289952,3356289983,GT +3356289984,3356290303,US +3356290304,3356290559,SV +3356290560,3356291071,CR +3356291072,3356293119,TT +3356293120,3356295167,AW +3356295168,3356297215,CL +3356297216,3356299263,BR +3356299264,3356305663,MX +3356305664,3356305919,AR +3356307456,3356316415,MX +3356317696,3356328959,MX +3356329984,3356332031,GF +3356332032,3356334079,CU +3356334080,3356336127,BO +3356336128,3356336639,SV +3356336640,3356338175,HN +3356338176,3356339967,SV +3356339968,3356341247,HN +3356341248,3356341503,SV +3356341504,3356342271,HN +3356342272,3356343039,SV +3356343040,3356343551,HN +3356343552,3356344319,SV +3356344320,3356360703,CO +3356360704,3356362751,CL +3356362752,3356364799,VE +3356364800,3356368895,MX +3356368896,3356369407,BR +3356369408,3356369663,EC +3356369664,3356370175,BR +3356370944,3356372991,CO +3356372992,3356375039,CU +3356375040,3356377087,HN +3356377088,3356379647,CL +3356380160,3356380927,CL +3356381184,3356381439,CL +3356382208,3356389119,CL +3356389376,3356389887,CO +3356389888,3356390399,CL +3356390656,3356391167,CL +3356391424,3356393471,CO +3356393472,3356426239,CL +3356426240,3356491775,US +3356491776,3356493823,PE +3356493824,3356495871,MU +3356495872,3356499967,AR +3356499968,3356508159,MX +3356508160,3356508671,AR +3356510208,3356511999,AR +3356512256,3356514303,AR +3356514304,3356514559,US +3356516352,3356520447,AR +3356521472,3356521727,AR +3356522496,3356557311,AR +3356557312,3356819455,BR +3356819456,3356884991,CO +3356884992,3356950527,CL +3356950528,3357016063,MX +3357016064,3357018623,CO +3357020160,3357048831,CO +3357057024,3357065215,PE +3357065216,3357073407,EC +3357073408,3357077503,CL +3357077504,3357081599,AR +3357081600,3357114367,CO +3357114368,3357138943,EC +3357138944,3357147135,CO +3357147136,3357179903,AR +3357179904,3357188095,CO +3357188096,3357190143,VE +3357190144,3357192191,DO +3357192192,3357194239,PY +3357194240,3357196287,AR +3357196288,3357204479,AN +3357204480,3357204991,US +3357204992,3357205759,AN +3357205760,3357206271,VG +3357206272,3357206527,AW +3357206528,3357208575,AN +3357208576,3357212671,AW +3357212672,3357368319,CL +3357368320,3357376511,CO +3357376512,3357403135,CL +3357403136,3357405183,CO +3357405184,3357407231,EC +3357407232,3357409279,AR +3357409280,3357413119,US +3357413120,3357413375,FR +3357413376,3357421311,US +3357421312,3357421567,CO +3357421568,3357422847,US +3357422848,3357423103,PR +3357423104,3357423615,US +3357423616,3357424639,VE +3357424640,3357425663,US +3357425664,3357442047,CO +3357442048,3357442303,NI +3357442304,3357442447,HN +3357442448,3357442455,SV +3357442456,3357442559,HN +3357442560,3357442815,NI +3357442816,3357443071,SV +3357443072,3357443327,NI +3357443328,3357443583,GT +3357443584,3357444607,HN +3357444608,3357444863,SV +3357444864,3357448191,GT +3357448192,3357448703,SV +3357448704,3357448959,GT +3357448960,3357449727,HN +3357449728,3357450751,GT +3357450752,3357451007,SV +3357451008,3357451519,HN +3357451520,3357451775,NI +3357451776,3357452287,GT +3357452288,3357452799,HN +3357452800,3357453055,NI +3357453056,3357453311,SV +3357453312,3357454591,GT +3357454592,3357454847,NI +3357454848,3357455103,HN +3357455104,3357455359,SV +3357455360,3357455871,GT +3357455872,3357456127,NI +3357456128,3357456639,GT +3357456640,3357456895,HN +3357456896,3357458431,GT +3357458432,3357474815,CL +3357474816,3357474843,US +3357474844,3357474847,PE +3357474848,3357474851,VE +3357474852,3357474855,EC +3357474856,3357474863,US +3357474864,3357474867,EC +3357474868,3357474875,CO +3357474876,3357474879,EC +3357474880,3357474883,VE +3357474884,3357474887,US +3357474888,3357474891,CO +3357474892,3357474895,US +3357474896,3357474899,CO +3357474900,3357474903,US +3357474904,3357474907,VE +3357474908,3357474923,US +3357474924,3357474927,VE +3357474928,3357474931,CO +3357474932,3357474935,US +3357474936,3357474939,PE +3357474940,3357474951,US +3357474952,3357474955,VE +3357474956,3357474959,US +3357474960,3357474963,CO +3357474964,3357474967,US +3357474968,3357474975,EC +3357474976,3357474983,US +3357474984,3357474987,EC +3357474988,3357474991,CO +3357474992,3357474995,CL +3357474996,3357475023,US +3357475024,3357475027,CO +3357475028,3357475051,US +3357475052,3357475055,CO +3357475056,3357475059,US +3357475060,3357475071,EC +3357475072,3357475839,AR +3357475840,3357476351,VE +3357476352,3357476607,EC +3357476608,3357476863,US +3357476864,3357477631,EC +3357477632,3357477887,AR +3357477888,3357478199,CO +3357478200,3357478207,EC +3357478208,3357480871,CO +3357480872,3357480879,EC +3357480880,3357480959,CO +3357480960,3357483007,EC +3357483008,3357491199,CL +3357491200,3357491843,CO +3357491844,3357491847,CR +3357491848,3357495375,CO +3357495376,3357495383,US +3357495384,3357496599,CO +3357496600,3357496607,LA +3357496608,3357496643,CO +3357496644,3357496647,CR +3357496648,3357499391,CO +3357499392,3357507583,PE +3357507584,3357515775,VE +3357515776,3357523967,SV +3357523968,3357532159,CO +3357532160,3357536255,AR +3357540352,3357556735,AR +3357556736,3357556991,VE +3357556992,3357557759,MX +3357557760,3357559295,EC +3357559296,3357559551,CA +3357559552,3357559807,US +3357559808,3357560319,VE +3357560320,3357560575,MX +3357560576,3357560831,US +3357560832,3357561855,CO +3357561856,3357562351,AR +3357562352,3357562367,US +3357562368,3357563047,AR +3357563048,3357563055,CL +3357563056,3357573003,AR +3357573004,3357573007,CL +3357573008,3357581311,AR +3357581312,3357589503,CL +3357589504,3357605887,BZ +3357605888,3357736959,MX +3357736960,3357745151,VE +3357745152,3357753343,CO +3357753344,3357757487,VE +3357757488,3357757495,BO +3357757496,3357773823,VE +3357773824,3357775871,PA +3357775872,3357777919,UY +3357777920,3357777923,SV +3357777924,3357778059,GT +3357778060,3357778063,SV +3357778064,3357778071,GT +3357778072,3357778075,SV +3357778076,3357778339,GT +3357778340,3357778343,SV +3357778344,3357778415,GT +3357778416,3357778423,SV +3357778424,3357778687,GT +3357778688,3357778695,SV +3357778696,3357779047,GT +3357779048,3357779055,SV +3357779056,3357779071,GT +3357779072,3357779079,SV +3357779080,3357779143,GT +3357779144,3357779151,SV +3357779152,3357779183,GT +3357779184,3357779199,SV +3357779200,3357779839,GT +3357779840,3357779855,SV +3357779856,3357780559,GT +3357780560,3357780575,SV +3357780576,3357782535,GT +3357782536,3357782543,SV +3357782544,3357784319,GT +3357784320,3357784479,SV +3357784480,3357784487,GT +3357784488,3357784511,SV +3357784512,3357784543,GT +3357784544,3357784551,SV +3357784552,3357785087,GT +3357785088,3357785163,SV +3357785164,3357785167,GT +3357785168,3357785215,SV +3357785216,3357785219,GT +3357785220,3357785223,SV +3357785224,3357785227,GT +3357785228,3357785247,SV +3357785248,3357785255,GT +3357785256,3357785599,SV +3357785600,3357785603,GT +3357785604,3357785855,SV +3357785856,3357786111,GT +3357786112,3357802495,VE +3357802496,3357868031,MX +3357868032,3357933567,PE +3357933568,3358064639,MX +3358064640,3358130175,UY +3358130176,3358131199,EC +3358131200,3358132223,CO +3358132224,3358132479,AR +3358132480,3358132735,CO +3358132736,3358133247,EC +3358133248,3358133759,VE +3358133760,3358140471,AR +3358140472,3358140475,US +3358140476,3358140547,AR +3358140548,3358140551,CL +3358140552,3358140623,AR +3358140624,3358140627,US +3358140628,3358142719,AR +3358142720,3358142975,US +3358142976,3358143231,CO +3358143232,3358143487,VE +3358143488,3358143999,US +3358144000,3358144511,CL +3358144512,3358145023,VE +3358145024,3358147135,AR +3358147136,3358147167,US +3358147168,3358149631,AR +3358149632,3358150655,CO +3358150656,3358151679,EC +3358151680,3358152703,PE +3358152704,3358152959,US +3358152960,3358153215,EC +3358153216,3358153247,HT +3358153248,3358153327,US +3358153328,3358153343,AR +3358153344,3358153559,US +3358153560,3358153567,CL +3358153568,3358153583,BR +3358153584,3358153727,US +3358153728,3358153983,EC +3358153984,3358154239,US +3358154240,3358154751,CL +3358154752,3358158847,PE +3358158848,3358159103,AR +3358159104,3358159151,US +3358159152,3358159159,AR +3358159160,3358159167,US +3358159168,3358159359,AR +3358159360,3358159615,EC +3358159616,3358159871,US +3358159872,3358160895,VE +3358160896,3358191615,AR +3358191616,3358192639,CL +3358192640,3358236671,AR +3358236672,3358244863,CL +3358244864,3358261247,DO +3358261248,3358264063,AR +3358264064,3358264319,PY +3358264320,3358326783,AR +3358326784,3358392319,VE +3358392320,3358411263,AR +3358411264,3358411279,UY +3358411280,3358457855,AR +3358457856,3358523391,PA +3358523392,3358543615,AR +3358543616,3358543871,VE +3358543872,3358544127,MX +3358544128,3358558463,AR +3358558464,3358558975,PY +3358558976,3358559231,AR +3358559232,3358560255,VE +3358560256,3358561791,AR +3358561792,3358562303,VE +3358562304,3358563327,PE +3358563328,3358564095,CO +3358564096,3358564351,MX +3358564352,3358564479,AR +3358564480,3358564511,US +3358564512,3358567423,AR +3358567424,3358568959,CO +3358568960,3358569471,MX +3358569472,3358570495,VE +3358570496,3358570751,MX +3358570752,3358571263,PE +3358571264,3358572543,MX +3358572544,3358577151,AR +3358577152,3358577407,PE +3358577408,3358578431,AR +3358578432,3358578687,VE +3358578688,3358579967,CO +3358579968,3358580223,AR +3358580224,3358580735,MX +3358580736,3358588927,AR +3358588928,3358654463,PE +3358654464,3358658559,AR +3358658560,3358660607,CL +3358660608,3358662655,AR +3358666752,3358695423,AR +3358695424,3358703615,GT +3358703616,3358715903,AR +3358715904,3358717951,EC +3358717952,3358719999,AR +3358720000,3358728191,US +3358728192,3358736383,CL +3358736384,3358737111,US +3358737112,3358737119,CA +3358737120,3358744575,US +3358744576,3358752767,CL +3358752768,3358756863,US +3358756864,3358760959,CL +3358760960,3358769151,AR +3358769152,3358777343,HT +3358777344,3358779391,CR +3358779392,3358781439,EC +3358781440,3358851071,AR +3358851072,3358982143,MX +3358982144,3359047679,CL +3359047680,3359057007,AR +3359057008,3359057023,CL +3359057024,3359080447,AR +3359080448,3359093295,CU +3359093296,3359093303,EC +3359093304,3359093335,CU +3359093336,3359093343,DO +3359093344,3359095719,CU +3359095720,3359095727,EC +3359095728,3359096831,CU +3359096832,3359105023,CL +3359105024,3359109119,EC +3359109120,3359111167,AR +3359111168,3359113215,EC +3359113216,3359244287,MX +3359244288,3359249695,US +3359249696,3359249727,BR +3359249728,3359260671,US +3359260672,3359268863,BO +3359268864,3359275519,AR +3359275520,3359275551,VE +3359275552,3359277055,AR +3359277056,3359285247,UY +3359285248,3359293439,BO +3359293440,3359305727,CO +3359305728,3359307775,DO +3359307776,3359309823,CL +3359309824,3359313919,AR +3359313920,3359315967,CR +3359315968,3359318015,HN +3359318016,3359356927,AR +3359356928,3359358975,VE +3359358976,3359363071,AR +3359367168,3359375359,AR +3359375360,3359440895,PE +3359440896,3359457487,AR +3359457488,3359457503,EC +3359457504,3359457663,AR +3359457664,3359457679,EC +3359457680,3359457695,AR +3359457696,3359457727,BO +3359457728,3359461951,AR +3359461952,3359462015,HN +3359462016,3359462271,AR +3359462272,3359462335,UY +3359462336,3359463399,AR +3359463400,3359463407,CO +3359463408,3359463423,BO +3359463424,3359463679,AR +3359463680,3359463743,HN +3359463744,3359464447,AR +3359464448,3359465471,UY +3359465472,3359466495,AR +3359466496,3359466751,BO +3359466752,3359472639,AR +3359472640,3359473663,PY +3359473664,3359477759,AR +3359477760,3359481855,CO +3359481856,3359498239,AR +3359498240,3359502335,PY +3359506432,3359508479,US +3359508480,3359514623,VE +3359514624,3359516671,GT +3359516672,3359516927,VG +3359516928,3359517183,US +3359517184,3359517439,VG +3359517440,3359517695,US +3359517696,3359517951,VG +3359517952,3359520255,US +3359520256,3359520767,AR +3359520768,3359522815,US +3359522816,3359539199,NI +3359539200,3359550319,PE +3359550320,3359550335,NI +3359550336,3359571967,PE +3359571968,3359582207,AR +3359582208,3359583487,PA +3359583488,3359583743,HN +3359583744,3359584255,PA +3359584256,3359586303,AR +3359586304,3359588351,CL +3359588352,3359589375,AR +3359589376,3359589887,UY +3359589888,3359596543,AR +3359596544,3359598591,CL +3359598592,3359600639,AN +3359600640,3359621119,AR +3359621120,3359637503,EC +3359637504,3359789583,MX +3359789584,3359789599,US +3359789600,3359789823,MX +3359789824,3359789887,US +3359789888,3359899647,MX +3359899648,3359916031,CL +3359916032,3359918143,AR +3359918144,3359918175,US +3359918176,3359932415,AR +3359932416,3359948799,CO +3359948800,3359966719,AR +3359966720,3359966735,AW +3359966736,3359989759,AR +3359989760,3359997951,CO +3359997952,3360006143,AR +3360006144,3360014335,EC +3360014336,3360096255,AR +3360096256,3360104447,UY +3360104448,3360116735,CO +3360116736,3360118783,BO +3360118784,3360120831,AR +3360120832,3360124927,CO +3360129024,3360145407,VE +3360145408,3360153599,CL +3360153600,3360157695,AR +3360157696,3360159743,VE +3360159744,3360161791,AN +3360161792,3360227327,CL +3360227328,3360227839,CO +3360227840,3360228351,CL +3360228352,3360229375,CO +3360229376,3360230399,CL +3360230400,3360231431,CO +3360231432,3360231463,CL +3360231464,3360231471,CO +3360231472,3360231479,CL +3360231480,3360231487,CO +3360231488,3360231527,CL +3360231528,3360231551,CO +3360231552,3360231631,CL +3360231632,3360231639,CO +3360231640,3360231655,CL +3360231656,3360232447,CO +3360232448,3360233471,CL +3360233472,3360235263,CO +3360235264,3360235271,CL +3360235272,3360235487,CO +3360235488,3360235495,CL +3360235496,3360235519,CO +3360235520,3360235775,CL +3360235776,3360236799,CO +3360236800,3360237055,CL +3360237056,3360238847,CO +3360238848,3360239103,CL +3360239104,3360240895,CO +3360240896,3360241151,CL +3360241152,3360243199,CO +3360243200,3360243455,CL +3360243456,3360243711,CO +3360243712,3360243967,CL +3360243968,3360244095,CO +3360244096,3360244127,CL +3360244128,3360244479,CO +3360244480,3360244735,CL +3360244736,3360245119,CO +3360245120,3360245123,CL +3360245124,3360245199,CO +3360245200,3360245203,CL +3360245204,3360245759,CO +3360245760,3360248575,CL +3360248576,3360251903,CO +3360251904,3360253951,BO +3360253952,3360255999,SV +3360256000,3360258047,AR +3360258048,3360260095,CL +3360260096,3360267263,AR +3360267264,3360267775,US +3360267776,3360268287,AR +3360268288,3360269055,US +3360269056,3360269567,AR +3360269568,3360269823,US +3360269824,3360270079,AR +3360270080,3360270335,US +3360270336,3360270591,AR +3360270592,3360270847,US +3360270848,3360276479,AR +3360276480,3360278527,VE +3360278528,3360280575,EC +3360280576,3360282623,CL +3360282624,3360284671,CO +3360284672,3360325631,CL +3360325632,3360333823,CO +3360333824,3360342015,CL +3360342016,3360354303,VE +3360354304,3360356351,PA +3360356352,3360358399,CR +3360358400,3360358911,CL +3360358912,3360358919,CO +3360358920,3360366591,CL +3360366592,3360382975,CO +3360382976,3360399359,VE +3360399360,3360403455,BO +3360403456,3360404479,US +3360404480,3360404543,AR +3360404544,3360405503,US +3360405504,3360407551,HN +3360407552,3360423935,PA +3360423936,3360455935,MX +3360455936,3360456703,US +3360456704,3360547983,MX +3360547984,3360547999,NI +3360548000,3360686079,MX +3360686080,3360687871,CO +3360687872,3360687975,AR +3360687976,3360687983,CO +3360687984,3360688079,AR +3360688080,3360688119,CO +3360688120,3360688127,AR +3360688128,3360688639,CO +3360688640,3360688895,AR +3360688896,3360689407,CO +3360689408,3360689919,AR +3360689920,3360690199,CO +3360690200,3360690215,AR +3360690216,3360690223,CO +3360690224,3360690231,AR +3360690232,3360690303,CO +3360690304,3360690327,AR +3360690328,3360690351,CO +3360690352,3360690415,AR +3360690416,3360690559,CO +3360690560,3360690687,AR +3360690688,3360690703,CO +3360690704,3360690719,AR +3360690720,3360690735,CO +3360690736,3360690879,AR +3360690880,3360691199,CO +3360691200,3360691327,AR +3360691328,3360691711,CO +3360691712,3360691967,AR +3360691968,3360692319,CO +3360692320,3360692367,AR +3360692368,3360692431,CO +3360692432,3360692439,AR +3360692440,3360692479,CO +3360692480,3360692671,AR +3360692672,3360692735,CO +3360692736,3360692799,AR +3360692800,3360692863,CO +3360692864,3360693263,AR +3360693264,3360693279,CO +3360693280,3360693351,AR +3360693352,3360693407,CO +3360693408,3360693423,AR +3360693424,3360693759,CO +3360693760,3360693799,AR +3360693800,3360693855,CO +3360693856,3360694015,AR +3360694016,3360694071,CO +3360694072,3360694079,AR +3360694080,3360694239,CO +3360694240,3360694247,AR +3360694248,3360694391,CO +3360694392,3360694415,AR +3360694416,3360694431,CO +3360694432,3360694447,AR +3360694448,3360694463,CO +3360694464,3360694783,AR +3360694784,3360695039,CO +3360695040,3360695263,AR +3360695264,3360695295,CO +3360695296,3360696447,AR +3360696448,3360696487,CO +3360696488,3360696495,AR +3360696496,3360696511,CO +3360696512,3360696543,AR +3360696544,3360696575,CO +3360696576,3360696703,AR +3360696704,3360696719,CO +3360696720,3360696735,AR +3360696736,3360696767,CO +3360696768,3360696783,AR +3360696784,3360696831,CO +3360696832,3360697599,AR +3360697600,3360697855,CO +3360697856,3360698111,AR +3360698112,3360698879,CO +3360698880,3360698911,AR +3360698912,3360698991,CO +3360698992,3360699007,AR +3360699008,3360700415,CO +3360700416,3360701311,AR +3360701312,3360702463,CO +3360702464,3360710655,AR +3360710656,3360718847,HT +3360718848,3360763903,AR +3360763904,3360765951,GT +3360765952,3360767999,CO +3360768000,3360772351,AR +3360772352,3360772479,BO +3360772480,3360788479,AR +3360788480,3360790527,CL +3360790528,3360849919,AR +3360849920,3360882687,VE +3360882688,3360948223,CL +3360948224,3361013759,VE +3361013760,3361021951,SV +3361021952,3361030143,PY +3361030144,3361034239,VE +3361034240,3361036287,EC +3361036288,3361046527,AR +3361046528,3361052671,BO +3361052672,3361054719,AR +3361054720,3361058815,NI +3361058816,3361062911,AR +3361062912,3361071103,CL +3361071104,3361079295,CO +3361079296,3361144831,CL +3361144832,3361210367,BO +3361210368,3361275903,DO +3361275904,3361276639,PE +3361276640,3361276647,US +3361276648,3361284095,PE +3361284096,3361296383,CL +3361296384,3361298431,SV +3361298432,3361300479,DO +3361300480,3361308671,CO +3361308672,3361325055,AR +3361325056,3361341439,CO +3361341440,3361374207,VE +3361374208,3361378303,PA +3361378304,3361380351,BO +3361380352,3361382399,EC +3361382400,3361415167,CL +3361415168,3361417215,AR +3361417216,3361419263,CL +3361419264,3361423359,AR +3361423360,3361456127,CR +3361456128,3361471131,CO +3361471132,3361471135,CL +3361471136,3361472511,CO +3361472512,3361538047,MX +3361538048,3361570815,VE +3361570816,3361587199,CO +3361587200,3361599487,EC +3361599488,3361600767,UY +3361601536,3361603583,EC +3361603584,3361734655,MX +3361734656,3362258943,BR +3362258944,3362324479,CL +3362324480,3362324735,AR +3362324736,3362324991,UY +3362324992,3362326527,AR +3362326528,3362328575,BR +3362328576,3362330623,CO +3362330624,3362332671,MX +3362332672,3362336767,PA +3362336768,3362338815,CO +3362338816,3362339839,AR +3362339840,3362341887,CO +3362341888,3362342143,AR +3362342144,3362342911,PA +3362342912,3362343423,CO +3362343424,3362343679,EC +3362343680,3362344959,CO +3362344960,3362347007,PA +3362347008,3362349055,CO +3362349056,3362351103,CR +3362351104,3362353151,AR +3362353152,3362355199,EC +3362355200,3362357247,AR +3362357248,3362381823,BO +3362381824,3362390015,EC +3362390016,3362422783,PE +3362422784,3362426879,CO +3362426880,3362428927,PA +3362428928,3362430975,CL +3362430976,3362447359,CO +3362447360,3362449407,HN +3362449408,3362450175,SV +3362450176,3362451455,HN +3362455552,3362471935,EC +3362471936,3362476031,CL +3362476032,3362476287,HN +3362476544,3362477055,CR +3362484224,3362484479,AR +3362484480,3362486271,UY +3362486272,3362488319,HN +3362488320,3362504703,PE +3362504704,3362506751,VE +3362506752,3362508799,AR +3362508800,3362510847,HN +3362510848,3362512895,GT +3362512896,3362514943,AR +3362514944,3362516991,HN +3362516992,3362519039,BO +3362519040,3362521087,EC +3362521088,3362529279,TT +3362529280,3362533375,PA +3362537472,3362545663,AR +3362545664,3362549759,PE +3362553856,3362557951,PY +3362562048,3362570239,BZ +3362570240,3362586623,UY +3362586624,3362652159,VE +3362652160,3362664447,PE +3362668544,3362676735,EC +3362676736,3362680831,CO +3362684928,3362688767,AR +3362688768,3362689279,CO +3362689280,3362689311,AR +3362689312,3362689535,CO +3362689536,3362689567,AR +3362689568,3362690015,CO +3362690016,3362690047,AR +3362690048,3362690367,CO +3362690368,3362690431,AR +3362690432,3362691071,CO +3362691072,3362692095,PA +3362692096,3362692223,AR +3362692224,3362692231,CO +3362692232,3362692239,AR +3362692240,3362692351,CO +3362692352,3362692607,MX +3362692608,3362693119,CO +3362693120,3362695167,AR +3362695168,3362697215,CO +3362697216,3362703359,AR +3362703360,3362705407,GT +3362705408,3362711551,AR +3362711552,3362713599,EC +3362713600,3362717695,GT +3362717696,3362815999,CL +3362816000,3362832383,AR +3362832384,3362836479,BO +3362840576,3362897919,CL +3362897920,3362906111,HT +3362914304,3362930687,CO +3362947072,3362983935,AR +3362988032,3362992127,EC +3362996224,3363000319,UY +3363004416,3363012607,CO +3363012608,3363013967,PA +3363013968,3363013975,NI +3363013976,3363024895,PA +3363028992,3363045375,AR +3363045376,3363110911,CO +3363110912,3363112063,AR +3363112064,3363112079,PY +3363112080,3363112127,AR +3363112128,3363112143,PY +3363112144,3363176447,AR +3363176448,3363274751,CO +3363274752,3363282943,GT +3363291136,3363299327,BO +3363299328,3363373055,CL +3363373056,3363438591,PE +3363438592,3363471359,AR +3363471360,3363480575,CR +3363480576,3363481087,CO +3363481088,3363487743,CR +3363487744,3363504127,CO +3363504128,3363512319,PE +3363520512,3363553599,AR +3363553600,3363553663,US +3363553664,3363557375,AR +3363561472,3363565567,CO +3363569664,3363577855,PA +3363577856,3363586047,CL +3363586048,3363594239,BZ +3363602432,3363610623,AN +3363610624,3363614719,CO +3363618816,3363622911,UY +3363627008,3363635199,EC +3363635200,3363651583,UY +3363651584,3363667967,AR +3363667968,3363676159,EC +3363676160,3363678207,TT +3363678208,3363680255,NI +3363680256,3363682303,GT +3363682304,3363684351,VE +3363684352,3363708927,EC +3363717120,3363733503,CL +3363733504,3363831807,AR +3363831808,3378511871,BR +3378511872,3383754751,MX +3384737792,3385851903,CR +3385851904,3386114047,VE +3386114048,3386245119,AR +3386245120,3386376191,CL +3386376192,3386392575,CO +3386392576,3386396671,AN +3386396672,3386400767,VG +3386400768,3386402815,AN +3386402816,3386404863,VG +3386404864,3386408959,US +3386408960,3386425343,GT +3386425344,3386429855,AR +3386429856,3386429863,US +3386429864,3386441727,AR +3386441728,3386458111,PY +3386458112,3386474495,EC +3386474496,3386490879,UY +3386490880,3386499071,CO +3386507264,3386523647,EC +3386523648,3386540031,PA +3386540032,3386548223,CL +3386556416,3386572799,PA +3386572800,3386589183,EC +3386589184,3386597375,AR +3386605568,3386613759,CL +3386621952,3386630143,CO +3386638336,3386642431,AN +3386646528,3386662911,CO +3386662912,3386671103,CL +3386671104,3386675199,HN +3386679296,3386683391,AR +3386687488,3386695679,CU +3386695680,3386703871,CL +3386703872,3386720255,UY +3386720256,3386728447,TT +3386728448,3386732543,AR +3386732544,3386734591,CL +3386736640,3386753023,CO +3386753024,3386761215,CL +3386761216,3386769407,PA +3386769408,3386773503,VE +3386777600,3386781695,AN +3386785792,3386802175,BO +3386802176,3386900479,CL +3386900480,3387162623,PA +3387162624,3387228159,CO +3387228160,3387244543,AW +3387260928,3387293695,DO +3387293696,3387359231,PE +3387359232,3387424767,AR +3387424768,3387555839,CO +3387555840,3387559999,AR +3387560000,3387560063,BR +3387560064,3387568127,AR +3387568128,3387572223,PE +3387572224,3387576319,CO +3387576320,3387578367,EC +3387578368,3387584511,AR +3387584512,3387588607,PE +3387588608,3387600895,AR +3387600896,3387604991,CO +3387604992,3387613183,EC +3387613184,3387617279,VE +3387617280,3387617327,CO +3387617328,3387617335,CL +3387617336,3387619327,CO +3387619328,3387686911,AR +3387686912,3387736063,CL +3387736064,3387752447,CO +3387752448,3387817983,CR +3387817984,3387834367,VE +3387834368,3387850751,TT +3387858944,3387867135,EC +3387867136,3387949055,CL +3387949056,3388014591,PE +3388014592,3388080127,CL +3388080128,3388211199,VE +3388211200,3388323671,CO +3388323672,3388323679,GS +3388323680,3388342271,CO +3388342272,3388407807,CL +3388407808,3388473343,SV +3388473344,3388604415,VE +3388604416,3388827407,AR +3388827408,3388827415,AW +3388827416,3388997631,AR +3388997632,3389001727,AU +3389001728,3389005823,PH +3389005824,3389014015,NZ +3389014016,3389014271,AU +3389014272,3389014783,JP +3389014784,3389015807,AU +3389015808,3389016063,SG +3389016064,3389016575,JP +3389016576,3389017087,AU +3389017088,3389017343,JP +3389017344,3389017855,HK +3389017856,3389018111,AU +3389018112,3389018367,PG +3389018368,3389018623,ID +3389018624,3389019135,AU +3389019136,3389019391,NZ +3389019392,3389020159,AU +3389020160,3389020671,SG +3389020672,3389020927,AU +3389020928,3389021183,PH +3389021184,3389021439,AU +3389021440,3389021695,JP +3389021696,3389021951,MY +3389021952,3389022463,AU +3389022464,3389022719,NZ +3389022720,3389023231,AU +3389023232,3389023487,HK +3389023488,3389023999,AU +3389024000,3389024255,ID +3389024256,3389024511,HK +3389024512,3389025791,AU +3389025792,3389026047,CN +3389026048,3389026303,TH +3389026304,3389026559,HK +3389026560,3389027327,AU +3389027328,3389027583,ID +3389027584,3389028607,TH +3389028608,3389028863,NZ +3389028864,3389029375,HK +3389029376,3389029887,NZ +3389029888,3389030399,SG +3389030400,3389035519,HK +3389035520,3389035775,AU +3389035776,3389036287,SG +3389036288,3389036543,NZ +3389036544,3389036799,SG +3389036800,3389037055,NZ +3389037056,3389037567,AU +3389037568,3389038591,NC +3389038592,3389044735,HK +3389044736,3389045759,AU +3389045760,3389046783,FR +3389046784,3389063167,US +3389063168,3389064447,AU +3389064448,3389064703,SG +3389064704,3389065215,HK +3389065216,3389067263,NZ +3389067264,3389071359,AU +3389071360,3389079551,PG +3389079552,3389092351,SG +3389092352,3389092863,PH +3389092864,3389093887,AU +3389093888,3389095935,IN +3389095936,3389104127,SG +3389104128,3389112319,SB +3389112320,3389116415,MV +3389116416,3389120511,JP +3389120512,3389124607,AU +3389124608,3389128703,PG +3389128704,3389129727,AU +3389129728,3389132799,NZ +3389132800,3389136895,AU +3389136896,3389142015,HK +3389142016,3389143039,TW +3389143040,3389145087,AU +3389145088,3389151231,HK +3389151232,3389152255,JP +3389152256,3389153279,ID +3389153280,3389161471,TV +3389161472,3389165286,JP +3389165287,3389165287,SG +3389165288,3389165631,JP +3389165632,3389165695,CN +3389165696,3389194239,JP +3389194240,3389195775,AU +3389195776,3389196287,HK +3389196288,3389198335,AU +3389198336,3389202431,NZ +3389202432,3389211647,AU +3389211648,3389212671,TH +3389212672,3389213439,AU +3389213440,3389214207,IN +3389214208,3389222911,AU +3389222912,3389225983,IN +3389225984,3389226239,HK +3389226240,3389226495,IN +3389226496,3389226751,SG +3389226752,3389227007,JP +3389227008,3389227263,PF +3389227264,3389227519,TW +3389227520,3389228031,PK +3389228032,3389228799,AU +3389228800,3389229055,SG +3389229056,3389229311,JP +3389229312,3389229567,AU +3389229568,3389230079,SG +3389230080,3389235199,JP +3389235200,3389243391,TW +3389243392,3389247487,AU +3389247488,3389251583,ID +3389251584,3389259775,PF +3389259776,3389263871,PH +3389263872,3389266175,NZ +3389266176,3389266431,IN +3389266432,3389266943,HK +3389266944,3389267967,AU +3389267968,3389276159,WS +3389276160,3389284351,AU +3389284352,3389292543,BD +3389292544,3389300735,CN +3389300736,3389308927,AU +3389308928,3389317119,HK +3389317120,3389322239,AU +3389322240,3389324031,JP +3389324032,3389324287,VU +3389324288,3389325311,CN +3389325312,3389326335,AU +3389326336,3389326847,TW +3389326848,3389327359,AU +3389327360,3389329407,TW +3389329408,3389333503,HK +3389333504,3389341695,BD +3389341696,3389345791,JP +3389345792,3389349887,TH +3389349888,3389358079,AU +3389358080,3389366271,PK +3389366272,3389374463,AU +3389374464,3389382655,MN +3389382656,3389390847,TW +3389390848,3389391359,HK +3389391360,3389391615,VN +3389391616,3389392127,AU +3389392128,3389392895,NZ +3389392896,3389411327,AU +3389411328,3389411583,IN +3389411584,3389412351,AU +3389412352,3389412863,NZ +3389412864,3389413119,AU +3389413120,3389413375,NZ +3389413376,3389413887,AU +3389413888,3389414143,TH +3389414144,3389414911,AU +3389414912,3389415167,HK +3389415168,3389415423,KR +3389415424,3389415935,VN +3389415936,3389416191,JP +3389416192,3389416447,IN +3389416448,3389416959,TH +3389416960,3389417215,SG +3389417216,3389417471,JP +3389417472,3389417983,TW +3389417984,3389418239,AU +3389418240,3389418495,TH +3389418496,3389418751,AU +3389418752,3389419263,NZ +3389419264,3389419519,TH +3389419520,3389420543,AU +3389420544,3389421055,NZ +3389421056,3389421311,AU +3389421312,3389421567,JP +3389421568,3389422591,KI +3389422592,3389431807,AU +3389431808,3389435903,SG +3389435904,3389439999,AU +3389440000,3389444095,HK +3389444096,3389452287,ID +3389452288,3389453311,SG +3389453312,3389454335,JP +3389454336,3389455359,AU +3389455360,3389456383,JP +3389456384,3389456895,NZ +3389456896,3389457407,AU +3389457408,3389458431,NZ +3389458432,3389460479,AU +3389460480,3389464575,JP +3389464576,3389469695,NZ +3389469696,3389471743,IN +3389471744,3389472767,NZ +3389472768,3389480959,AU +3389480960,3389489151,JP +3389489152,3389493247,HK +3389493248,3389521919,AU +3389521920,3389523455,SG +3389523456,3389523967,JP +3389523968,3389525503,NZ +3389525504,3389526015,TW +3389526016,3389528319,AU +3389528320,3389528575,TH +3389528576,3389529087,JP +3389529088,3389532159,AU +3389532160,3389533183,SG +3389533184,3389534207,NZ +3389534208,3389538303,JP +3389538304,3389538559,AU +3389538560,3389540351,TH +3389540352,3389541631,AU +3389541632,3389541887,JP +3389541888,3389542399,TH +3389542400,3389543423,JP +3389543424,3389544447,TH +3389544448,3389545471,HK +3389545472,3389545727,AU +3389545728,3389545983,HK +3389545984,3389546495,SG +3389546496,3389554687,AU +3389554688,3389562879,CN +3389562880,3389571071,AU +3389571072,3389575167,LK +3389575168,3389579233,JP +3389579234,3389579263,AU +3389579264,3389587455,PH +3389587456,3389612031,AU +3389612032,3389616127,MY +3389616128,3389640703,IN +3389640704,3389644799,JP +3389644800,3389652991,NZ +3389652992,3389661183,AU +3389661184,3389669375,ID +3389669376,3389673471,CN +3389673472,3389677567,AU +3389677568,3389685759,JP +3389685760,3389718527,AU +3389718528,3389784063,JP +3389784064,3389784319,NZ +3389784320,3389784575,AU +3389784576,3389784831,SG +3389784832,3389785087,NZ +3389785088,3389786111,HK +3389786112,3389788159,JP +3389788160,3389788415,IN +3389788416,3389788927,PH +3389788928,3389789695,US +3389789696,3389790719,AU +3389790720,3389790975,BN +3389790976,3389791231,JP +3389791232,3389791743,AU +3389791744,3389791999,JP +3389792000,3389801983,AU +3389801984,3389802239,NZ +3389802240,3389802751,AU +3389802752,3389803263,TH +3389803264,3389803519,AU +3389803520,3389806079,NZ +3389806080,3389807359,AU +3389807360,3389807615,NZ +3389807616,3389808127,AU +3389808128,3389808639,SG +3389808640,3389808895,NZ +3389808896,3389809151,TH +3389809152,3389809919,AU +3389809920,3389810175,IN +3389810176,3389810687,AU +3389810688,3389811199,NZ +3389811200,3389811711,AU +3389811712,3389811967,NZ +3389811968,3389813759,AU +3389813760,3389814527,TH +3389814528,3389815295,AU +3389815296,3389816063,NZ +3389816064,3389816575,AU +3389816576,3389816831,US +3389816832,3389846271,AU +3389846272,3389847551,JP +3389847552,3389849599,NZ +3389849600,3389915135,JP +3389915136,3389917183,AU +3389917184,3389919231,TW +3389919232,3389931519,NZ +3389931520,3389932287,AU +3389932288,3389932799,HK +3389932800,3389933055,IN +3389933056,3389933567,PK +3389933568,3389933823,IN +3389933824,3389934591,NZ +3389934592,3389935615,AU +3389935616,3389935871,HK +3389935872,3389936127,AU +3389936128,3389936895,NZ +3389936896,3389937663,PH +3389937664,3389937919,CN +3389937920,3389939711,AU +3389939712,3389940223,NZ +3389940224,3389940479,AU +3389940480,3389940991,NZ +3389940992,3389941247,AU +3389941248,3389941503,NZ +3389941504,3389941759,KR +3389941760,3389942271,AU +3389942272,3389943295,NZ +3389943296,3389944319,AU +3389944320,3389944831,NZ +3389944832,3389945087,HK +3389945088,3389945343,TH +3389945344,3389947647,AU +3389947648,3389947903,NZ +3389947904,3389949695,AU +3389949696,3389950207,NZ +3389950208,3389950975,AU +3389950976,3389951743,NZ +3389951744,3389953279,AU +3389953280,3389953535,NZ +3389953536,3389954303,AU +3389954304,3389954815,SG +3389954816,3389956607,AU +3389956608,3389957375,TH +3389957376,3389957631,KR +3389957632,3389957887,AU +3389957888,3389958399,NZ +3389958400,3389970431,AU +3389970432,3389971199,NZ +3389971200,3389971967,AU +3389971968,3389972223,HK +3389972224,3389972735,AU +3389972736,3389973759,NZ +3389973760,3389975295,AU +3389975296,3389976319,CN +3389976320,3389979647,AU +3389979648,3389980415,NZ +3389980416,3389980671,ID +3389980672,3390308351,JP +3390308352,3390310399,NZ +3390310400,3390316543,AU +3390316544,3390325247,NZ +3390325248,3390325503,HK +3390325504,3390327807,AU +3390327808,3390329087,NZ +3390329088,3390329343,AU +3390329344,3390330623,KR +3390330624,3390330879,TH +3390330880,3390331391,HK +3390331392,3390331647,JP +3390331648,3390332415,NZ +3390332416,3390332927,HK +3390332928,3390333439,NZ +3390333440,3390333695,AU +3390333696,3390333951,KR +3390333952,3390334463,HK +3390334464,3390335231,NZ +3390335232,3390335487,TH +3390335488,3390336511,ID +3390336512,3390337023,AU +3390337024,3390337279,GU +3390337280,3390337535,NZ +3390337536,3390338303,SG +3390338304,3390338815,HK +3390338816,3390339071,KR +3390339072,3390339327,CN +3390339328,3390339839,NZ +3390339840,3390340351,JP +3390340352,3390341119,HK +3390341120,3390375935,KR +3390375936,3390377983,AU +3390377984,3390382079,NZ +3390382080,3390390271,LK +3390390272,3390402559,NZ +3390402560,3390406655,JP +3390406656,3390406911,NZ +3390406912,3390407167,AU +3390407168,3390408191,NZ +3390408192,3390408703,IN +3390408704,3390409727,NZ +3390409728,3390409983,TH +3390409984,3390410751,NZ +3390410752,3390411007,TH +3390411008,3390411519,SG +3390411520,3390411775,IN +3390411776,3390412031,MY +3390412032,3390412287,TH +3390412288,3390413311,JP +3390413312,3390413567,SG +3390413568,3390414335,NZ +3390414336,3390414847,SG +3390414848,3390418943,JP +3390418944,3390423039,MV +3390423040,3390429439,SG +3390429440,3390429951,HK +3390429952,3390439423,SG +3390439424,3390441471,NZ +3390441472,3390443519,TH +3390443520,3390447359,NZ +3390447360,3390447615,ID +3390447616,3390455807,KR +3390455808,3390472191,JP +3390472192,3390480383,NC +3390480384,3390484479,AU +3390484480,3390488575,GU +3390488576,3390492671,BD +3390492672,3390496767,JP +3390496768,3390500863,NC +3390500864,3390502911,HK +3390502912,3390504959,CN +3390504960,3390767103,JP +3390767104,3390769407,NZ +3390769408,3390769663,IN +3390769664,3390770175,TH +3390770176,3390770687,AU +3390770688,3390770943,JP +3390770944,3390771199,AU +3390771200,3390775295,SG +3390775296,3390790399,NZ +3390790400,3390790655,AU +3390790656,3390796287,NZ +3390796288,3390796543,AU +3390796544,3390800383,NZ +3390800384,3390800895,AU +3390800896,3390801151,NZ +3390801152,3390801407,AU +3390801408,3390802943,NZ +3390802944,3390803967,AU +3390803968,3390815231,NZ +3390815232,3390815359,AU +3390815360,3390819583,NZ +3390819584,3390820351,AU +3390820352,3390832639,NZ +3390832640,3390963711,TH +3390963712,3391094783,KR +3391094784,3391356927,JP +3391356928,3391364095,NZ +3391364096,3391364351,AU +3391364352,3391375871,NZ +3391375872,3391376127,AU +3391376128,3391379199,NZ +3391379200,3391379455,AU +3391379456,3391386623,NZ +3391386624,3391387135,AU +3391387136,3391414783,NZ +3391414784,3391415039,AU +3391415040,3391432703,NZ +3391432704,3391433215,AU +3391433216,3391434239,NZ +3391434240,3391434751,AU +3391434752,3391440255,NZ +3391440256,3391440383,AU +3391440384,3391440639,NZ +3391440640,3391440895,AU +3391440896,3391441407,NZ +3391441408,3391441663,AU +3391441664,3391444479,NZ +3391444480,3391444991,AU +3391444992,3391453183,NZ +3391453184,3391453439,AU +3391453440,3391456511,NZ +3391456512,3391456767,AU +3391456768,3391461375,NZ +3391461376,3391461631,AU +3391461632,3391464959,NZ +3391464960,3391465215,AU +3391465216,3391469055,NZ +3391469056,3391469311,AU +3391469312,3391473407,NZ +3391473408,3391473663,AU +3391473664,3391482623,NZ +3391482624,3391482879,AU +3391482880,3391487999,NZ +3391488000,3391492095,CN +3391492096,3391496191,HK +3391496192,3391500287,SG +3391500288,3391504383,PK +3391504384,3391523583,CN +3391523584,3391523839,AU +3391523840,3391524863,CN +3391524864,3391525375,AU +3391525376,3391525887,CN +3391525888,3391526143,AU +3391526144,3391526655,CN +3391526656,3391526911,SG +3391526912,3391528191,CN +3391528192,3391528959,AU +3391528960,3391529471,CN +3391529472,3391529983,AU +3391529984,3391533567,CN +3391533568,3391534079,HK +3391534080,3391535103,IN +3391535104,3391553535,CN +3391553536,3391619071,TW +3391619072,3391620607,HK +3391620608,3391620863,IN +3391620864,3391660799,HK +3391660800,3391661055,AU +3391661056,3391663103,HK +3391663104,3391664127,PH +3391664128,3391668223,BD +3391668224,3391676415,HK +3391676416,3391684607,SG +3391684608,3391688191,IN +3391688192,3391688703,AU +3391688704,3391717887,IN +3391717888,3391718143,US +3391718144,3391718911,IN +3391718912,3391719167,JP +3391719168,3391719423,AU +3391719424,3391720703,NZ +3391720704,3391720959,SG +3391720960,3391721215,CN +3391721216,3391721471,HK +3391721472,3391721727,AU +3391721728,3391721983,KR +3391721984,3391722239,TW +3391722240,3391722495,PH +3391722496,3391723519,IN +3391723520,3391725567,CN +3391725568,3391733759,TH +3391733760,3391734015,IN +3391734016,3391734783,AU +3391734784,3391736831,JP +3391736832,3391737855,IN +3391737856,3391741951,JP +3391741952,3391744959,IN +3391744960,3391744991,SG +3391744992,3391746047,IN +3391746048,3391750143,CN +3391750144,3391815679,SG +3391815680,3391817727,AU +3391817728,3391819775,TO +3391819776,3391823871,JP +3391823872,3391827967,TH +3391827968,3391832063,KR +3391832064,3391832575,ID +3391832576,3391832831,AU +3391832832,3391833087,IN +3391833088,3391834111,JP +3391834112,3391835135,ID +3391835136,3391836159,CN +3391836160,3391836671,AU +3391836672,3391837183,HK +3391837184,3391838207,AU +3391838208,3391838719,ID +3391838720,3391839231,AU +3391839232,3391840255,ID +3391840256,3391841279,JP +3391841280,3391842303,MY +3391842304,3391852543,AU +3391852544,3391856639,CN +3391856640,3391864831,ID +3391864832,3391868927,US +3391868928,3391870975,SG +3391870976,3391873023,US +3391873024,3391877119,AU +3391877120,3391879167,JP +3391879168,3391881215,ID +3391881216,3391895551,TH +3391895552,3391896575,IN +3391896576,3391900415,TH +3391900416,3391901695,AU +3391901696,3391905791,PK +3391905792,3391906047,TH +3391906048,3391906303,JP +3391906304,3391906815,AU +3391906816,3391907839,PH +3391907840,3391909887,BD +3391909888,3391910911,IO +3391910912,3391911935,AU +3391911936,3391913983,HK +3391913984,3391915519,TH +3391915520,3391915775,AU +3391915776,3391916287,TH +3391916288,3391916543,AU +3391916544,3391920127,TH +3391920128,3391930367,AU +3391930368,3391946751,TH +3391946752,3391947007,DE +3391947008,3391947519,HK +3391947520,3391947775,AU +3391947776,3391948287,HK +3391948288,3391948799,IN +3391948800,3391949311,HK +3391949312,3391949823,IN +3391949824,3391950079,JP +3391950080,3391950335,AU +3391950336,3391971327,HK +3391971328,3391979519,AU +3391979520,3391979775,HK +3391979776,3391980031,JP +3391980032,3391980543,HK +3391980544,3391983615,MY +3391983616,3391984639,NP +3391984640,3391984895,HK +3391984896,3391985151,ID +3391985152,3391986687,AU +3391986688,3391987199,PK +3391987200,3391987455,AU +3391987456,3391987711,BD +3391987712,3391991807,JP +3391991808,3392012287,HK +3392012288,3392017151,ID +3392017152,3392017407,IN +3392017408,3392017919,ID +3392017920,3392018431,IN +3392018432,3392020479,ID +3392020480,3392028671,CN +3392028672,3392040959,ID +3392040960,3392045055,MY +3392045056,3392046079,ID +3392046080,3392049151,AU +3392049152,3392053247,ID +3392053248,3392061439,NZ +3392061440,3392069631,IN +3392069632,3392073727,CN +3392073728,3392077823,ID +3392077824,3392081919,AU +3392081920,3392086015,JP +3392086016,3392094207,AU +3392094208,3392098303,ID +3392098304,3392102399,AU +3392102400,3392106495,KH +3392106496,3392109567,AU +3392109568,3392109823,IN +3392109824,3392110335,PH +3392110336,3392110591,IN +3392110592,3392111103,PH +3392111104,3392111359,DE +3392111360,3392112127,PH +3392112128,3392112639,AU +3392112640,3392114175,PH +3392114176,3392114431,VN +3392114432,3392114687,KR +3392114688,3392118783,GU +3392118784,3392126975,MY +3392126976,3392135167,ID +3392135168,3392143359,TH +3392143360,3392208895,JP +3392208896,3392229375,NZ +3392229376,3392229887,AU +3392229888,3392230335,NZ +3392230336,3392230399,AU +3392230400,3392233471,NZ +3392233472,3392235519,AU +3392235520,3392238079,NZ +3392238080,3392238335,AU +3392238336,3392272383,NZ +3392272384,3392272639,AU +3392272640,3392286719,NZ +3392286720,3392286975,AU +3392286976,3392287231,US +3392287232,3392287743,NZ +3392287744,3392288767,AU +3392288768,3392293887,NZ +3392293888,3392294399,AU +3392294400,3392295935,NZ +3392295936,3392296191,AU +3392296192,3392307199,NZ +3392307200,3392307455,AU +3392307456,3392307711,NZ +3392307712,3392309503,AU +3392309504,3392324607,NZ +3392324608,3392325119,AU +3392325120,3392325631,NZ +3392325632,3392326655,AU +3392326656,3392336159,NZ +3392336160,3392336639,AU +3392336640,3392339727,NZ +3392339728,3392339743,AU +3392339744,3392339967,NZ +3392339968,3392340991,NP +3392340992,3392344063,JP +3392344064,3392348159,ID +3392348160,3392354303,JP +3392354304,3392356351,ID +3392356352,3392364543,NP +3392364544,3392372735,ID +3392372736,3392385023,AU +3392385024,3392389119,BD +3392389120,3392401407,ID +3392401408,3392403455,SG +3392403456,3392404479,AU +3392404480,3392405503,ID +3392405504,3392406015,NP +3392406016,3392406527,IN +3392406528,3392407551,TH +3392407552,3392409599,ID +3392409600,3392413695,JP +3392413696,3392421887,AU +3392421888,3392430271,SG +3392430272,3392430303,TW +3392430304,3392432511,SG +3392432512,3392432543,TW +3392432544,3392438271,SG +3392438272,3392446463,AU +3392446464,3392450559,PH +3392450560,3392454655,JP +3392454656,3392462847,HK +3392462848,3392472063,NP +3392472064,3392473087,AU +3392473088,3392475135,IN +3392475136,3392479231,JP +3392479232,3392487423,AU +3392487424,3392499711,IN +3392499712,3392503807,JP +3392503808,3392511999,HK +3392512000,3392516095,BD +3392516096,3392520191,NZ +3392520192,3392524287,AU +3392524288,3392528383,JP +3392528384,3392536575,ID +3392536576,3392610303,IN +3392610304,3392618495,HK +3392618496,3392626687,SG +3392626688,3392630783,NZ +3392630784,3392634879,JP +3392634880,3392635903,PK +3392635904,3392636927,VN +3392636928,3392637951,JP +3392637952,3392638975,TH +3392638976,3392643071,AU +3392643072,3392647167,ID +3392647168,3392651263,MN +3392651264,3392659455,JP +3392659456,3392660831,TW +3392660832,3392660847,SG +3392660848,3392660911,TW +3392660912,3392660927,SG +3392660928,3392667647,TW +3392667648,3392668671,IN +3392668672,3392669695,BD +3392669696,3392670783,HK +3392670784,3392670791,GB +3392670792,3392670815,HK +3392670816,3392670847,US +3392670848,3392671743,HK +3392671744,3392675839,JP +3392675840,3392681983,NZ +3392681984,3392684031,AU +3392684032,3392688127,JP +3392688128,3392692223,MY +3392692224,3392700415,IN +3392700416,3392708607,SG +3392708608,3392712703,ID +3392712704,3392716799,AF +3392716800,3392733183,IN +3392733184,3392741375,ID +3392741376,3392765951,PH +3392765952,3392782335,TH +3392782336,3392790527,HK +3392790528,3392794623,JP +3392794624,3392798719,AU +3392798720,3392798975,LA +3392798976,3392799231,JP +3392799232,3392799487,PH +3392799488,3392799743,AU +3392799744,3392800767,JP +3392800768,3392801375,SG +3392801376,3392801391,HK +3392801392,3392802815,SG +3392802816,3392806911,JP +3392806912,3392815103,AU +3392815104,3392819199,ID +3392819200,3392823295,MY +3392823296,3392824319,KH +3392824320,3392824831,AU +3392824832,3392825343,IN +3392825344,3392826367,JP +3392826368,3392827391,PH +3392827392,3392828415,AU +3392828416,3392829439,JP +3392829440,3392830463,IN +3392830464,3392830719,ID +3392830720,3392830975,IN +3392830976,3392831231,TH +3392831232,3392831487,IN +3392831488,3392832511,PG +3392832512,3392833535,IN +3392833536,3392835583,AU +3392835584,3392839679,JP +3392839680,3392845823,ID +3392845824,3392847871,HK +3392847872,3392856063,ID +3392856064,3392864255,AU +3392864256,3392864511,TO +3392864512,3392864767,AU +3392864768,3392865279,IN +3392865280,3392866303,NU +3392866304,3392880639,AU +3392880640,3392888831,PK +3392888832,3392892927,AU +3392892928,3392897023,JP +3392897024,3392901119,BD +3392901120,3392903167,JP +3392903168,3392905215,HK +3392905216,3392909311,ID +3392909312,3392913407,JP +3392913408,3392917503,ID +3392917504,3392921599,BD +3392921600,3392929791,AU +3392929792,3392931839,MU +3392931840,3392933887,PH +3392933888,3392942079,JP +3392942080,3392944127,AU +3392944128,3392945151,MY +3392945152,3392946175,IN +3392946176,3392956415,AU +3392956416,3392958463,VN +3392958464,3392962559,CN +3392962560,3392963583,IN +3392963584,3392970751,AU +3392970752,3392978943,JP +3392978944,3392983039,TH +3392983040,3392987135,IN +3392987136,3392995327,HK +3392995328,3392995583,PG +3392995584,3392995839,JP +3392995840,3392996351,NZ +3392996352,3392997375,AU +3392997376,3392998399,IN +3392998400,3392999423,AU +3392999424,3393003519,JP +3393003520,3393011711,PK +3393011712,3393019903,PH +3393019904,3393060863,AU +3393060864,3393062911,FJ +3393062912,3393069055,ID +3393069056,3393077247,AU +3393077248,3393085439,IN +3393085440,3393089535,LA +3393089536,3393090559,AU +3393090560,3393091071,IN +3393091072,3393093631,FJ +3393093632,3393101823,AU +3393101824,3393110015,JP +3393110016,3393118207,HK +3393118208,3393122303,IN +3393122304,3393125375,AU +3393125376,3393125631,IN +3393125632,3393125887,JP +3393125888,3393126399,AU +3393126400,3393134591,HK +3393134592,3393146879,AU +3393146880,3393150975,PK +3393150976,3393159167,IN +3393159168,3393167359,SG +3393167360,3393175551,IN +3393175552,3393183743,PK +3393183744,3393187839,SG +3393187840,3393189887,NP +3393189888,3393190911,CN +3393190912,3393191423,IN +3393191424,3393191935,SB +3393191936,3393260031,HK +3393260032,3393260543,BD +3393260544,3393265663,AU +3393265664,3393273855,CK +3393273856,3393282047,AU +3393282048,3393286143,HK +3393286144,3393290239,ID +3393290240,3393298431,IN +3393298432,3393300479,NZ +3393300480,3393302527,BD +3393302528,3393306623,PH +3393306624,3393314815,HK +3393314816,3393318911,ID +3393318912,3393320959,SG +3393320960,3393389567,HK +3393389568,3393390591,IN +3393390592,3393392639,ID +3393392640,3393396735,JP +3393396736,3393400831,ID +3393400832,3393404927,JP +3393404928,3393421311,AU +3393421312,3393470463,HK +3393470464,3393474559,AU +3393474560,3393478655,NZ +3393478656,3393486847,AU +3393486848,3393495039,IN +3393495040,3393499135,AU +3393499136,3393503231,SG +3393503232,3393507327,HK +3393507328,3393511423,SG +3393511424,3393519615,KR +3393519616,3393520639,HK +3393520640,3393521663,CN +3393521664,3393523711,PK +3393523712,3393527807,CN +3393527808,3393535999,PK +3393536000,3393544191,HK +3393544192,3393548287,ID +3393548288,3393552383,JP +3393552384,3393553407,HK +3393553408,3393554431,AU +3393554432,3393556479,TH +3393556480,3393560575,SG +3393560576,3393568767,PH +3393568768,3393572863,LK +3393572864,3393576959,AU +3393576960,3393581055,JP +3393581056,3393585151,HK +3393585152,3393593343,CN +3393593344,3393597439,MN +3393597440,3393601535,ID +3393601536,3393609727,NP +3393609728,3393613823,AU +3393613824,3393617919,AS +3393617920,3393622015,AU +3393622016,3393626111,PK +3393626112,3393626367,HK +3393626368,3393630207,CN +3393630208,3393634303,JP +3393634304,3393638399,IN +3393638400,3393650687,JP +3393650688,3393658879,HK +3393658880,3393662975,KH +3393662976,3393675263,JP +3393675264,3393679359,MY +3393679360,3393683455,TH +3393683456,3393691647,IN +3393691648,3393695743,AU +3393695744,3393699839,PH +3393699840,3393724415,HK +3393724416,3393728511,AU +3393728512,3393736703,JP +3393736704,3393740799,AU +3393740800,3393741055,KH +3393741056,3393741311,BD +3393741312,3393741567,NP +3393741568,3393741575,BD +3393741576,3393741791,US +3393741792,3393741823,MG +3393741824,3393742847,SC +3393742848,3393743871,TL +3393743872,3393744127,US +3393744128,3393744143,TK +3393744144,3393744159,US +3393744160,3393744175,TK +3393744176,3393744383,US +3393744384,3393744415,SC +3393744416,3393744447,US +3393744448,3393744479,MG +3393744480,3393744511,BD +3393744512,3393744575,PK +3393744576,3393744639,US +3393744640,3393744895,KH +3393744896,3393748991,PH +3393748992,3393765375,AU +3393765376,3393773567,ID +3393773568,3393775615,AU +3393775616,3393777663,BD +3393777664,3393779711,MN +3393779712,3393780735,IN +3393780736,3393782783,HK +3393782784,3393783807,BD +3393783808,3393785855,MY +3393785856,3393789951,ID +3393789952,3393798143,SG +3393798144,3393806335,JP +3393806336,3393814527,ID +3393814528,3393815551,AU +3393815552,3393816575,KR +3393816576,3393818623,JP +3393818624,3393822719,AU +3393822720,3393830911,PH +3393830912,3393835007,NZ +3393835008,3393839103,JP +3393839104,3393843199,ID +3393843200,3393848319,HK +3393848320,3393849343,JP +3393849344,3393851391,CN +3393851392,3393855487,JP +3393855488,3393865727,AU +3393865728,3393867775,ID +3393867776,3393871871,AU +3393871872,3393880063,HK +3393880064,3393896447,AU +3393896448,3393906687,NZ +3393906688,3393908735,AU +3393908736,3393910783,BD +3393910784,3393911807,PH +3393911808,3393912063,AU +3393912064,3393912319,JP +3393912320,3393913855,HK +3393913856,3393914879,MY +3393914880,3393916927,JP +3393916928,3393921023,ID +3393921024,3393929215,MY +3393929216,3393937407,HK +3393937408,3393941503,ID +3393941504,3393945599,JP +3393945600,3393961983,MY +3393961984,3393966079,IN +3393966080,3393970175,CN +3393970176,3393974271,JP +3393974272,3393976319,SG +3393976320,3393977343,MO +3393977344,3394011135,HK +3394011136,3394027519,AU +3394027520,3394035711,JP +3394035712,3394039807,MY +3394039808,3394041855,US +3394041856,3394042879,AU +3394042880,3394060287,HK +3394060288,3394064383,ID +3394064384,3394068479,AU +3394068480,3394076671,ID +3394076672,3394078719,HK +3394078720,3394078975,AU +3394078976,3394079231,IN +3394079232,3394079743,PH +3394079744,3394087471,HK +3394087472,3394087487,CN +3394087488,3394111487,HK +3394111488,3394113535,AU +3394113536,3394117631,SG +3394117632,3394121727,AU +3394121728,3394125823,SG +3394125824,3394142207,PH +3394142208,3394150399,NZ +3394150400,3394154495,IN +3394154496,3394158591,JP +3394158592,3394162687,ID +3394162688,3394166783,JP +3394166784,3394168831,VN +3394168832,3394170879,IN +3394170880,3394172927,NZ +3394172928,3394173695,JP +3394173696,3394173951,IN +3394173952,3394174975,HK +3394174976,3394179071,JP +3394179072,3394181119,BD +3394181120,3394183167,KH +3394183168,3394191359,NP +3394191360,3394207743,SG +3394207744,3394215935,JP +3394215936,3394220031,AU +3394220032,3394232319,SG +3394232320,3394234367,AU +3394234368,3394236415,VN +3394236416,3394238463,JP +3394238464,3394239487,AU +3394239488,3394248703,HK +3394248704,3394252799,VU +3394252800,3394256895,IN +3394256896,3394265087,AU +3394265088,3394267135,JP +3394267136,3394269183,TW +3394269184,3394273279,ID +3394273280,3394277375,HK +3394277376,3394279423,AU +3394279424,3394281471,PH +3394281472,3394283775,SG +3394283776,3394284031,BD +3394284032,3394284287,SG +3394284288,3394284351,SO +3394284352,3394285567,SG +3394285568,3394289663,AU +3394289664,3394290687,HK +3394290688,3394293759,AU +3394293760,3394297855,ID +3394297856,3394306047,TH +3394306048,3394307071,HK +3394307072,3394308095,SG +3394308096,3394310143,JP +3394310144,3394314239,AU +3394314240,3394322431,ID +3394322432,3394326527,AU +3394326528,3394330623,JP +3394330624,3394338815,AU +3394338816,3394347007,IN +3394347008,3394355199,PH +3394355200,3394359295,IN +3394359296,3394363391,AU +3394363392,3394437119,HK +3394437120,3394438143,AU +3394438144,3394441215,HK +3394441216,3394453503,IN +3394453504,3394461695,AU +3394461696,3394465791,SG +3394465792,3394467839,AU +3394467840,3394469887,MY +3394469888,3394478079,JP +3394478080,3394482175,PK +3394482176,3394484223,AU +3394484224,3394486271,JP +3394486272,3394494463,HK +3394494464,3394498559,JP +3394498560,3394500607,HK +3394500608,3394501631,SG +3394501632,3394507263,HK +3394507264,3394507775,JP +3394507776,3394508799,PH +3394508800,3394510847,AU +3394510848,3394514943,BD +3394514944,3394519039,JP +3394519040,3394521087,BD +3394521088,3394523135,KH +3394523136,3394527231,JP +3394527232,3394535423,PH +3394535424,3394565631,HK +3394565632,3394565887,PK +3394565888,3394621439,HK +3394621440,3394625535,CN +3394625536,3394629631,HK +3394629632,3394631679,AU +3394631680,3394634751,HK +3394634752,3394635775,IN +3394635776,3394637823,KR +3394637824,3394641919,AF +3394641920,3394648063,AU +3394648064,3394650111,JP +3394650112,3394658303,HK +3394658304,3394662399,NZ +3394662400,3394664447,AU +3394664448,3394666495,JP +3394666496,3394682367,MO +3394682368,3394682879,HK +3394682880,3394686975,PH +3394686976,3394689023,AU +3394689024,3394691071,BD +3394691072,3394697215,JP +3394697216,3394697471,SG +3394697472,3394697983,AU +3394697984,3394698239,IN +3394698240,3394699263,AU +3394699264,3394700287,HK +3394700288,3394707455,AU +3394707456,3394715647,IN +3394715648,3394719743,JP +3394719744,3394732031,PK +3394732032,3394740223,NC +3394740224,3394744319,AU +3394744320,3394752511,ID +3394752512,3394753535,WS +3394753536,3394754559,VN +3394754560,3394756607,MY +3394756608,3394760703,JP +3394760704,3394764799,ID +3394764800,3394772991,HK +3394772992,3394777087,PK +3394777088,3394781183,JP +3394781184,3394789375,MP +3394789376,3394797567,HK +3394797568,3394813951,IN +3394813952,3394815999,JP +3394816000,3394818047,HK +3394818048,3394830335,IN +3394830336,3394831359,HK +3394831360,3394832383,NZ +3394832384,3394833407,PH +3394833408,3394834431,AU +3394834432,3394834687,HK +3394834688,3394834943,JP +3394834944,3394834959,HK +3394834960,3394834975,JP +3394834976,3394835199,HK +3394835200,3394835455,JP +3394835456,3394835583,SG +3394835584,3394835711,JP +3394835712,3394835967,CN +3394835968,3394836239,JP +3394836240,3394836247,AS +3394836248,3394836479,JP +3394836480,3394838527,BT +3394838528,3394846719,NZ +3394846720,3394850815,IN +3394850816,3394854911,JP +3394854912,3394855935,PH +3394855936,3394856959,AU +3394856960,3394859007,IN +3394859008,3394860031,JP +3394860032,3394860543,ID +3394860544,3394861055,IN +3394861056,3394862079,HK +3394862080,3394863103,KR +3394863104,3394871295,NZ +3394871296,3394879487,AU +3394879488,3394883583,PH +3394883584,3394887679,ID +3394887680,3394893823,JP +3394893824,3394894847,KR +3394894848,3394895871,HK +3394895872,3394896895,CN +3394896896,3394897919,TH +3394897920,3394899967,JP +3394899968,3394904063,SG +3394904064,3394905087,AU +3394905088,3394905343,BN +3394905344,3394912255,AU +3394912256,3394920447,PF +3394920448,3394924543,IN +3394924544,3394928639,TH +3394928640,3394936831,PH +3394936832,3394940927,AU +3394940928,3394945023,JP +3394945024,3394945279,IN +3394945280,3394945535,AU +3394945536,3394946047,ID +3394946048,3394946559,AU +3394946560,3394947071,ID +3394947072,3394948095,BD +3394948096,3394948351,IN +3394948352,3394948607,PH +3394948608,3394949119,AU +3394949120,3394953215,JP +3394953216,3394957311,CN +3394957312,3394959359,AU +3394959360,3394960383,HK +3394960384,3394962431,CN +3394962432,3394963455,AU +3394963456,3394965503,ID +3394965504,3394967551,TH +3394967552,3394969599,ID +3394969600,3394973695,SG +3394973696,3394977791,JP +3394977792,3394985983,IN +3394985984,3394990079,AU +3394990080,3394994175,JP +3394994176,3394995199,CN +3394995200,3394998271,IN +3394998272,3395002367,JP +3395002368,3395006463,PH +3395006464,3395010559,CN +3395010560,3395014655,AU +3395014656,3395018751,JP +3395018752,3395027967,CN +3395027968,3395028991,VN +3395028992,3395031039,AU +3395031040,3395035135,PK +3395035136,3395059711,AU +3395059712,3395067903,PH +3395067904,3395076095,HK +3395076096,3395080191,ID +3395080192,3395084287,AU +3395084288,3395088383,IN +3395088384,3395091455,AU +3395091456,3395093503,CN +3395093504,3395094015,AU +3395094016,3395094527,KR +3395094528,3395096575,KH +3395096576,3395104767,ID +3395104768,3395108863,TH +3395108864,3395117055,JP +3395117056,3395121151,AU +3395121152,3395129343,ID +3395129344,3395131391,JP +3395131392,3395131647,AU +3395131648,3395131903,KH +3395131904,3395132159,IN +3395132160,3395132415,AU +3395132416,3395133439,VN +3395133440,3395141631,AU +3395141632,3395145727,HK +3395145728,3395149823,BN +3395149824,3395155967,ID +3395155968,3395156991,AU +3395156992,3395158015,CN +3395158016,3395170303,AU +3395170304,3395174399,JP +3395174400,3395182591,AU +3395182592,3395190783,SG +3395190784,3395198975,JP +3395198976,3395203071,MY +3395203072,3395215359,JP +3395215360,3395219455,HK +3395219456,3395223551,TH +3395223552,3395231743,CN +3395231744,3395239935,JP +3395239936,3395254751,SG +3395254752,3395254767,JP +3395254768,3395256319,SG +3395256320,3395264511,ID +3395264512,3395272703,JP +3395272704,3395276799,PG +3395276800,3395280895,JP +3395280896,3395284991,PH +3395284992,3395287039,AU +3395287040,3395287551,JP +3395287552,3395287807,NZ +3395287808,3395288063,IN +3395288064,3396868319,CN +3396868320,3396868351,SG +3396868352,3396995071,CN +3396995072,3396997119,ID +3396997120,3396999167,IN +3396999168,3397001215,JP +3397001216,3397003263,CN +3397003264,3397005311,TH +3397005312,3397009407,JP +3397009408,3397017599,CN +3397017600,3397021695,HK +3397021696,3397023743,CN +3397023744,3397025791,AU +3397025792,3397026047,CN +3397026048,3397026303,AU +3397026304,3397026815,TH +3397026816,3397027071,AU +3397027072,3397027327,PH +3397027328,3397027839,IN +3397027840,3397029887,JP +3397029888,3397033983,MY +3397033984,3397038079,ID +3397038080,3397058559,JP +3397058560,3397066751,AU +3397066752,3397070847,IN +3397070848,3397074943,PH +3397074944,3397083135,HK +3397083136,3397087231,CN +3397087232,3397091327,JP +3397091328,3397099519,GU +3397099520,3397103615,HK +3397103616,3397105663,LA +3397105664,3397107711,JP +3397107712,3397115903,HK +3397115904,3397119999,ID +3397120000,3397124095,PK +3397124096,3397128191,JP +3397128192,3397131263,AU +3397131264,3397132287,HK +3397132288,3397136383,AU +3397136384,3397140479,JP +3397140480,3397148671,AU +3397148672,3397156863,NZ +3397156864,3397165055,PH +3397165056,3397173247,LK +3397173248,3397177343,AU +3397177344,3397181439,JP +3397181440,3397185535,PW +3397185536,3397201919,AU +3397201920,3397206015,JP +3397206016,3397210111,BD +3397210112,3397218303,AU +3397218304,3397219327,PK +3397219328,3397222399,AU +3397222400,3397230591,PK +3397230592,3397234687,AU +3397234688,3397238783,CN +3397238784,3397255167,HK +3397255168,3397255607,JP +3397255608,3397255615,SG +3397255616,3397255711,JP +3397255712,3397255727,SG +3397255728,3397255807,JP +3397255808,3397255823,HK +3397255824,3397256655,JP +3397256656,3397256671,HK +3397256672,3397256975,JP +3397256976,3397256983,SG +3397256984,3397257327,JP +3397257328,3397257343,SG +3397257344,3397257983,JP +3397257984,3397258007,SG +3397258008,3397258015,JP +3397258016,3397258063,SG +3397258064,3397263359,JP +3397263360,3397267455,PH +3397267456,3397271551,HK +3397271552,3397275647,TW +3397275648,3397277695,NZ +3397277696,3397279743,MN +3397279744,3397283839,AU +3397283840,3397285887,KR +3397285888,3397287935,BD +3397287936,3397304319,SG +3397304320,3397308415,NZ +3397308416,3397312511,HK +3397312512,3397320703,JP +3397320704,3397322751,CN +3397322752,3397323775,NZ +3397323776,3397328895,CN +3397328896,3397330943,ID +3397330944,3397337087,CN +3397337088,3397341183,HK +3397341184,3397345279,JP +3397345280,3397349375,ID +3397349376,3397363711,CN +3397363712,3397365759,HK +3397365760,3397369855,JP +3397369856,3397374463,CN +3397374464,3397374975,AU +3397374976,3397386239,CN +3397386240,3397394431,GU +3397394432,3397402623,PH +3397402624,3397410815,GU +3397410816,3397419007,AU +3397419008,3397419535,HK +3397419536,3397419551,KR +3397419552,3397419743,HK +3397419744,3397419759,KR +3397419760,3397419871,HK +3397419872,3397419904,KR +3397419905,3397427199,HK +3397427200,3397443583,SG +3397443584,3397451775,HK +3397451776,3397468159,TH +3397468160,3397492735,AU +3397492736,3397496831,MY +3397496832,3397498879,JP +3397498880,3397500927,ID +3397500928,3397501951,BD +3397501952,3397503999,IN +3397504000,3397505023,TH +3397505024,3397505279,NZ +3397505280,3397506559,IN +3397506560,3397506815,AU +3397506816,3397507071,IN +3397507072,3397507583,ID +3397507584,3397507839,AU +3397507840,3397508095,IN +3397508096,3397509119,PH +3397509120,3397510143,ID +3397510144,3397511167,FJ +3397511168,3397512191,LK +3397512192,3397512447,KH +3397512448,3397512703,AU +3397512704,3397512959,PH +3397512960,3397513727,IN +3397513728,3397514239,SG +3397514240,3397515263,AU +3397515264,3397516287,NP +3397516288,3397516543,AU +3397516544,3397516799,NZ +3397516800,3397517055,JP +3397517056,3397517311,AU +3397517312,3397525503,CN +3397525504,3397526527,AU +3397526528,3397527039,VN +3397527040,3397527295,AU +3397527296,3397527551,JP +3397527552,3397528575,IN +3397528576,3397530623,AU +3397530624,3397531647,ID +3397531648,3397532671,SG +3397532672,3397533695,JP +3397533696,3397555903,HK +3397555904,3397555935,JP +3397555936,3397566263,HK +3397566264,3397566271,TW +3397566272,3397566463,HK +3397566464,3397574655,AU +3397574656,3397582847,CN +3397582848,3397584895,MN +3397584896,3397586943,JP +3397586944,3397588991,CN +3397588992,3397591039,KR +3397591040,3397595135,HK +3397595136,3397599231,CN +3397599232,3397603327,HK +3397603328,3397605375,KH +3397605376,3397607423,AU +3397607424,3397623807,IN +3397623808,3397631999,GU +3397632000,3397636095,JP +3397636096,3397640191,CN +3397640192,3397648383,MN +3397648384,3397713919,TW +3397713920,3397715967,ID +3397715968,3397716431,HK +3397716432,3397716447,ID +3397716448,3397716471,HK +3397716472,3397716479,AF +3397716480,3397717255,HK +3397717256,3397717279,AF +3397717280,3397717287,ID +3397717288,3397717295,AF +3397717296,3397717303,HK +3397717304,3397717311,AF +3397717312,3397717711,HK +3397717712,3397717727,BD +3397717728,3397718015,HK +3397718016,3397722111,KR +3397722112,3397726207,PK +3397726208,3397730303,IN +3397730304,3397734399,AU +3397734400,3397738495,ID +3397738496,3397742591,MY +3397742592,3397746687,JP +3397746688,3397763071,TH +3397763072,3397771263,PH +3397771264,3397775887,TW +3397775888,3397775919,HK +3397775920,3397777535,TW +3397777536,3397777551,CR +3397777552,3397777583,TW +3397777584,3397777599,CR +3397777600,3397777791,TW +3397777792,3397777807,CR +3397777808,3397777839,TW +3397777840,3397777855,CR +3397777856,3397778175,TW +3397778176,3397778191,US +3397778192,3397779455,TW +3397779456,3397781503,ID +3397781504,3397783551,BD +3397783552,3397785599,VN +3397785600,3397787647,TO +3397787648,3397793791,AU +3397793792,3397794303,PH +3397794304,3397794559,AU +3397794560,3397794815,IN +3397794816,3397812223,HK +3397812224,3397816319,AU +3397816320,3397832703,IN +3397832704,3397836799,JP +3397836800,3397844991,AU +3397844992,3397853695,JP +3397853696,3397853951,NZ +3397853952,3397854207,HK +3397854208,3397855231,JP +3397855232,3397855239,HK +3397855240,3397857535,JP +3397857536,3397857791,NZ +3397857792,3397881503,JP +3397881504,3397881535,NZ +3397881536,3397903103,JP +3397903104,3397903359,HK +3397903360,3397910015,JP +3397910016,3397910271,SG +3397910272,3397910527,JP +3397910528,3397918719,SG +3397918720,3397922815,AU +3397922816,3397926911,CN +3397926912,3397935103,ID +3397935104,3397939199,AU +3397939200,3397951487,KR +3397951488,3397959679,SG +3397959680,3397963775,JP +3397963776,3397971967,CN +3397971968,3397974015,LA +3397974016,3397975039,IN +3397975040,3397976063,AU +3397976064,3397984255,ID +3397984256,3397992447,JP +3397992448,3398004735,AU +3398004736,3398008831,PH +3398008832,3398017023,LA +3398017024,3398021119,AU +3398021120,3398023167,FJ +3398023168,3398025215,JP +3398025216,3398029311,AU +3398029312,3398033407,IN +3398033408,3398035455,AU +3398035456,3398037503,IN +3398037504,3398039551,NZ +3398039552,3398040575,IN +3398040576,3398041599,MY +3398041600,3398062079,AU +3398062080,3398066175,JP +3398066176,3398074367,IN +3398074368,3398090751,PH +3398090752,3398098943,AU +3398098944,3398107135,ID +3398107136,3398156287,AU +3398156288,3398164479,TH +3398164480,3398172671,AU +3398172672,3398180863,JP +3398180864,3398189055,IN +3398189056,3398205439,HK +3398205440,3398213631,IN +3398213632,3398221823,AU +3398221824,3398230015,JP +3398230016,3398238207,HK +3398238208,3398279167,IN +3398279168,3398287359,CN +3398287360,3398291455,JP +3398291456,3398295551,AU +3398295552,3398303743,PK +3398303744,3398305791,IN +3398305792,3398307839,JP +3398307840,3398311935,CN +3398311936,3398320127,AU +3398320128,3398336511,IN +3398336512,3398340607,AU +3398340608,3398352895,PK +3398352896,3398361087,TH +3398361088,3398369279,JP +3398369280,3398369791,IN +3398369792,3398370303,JP +3398370304,3398371327,IN +3398371328,3398373375,JP +3398373376,3398377471,CN +3398377472,3398385663,AU +3398385664,3398393855,JP +3398393856,3398397951,ID +3398397952,3398402047,PK +3398402048,3398418431,TH +3398418432,3398434815,JP +3398434816,3398467583,IN +3398467584,3398475775,BT +3398475776,3398481919,AU +3398481920,3398483967,LA +3398483968,3398488063,MY +3398488064,3398492159,TW +3398492160,3398500351,AU +3398500352,3398504447,ID +3398504448,3398508543,JP +3398508544,3398565887,TW +3398565888,3398567423,ID +3398567424,3398569983,AU +3398569984,3398572031,JP +3398572032,3398574079,AU +3398574080,3398582271,ID +3398582272,3398590463,MY +3398590464,3398598655,HK +3398598656,3398606847,ID +3398606848,3398610943,AU +3398610944,3398612991,ID +3398612992,3398613503,PH +3398613504,3398613759,NZ +3398613760,3398615039,AU +3398615040,3398619135,IN +3398619136,3398621183,AU +3398621184,3398623231,HK +3398623232,3398631423,ID +3398631424,3398631935,AU +3398631936,3398632015,JP +3398632016,3398632023,AU +3398632024,3398632047,JP +3398632048,3398632063,AU +3398632064,3398632143,JP +3398632144,3398632175,AU +3398632176,3398632191,JP +3398632192,3398632255,AU +3398632256,3398632383,JP +3398632384,3398632399,AU +3398632400,3398632575,JP +3398632576,3398632591,AU +3398632592,3398632607,JP +3398632608,3398632639,AU +3398632640,3398632703,JP +3398632704,3398632767,AU +3398632768,3398632959,JP +3398632960,3398633983,AU +3398633984,3398634111,KR +3398634112,3398634303,AU +3398634304,3398634335,KR +3398634336,3398634343,AU +3398634344,3398634367,KR +3398634368,3398634399,AU +3398634400,3398634447,KR +3398634448,3398634463,AU +3398634464,3398634479,KR +3398634480,3398634495,AU +3398634496,3398634591,KR +3398634592,3398634751,AU +3398634752,3398634783,KR +3398634784,3398635263,AU +3398635264,3398635391,KR +3398635392,3398636039,AU +3398636040,3398636087,HK +3398636088,3398636095,AU +3398636096,3398636127,HK +3398636128,3398636351,AU +3398636352,3398636367,HK +3398636368,3398636375,AU +3398636376,3398636383,HK +3398636384,3398636447,AU +3398636448,3398636511,HK +3398636512,3398636543,AU +3398636544,3398636583,HK +3398636584,3398636591,AU +3398636592,3398636719,HK +3398636720,3398636767,AU +3398636768,3398636775,HK +3398636776,3398636783,AU +3398636784,3398636799,HK +3398636800,3398637183,AU +3398637184,3398637215,HK +3398637216,3398637247,AU +3398637248,3398637311,HK +3398637312,3398637375,AU +3398637376,3398637439,HK +3398637440,3398637455,AU +3398637456,3398637503,HK +3398637504,3398637511,AU +3398637512,3398637519,HK +3398637520,3398637551,AU +3398637552,3398637567,HK +3398637568,3398638095,AU +3398638096,3398638111,PH +3398638112,3398638159,AU +3398638160,3398638167,PH +3398638168,3398638191,TW +3398638192,3398638207,PH +3398638208,3398638367,AU +3398638368,3398638383,TW +3398638384,3398638399,AU +3398638400,3398638415,TW +3398638416,3398638431,AU +3398638432,3398638447,PH +3398638448,3398638479,AU +3398638480,3398638495,TW +3398638496,3398638719,AU +3398638720,3398638847,PH +3398638848,3398638879,AU +3398638880,3398638911,PH +3398638912,3398639007,AU +3398639008,3398639231,PH +3398639232,3398639247,AU +3398639248,3398639263,PH +3398639264,3398639271,TW +3398639272,3398639423,AU +3398639424,3398639455,PH +3398639456,3398640127,AU +3398640128,3398640159,SG +3398640160,3398640191,AU +3398640192,3398640207,MY +3398640208,3398640303,AU +3398640304,3398640311,SG +3398640312,3398640639,AU +3398640640,3398640695,SG +3398640696,3398640783,AU +3398640784,3398640799,SG +3398640800,3398640911,AU +3398640912,3398640959,SG +3398640960,3398641007,AU +3398641008,3398641039,SG +3398641040,3398641055,AU +3398641056,3398641087,SG +3398641088,3398641095,AU +3398641096,3398641103,SG +3398641104,3398641119,AU +3398641120,3398641311,SG +3398641312,3398641423,AU +3398641424,3398641431,SG +3398641432,3398641447,MY +3398641448,3398641455,AU +3398641456,3398641503,SG +3398641504,3398641535,AU +3398641536,3398641543,SG +3398641544,3398641567,AU +3398641568,3398641631,MY +3398641632,3398643223,AU +3398643224,3398643247,NZ +3398643248,3398643375,AU +3398643376,3398643383,NZ +3398643384,3398643711,AU +3398643712,3398643967,SG +3398643968,3398647295,AU +3398647296,3398647551,TW +3398647552,3398672383,AU +3398672384,3398680575,PK +3398680576,3398684671,ID +3398684672,3398688767,JP +3398688768,3398705151,ID +3398705152,3398711295,AU +3398711296,3398713343,BD +3398713344,3398721535,AU +3398721536,3398729727,CN +3398729728,3398737919,AU +3398737920,3398742015,SG +3398742016,3398746111,TH +3398746112,3398750207,IN +3398750208,3398754303,TW +3398754304,3398758399,AU +3398758400,3398768639,JP +3398768640,3398770687,TH +3398770688,3398778879,IN +3398778880,3398787071,ID +3398787072,3398795263,TH +3398795264,3398803455,ID +3398803456,3398811647,CN +3398811648,3398819839,IN +3398819840,3398828031,CN +3398828032,3398829055,KH +3398829056,3398830079,IN +3398830080,3398831103,KH +3398831104,3398832127,AU +3398832128,3398836223,CN +3398836224,3398840319,AU +3398840320,3398842367,JP +3398842368,3398844415,AU +3398844416,3398852607,ID +3398852608,3398860799,NZ +3398860800,3398873087,ID +3398873088,3398877183,KR +3398877184,3398881279,AU +3398881280,3398885375,SG +3398885376,3398893567,AU +3398893568,3398894591,ID +3398894592,3398895615,TH +3398895616,3398897663,ID +3398897664,3398901759,FJ +3398901760,3398902015,AU +3398902016,3398902271,HK +3398902272,3398902783,PH +3398902784,3398903807,AU +3398903808,3398905855,TH +3398905856,3398909951,TW +3398909952,3398918143,GU +3398918144,3398926335,JP +3398926336,3398934527,IN +3398934528,3398938623,VN +3398938624,3398942719,TH +3398942720,3398959103,MY +3398959104,3398975487,ID +3398975488,3398983679,BN +3398983680,3398991871,JP +3398991872,3399004159,ID +3399004160,3399008255,CN +3399008256,3399012351,ID +3399012352,3399016447,JP +3399016448,3399024639,ID +3399024640,3399025663,TH +3399025664,3399026175,JP +3399026176,3399026431,SG +3399026432,3399026687,AU +3399026688,3399028735,HK +3399028736,3399032831,ID +3399032832,3399036927,IN +3399036928,3399041023,CN +3399041024,3399045119,AU +3399045120,3399047167,MV +3399047168,3399057407,HK +3399057408,3399065599,ID +3399065600,3399074495,TW +3399074496,3399074527,CN +3399074528,3399075487,TW +3399075488,3399075503,CR +3399075504,3399076431,TW +3399076432,3399076447,CR +3399076448,3399076607,TW +3399076608,3399076639,HK +3399076640,3399076687,TW +3399076688,3399076703,HK +3399076704,3399077079,TW +3399077080,3399077087,HK +3399077088,3399077359,TW +3399077360,3399077375,CR +3399077376,3399077887,TW +3399077888,3399081983,AU +3399081984,3399099647,ID +3399099648,3399099903,AU +3399099904,3399100719,ID +3399100720,3399100735,AU +3399100736,3399100751,ID +3399100752,3399100799,AU +3399100800,3399100863,ID +3399100864,3399100879,AU +3399100880,3399100895,ID +3399100896,3399100927,AU +3399100928,3399101951,ID +3399101952,3399101983,AU +3399101984,3399102079,ID +3399102080,3399102111,AU +3399102112,3399102127,ID +3399102128,3399102207,AU +3399102208,3399102287,ID +3399102288,3399102399,AU +3399102400,3399102431,ID +3399102432,3399102463,AU +3399102464,3399102719,ID +3399102720,3399102975,AU +3399102976,3399106559,ID +3399106560,3399122943,AU +3399122944,3399131135,NZ +3399131136,3399135231,IN +3399135232,3399139327,ID +3399139328,3399147519,TW +3399147520,3399155711,PK +3399155712,3399196671,ID +3399196672,3399204863,AU +3399204864,3399221247,HK +3399221248,3399286783,SG +3399286784,3399303167,JP +3399303168,3399311359,IN +3399311360,3399319551,JP +3399319552,3399331839,SG +3399331840,3399332351,MY +3399332352,3399332863,SG +3399332864,3399333375,HK +3399333376,3399335423,MY +3399335424,3399335935,IN +3399335936,3399344127,AU +3399344128,3399352319,JP +3399352320,3399389183,ID +3399389184,3399393279,KR +3399393280,3399401471,CN +3399401472,3399409663,AU +3399409664,3399413759,JP +3399413760,3399414271,AU +3399414272,3399414527,JP +3399414528,3399414783,AU +3399414784,3399415807,VN +3399415808,3399416831,SG +3399416832,3399417087,ID +3399417088,3399417855,AU +3399417856,3399450623,ID +3399450624,3399467007,AU +3399467008,3399483391,IN +3399483392,3399495679,BN +3399495680,3399499775,NZ +3399499776,3399507967,TW +3399507968,3399512063,AU +3399512064,3399514111,NZ +3399514112,3399515135,SG +3399515136,3399515647,VN +3399515648,3399524351,AU +3399524352,3399528447,IN +3399528448,3399532543,CN +3399532544,3399544575,SG +3399544576,3399544831,IN +3399544832,3399546879,SG +3399546880,3399547135,US +3399547136,3399547903,SG +3399547904,3399548159,PK +3399548160,3399548415,SG +3399548416,3399548671,ID +3399548672,3399548927,SG +3399548928,3399557119,AU +3399557120,3399565311,SG +3399565312,3399581695,AU +3399581696,3399583487,US +3399583488,3399583743,NP +3399583744,3399584255,US +3399584256,3399584511,BD +3399584512,3399587839,US +3399587840,3399588095,BD +3399588096,3399589631,US +3399589632,3399589887,NP +3399589888,3399593983,HK +3399593984,3399598079,BD +3399598080,3399614463,JP +3399614464,3399622655,MY +3399622656,3399626751,ID +3399626752,3399630847,IN +3399630848,3399631871,AU +3399631872,3399632895,SG +3399632896,3399633407,NZ +3399633408,3399633919,AU +3399633920,3399634943,TH +3399634944,3399639039,JP +3399639040,3399643135,AU +3399643136,3399655423,JP +3399655424,3399659519,PH +3399659520,3399661567,NZ +3399661568,3399662591,HK +3399662592,3399663615,IN +3399663616,3399671807,ID +3399671808,3399679999,IN +3399680000,3399688191,HK +3399688192,3399696383,SG +3399696384,3399712767,PK +3399712768,3399720959,KR +3399720960,3399729151,JP +3399729152,3399745535,PH +3399745536,3399749631,CN +3399749632,3399751679,AU +3399751680,3399752191,IN +3399752192,3399752447,AU +3399752448,3399752703,HK +3399752704,3399753727,NZ +3399753728,3399761919,IN +3399761920,3399770111,JP +3399770112,3399778303,AU +3399778304,3399786495,IN +3399786496,3399794687,PH +3399794688,3399798783,AU +3399798784,3399800831,BD +3399800832,3399802879,ID +3399802880,3399811071,JP +3399811072,3399819263,MY +3399819264,3399823359,ID +3399823360,3399825407,JP +3399825408,3399826431,KR +3399826432,3399826943,PH +3399826944,3399827455,IN +3399827456,3399839743,AU +3399839744,3399841791,JP +3399841792,3399846399,TW +3399846400,3399846407,US +3399846408,3399846919,TW +3399846920,3399846935,US +3399846936,3399847247,TW +3399847248,3399847263,US +3399847264,3399852031,TW +3399852032,3399856127,JP +3399856128,3399860223,CN +3399860224,3399864319,PG +3399864320,3399868415,CN +3399868416,3399876607,PK +3399876608,3399917567,SG +3399917568,3399921663,PK +3399921664,3399923711,NC +3399923712,3399923967,IN +3399923968,3399924223,JP +3399924224,3399924735,AU +3399924736,3399925759,PH +3399925760,3399933951,NP +3399933952,3399950335,AU +3399950336,3399967871,US +3399967872,3399967999,HK +3399968000,3399974911,US +3399974912,3399979007,AU +3399979008,3399982959,US +3399982960,3399982975,SG +3399982976,3399995391,US +3399995392,3399999487,KR +3399999488,3400002047,SG +3400002048,3400002559,HK +3400002560,3400003583,JP +3400003584,3400005823,SG +3400005824,3400005863,HK +3400005864,3400006143,SG +3400006144,3400006399,HK +3400006400,3400007679,SG +3400007680,3400024063,AU +3400024064,3400028159,MY +3400028160,3400030207,AU +3400030208,3400031231,IN +3400031232,3400031743,SG +3400031744,3400031999,IN +3400032000,3400032255,HK +3400032256,3400048639,AU +3400048640,3400056831,CN +3400056832,3400060927,TW +3400060928,3400061695,HK +3400061696,3400061791,US +3400061792,3400061983,HK +3400061984,3400061999,US +3400062000,3400062015,HK +3400062016,3400062047,MO +3400062048,3400062975,HK +3400062976,3400065023,JP +3400065024,3400073215,BD +3400073216,3400077311,HK +3400077312,3400079359,AU +3400079360,3400081407,MY +3400081408,3400089599,ID +3400089600,3400097791,JP +3400097792,3400105983,AU +3400105984,3400114175,JP +3400114176,3400118271,TW +3400118272,3400120319,AU +3400120320,3400122367,JP +3400122368,3400130559,NZ +3400130560,3400138751,ID +3400138752,3400146943,HK +3400146944,3400151039,FJ +3400151040,3400155135,MY +3400155136,3400163327,MN +3400163328,3400167423,JP +3400167424,3400171519,TH +3400171520,3400179711,CN +3400179712,3400183807,NZ +3400183808,3400187903,JP +3400187904,3400191999,AU +3400192000,3400194047,JP +3400194048,3400196095,CN +3400196096,3400204287,AU +3400204288,3400212479,ID +3400212480,3400220671,MY +3400220672,3400221055,NC +3400221056,3400221119,NZ +3400221120,3400224767,NC +3400224768,3400228863,JP +3400228864,3400232959,AU +3400232960,3400245247,JP +3400245248,3400253439,AU +3400253440,3400257535,MY +3400257536,3400259583,HK +3400259584,3400261631,AU +3400261632,3400263679,JP +3400263680,3400265727,AU +3400265728,3400267775,PG +3400267776,3400268799,KR +3400268800,3400270847,MO +3400270848,3400271359,VN +3400271360,3400271615,AU +3400271616,3400271871,IN +3400271872,3400273919,AU +3400273920,3400275967,TH +3400275968,3400278015,JP +3400278016,3400286207,SG +3400286208,3400294399,JP +3400294400,3400310783,AU +3400310784,3400335359,SG +3400335360,3400336383,MO +3400336384,3400336639,PH +3400336640,3400336895,JP +3400336896,3400337151,AU +3400337152,3400337407,PH +3400337408,3400339455,CN +3400339456,3400341503,ID +3400341504,3400343551,AU +3400343552,3400351743,TW +3400351744,3400359935,ID +3400359936,3400368127,JP +3400368128,3400388607,AU +3400388608,3400392703,TH +3400392704,3400400895,CN +3400400896,3400401919,MO +3400401920,3400402175,TW +3400402176,3400402431,IN +3400402432,3400402943,NZ +3400402944,3400404991,AU +3400404992,3400409087,TW +3400409088,3400413183,AU +3400413184,3400417279,JP +3400417280,3400421375,SG +3400421376,3400423423,AU +3400423424,3400424447,KR +3400424448,3400425471,IN +3400425472,3400429567,AU +3400429568,3400431615,NZ +3400431616,3400431871,IN +3400431872,3400432127,HK +3400432128,3400433663,IN +3400433664,3400434431,HK +3400434432,3400434463,MY +3400434464,3400434471,HK +3400434472,3400434479,MY +3400434480,3400434487,HK +3400434488,3400434519,MY +3400434520,3400434527,MV +3400434528,3400434535,HK +3400434536,3400434543,KZ +3400434544,3400434551,MY +3400434552,3400434559,KZ +3400434560,3400434567,MV +3400434568,3400434575,MY +3400434576,3400434583,MV +3400434584,3400434599,MY +3400434600,3400434607,HK +3400434608,3400434647,MV +3400434648,3400434655,KZ +3400434656,3400434663,MV +3400434664,3400434679,MY +3400434680,3400434687,HK +3400434688,3400434895,MY +3400434896,3400434911,MV +3400434912,3400434927,KZ +3400434928,3400434935,MV +3400434936,3400434951,HK +3400434952,3400434959,AF +3400434960,3400434975,HK +3400434976,3400434991,AF +3400434992,3400435007,MA +3400435008,3400435071,MY +3400435072,3400435087,MA +3400435088,3400435095,AF +3400435096,3400435119,MA +3400435120,3400435143,HK +3400435144,3400435151,MA +3400435152,3400435159,HK +3400435160,3400435175,MA +3400435176,3400435183,MY +3400435184,3400435199,MV +3400435200,3400435207,AF +3400435208,3400435239,HK +3400435240,3400435263,ID +3400435264,3400435391,MY +3400435392,3400435423,HK +3400435424,3400435439,ID +3400435440,3400435455,KZ +3400435456,3400435575,MY +3400435576,3400435639,HK +3400435640,3400435647,MY +3400435648,3400435663,HK +3400435664,3400435711,MY +3400435712,3400436479,HK +3400436480,3400436735,NP +3400436736,3400437247,BD +3400437248,3400437375,PK +3400437376,3400437439,BD +3400437440,3400437527,HK +3400437528,3400437543,MY +3400437544,3400437551,HK +3400437552,3400437591,MY +3400437592,3400437599,BD +3400437600,3400437607,MN +3400437608,3400437615,MY +3400437616,3400437631,HK +3400437632,3400437647,MY +3400437648,3400437655,HK +3400437656,3400437663,MY +3400437664,3400437679,HK +3400437680,3400437687,MN +3400437688,3400437703,ID +3400437704,3400437711,HK +3400437712,3400437719,MY +3400437720,3400437735,HK +3400437736,3400437759,ID +3400437760,3400437767,AF +3400437768,3400437775,MY +3400437776,3400437783,HK +3400437784,3400437807,NP +3400437808,3400437815,MN +3400437816,3400437823,ID +3400437824,3400437831,MY +3400437832,3400437847,ID +3400437848,3400437887,MY +3400437888,3400437895,HK +3400437896,3400437903,MY +3400437904,3400437911,ID +3400437912,3400437927,MY +3400437928,3400437935,ID +3400437936,3400437951,BD +3400437952,3400437959,MN +3400437960,3400437967,ID +3400437968,3400437975,MY +3400437976,3400437983,AF +3400437984,3400438191,HK +3400438192,3400438207,US +3400438208,3400438399,HK +3400438400,3400438591,BD +3400438592,3400438783,HK +3400438784,3400438815,KZ +3400438816,3400438831,PK +3400438832,3400438839,AF +3400438840,3400438847,ID +3400438848,3400438863,BD +3400438864,3400438871,HK +3400438872,3400438879,ID +3400438880,3400438911,NP +3400438912,3400438919,AF +3400438920,3400438927,IN +3400438928,3400438943,BD +3400438944,3400438959,HK +3400438960,3400438991,ID +3400438992,3400438999,HK +3400439000,3400439007,PK +3400439008,3400439023,BD +3400439024,3400439039,ID +3400439040,3400439295,HK +3400439296,3400439551,PK +3400439552,3400439615,BD +3400439616,3400439679,HK +3400439680,3400439711,BD +3400439712,3400439743,KZ +3400439744,3400439807,BD +3400439808,3400439871,HK +3400439872,3400439935,NP +3400439936,3400440063,HK +3400440064,3400440079,NP +3400440080,3400440087,MN +3400440088,3400440095,MY +3400440096,3400440111,MN +3400440112,3400440127,MY +3400440128,3400440135,MN +3400440136,3400440143,HK +3400440144,3400440159,MY +3400440160,3400440167,BD +3400440168,3400440175,MY +3400440176,3400440191,BD +3400440192,3400440199,KZ +3400440200,3400440207,MN +3400440208,3400440223,MY +3400440224,3400440239,BD +3400440240,3400440247,ID +3400440248,3400440255,AF +3400440256,3400440263,ID +3400440264,3400440271,MN +3400440272,3400440295,ID +3400440296,3400440303,BD +3400440304,3400440319,MY +3400440320,3400440327,AF +3400440328,3400440335,ID +3400440336,3400440343,NP +3400440344,3400440351,AF +3400440352,3400440359,HK +3400440360,3400440367,ID +3400440368,3400440375,HK +3400440376,3400440383,ID +3400440384,3400440391,MN +3400440392,3400440415,ID +3400440416,3400440431,AF +3400440432,3400440439,MY +3400440440,3400440447,HK +3400440448,3400440455,AF +3400440456,3400440463,BD +3400440464,3400440467,ID +3400440468,3400440475,HK +3400440476,3400440479,NP +3400440480,3400440487,AF +3400440488,3400440495,MY +3400440496,3400440499,LK +3400440500,3400440507,AF +3400440508,3400440519,HK +3400440520,3400440531,ID +3400440532,3400440535,AF +3400440536,3400440539,ID +3400440540,3400440543,HK +3400440544,3400440551,MN +3400440552,3400440575,NP +3400440576,3400440583,ID +3400440584,3400440591,HK +3400440592,3400440607,PK +3400440608,3400440623,HK +3400440624,3400440639,ID +3400440640,3400440703,HK +3400440704,3400440711,AF +3400440712,3400440719,ID +3400440720,3400440727,AF +3400440728,3400440735,KZ +3400440736,3400440743,BD +3400440744,3400440750,ID +3400440751,3400440751,HK +3400440752,3400440759,ID +3400440760,3400440767,MY +3400440768,3400440775,ID +3400440776,3400440783,HK +3400440784,3400440791,MN +3400440792,3400440799,AF +3400440800,3400440807,BD +3400440808,3400440815,MY +3400440816,3400440823,AF +3400440824,3400440831,MY +3400440832,3400440895,BD +3400440896,3400440959,AF +3400440960,3400441023,HK +3400441024,3400441047,AF +3400441048,3400441055,BD +3400441056,3400441063,PK +3400441064,3400441071,HK +3400441072,3400441079,ID +3400441080,3400441087,AF +3400441088,3400441151,PK +3400441152,3400441215,BD +3400441216,3400441279,HK +3400441280,3400441311,AF +3400441312,3400441319,LK +3400441320,3400441327,AF +3400441328,3400441335,LK +3400441336,3400441855,HK +3400441856,3400450047,NZ +3400450048,3400458239,JP +3400458240,3400466431,AU +3400466432,3400499199,MO +3400499200,3400503295,NZ +3400503296,3400507391,JP +3400507392,3400515583,MO +3400515584,3400531967,PH +3400531968,3400534015,AU +3400534016,3400535039,JP +3400535040,3400535551,MY +3400535552,3400536063,AU +3400536064,3400548351,JP +3400548352,3400581119,TH +3400581120,3400589311,SG +3400589312,3400597503,AU +3400597504,3400605695,HK +3400605696,3400607743,JP +3400607744,3400608767,AU +3400608768,3400609791,IN +3400609792,3400630271,JP +3400630272,3400646655,IN +3400646656,3400647043,SG +3400647044,3400647047,JP +3400647048,3400647623,SG +3400647624,3400647631,JP +3400647632,3400648735,SG +3400648736,3400648743,DE +3400648744,3400648767,SG +3400648768,3400648807,US +3400648808,3400649191,SG +3400649192,3400649199,HK +3400649200,3400649519,SG +3400649520,3400649527,JP +3400649528,3400649983,SG +3400649984,3400650047,HK +3400650048,3400650751,SG +3400650752,3400651007,JP +3400651008,3400654847,SG +3400654848,3400663039,IN +3400663040,3400683519,MY +3400683520,3400691711,JP +3400691712,3400695807,KH +3400695808,3400728575,TW +3400728576,3400736767,MN +3400736768,3400744959,JP +3400744960,3400753151,IN +3400753152,3400761343,MY +3400761344,3400769535,PK +3400769536,3400773631,JP +3400773632,3400775679,KR +3400775680,3400777727,ID +3400777728,3400790015,JP +3400790016,3400794111,CN +3400794112,3400802303,ID +3400802304,3400806399,JP +3400806400,3400808447,ID +3400808448,3400810495,JP +3400810496,3400826879,NZ +3400826880,3400835071,CN +3400835072,3400839167,HK +3400839168,3400847359,JP +3400847360,3400849407,AU +3400849408,3400851455,MN +3400851456,3400884223,AU +3400884224,3400888319,JP +3400888320,3400892415,CN +3400892416,3400925183,HK +3400925184,3400933375,TH +3400933376,3400937471,AU +3400937472,3400941567,ID +3400941568,3400966143,AU +3400966144,3400974335,ID +3400974336,3400982527,AU +3400982528,3400990719,HK +3400990720,3400998911,ID +3400998912,3401003007,PH +3401003008,3401007103,JP +3401007104,3401011199,IN +3401011200,3401015295,JP +3401015296,3401023487,AU +3401023488,3401056255,TH +3401056256,3401383935,MY +3401383936,3401404415,AU +3401404416,3401408511,CN +3401408512,3401416703,HK +3401416704,3401420799,KR +3401420800,3401424895,JP +3401424896,3401428991,NZ +3401428992,3401431039,JP +3401431040,3401433087,AU +3401433088,3401441279,JP +3401441280,3401449471,IN +3401449472,3401515007,MY +3401515008,3401515263,DE +3401515264,3401515519,AU +3401515520,3401516031,ID +3401516032,3401519103,AU +3401519104,3401523199,JP +3401523200,3401527295,NZ +3401527296,3401529343,AU +3401529344,3401530367,VN +3401530368,3401531391,AU +3401531392,3401532415,IN +3401532416,3401543679,AU +3401543680,3401545727,JP +3401545728,3401547775,BD +3401547776,3401580543,MY +3401580544,3401642495,CN +3401642496,3401642751,TW +3401642752,3402629119,CN +3402629120,3404857954,JP +3404857955,3404857955,ID +3404857956,3404857966,JP +3404857967,3404857967,IN +3404857968,3405774847,JP +3405774848,3406071807,AU +3406071808,3406073855,US +3406073856,3406077951,AU +3406077952,3406078207,TH +3406078208,3406327039,AU +3406327040,3406327295,IN +3406327296,3406384639,AU +3406384640,3406385151,SG +3406385152,3406409727,AU +3406409728,3406411775,NZ +3406411776,3406434303,AU +3406434304,3406436351,MY +3406436352,3406542847,AU +3406542848,3406543103,SG +3406543104,3406565887,AU +3406565888,3406566143,PH +3406566144,3406591487,AU +3406591488,3406591743,NP +3406591744,3406617599,AU +3406617600,3406617855,MY +3406617856,3406618111,AU +3406618112,3406618623,IN +3406618624,3406625023,AU +3406625024,3406625279,NF +3406625280,3406663935,AU +3406663936,3406664191,CN +3406664192,3406664447,IN +3406664448,3406669823,AU +3406669824,3406670847,IN +3406670848,3406696959,AU +3406696960,3406697215,IN +3406697216,3406737407,AU +3406737408,3406737663,ID +3406737664,3406739199,AU +3406739200,3406739455,ID +3406739456,3406746623,AU +3406746624,3406746879,HK +3406746880,3406865663,AU +3406865664,3406865919,IN +3406865920,3406946815,AU +3406946816,3406947071,KR +3406947072,3406950399,AU +3406950400,3406951423,NF +3406951424,3406961151,AU +3406961152,3406961407,IN +3406961408,3406967295,AU +3406967296,3406967551,CN +3406967552,3406989567,AU +3406989568,3406989823,IN +3406989824,3407020287,AU +3407020288,3407020543,SG +3407020544,3407020799,AU +3407020800,3407021055,IN +3407021056,3407021311,ID +3407021312,3407045887,AU +3407045888,3407046143,HK +3407046144,3407057663,AU +3407057664,3407057919,JP +3407057920,3407096831,AU +3407096832,3407097087,JP +3407097088,3407112447,AU +3407112448,3407112703,SG +3407112704,3407152895,AU +3407152896,3407153151,IN +3407153152,3407157559,AU +3407157560,3407157563,NZ +3407157564,3407157579,AU +3407157580,3407157583,NZ +3407157584,3407157611,AU +3407157612,3407157615,NZ +3407157616,3407157643,AU +3407157644,3407157647,NZ +3407157648,3407157703,AU +3407157704,3407157711,NZ +3407157712,3407158015,AU +3407158016,3407158047,NZ +3407158048,3407158051,AU +3407158052,3407158055,NZ +3407158056,3407158167,AU +3407158168,3407158175,NZ +3407158176,3407158207,AU +3407158208,3407158223,NZ +3407158224,3407158239,AU +3407158240,3407158271,NZ +3407158272,3407159091,AU +3407159092,3407159095,NZ +3407159096,3407159115,AU +3407159116,3407159135,NZ +3407159136,3407159191,AU +3407159192,3407159195,NZ +3407159196,3407159207,AU +3407159208,3407159215,NZ +3407159216,3407159231,AU +3407159232,3407159239,NZ +3407159240,3407159263,AU +3407159264,3407159295,NZ +3407159296,3407243263,AU +3407243264,3407243775,HK +3407243776,3407268863,AU +3407268864,3407269119,US +3407269120,3407329791,AU +3407329792,3407330047,IN +3407330048,3407367167,AU +3407367168,3407367679,ID +3407367680,3407369983,AU +3407369984,3407370239,IN +3407370240,3407498495,AU +3407498496,3407498751,PK +3407498752,3407524607,AU +3407524608,3407524863,NZ +3407524864,3407602943,AU +3407602944,3407603199,JP +3407603200,3407604479,AU +3407604480,3407604735,IN +3407604736,3407608715,AU +3407608716,3407608736,JP +3407608737,3407732223,AU +3407732224,3407732479,HK +3407732480,3407750655,AU +3407750656,3407751167,SG +3407751168,3407753215,AU +3407753216,3407753727,HK +3407753728,3407785471,AU +3407785472,3407785727,NZ +3407785728,3407801343,AU +3407801344,3407801855,ID +3407801856,3407805951,AU +3407805952,3407806463,ID +3407806464,3407814655,AU +3407814656,3407815167,HK +3407815168,3407828991,AU +3407828992,3407829503,US +3407829504,3407837183,AU +3407837184,3407837439,US +3407837440,3407848447,AU +3407848448,3407848959,ID +3407848960,3407866367,AU +3407866368,3407866623,GB +3407866624,3407873023,AU +3407873024,3407873535,IN +3407873536,3407928575,AU +3407928576,3407928831,IN +3407928832,3407985919,AU +3407985920,3407986175,KH +3407986176,3407987711,AU +3407987712,3407987967,PH +3407987968,3407988223,AU +3407988224,3407988735,IN +3407988736,3407998975,AU +3407998976,3407999231,TH +3407999232,3408012543,AU +3408012544,3408012799,MN +3408012800,3408023807,AU +3408023808,3408024063,JP +3408024064,3408032767,AU +3408032768,3408033279,IN +3408033280,3408033791,ID +3408033792,3408039935,AU +3408039936,3408040191,VN +3408040192,3408042495,AU +3408042496,3408042751,HK +3408042752,3408066047,AU +3408066048,3408066303,PH +3408066304,3409396479,AU +3409396480,3409396735,PH +3409396736,3409418495,AU +3409418496,3409418751,PL +3409418752,3409420287,AU +3409420288,3409420543,IN +3409420544,3409423615,AU +3409423616,3409423871,IN +3409423872,3409491711,AU +3409491712,3409491967,SG +3409491968,3409505023,AU +3409505024,3409505279,US +3409505280,3409506559,AU +3409506560,3409506815,IN +3409506816,3409509631,AU +3409509632,3409509887,HK +3409509888,3409510367,AU +3409510368,3409510383,IN +3409510384,3409516543,AU +3409516544,3409517055,ID +3409517056,3409547519,AU +3409547520,3409547775,NZ +3409547776,3409802831,AU +3409802832,3409802847,MT +3409802848,3409838335,AU +3409838336,3409838591,MY +3409838592,3409876991,AU +3409876992,3409878015,TH +3409878016,3409882111,AU +3409882112,3409883135,IN +3409883136,3409887999,AU +3409888000,3409888255,SG +3409888256,3409969151,AU +3409969152,3410755583,TW +3410755584,3410771967,AU +3410771968,3410780159,JP +3410780160,3410788351,BD +3410788352,3410792447,IN +3410792448,3410796543,BD +3410796544,3410797567,KH +3410797568,3410798591,JP +3410798592,3410799615,IN +3410799616,3410800639,SG +3410800640,3410804735,IN +3410804736,3410821119,PH +3410821120,3410853887,TW +3410853888,3410862079,HK +3410862080,3410866175,AU +3410866176,3410866431,KR +3410866432,3410866687,IN +3410866688,3410866943,VN +3410866944,3410867199,AU +3410867200,3410868223,HK +3410868224,3410870271,US +3410870272,3410874367,IN +3410874368,3410886655,ID +3410886656,3410887679,TW +3410887680,3410887935,IN +3410887936,3410888703,HK +3410888704,3410890751,SG +3410890752,3410894847,AU +3410894848,3410898943,HK +3410898944,3410903039,AU +3410903040,3410911231,HK +3410911232,3410915327,TH +3410915328,3410919423,ID +3410919424,3410927615,IN +3410927616,3410931711,NP +3410931712,3410935807,TW +3410935808,3410939903,MY +3410939904,3410943999,IN +3410944000,3410952191,JP +3410952192,3410956287,CN +3410956288,3410960383,AU +3410960384,3410964479,GB +3410964480,3410968575,JP +3410968576,3410984959,NZ +3410984960,3411017727,TW +3411017728,3411018751,HK +3411018752,3411019263,AU +3411019264,3411019775,JP +3411019776,3411021823,ID +3411021824,3411023871,MY +3411023872,3411025919,JP +3411025920,3411030015,AU +3411030016,3411032063,NC +3411032064,3411032319,TH +3411032320,3411033087,AU +3411033088,3411034111,NZ +3411034112,3411050495,HK +3411050496,3411051519,PK +3411051520,3411052543,AU +3411052544,3411054591,PH +3411054592,3411058687,CN +3411058688,3411062783,AU +3411062784,3411063231,HK +3411063232,3411063295,PK +3411063296,3411083263,HK +3411083264,3411085311,AU +3411085312,3411086335,KR +3411086336,3411087359,JP +3411087360,3411091455,CN +3411091456,3411099647,SG +3411099648,3411107839,MM +3411107840,3411111935,LK +3411111936,3411116031,JP +3411116032,3411124223,KR +3411124224,3411128319,MM +3411128320,3411130367,HK +3411130368,3411132415,ID +3411132416,3411144703,PK +3411144704,3411146751,JP +3411146752,3411147775,ID +3411147776,3411149311,HK +3411149312,3411149823,MV +3411149824,3411150847,IN +3411150848,3411152895,HK +3411152896,3411154943,AU +3411154944,3411156991,JP +3411156992,3411161087,PH +3411161088,3411165183,PK +3411165184,3411173375,MY +3411173376,3411177471,AU +3411177472,3411189759,JP +3411189760,3411197951,AU +3411197952,3411202047,BD +3411202048,3411204607,AU +3411204608,3411204863,IN +3411204864,3411205631,KR +3411205632,3411206143,HK +3411206144,3411210239,KH +3411210240,3411212287,KR +3411212288,3411212799,PH +3411212800,3411213311,IN +3411213312,3411215359,HK +3411215360,3411216383,AU +3411216384,3411218431,JP +3411218432,3411220479,PG +3411220480,3411226623,ID +3411226624,3411228671,IO +3411228672,3411230719,CN +3411230720,3411247103,HK +3411247104,3411255295,KR +3411255296,3411263487,BD +3411263488,3411269631,AU +3411269632,3411270143,TW +3411270144,3411270399,NZ +3411270400,3411270655,AU +3411270656,3411271679,JP +3411271680,3411275775,AU +3411275776,3411277823,JP +3411277824,3411278335,IN +3411278336,3411278591,SG +3411278592,3411278847,FJ +3411278848,3411296255,HK +3411296256,3411312639,AU +3411312640,3411313151,HK +3411313152,3411313663,TW +3411313664,3411313919,AU +3411313920,3411314175,HK +3411314176,3411314687,NZ +3411314688,3411316735,ID +3411316736,3411318783,TW +3411318784,3411320831,ID +3411320832,3411329023,PH +3411329024,3411341311,AU +3411341312,3411345407,KR +3411345408,3411410943,HK +3411410944,3411435519,CN +3411435520,3411443711,IN +3411443712,3411460095,HK +3411460096,3411464191,NZ +3411464192,3411468287,AU +3411468288,3411470335,JP +3411470336,3411472383,HK +3411472384,3411475199,JP +3411475200,3411475455,AU +3411475456,3411475967,HK +3411475968,3411509247,AU +3411509248,3411542015,PH +3411542016,3411550207,IN +3411550208,3411558399,CN +3411558400,3411558911,HK +3411558912,3411558927,ID +3411558928,3411558943,HK +3411558944,3411558959,ID +3411558960,3411558975,HK +3411558976,3411558983,AF +3411558984,3411559007,HK +3411559008,3411559015,MY +3411559016,3411559023,HK +3411559024,3411559031,ID +3411559032,3411559035,NP +3411559036,3411559039,PK +3411559040,3411559063,ID +3411559064,3411559071,MY +3411559072,3411559079,AF +3411559080,3411559087,MY +3411559088,3411559095,ID +3411559096,3411559103,PK +3411559104,3411559111,MY +3411559112,3411559135,PK +3411559136,3411559143,HK +3411559144,3411559167,MY +3411559168,3411559199,BD +3411559200,3411559231,HK +3411559232,3411559295,BD +3411559296,3411559303,ID +3411559304,3411559311,HK +3411559312,3411559327,NP +3411559328,3411559343,HK +3411559344,3411559359,ID +3411559360,3411559423,BD +3411559424,3411559455,HK +3411559456,3411559487,BD +3411559488,3411559551,HK +3411559552,3411559679,BD +3411559680,3411559935,ID +3411559936,3411560031,BD +3411560032,3411560063,HK +3411560064,3411560319,BD +3411560320,3411560447,HK +3411560448,3411560703,NP +3411560704,3411562047,BD +3411562048,3411562111,PK +3411562112,3411562239,BD +3411562240,3411562559,HK +3411562560,3411562591,MA +3411562592,3411562607,PK +3411562608,3411562623,MA +3411562624,3411562751,HK +3411562752,3411563015,MY +3411563016,3411563023,TH +3411563024,3411563047,ID +3411563048,3411563055,LK +3411563056,3411563135,ID +3411563136,3411563143,TH +3411563144,3411563183,ID +3411563184,3411563191,HK +3411563192,3411563247,ID +3411563248,3411563255,AF +3411563256,3411563263,ID +3411563264,3411563519,HK +3411563520,3411563775,BD +3411563776,3411564031,HK +3411564032,3411564055,ID +3411564056,3411564071,HK +3411564072,3411564087,ID +3411564088,3411564095,HK +3411564096,3411564119,ID +3411564120,3411564191,HK +3411564192,3411564199,ID +3411564200,3411564239,HK +3411564240,3411564247,ID +3411564248,3411564255,HK +3411564256,3411564263,ID +3411564264,3411564287,HK +3411564288,3411564543,BD +3411564544,3411564551,HK +3411564552,3411564559,PK +3411564560,3411564567,HK +3411564568,3411564587,AF +3411564588,3411564623,HK +3411564624,3411564639,MY +3411564640,3411564647,ID +3411564648,3411564663,MY +3411564664,3411564671,ID +3411564672,3411564695,HK +3411564696,3411564703,ID +3411564704,3411564711,AF +3411564712,3411564743,HK +3411564744,3411564751,MY +3411564752,3411564767,HK +3411564768,3411564775,AF +3411564776,3411565055,HK +3411565056,3411565063,BD +3411565064,3411565119,HK +3411565120,3411565311,BD +3411565312,3411566591,HK +3411566592,3411570687,BD +3411570688,3411574783,AU +3411574784,3411582975,IN +3411582976,3411587071,HK +3411587072,3411591167,JP +3411591168,3411599359,CN +3411599360,3411607551,AU +3411607552,3411608575,CN +3411608576,3411608831,IN +3411608832,3411609087,AU +3411609088,3411609599,HK +3411609600,3411611647,AU +3411611648,3411615743,ID +3411615744,3411623935,JP +3411623936,3411640319,AU +3411640320,3411641343,JP +3411641344,3411641599,IN +3411641600,3411641855,HK +3411641856,3411642367,IN +3411642368,3411643391,AU +3411643392,3411644415,VN +3411644416,3411644927,AU +3411644928,3411645951,ID +3411645952,3411646207,SG +3411646208,3411647487,IN +3411647488,3411648511,HK +3411648512,3411656703,NZ +3411656704,3411673087,AU +3411673088,3411674111,CN +3411674112,3411674623,IN +3411674624,3411675135,HK +3411675136,3411676159,AU +3411676160,3411677183,PK +3411677184,3411679231,JP +3411679232,3411681279,AU +3411681280,3411689471,KR +3411689472,3411705855,IN +3411705856,3411730431,CN +3411730432,3411738623,HK +3411738624,3411746815,TW +3411746816,3411755007,CN +3411755008,3411763199,AU +3411763200,3411767295,CN +3411767296,3411769343,MN +3411769344,3411771391,CN +3411771392,3411773439,HK +3411773440,3411773695,SC +3411773696,3411773951,HK +3411773952,3411774463,BD +3411774464,3411776511,HK +3411776512,3411776767,SC +3411776768,3411777663,HK +3411777664,3411777791,BD +3411777792,3411779519,HK +3411779520,3411779535,ID +3411779536,3411779583,HK +3411779584,3411787775,JP +3411787776,3411795967,IN +3411795968,3411804159,AU +3411804160,3411805183,CN +3411805184,3411805695,PK +3411805696,3411805951,JP +3411805952,3411806207,AU +3411806208,3411808255,PH +3411808256,3411810303,JP +3411810304,3411810559,MN +3411810560,3411810815,NZ +3411810816,3411812351,AU +3411812352,3411820543,IN +3411820544,3411836927,SG +3411836928,3411845119,MY +3411845120,3411853311,CN +3411853312,3411857407,IN +3411857408,3411857663,TW +3411857664,3411857919,JP +3411857920,3411858175,SG +3411858176,3411858431,HK +3411858432,3411858687,JP +3411858688,3411858943,NZ +3411858944,3411859199,JP +3411859200,3411859455,SG +3411859456,3411860991,HK +3411860992,3411861375,JP +3411861376,3411861487,HK +3411861488,3411861503,JP +3411861504,3411869695,AU +3411869696,3411943423,CN +3411943424,3411951615,AU +3411951616,3411967999,LK +3411968000,3411984383,AU +3411984384,3412000767,IN +3412000768,3412002815,CN +3412002816,3412004863,GU +3412004864,3412017151,JP +3412017152,3412025343,SG +3412025344,3412033535,CN +3412033536,3412066303,TW +3412066304,3412107263,NZ +3412107264,3412115455,AU +3412115456,3412123647,NZ +3412123648,3412131839,AU +3412131840,3412213759,NZ +3412213760,3412221951,AU +3412221952,3412230143,IN +3412230144,3412246527,HK +3412246528,3412246783,AU +3412246784,3412246799,HK +3412246800,3412246847,AU +3412246848,3412246911,IN +3412246912,3412246927,SG +3412246928,3412246951,AU +3412246952,3412246959,CN +3412246960,3412246967,JP +3412246968,3412246975,AU +3412246976,3412247007,JP +3412247008,3412247023,IN +3412247024,3412247031,CN +3412247032,3412247039,NZ +3412247040,3412247055,HK +3412247056,3412247071,CN +3412247072,3412247103,JP +3412247104,3412247167,AU +3412247168,3412247319,IN +3412247320,3412247327,AU +3412247328,3412247335,IN +3412247336,3412247343,SG +3412247344,3412247359,CN +3412247360,3412247375,AU +3412247376,3412247391,MY +3412247392,3412247399,SG +3412247400,3412247423,AU +3412247424,3412247439,HK +3412247440,3412247455,IN +3412247456,3412247487,AU +3412247488,3412247551,CN +3412247552,3412248831,AU +3412248832,3412249087,CN +3412249088,3412249103,HK +3412249104,3412249119,IN +3412249120,3412249151,AU +3412249152,3412249215,CN +3412249216,3412249231,AU +3412249232,3412249239,HK +3412249240,3412249243,SG +3412249244,3412249247,AU +3412249248,3412249271,CN +3412249272,3412249279,AU +3412249280,3412249471,IN +3412249472,3412249599,TW +3412249600,3412249855,AU +3412249856,3412249863,SG +3412249864,3412249871,AU +3412249872,3412249879,HK +3412249880,3412249887,JP +3412249888,3412249903,CN +3412249904,3412249983,SG +3412249984,3412250015,IN +3412250016,3412250023,HK +3412250024,3412250031,CN +3412250032,3412250063,IN +3412250064,3412250079,AU +3412250080,3412250087,KR +3412250088,3412250367,HK +3412250368,3412250375,CN +3412250376,3412250383,TW +3412250384,3412250399,SG +3412250400,3412250431,KR +3412250432,3412250447,IN +3412250448,3412250479,CN +3412250480,3412250495,HK +3412250496,3412250503,JP +3412250504,3412250511,HK +3412250512,3412250527,TW +3412250528,3412250559,IN +3412250560,3412250575,SG +3412250576,3412250599,HK +3412250600,3412250607,AU +3412250608,3412250615,KR +3412250616,3412250623,AU +3412250624,3412250879,JP +3412250880,3412250927,AU +3412250928,3412250959,SG +3412250960,3412250991,JP +3412250992,3412251007,HK +3412251008,3412251071,CN +3412251072,3412251103,AU +3412251104,3412251119,PH +3412251120,3412251135,AU +3412251136,3412251151,CN +3412251152,3412251167,AU +3412251168,3412251231,HK +3412251232,3412251239,CN +3412251240,3412251247,AU +3412251248,3412251263,IN +3412251264,3412251391,AU +3412251392,3412251647,TW +3412251648,3412251903,AU +3412251904,3412251919,HK +3412251920,3412251927,AU +3412251928,3412251935,CN +3412251936,3412251967,HK +3412251968,3412252031,SG +3412252032,3412252079,HK +3412252080,3412252087,CN +3412252088,3412252095,HK +3412252096,3412252103,JP +3412252104,3412252111,HK +3412252112,3412252159,IN +3412252160,3412252415,KR +3412252416,3412252671,JP +3412252672,3412252927,HK +3412252928,3412253087,AU +3412253088,3412253091,JP +3412253092,3412253099,AU +3412253100,3412253103,HK +3412253104,3412253183,AU +3412253184,3412253439,SG +3412253440,3412253695,KR +3412253696,3412254719,JP +3412254720,3412262911,NR +3412262912,3412264959,JP +3412264960,3412267007,AU +3412267008,3412271103,CN +3412271104,3412273151,NZ +3412273152,3412275199,IN +3412275200,3412279295,PK +3412279296,3412281343,NZ +3412281344,3412283391,JP +3412283392,3412287487,CN +3412287488,3412295679,ID +3412295680,3412296191,NZ +3412296192,3412296703,ID +3412296704,3412297727,NZ +3412297728,3412298239,SC +3412298240,3412298751,MY +3412298752,3412299263,CN +3412299264,3412299519,AU +3412299520,3412299775,HK +3412299776,3412302847,AU +3412302848,3412303871,WS +3412303872,3412312063,PK +3412312064,3412320255,IN +3412320256,3412322303,JP +3412322304,3412324351,PH +3412324352,3412326399,JP +3412326400,3412327423,VN +3412327424,3412327935,TH +3412327936,3412328191,HK +3412328192,3412328447,WS +3412328448,3412336639,AU +3412336640,3412340735,CN +3412340736,3412343039,AU +3412343040,3412343295,IN +3412343296,3412344319,AU +3412344320,3412344575,SG +3412344576,3412344831,AU +3412344832,3412348927,IN +3412348928,3412361215,CN +3412361216,3412369407,AU +3412369408,3412377599,KR +3412377600,3412381695,CN +3412381696,3412385791,NZ +3412385792,3412393983,AU +3412393984,3412426751,IN +3412426752,3412434943,TH +3412434944,3412443135,PK +3412443136,3412451327,SG +3412451328,3412594687,AU +3412594688,3412596735,IN +3412596736,3412598783,MV +3412598784,3412602879,AU +3412602880,3412606975,NC +3412606976,3412615167,PH +3412615168,3412656127,JP +3412656128,3412672511,HK +3412672512,3412680703,JP +3412680704,3412697087,AU +3412697088,3412705279,IN +3412705280,3412713471,AU +3412713472,3412721663,TW +3412721664,3412787199,MY +3412787200,3412803583,TW +3412803584,3412819967,AU +3412819968,3412852735,TH +3412852736,3412918271,AU +3412918272,3412926463,KR +3412926464,3412934655,MY +3412934656,3412951039,IN +3412951040,3413000191,NZ +3413000192,3413004287,LA +3413004288,3413008383,IN +3413008384,3413016575,JP +3413016576,3413024767,AU +3413024768,3413032959,CN +3413032960,3413037055,AU +3413037056,3413041151,IN +3413041152,3413043199,JP +3413043200,3413044479,AU +3413044480,3413044735,SG +3413044736,3413045247,AU +3413045248,3413047295,IN +3413047296,3413102591,AU +3413102592,3413106687,TW +3413106688,3413110783,PH +3413110784,3413112831,JP +3413112832,3413113855,IN +3413113856,3413133311,JP +3413133312,3413135359,BD +3413135360,3413139455,HK +3413139456,3413147647,AU +3413147648,3413155839,IN +3413155840,3413164031,SG +3413164032,3413172223,BD +3413172224,3413180415,MY +3413180416,3413213183,TH +3413213184,3413229567,VN +3413229568,3413245951,AU +3413245952,3413262335,MY +3413262336,3413270527,PH +3413270528,3413278719,TH +3413278720,3413295103,NZ +3413295104,3413303295,JP +3413303296,3413304319,ID +3413304320,3413305343,JP +3413305344,3413306367,IN +3413306368,3413307391,PH +3413307392,3413308415,IN +3413308416,3413309439,CN +3413309440,3413310463,JP +3413310464,3413311487,HK +3413311488,3413327871,LK +3413327872,3413344255,IN +3413344256,3413360639,PH +3413360640,3413377023,MY +3413377024,3413524479,SG +3413524480,3413540863,TH +3413540864,3413557247,NZ +3413557248,3413565439,CN +3413565440,3413569535,TW +3413569536,3413569791,SG +3413569792,3413570047,NZ +3413570048,3413570303,KH +3413570304,3413570559,AU +3413570560,3413571583,PH +3413571584,3413572607,CN +3413572608,3413573631,JP +3413573632,3413573887,AU +3413573888,3413574143,JP +3413574144,3413574399,HK +3413574400,3413574655,TW +3413574656,3413575679,PH +3413575680,3413576703,VN +3413576704,3413576959,AU +3413576960,3413577215,ID +3413577216,3413579007,AU +3413579008,3413579775,NL +3413579776,3413582847,CN +3413582848,3413583871,VN +3413583872,3413584127,JP +3413584128,3413584383,ID +3413584384,3413584895,AU +3413584896,3413585919,VN +3413585920,3413586175,ID +3413586176,3413586687,IN +3413586688,3413586943,AU +3413586944,3413587967,ID +3413587968,3413588223,NZ +3413588224,3413588479,MY +3413588480,3413593087,VN +3413593088,3413639167,AU +3413639168,3413704703,SG +3413704704,3413737471,MY +3413737472,3413753855,TH +3413753856,3413762047,AU +3413762048,3413770239,TW +3413770240,3413786623,IN +3413786624,3413835775,AU +3413835776,3413843967,SG +3413843968,3413848063,IN +3413848064,3413850111,SG +3413850112,3413850879,JP +3413850880,3413851135,AU +3413851136,3413852159,ID +3413852160,3413868543,AU +3413868544,3413884927,IN +3413884928,3413893119,KR +3413893120,3413899199,ID +3413899200,3413899203,IN +3413899204,3413901311,ID +3413901312,3413902847,SG +3413902848,3413903359,JP +3413903360,3413905407,HK +3413905408,3413907455,IN +3413907456,3413917695,PK +3413917696,3413925887,JP +3413925888,3413934079,SG +3413934080,3413946367,IN +3413946368,3413950463,AU +3413950464,3413966847,IN +3413966848,3414050303,SG +3414050304,3414050815,US +3414050816,3414098175,SG +3414098176,3414098191,ID +3414098192,3414155519,SG +3414155520,3414155775,PH +3414155776,3414163455,SG +3414163456,3414171647,PK +3414171648,3414179839,CN +3414179840,3414188031,ID +3414188032,3414196223,CN +3414196224,3414204415,AU +3414204416,3414220799,KR +3414220800,3414223871,AU +3414223872,3414224895,KR +3414224896,3414226943,VN +3414226944,3414227967,ID +3414227968,3414230015,PK +3414230016,3414230527,PH +3414230528,3414231039,KR +3414231040,3414245375,AU +3414245376,3414253567,HK +3414253568,3414261759,JP +3414261760,3414269951,AU +3414269952,3414278143,JP +3414278144,3414294527,IN +3414294528,3414302719,PK +3414302720,3414310911,CN +3414310912,3414327295,KR +3414327296,3414335487,TH +3414335488,3414339583,AU +3414339584,3414343679,KR +3414343680,3414360063,ID +3414360064,3414376447,AU +3414376448,3414409215,PH +3414409216,3414413311,JP +3414413312,3414417407,TH +3414417408,3414425599,HK +3414425600,3414433791,AU +3414433792,3414441983,CN +3414441984,3414450175,AU +3414450176,3414458367,JP +3414458368,3414466559,IN +3414466560,3414474751,KR +3414474752,3414478847,HK +3414478848,3414482943,IN +3414482944,3414491135,AU +3414491136,3414523903,TW +3414523904,3414532095,JP +3414532096,3414540287,KR +3414540288,3414555647,JP +3414555648,3414556671,PK +3414556672,3414605823,AU +3414605824,3414616063,IN +3414616064,3414618111,ID +3414618112,3414620159,CN +3414620160,3414621183,IN +3414621184,3414638591,PK +3414638592,3414646783,TW +3414646784,3414654975,CN +3414654976,3414663167,HK +3414663168,3414667263,CN +3414667264,3414669311,ID +3414669312,3414671359,AU +3414671360,3415080959,JP +3415080960,3415083007,MY +3415083008,3415083519,SG +3415083520,3415084031,HK +3415084032,3415084543,CN +3415084544,3415085055,US +3415085056,3415087615,SG +3415087616,3415087871,US +3415087872,3415088127,SG +3415088128,3415089151,HK +3415089152,3415097343,MY +3415097344,3415103487,ID +3415103488,3415113727,HK +3415113728,3415121919,AU +3415121920,3415130111,KR +3415130112,3415136255,JP +3415136256,3415136767,KR +3415136768,3415137023,AU +3415137024,3415137279,CN +3415137280,3415137535,IN +3415137536,3415137791,NF +3415137792,3415146495,AU +3415146496,3415162879,LK +3415162880,3415171071,AU +3415171072,3415179263,JP +3415179264,3415187455,SG +3415187456,3415191551,AU +3415191552,3415195647,IN +3415195648,3415220223,AU +3415220224,3415224319,NZ +3415224320,3415228415,US +3415228416,3415236607,KH +3415236608,3415244799,IN +3415244800,3415277567,TH +3415277568,3415293951,AU +3415293952,3415302143,HK +3415302144,3415306239,AU +3415306240,3415308287,TH +3415308288,3415310335,JP +3415310336,3415326719,IN +3415326720,3415334911,TW +3415334912,3415343103,JP +3415343104,3415425023,TH +3415425024,3415431167,NC +3415431168,3415435263,AU +3415435264,3415436287,PH +3415436288,3415436799,AU +3415436800,3415437311,HK +3415437312,3415474175,AU +3415474176,3415490559,CN +3415490560,3415491583,PK +3415491584,3415494655,AU +3415494656,3415495679,PH +3415495680,3415496191,ID +3415496192,3415496703,AU +3415496704,3415497727,MY +3415497728,3415497983,TW +3415497984,3415498751,AU +3415498752,3415506943,JP +3415506944,3415556095,TH +3415556096,3415564287,AU +3415564288,3415568383,JP +3415568384,3415572479,KR +3415572480,3415605247,SG +3415605248,3415752703,TH +3415752704,3415760895,CN +3415760896,3415769087,NZ +3415769088,3415777279,AU +3415777280,3415785471,KR +3415785472,3415793663,JP +3415793664,3415801855,AU +3415801856,3415802879,ID +3415802880,3415803391,HK +3415803392,3415805951,PH +3415805952,3415807999,MY +3415808000,3415810047,ID +3415810048,3415814399,IN +3415814400,3415814655,ID +3415814656,3415815167,TH +3415815168,3415816191,IN +3415816192,3415817215,JP +3415817216,3415818239,ID +3415818240,3415822335,AU +3415822336,3415826431,MY +3415826432,3415834623,ID +3415834624,3415838719,TH +3415838720,3415842815,KR +3415842816,3415851007,TH +3415851008,3415855103,AU +3415855104,3415855615,HK +3415855616,3415856127,IN +3415856128,3415858175,ID +3415858176,3415859199,LK +3415859200,3415867391,AU +3415867392,3416047615,TH +3416047616,3416063999,CN +3416064000,3416131583,TH +3416131584,3416133631,PH +3416133632,3416135679,CN +3416135680,3416137727,MY +3416137728,3416145919,AU +3416145920,3416154111,IN +3416154112,3416260607,TH +3416260608,3416261119,VN +3416261120,3416261631,AU +3416261632,3416262655,TH +3416262656,3416264703,AU +3416264704,3416268799,JP +3416268800,3416272895,HK +3416272896,3416274943,MN +3416274944,3416276991,ID +3416276992,3416285183,HK +3416285184,3416287231,VN +3416287232,3416289279,AU +3416289280,3416293375,NZ +3416293376,3416293631,ID +3416293632,3416293887,IN +3416293888,3416294399,PH +3416294400,3416295423,AU +3416295424,3416295679,IN +3416295680,3416295935,TH +3416295936,3416296447,IN +3416296448,3416297471,KR +3416297472,3416301567,TW +3416301568,3416309759,PH +3416309760,3416317951,AU +3416317952,3416326143,TW +3416326144,3416327167,VN +3416327168,3416328191,HK +3416328192,3416330239,AU +3416330240,3416334335,ID +3416334336,3416338431,SG +3416338432,3416338687,MY +3416338688,3416340735,SG +3416340736,3416340991,IN +3416340992,3416341247,SG +3416341248,3416341503,IN +3416341504,3416341759,SG +3416341760,3416342015,IN +3416342016,3416342271,SG +3416342272,3416342527,IN +3416342528,3416375295,AU +3416375296,3416383487,CN +3416383488,3416391679,HK +3416391680,3416457215,VN +3416457216,3416460799,JP +3416460800,3416461055,SG +3416461056,3416465663,JP +3416465664,3416465919,HK +3416465920,3416471039,JP +3416471040,3416471295,NZ +3416471296,3416473727,JP +3416473728,3416473855,PH +3416473856,3416474111,JP +3416474112,3416474239,ID +3416474240,3416474615,JP +3416474616,3416474623,LK +3416474624,3416474639,JP +3416474640,3416474671,NZ +3416474672,3416474687,JP +3416474688,3416474740,NZ +3416474741,3416474743,JP +3416474744,3416474759,NZ +3416474760,3416474775,JP +3416474776,3416474783,NZ +3416474784,3416474847,JP +3416474848,3416474855,NZ +3416474856,3416475199,JP +3416475200,3416475263,NZ +3416475264,3416475455,JP +3416475456,3416475487,NZ +3416475488,3416475615,JP +3416475616,3416475647,NZ +3416475648,3416475903,TW +3416475904,3416475919,SG +3416475920,3416475951,JP +3416475952,3416475959,SG +3416475960,3416476031,JP +3416476032,3416476063,SG +3416476064,3416476071,JP +3416476072,3416476079,SG +3416476080,3416476111,JP +3416476112,3416476127,SG +3416476128,3416476863,JP +3416476864,3416477183,TW +3416477184,3416477199,JP +3416477200,3416477207,MY +3416477208,3416477215,JP +3416477216,3416477239,MY +3416477240,3416477247,SG +3416477248,3416477263,MY +3416477264,3416477759,JP +3416477760,3416477823,SG +3416477824,3416477887,JP +3416477888,3416477951,SG +3416477952,3416477983,ID +3416477984,3416478143,JP +3416478144,3416478175,ID +3416478176,3416478239,JP +3416478240,3416478271,HK +3416478272,3416478303,JP +3416478304,3416478335,HK +3416478336,3416478463,JP +3416478464,3416478479,TW +3416478480,3416478527,JP +3416478528,3416478543,TW +3416478544,3416478655,JP +3416478656,3416478671,HK +3416478672,3416478687,TW +3416478688,3416478783,JP +3416478784,3416478799,KR +3416478800,3416478847,JP +3416478848,3416478911,TW +3416478912,3416478927,KR +3416478928,3416480255,JP +3416480256,3416480383,TW +3416480384,3416481559,JP +3416481560,3416481567,IN +3416481568,3416481807,JP +3416481808,3416481815,HK +3416481816,3416481855,JP +3416481856,3416481871,HK +3416481872,3416481887,JP +3416481888,3416481919,HK +3416481920,3416482047,JP +3416482048,3416482079,SG +3416482080,3416482159,JP +3416482160,3416482191,SG +3416482192,3416482255,JP +3416482256,3416482287,SG +3416482288,3416482591,JP +3416482592,3416482607,KR +3416482608,3416482719,JP +3416482720,3416482783,SG +3416482784,3416482815,HK +3416482816,3416482879,KR +3416482880,3416483167,JP +3416483168,3416483199,SG +3416483200,3416483231,JP +3416483232,3416483295,SG +3416483296,3416483319,JP +3416483320,3416483327,SG +3416483328,3416483391,HK +3416483392,3416483407,JP +3416483408,3416483423,HK +3416483424,3416483567,JP +3416483568,3416483583,HK +3416483584,3416483663,SG +3416483664,3416483671,JP +3416483672,3416483775,SG +3416483776,3416483863,JP +3416483864,3416483871,KR +3416483872,3416483903,JP +3416483904,3416483911,KR +3416483912,3416483919,HK +3416483920,3416483943,JP +3416483944,3416483951,KR +3416483952,3416483959,HK +3416483960,3416483975,JP +3416483976,3416484023,HK +3416484024,3416484039,JP +3416484040,3416484055,KR +3416484056,3416484143,JP +3416484144,3416484159,MY +3416484160,3416484175,JP +3416484176,3416484183,MY +3416484184,3416484191,JP +3416484192,3416484223,MY +3416484224,3416484319,JP +3416484320,3416484335,HK +3416484336,3416484351,JP +3416484352,3416484407,SG +3416484408,3416484447,JP +3416484448,3416484607,SG +3416484608,3416484671,JP +3416484672,3416484735,HK +3416484736,3416485823,JP +3416485824,3416485903,SG +3416485904,3416485911,JP +3416485912,3416485927,SG +3416485928,3416485935,JP +3416485936,3416485943,SG +3416485944,3416485967,JP +3416485968,3416485975,SG +3416485976,3416486039,JP +3416486040,3416486047,SG +3416486048,3416486063,JP +3416486064,3416486103,SG +3416486104,3416486111,JP +3416486112,3416486119,SG +3416486120,3416486127,HK +3416486128,3416486143,SG +3416486144,3416487167,JP +3416487168,3416487175,HK +3416487176,3416487183,JP +3416487184,3416487191,HK +3416487192,3416487255,JP +3416487256,3416487263,HK +3416487264,3416487271,JP +3416487272,3416487279,HK +3416487280,3416487303,JP +3416487304,3416487343,HK +3416487344,3416487359,JP +3416487360,3416487383,HK +3416487384,3416487391,JP +3416487392,3416487415,HK +3416487416,3416487423,JP +3416487424,3416487487,PH +3416487488,3416488578,JP +3416488579,3416488579,TW +3416488580,3416488580,SG +3416488581,3416488581,JP +3416488582,3416488582,HK +3416488583,3416489983,JP +3416489984,3416506367,AU +3416506368,3416514559,TW +3416514560,3416522751,IN +3416522752,3416588287,AU +3416588288,3416653823,JP +3416653824,3416656583,AU +3416656584,3416656591,IN +3416656592,3416666111,AU +3416666112,3416666239,HK +3416666240,3416667135,AU +3416667136,3416668159,US +3416668160,3416684175,AU +3416684176,3416684183,NZ +3416684184,3416686591,AU +3416686592,3416694783,SG +3416694784,3416702975,CN +3416702976,3416707071,ID +3416707072,3416709119,KR +3416709120,3416709375,AU +3416709376,3416709631,ID +3416709632,3416710143,AU +3416710144,3416711167,HK +3416711168,3416719359,AU +3416719360,3416727551,PH +3416727552,3416735743,JP +3416735744,3416752127,PH +3416752128,3416784895,NZ +3416784896,3416801279,AU +3416801280,3416817663,JP +3416817664,3416850431,HK +3416850432,3416851455,PH +3416851456,3416851967,KR +3416851968,3416852479,SG +3416852480,3416854527,JP +3416854528,3416856575,AU +3416856576,3416858623,BD +3416858624,3416862719,HK +3416862720,3416864767,MN +3416864768,3416864895,JP +3416864896,3416865023,SG +3416865024,3416865151,HK +3416865152,3416865279,SG +3416865280,3416865287,JP +3416865288,3416865407,AU +3416865408,3416865599,JP +3416865600,3416865607,HK +3416865608,3416865655,AU +3416865656,3416865791,JP +3416865792,3416866055,HK +3416866056,3416866063,SG +3416866064,3416866303,AU +3416866304,3416866559,HK +3416866560,3416866815,AU +3416866816,3416883199,SG +3416883200,3416915967,HK +3416915968,3416920063,AU +3416920064,3416921087,TH +3416921088,3416922111,PH +3416922112,3416922367,AU +3416922368,3416922623,IN +3416922624,3416923135,VN +3416923136,3416924159,AU +3416924160,3416928255,JP +3416928256,3416928511,IN +3416928512,3416928767,HK +3416928768,3416929279,TH +3416929280,3416930303,JP +3416930304,3416930559,NZ +3416930560,3416931327,AU +3416931328,3416932351,IN +3416932352,3416936447,PK +3416936448,3416938495,AU +3416938496,3416938751,NZ +3416938752,3416939007,AU +3416939008,3416939519,HK +3416939520,3416940543,AU +3416940544,3416948735,KR +3416948736,3416981503,TH +3416981504,3416982527,PH +3416982528,3416982783,NZ +3416982784,3416983039,AU +3416983040,3416983551,PH +3416983552,3416985599,JP +3416985600,3416989695,VN +3416989696,3416997887,NZ +3416997888,3417014271,AU +3417014272,3417022463,JP +3417022464,3417030655,KR +3417030656,3417034751,AU +3417034752,3417035007,NZ +3417035008,3417035775,IN +3417035776,3417036799,JP +3417036800,3417037823,ID +3417037824,3417038079,AU +3417038080,3417038335,ID +3417038336,3417038591,IN +3417038592,3417038847,NZ +3417038848,3417042943,CN +3417042944,3417044991,IN +3417044992,3417047039,AU +3417047040,3417055231,PH +3417055232,3417112575,TH +3417112576,3417128959,AU +3417128960,3417135103,JP +3417135104,3417137151,ID +3417137152,3417145343,KR +3417145344,3417178111,NZ +3417178112,3417179135,PH +3417179136,3417179391,AU +3417179392,3417179647,ID +3417179648,3417179903,IN +3417179904,3417180159,CN +3417180160,3417182207,ID +3417182208,3417184767,AU +3417184768,3417185023,NZ +3417185024,3417185279,AF +3417185280,3417185791,SG +3417185792,3417186303,NZ +3417186304,3417194495,HK +3417194496,3417198591,JP +3417198592,3417200639,SG +3417200640,3417202687,JP +3417202688,3417210879,CN +3417210880,3417227263,AU +3417227264,3417243647,JP +3417243648,3417244671,PH +3417244672,3417245695,IN +3417245696,3417247743,BT +3417247744,3417251839,JP +3417251840,3417260031,KR +3417260032,3417264127,PK +3417264128,3417268223,JP +3417268224,3417272319,PK +3417272320,3417274367,NZ +3417274368,3417275391,AU +3417275392,3417276415,PH +3417276416,3417284607,CN +3417284608,3417288703,SG +3417288704,3417289215,IN +3417289216,3417289727,AU +3417289728,3417291263,IN +3417291264,3417291775,AU +3417291776,3417292799,KR +3417292800,3417309183,CN +3417309184,3417337855,AU +3417337856,3417338367,IN +3417338368,3417338879,HK +3417338880,3417339903,PH +3417339904,3417340415,AU +3417340416,3417341951,NZ +3417341952,3417346047,CA +3417346048,3417348095,MY +3417348096,3417350143,AU +3417350144,3417352191,VN +3417352192,3417354239,CN +3417354240,3417356287,ID +3417356288,3417357311,AU +3417357312,3417357567,NZ +3417357568,3417357823,AU +3417357824,3417358335,PK +3417358336,3417374719,HK +3417374720,3417440255,PH +3417440256,3417706095,JP +3417706096,3417706099,HK +3417706100,3417716655,JP +3417716656,3417716659,HK +3417716660,3417833471,JP +3417833472,3417849855,NZ +3417849856,3417853951,AU +3417853952,3417858047,CN +3417858048,3417866239,JP +3417866240,3417915391,HK +3417915392,3417939967,TH +3417939968,3417946111,PF +3417946112,3417947135,AU +3417947136,3417947391,IN +3417947392,3417947647,HK +3417947648,3417947903,AU +3417947904,3417948159,IN +3417948160,3417964543,AU +3417964544,3418030079,HK +3418030080,3418062847,TW +3418062848,3418063615,US +3418063616,3418063679,IN +3418063680,3418063711,US +3418063712,3418063775,IN +3418063776,3418063807,US +3418063808,3418063839,IN +3418063840,3418063871,US +3418063872,3418064127,IN +3418064128,3418064447,US +3418064448,3418064513,IN +3418064514,3418065023,US +3418065024,3418065039,IN +3418065040,3418066527,US +3418066528,3418066591,IN +3418066592,3418066703,US +3418066704,3418066719,IN +3418066720,3418067071,US +3418067072,3418067135,SG +3418067136,3418067967,US +3418067968,3418068223,IN +3418068224,3418068479,US +3418068480,3418068607,IN +3418068608,3418069119,US +3418069120,3418069135,IN +3418069136,3418071039,US +3418071040,3418079231,CN +3418079232,3418095615,IN +3418095616,3418111999,TH +3418112000,3418128383,HK +3418128384,3418136575,AU +3418136576,3418144767,BD +3418144768,3418148863,TW +3418148864,3418150911,JP +3418150912,3418152959,AU +3418152960,3418155007,IN +3418155008,3418157055,MY +3418157056,3418161663,BD +3418161664,3418162431,AU +3418162432,3418162687,IN +3418162688,3418163199,AU +3418163200,3418165247,PH +3418165248,3418167295,MY +3418167296,3418167551,IN +3418167552,3418167807,AU +3418167808,3418168319,HK +3418168320,3418169343,VN +3418169344,3418177535,JP +3418177536,3418181631,LK +3418181632,3418183679,AU +3418183680,3418184191,ID +3418184192,3418184959,IN +3418184960,3418189823,AU +3418189824,3418190847,BD +3418190848,3418191871,TH +3418191872,3418192895,ID +3418192896,3418193919,AU +3418193920,3418202111,KH +3418202112,3418206207,HK +3418206208,3418208255,IN +3418208256,3418210303,LK +3418210304,3418218495,AU +3418218496,3418227711,BD +3418227712,3418228735,TW +3418228736,3418230783,BD +3418230784,3418232831,TW +3418232832,3418233343,AU +3418233344,3418233855,KR +3418233856,3418234879,JP +3418234880,3418235903,BD +3418235904,3418236415,ID +3418236416,3418236927,AU +3418236928,3418241023,ID +3418241024,3418243071,JP +3418243072,3418246015,PH +3418246016,3418246023,SG +3418246024,3418251263,PH +3418251264,3418255359,CN +3418255360,3418257407,ID +3418257408,3418257551,HK +3418257552,3418257559,GB +3418257560,3418259367,HK +3418259368,3418259373,SG +3418259374,3418259455,HK +3418259456,3418267647,IN +3418267648,3418271743,VN +3418271744,3418273791,SG +3418273792,3418275839,ID +3418275840,3418279935,AU +3418279936,3418281983,NZ +3418281984,3418282239,IN +3418282240,3418282495,AU +3418282496,3418283519,PH +3418283520,3418284031,AU +3418284032,3418285055,SG +3418285056,3418285823,JP +3418285824,3418287135,SG +3418287136,3418287167,JP +3418287168,3418287691,SG +3418287692,3418287695,JP +3418287696,3418287699,SG +3418287700,3418287703,JP +3418287704,3418287719,SG +3418287720,3418287730,JP +3418287731,3418287732,SG +3418287733,3418287734,JP +3418287735,3418287735,SG +3418287736,3418287743,JP +3418287744,3418288127,SG +3418288128,3418290175,ID +3418290176,3418290431,IN +3418290432,3418290687,HK +3418290688,3418291199,TH +3418291200,3418291711,AU +3418291712,3418292735,BD +3418292736,3418292991,JP +3418292992,3418293247,HK +3418293248,3418293503,JP +3418293504,3418293759,IN +3418293760,3418294015,AU +3418294016,3418294271,NZ +3418294272,3418296319,VN +3418296320,3418300415,CN +3418300416,3418300927,BD +3418300928,3418301439,IN +3418301440,3418302463,AU +3418302464,3418304511,ID +3418304512,3418306559,VN +3418306560,3418308607,MN +3418308608,3418324991,CN +3418324992,3418326015,BD +3418326016,3418326527,AU +3418326528,3418327039,PH +3418327040,3418329087,JP +3418329088,3418333183,CN +3418333184,3418345471,AU +3418345472,3418357759,JP +3418357760,3418365951,CN +3418365952,3418374143,TH +3418374144,3418382335,AU +3418382336,3418390527,JP +3418390528,3418392319,AU +3418392320,3418392383,HK +3418392384,3418392447,AU +3418392448,3418392463,HK +3418392464,3418392479,AU +3418392480,3418392575,HK +3418392576,3418392831,AU +3418392832,3418393087,HK +3418393088,3418393103,SG +3418393104,3418393111,AU +3418393112,3418393135,SG +3418393136,3418393143,AU +3418393144,3418393159,SG +3418393160,3418393183,AU +3418393184,3418393247,SG +3418393248,3418393279,AU +3418393280,3418393343,SG +3418393344,3418393599,AU +3418393600,3418393607,JP +3418393608,3418393679,AU +3418393680,3418393791,JP +3418393792,3418393983,AU +3418393984,3418394015,SG +3418394016,3418394047,AU +3418394048,3418394063,MY +3418394064,3418394079,NZ +3418394080,3418394111,AU +3418394112,3418394367,KR +3418394368,3418394623,TW +3418394624,3418394879,AU +3418394880,3418395135,JP +3418395136,3418395391,AU +3418395392,3418395407,JP +3418395408,3418395423,AU +3418395424,3418395439,JP +3418395440,3418395455,AU +3418395456,3418395520,JP +3418395521,3418395679,AU +3418395680,3418395695,KR +3418395696,3418395839,AU +3418395840,3418395903,KR +3418395904,3418396415,JP +3418396416,3418396719,AU +3418396720,3418396735,TW +3418396736,3418397855,AU +3418397856,3418397911,HK +3418397912,3418398079,AU +3418398080,3418398207,KR +3418398208,3418399439,AU +3418399440,3418399455,PH +3418399456,3418399471,AU +3418399472,3418399487,TW +3418399488,3418401535,AU +3418401536,3418401599,PH +3418401600,3418401631,AU +3418401632,3418401647,PH +3418401648,3418401719,AU +3418401720,3418401727,PH +3418401728,3418401791,TW +3418401792,3418401887,AU +3418401888,3418401903,PH +3418401904,3418401919,TW +3418401920,3418401935,AU +3418401936,3418401951,TW +3418401952,3418403071,AU +3418403072,3418403103,MY +3418403104,3418403775,AU +3418403776,3418403783,NZ +3418403784,3418403839,AU +3418403840,3418403991,HK +3418403992,3418403999,AU +3418404000,3418404063,HK +3418404064,3418404159,AU +3418404160,3418404175,TW +3418404176,3418404351,AU +3418404352,3418404479,KR +3418404480,3418405631,AU +3418405632,3418405663,HK +3418405664,3418405855,AU +3418405856,3418405887,SG +3418405888,3418406143,AU +3418406144,3418406399,SG +3418406400,3418406655,AU +3418406656,3418406687,PH +3418406688,3418406695,AU +3418406696,3418406703,PH +3418406704,3418406719,TW +3418406720,3418406783,PH +3418406784,3418406799,TW +3418406800,3418406831,PH +3418406832,3418406847,TW +3418406848,3418406879,AU +3418406880,3418406895,TW +3418406896,3418406911,AU +3418406912,3418423295,IN +3418423296,3418435711,HK +3418435712,3418435743,JP +3418435744,3418448639,HK +3418448640,3418448895,SG +3418448896,3418453064,HK +3418453065,3418453065,AS +3418453066,3418453071,US +3418453072,3418453087,HK +3418453088,3418453091,US +3418453092,3418453247,HK +3418453248,3418453375,AS +3418453376,3418453407,US +3418453408,3418453411,HK +3418453412,3418453412,KR +3418453413,3418453415,HK +3418453416,3418453423,KR +3418453424,3418453631,HK +3418453632,3418453759,US +3418453760,3418456063,HK +3418456064,3418472447,IN +3418472448,3418505215,AU +3418505216,3418506831,JP +3418506832,3418506879,ID +3418506880,3418506895,JP +3418506896,3418506911,NZ +3418506912,3418507043,JP +3418507044,3418507047,ID +3418507048,3418507071,JP +3418507072,3418507075,ID +3418507076,3418507295,JP +3418507296,3418507335,HK +3418507336,3418507903,JP +3418507904,3418507919,MY +3418507920,3418507927,JP +3418507928,3418507935,MY +3418507936,3418507967,JP +3418507968,3418507971,MY +3418507972,3418507975,JP +3418507976,3418507983,MY +3418507984,3418508543,JP +3418508544,3418508607,HK +3418508608,3418508639,JP +3418508640,3418508671,HK +3418508672,3418508927,JP +3418508928,3418509024,SG +3418509025,3418509055,JP +3418509056,3418509119,TW +3418509120,3418509327,JP +3418509328,3418509455,HK +3418509456,3418510271,JP +3418510272,3418510279,TW +3418510280,3418510287,JP +3418510288,3418510303,HK +3418510304,3418510328,JP +3418510329,3418510329,TW +3418510330,3418510591,JP +3418510592,3418510847,TW +3418510848,3418510927,JP +3418510928,3418510943,HK +3418510944,3418510991,JP +3418510992,3418511007,HK +3418511008,3418511031,JP +3418511032,3418511055,HK +3418511056,3418511087,JP +3418511088,3418511103,HK +3418511104,3418511107,JP +3418511108,3418511115,SG +3418511116,3418511116,JP +3418511117,3418511117,SG +3418511118,3418511119,JP +3418511120,3418511359,SG +3418511360,3418511383,JP +3418511384,3418511399,TW +3418511400,3418511407,SG +3418511408,3418511415,TW +3418511416,3418511423,SG +3418511424,3418511439,TW +3418511440,3418513031,JP +3418513032,3418513039,HK +3418513040,3418513215,JP +3418513216,3418513231,TW +3418513232,3418513247,JP +3418513248,3418513279,TW +3418513280,3418513407,JP +3418513408,3418517503,IN +3418517504,3418519551,MN +3418519552,3418521599,AU +3418521600,3418554367,HK +3418554368,3418578943,AU +3418578944,3418583039,TH +3418583040,3418585087,AU +3418585088,3418586111,TH +3418586112,3418586367,AU +3418586368,3418586623,SG +3418586624,3418586879,PK +3418586880,3418619903,AU +3418619904,3418621951,CN +3418621952,3418623999,AU +3418624000,3418626047,JP +3418626048,3418628095,KI +3418628096,3418636287,AU +3418636288,3418642943,JP +3418642944,3418643199,ID +3418643200,3418643455,JP +3418643456,3418644479,AU +3418644480,3418644991,JP +3418644992,3418645247,TW +3418645248,3418645503,SG +3418645504,3418645759,JP +3418645760,3418646271,NZ +3418646272,3418646527,HK +3418646528,3418646783,JP +3418646784,3418647039,TW +3418647040,3418648063,JP +3418648064,3418648575,SG +3418648576,3418648783,JP +3418648784,3418648799,SG +3418648800,3418648815,NZ +3418648816,3418648831,HK +3418648832,3418649439,JP +3418649440,3418649503,SG +3418649504,3418649519,JP +3418649520,3418649551,SG +3418649552,3418649583,JP +3418649584,3418649599,SG +3418649600,3418649887,JP +3418649888,3418649951,PH +3418649952,3418650751,JP +3418650752,3418650808,HK +3418650809,3418650823,JP +3418650824,3418650839,HK +3418650840,3418650846,JP +3418650847,3418650879,HK +3418650880,3418651039,NZ +3418651040,3418651135,JP +3418651136,3418651391,SG +3418651392,3418651903,JP +3418651904,3418652159,HK +3418652160,3418652163,PH +3418652164,3418652167,JP +3418652168,3418652171,PH +3418652172,3418652183,JP +3418652184,3418652215,PH +3418652216,3418652415,JP +3418652416,3418652671,HK +3418652672,3418750975,IN +3418750976,3418816511,HK +3418816512,3418947583,IN +3418947584,3418955775,AU +3418955776,3418959871,TW +3418959872,3418960383,BD +3418960384,3418960895,ID +3418960896,3418961919,SG +3418961920,3418962943,VN +3418962944,3418963967,IN +3418963968,3418988543,AU +3418988544,3418992639,ID +3418992640,3418993919,SG +3418993920,3418994175,MN +3418994176,3418994431,MY +3418994432,3418994687,AU +3418994688,3418995711,MY +3418995712,3418996735,JP +3418996736,3419013119,IN +3419013120,3419062271,AU +3419062272,3419070463,JP +3419070464,3419071999,HK +3419072000,3419072255,ID +3419072256,3419072511,HK +3419072512,3419073023,JP +3419073024,3419073279,SG +3419073280,3419073535,FJ +3419073536,3419074559,CN +3419074560,3419078655,BD +3419078656,3419209727,TW +3419209728,3419275263,JP +3419275264,3419340799,AU +3419340800,3419344895,TW +3419344896,3419348991,KR +3419348992,3419353087,TW +3419353088,3419354111,JP +3419354112,3419356159,ID +3419356160,3419356671,NZ +3419356672,3419357183,IN +3419357184,3419411455,CN +3419411456,3419411711,HK +3419411712,3419411967,NZ +3419411968,3419412223,AU +3419412224,3419412479,JP +3419412480,3419414527,PH +3419414528,3419422719,CN +3419422720,3419439103,AU +3419439104,3419448703,SG +3419448704,3419448735,NP +3419448736,3419449023,SG +3419449024,3419449055,BD +3419449056,3419456911,SG +3419456912,3419456927,JP +3419456928,3419459007,SG +3419459008,3419459071,AF +3419459072,3419471871,SG +3419471872,3419504639,TH +3419504640,3419508735,HK +3419508736,3419512831,JP +3419512832,3419516927,AU +3419516928,3419517951,JP +3419517952,3419518975,VN +3419518976,3419519999,TW +3419520000,3419520767,ID +3419520768,3419521023,TH +3419521024,3419529215,AU +3419529216,3419537407,CN +3419537408,3419541503,HK +3419541504,3419553791,KR +3419553792,3419557887,AU +3419557888,3419558399,ID +3419558400,3419558655,AU +3419558656,3419559935,ID +3419559936,3419560959,JP +3419560960,3419561983,IN +3419561984,3419570175,AU +3419570176,3419602943,VN +3419602944,3419611135,TW +3419611136,3419617279,JP +3419617280,3419618303,AU +3419618304,3419619327,SG +3419619328,3419635711,NZ +3419635712,3419643903,SG +3419643904,3419668479,JP +3419668480,3419672575,CN +3419672576,3419674623,AU +3419674624,3419675647,IN +3419675648,3419676671,MN +3419676672,3419684863,JP +3419684864,3419688959,IN +3419688960,3419693055,CN +3419693056,3419701247,KR +3419701248,3419709439,AU +3419709440,3419717631,KR +3419717632,3419734015,IN +3419734016,3419774975,AU +3419774976,3419783167,JP +3419783168,3419791359,PH +3419791360,3419873279,AU +3419873280,3419877375,AF +3419877376,3419877631,ID +3419877632,3419877887,KH +3419877888,3419878143,ID +3419878144,3419879423,IN +3419879424,3419880447,JP +3419880448,3419881471,MY +3419881472,3419897855,PH +3419897856,3419899903,JP +3419899904,3419900159,FR +3419900160,3419900415,BE +3419900416,3419901439,AU +3419901440,3419901951,NZ +3419901952,3419902207,AU +3419902208,3419902463,HK +3419902464,3419902719,CN +3419902720,3419902975,HK +3419902976,3419903231,AU +3419903232,3419903487,JP +3419903488,3419906047,AU +3419906048,3419914239,PK +3419914240,3419922431,KR +3419922432,3419924479,JP +3419924480,3419926527,AU +3419926528,3419930623,HK +3419930624,3419971583,JP +3419971584,3419979775,KR +3419979776,3419996159,JP +3419996160,3420020735,AU +3420020736,3420028927,TW +3420028928,3420045311,AU +3420045312,3420061695,KR +3420061696,3420127231,HK +3420127232,3420323839,AU +3420323840,3420332031,TW +3420332032,3420334591,AU +3420334592,3420334623,HK +3420334624,3420334639,AU +3420334640,3420334643,SG +3420334644,3420334647,AU +3420334648,3420334687,HK +3420334688,3420334695,SG +3420334696,3420334703,JP +3420334704,3420334719,HK +3420334720,3420334847,SG +3420334848,3420335271,HK +3420335272,3420335279,CN +3420335280,3420335615,HK +3420335616,3420335623,KR +3420335624,3420335631,SG +3420335632,3420335640,JP +3420335641,3420335647,AU +3420335648,3420335871,JP +3420335872,3420336127,SG +3420336128,3420336183,JP +3420336184,3420336199,SG +3420336200,3420336207,JP +3420336208,3420336223,HK +3420336224,3420336255,SG +3420336256,3420336287,JP +3420336288,3420336319,SG +3420336320,3420336351,JP +3420336352,3420336367,KR +3420336368,3420336383,SG +3420336384,3420336655,JP +3420336656,3420336671,AU +3420336672,3420336895,JP +3420336896,3420337151,HK +3420337152,3420337167,SG +3420337168,3420337171,AU +3420337172,3420337175,SG +3420337176,3420337183,AU +3420337184,3420337599,SG +3420337600,3420337631,HK +3420337632,3420337635,AU +3420337636,3420337643,SG +3420337644,3420337647,AU +3420337648,3420337663,SG +3420337664,3420337727,AU +3420337728,3420337743,NZ +3420337744,3420337835,AU +3420337836,3420337839,NZ +3420337840,3420340019,AU +3420340020,3420340023,NZ +3420340024,3420340143,AU +3420340144,3420340159,NZ +3420340160,3420365847,AU +3420365848,3420365855,TW +3420365856,3420365887,AU +3420365888,3420366047,HK +3420366048,3420366055,TW +3420366056,3420366059,HK +3420366060,3420366063,AU +3420366064,3420366079,TW +3420366080,3420366335,HK +3420366336,3420366431,SG +3420366432,3420366439,CN +3420366440,3420366447,SG +3420366448,3420366463,US +3420366464,3420366471,SG +3420366472,3420366479,IN +3420366480,3420366495,SG +3420366496,3420366511,HK +3420366512,3420366527,SG +3420366528,3420366591,CN +3420366592,3420366639,HK +3420366640,3420366647,TW +3420366648,3420366655,CN +3420366656,3420366719,HK +3420366720,3420366735,CN +3420366736,3420366751,KR +3420366752,3420366847,HK +3420366848,3420366871,JP +3420366872,3420366879,KR +3420366880,3420366911,AU +3420366912,3420366959,JP +3420366960,3420366975,KR +3420366976,3420367039,JP +3420367040,3420367055,KR +3420367056,3420367103,JP +3420367104,3420367359,HK +3420367360,3420367383,JP +3420367384,3420367423,KR +3420367424,3420367495,JP +3420367496,3420367503,KR +3420367504,3420367519,AU +3420367520,3420367631,JP +3420367632,3420367647,AU +3420367648,3420367663,JP +3420367664,3420367679,KR +3420367680,3420367743,JP +3420367744,3420367775,AU +3420367776,3420367791,TW +3420367792,3420367807,IN +3420367808,3420367871,JP +3420367872,3420368015,AU +3420368016,3420368031,NZ +3420368032,3420368063,AU +3420368064,3420368067,NZ +3420368068,3420368583,AU +3420368584,3420368591,CN +3420368592,3420368639,AU +3420368640,3420368895,NZ +3420368896,3420368935,HK +3420368936,3420368943,TW +3420368944,3420368991,HK +3420368992,3420369023,AU +3420369024,3420369055,HK +3420369056,3420369087,AU +3420369088,3420369139,HK +3420369140,3420369223,CN +3420369224,3420369239,HK +3420369240,3420369255,TW +3420369256,3420369263,CN +3420369264,3420369279,AU +3420369280,3420369343,HK +3420369344,3420369407,CN +3420369408,3420370431,AU +3420370432,3420370527,HK +3420370528,3420370543,CN +3420370544,3420370559,HK +3420370560,3420370575,JP +3420370576,3420370591,CN +3420370592,3420370623,AU +3420370624,3420370943,HK +3420370944,3420371199,JP +3420371200,3420371455,AU +3420371456,3420371775,JP +3420371776,3420371807,KR +3420371808,3420371823,HK +3420371824,3420371839,KR +3420371840,3420371879,IN +3420371880,3420371887,SG +3420371888,3420371895,CN +3420371896,3420371903,AU +3420371904,3420371967,IN +3420371968,3420372223,AU +3420372224,3420372735,HK +3420372736,3420372767,TW +3420372768,3420372799,SG +3420372800,3420372831,JP +3420372832,3420372863,KR +3420372864,3420372895,PH +3420372896,3420372927,SG +3420372928,3420372991,AU +3420372992,3420377087,HK +3420377088,3420389375,JP +3420389376,3420393471,US +3420393472,3420395519,AU +3420395520,3420397567,JP +3420397568,3420401663,KH +3420401664,3420411903,JP +3420411904,3420412415,TH +3420412416,3420412927,ID +3420412928,3420413951,BD +3420413952,3420422143,KR +3420422144,3420430335,MY +3420430336,3420434431,PK +3420434432,3420434687,IN +3420434688,3420434943,KR +3420434944,3420435199,HK +3420435200,3420435455,AU +3420435456,3420436479,JP +3420436480,3420437503,AU +3420437504,3420438527,IN +3420438528,3420454911,HK +3420454912,3422552063,KR +3422552064,3422848511,US +3422848512,3422848767,GB +3422848768,3423092735,US +3423092736,3423093759,VI +3423093760,3423094783,US +3423094784,3423095807,CA +3423095808,3423143935,US +3423143936,3423145983,CA +3423145984,3423182847,US +3423182848,3423183743,CA +3423183744,3423183871,EE +3423183872,3423184207,CA +3423184208,3423184215,EE +3423184216,3423184895,CA +3423184896,3423197183,US +3423198208,3423221759,US +3423221760,3423222783,CA +3423222784,3423234751,US +3423234752,3423234783,CA +3423234784,3423235871,US +3423235872,3423235903,CA +3423235904,3423236095,US +3423236096,3423238143,JM +3423238144,3423258623,US +3423258624,3423260671,CA +3423262720,3423264831,US +3423264832,3423264863,NG +3423264864,3423265247,US +3423265248,3423265263,EC +3423265264,3423268863,US +3423268864,3423269887,CA +3423269888,3423285247,US +3423285248,3423287295,CA +3423287296,3423290367,US +3423291392,3423303679,US +3423303680,3423304703,CA +3423304704,3423311871,US +3423311872,3423313919,VI +3423313920,3423338495,US +3423404032,3423412223,US +3423412224,3423412239,CA +3423412240,3423412255,GR +3423412256,3423412287,TK +3423412288,3423412319,RU +3423412320,3423412415,CA +3423412416,3423412479,SA +3423412480,3423412495,CA +3423412496,3423412511,US +3423412512,3423412543,CA +3423412544,3423412623,FR +3423412624,3423412639,NO +3423412640,3423412655,CA +3423412656,3423412671,RU +3423412672,3423412703,CA +3423412704,3423412719,RU +3423412720,3423412727,US +3423412728,3423412751,CA +3423412752,3423412767,US +3423412768,3423412783,FI +3423412784,3423412799,CA +3423412800,3423412815,US +3423412816,3423412831,GR +3423412832,3423412847,CA +3423412848,3423412863,US +3423412864,3423412927,CA +3423412928,3423412991,NL +3423412992,3423413055,CA +3423413056,3423413071,US +3423413072,3423413151,CA +3423413152,3423413167,US +3423413168,3423413183,CA +3423413184,3423413247,RS +3423413248,3423413279,US +3423413280,3423413295,SE +3423413296,3423413311,CA +3423413312,3423413327,PT +3423413328,3423413343,US +3423413344,3423413375,CA +3423413376,3423413759,US +3423413760,3423414143,CA +3423414144,3423414159,FR +3423414160,3423414271,CA +3423414272,3423416319,US +3423417344,3423439871,US +3423440896,3423451135,US +3423453184,3423473663,US +3423473664,3423474687,CA +3423474688,3423493631,US +3423493632,3423493887,CA +3423493888,3423533055,US +3423533056,3423535103,AI +3423535104,3423543295,US +3423543296,3423545343,CA +3423545344,3423549439,US +3423551488,3423571967,US +3423571968,3423574015,PR +3423574016,3423582207,US +3423582208,3423586303,CA +3423586304,3423602687,US +3423602688,3423603711,KN +3423603712,3423609855,US +3423610880,3423626239,US +3423626240,3423627263,CA +3423627264,3423629311,US +3423632384,3423637503,US +3423637504,3423639551,CA +3423639552,3423651839,US +3423651840,3423653887,CA +3423653888,3423705599,US +3423705856,3423709183,US +3423709184,3423709439,CA +3423709440,3423718399,US +3423718656,3423731455,US +3423731712,3423797247,US +3423797504,3423801087,CA +3423801344,3423827711,CA +3423827712,3423827967,US +3423827968,3423830271,CA +3423830528,3423838719,CA +3423838976,3423848447,CA +3423848448,3423849471,KN +3423849984,3423850495,CA +3423850752,3423854335,CA +3423854592,3423858175,CA +3423858176,3423858687,US +3423858688,3423858943,CA +3423859456,3423859711,CA +3423859968,3423862527,CA +3423862784,3424270847,US +3424271360,3424321279,US +3424321536,3424334847,US +3424334848,3424335871,CA +3424335872,3424371967,US +3424372224,3424375295,US +3424375552,3424378879,US +3424378880,3424379135,PR +3424379136,3424389631,US +3424390144,3424412415,US +3424412672,3424415743,US +3424419840,3424444159,US +3424452608,3424455423,US +3424455680,3424493823,US +3424493824,3424494079,CA +3424494080,3424494335,US +3424494592,3424496383,US +3424496640,3424499967,US +3424500224,3424500991,US +3424501248,3424502015,US +3424502272,3424502783,US +3424503296,3424505599,US +3424505856,3424507135,US +3424507392,3425173503,US +3425173504,3425304575,CA +3425304576,3425450239,US +3425451008,3425470975,US +3425471488,3425475839,US +3425476608,3425501183,US +3425566720,3425697791,US +3425697792,3425699839,CA +3425699840,3425705983,US +3425706752,3425708287,US +3425709824,3425711359,US +3425713408,3425728255,US +3425728512,3425828863,US +3425828864,3425855231,CA +3425855232,3425855487,US +3425855488,3425894399,CA +3425894400,3425910783,US +3425959936,3425962495,US +3425963008,3425984511,US +3425992704,3426010111,US +3426010368,3426012671,US +3426012928,3426013183,US +3426013184,3426013439,IL +3426013440,3426019327,US +3426019584,3426369023,US +3426369536,3426386687,US +3426386944,3426387711,US +3426387968,3426388991,MX +3426388992,3426390783,US +3426391040,3426415615,US +3426415872,3426416895,US +3426417152,3426418175,US +3426418688,3426553343,US +3426553856,3426557439,US +3426557952,3426602751,US +3426603008,3426605567,US +3426606080,3426617855,US +3426618368,3426644479,US +3426644992,3426653695,US +3426654208,3426680831,US +3426684928,3426714879,US +3426715648,3426725375,US +3426725888,3426729471,US +3426729984,3426735359,US +3426736128,3426744319,US +3426744320,3426746367,CA +3426746368,3427033087,US +3427041280,3427055615,US +3427055872,3427061503,US +3427061760,3427073535,US +3427074048,3427110911,US +3427111168,3427112959,US +3427113216,3427113471,US +3427113984,3427116543,US +3427117312,3427127295,US +3427127296,3427127551,CA +3427127552,3427127807,US +3427128064,3427128831,US +3427129344,3427130623,US +3427130880,3427134207,US +3427134464,3427136511,US +3427137024,3427139327,US +3427139584,3427404287,US +3427404800,3427454719,US +3427467264,3427470079,US +3427470336,3427503103,US +3427503360,3427503871,US +3427504640,3427507455,US +3427507968,3427511295,US +3427511808,3427540223,US +3427540992,3427567103,US +3427567616,3427572991,US +3427573248,3427582975,US +3427583488,3427584767,US +3427585536,3427586815,US +3427587584,3427589119,US +3427589632,3427597823,US +3427598336,3427605247,US +3427605504,3427632639,US +3427633152,3427635455,US +3427635712,3427636223,US +3427636736,3427636991,US +3427637248,3427637503,US +3427637760,3427639551,US +3427640320,3427641343,US +3427641856,3427642111,US +3427642368,3427646719,US +3427646976,3427647743,US +3427648768,3427649279,US +3427649536,3427651071,US +3427651328,3427652607,US +3427653376,3427653631,US +3427654144,3427655167,US +3427663872,3427742975,US +3427742976,3427743231,GB +3427743232,3427762175,US +3427762176,3427762431,DE +3427762432,3427762687,CA +3427762688,3427763455,IT +3427763456,3427763711,AU +3427763712,3427763967,GB +3427763968,3427764223,US +3427764224,3427764479,FR +3427764480,3427765503,US +3427765504,3427765759,GB +3427765760,3427766271,US +3427766272,3427766783,GB +3427766784,3427767039,SE +3427767040,3427767807,DE +3427767808,3427769599,US +3427769600,3427770111,JP +3427770112,3427770367,NO +3427770368,3427770623,GB +3427770624,3427771391,CH +3427771392,3427771647,US +3427771648,3427771903,CA +3427771904,3427772415,CH +3427772416,3427772671,DE +3427772672,3427772927,HK +3427772928,3427773183,BE +3427773184,3427773439,DE +3427773440,3427773695,US +3427773696,3427773951,FR +3427773952,3427774719,US +3427774720,3427775231,DE +3427775232,3427775999,US +3427776000,3427776511,HK +3427776512,3427776767,CZ +3427776768,3427777023,US +3427777024,3427777279,NL +3427777280,3427777535,DE +3427777536,3427777791,US +3427777792,3427778047,HK +3427778048,3427778303,US +3427778304,3427778559,SE +3427778560,3427779071,NO +3427779072,3427779327,GB +3427779328,3427780095,US +3427780096,3427780351,GB +3427780352,3427780607,DE +3427780608,3427781375,US +3427781376,3427781631,GB +3427781632,3427781887,BE +3427781888,3427782399,US +3427782400,3427782655,GB +3427782656,3427783423,FR +3427783424,3427783679,GB +3427783680,3427783935,US +3427783936,3427784703,GB +3427784704,3427785215,US +3427785216,3427785471,JP +3427785472,3427785727,NO +3427785728,3427786751,US +3427786752,3427787263,LU +3427787264,3427787775,US +3427787776,3427788031,FR +3427788032,3427788287,CH +3427788288,3427788799,GB +3427788800,3427789567,NO +3427789568,3427790079,DE +3427790080,3427790847,US +3427790848,3427791103,IT +3427791104,3427791615,DE +3427791616,3427791871,GB +3427791872,3427792383,CA +3427792384,3427793919,NL +3427793920,3427794175,US +3427794176,3427794943,NL +3427794944,3427796991,CA +3427796992,3427811327,US +3427811584,3427816959,US +3427817472,3427831551,US +3427831552,3427831807,MX +3427831808,3427835647,US +3427835904,3427848959,US +3427849216,3427860479,US +3427860480,3428057087,CA +3428057088,3428191487,US +3428192256,3428221439,US +3428221952,3428237823,US +3428238336,3428251903,US +3428252672,3428286719,US +3428286720,3428286975,CA +3428286976,3428290047,US +3428290304,3428296959,US +3428296960,3428297215,CL +3428297472,3428297983,US +3428298240,3428299519,US +3428299776,3428302079,US +3428302336,3428305663,US +3428305920,3428306175,US +3428306432,3428310527,US +3428310784,3428311039,US +3428311296,3428318975,US +3428319232,3428367871,US +3428368384,3428391679,US +3428391936,3428399359,US +3428400128,3428421375,US +3428421632,3428423679,US +3428423936,3428433919,US +3428434176,3428434943,US +3428434944,3428435199,IT +3428435200,3428437503,US +3428437504,3428437759,MX +3428437760,3428439551,US +3428439808,3428440575,US +3428440832,3428442367,US +3428442624,3428445695,US +3428445952,3428452863,US +3428453376,3428471807,US +3428472064,3428472831,US +3428473088,3428475391,US +3428475648,3428477439,US +3428477696,3428496639,US +3428496640,3428497151,NL +3428497152,3428582655,US +3428582656,3428582911,CA +3428582912,3428585023,US +3428585024,3428585055,CA +3428585056,3428585151,US +3428585152,3428585215,CA +3428585216,3428586751,US +3428586752,3428586879,CA +3428586880,3428587775,US +3428587776,3428588287,CA +3428588288,3428591631,US +3428591632,3428591647,CA +3428591648,3428591655,US +3428591656,3428591663,CA +3428591664,3428594687,US +3428594688,3428594943,CA +3428594944,3428595551,US +3428595552,3428595583,CA +3428595584,3428598527,US +3428598528,3428598559,CA +3428598560,3428599551,US +3428599552,3428599807,CA +3428599808,3428600063,US +3428600064,3428600319,CA +3428600320,3428601343,US +3428601344,3428601599,CA +3428601600,3428607999,US +3428608000,3428609023,CA +3428609024,3428610815,US +3428610816,3428611071,CA +3428611072,3428612607,US +3428612608,3428612863,CA +3428612864,3428613119,US +3428613120,3428613631,CA +3428613632,3428614143,US +3428614144,3428620095,CA +3428620096,3428620287,US +3428620288,3428620799,CA +3428620800,3428621055,US +3428621056,3428621887,CA +3428621888,3428622047,US +3428622048,3428622095,CA +3428622096,3428622335,US +3428622336,3428623615,CA +3428623616,3428623871,US +3428623872,3428624639,CA +3428624640,3428625407,US +3428625408,3428627199,CA +3428627200,3428634879,US +3428634880,3428635135,CA +3428635136,3428635903,US +3428635904,3428636927,CA +3428636928,3428637439,US +3428637440,3428637951,CA +3428637952,3428638975,US +3428638976,3428639231,CA +3428639232,3428642047,US +3428642048,3428642303,CA +3428642304,3428679679,US +3428712448,3428739327,US +3428739328,3428739343,GB +3428739344,3428752383,US +3428752384,3428753407,GH +3428753408,3428756479,US +3428756480,3428756487,SE +3428756488,3428818727,US +3428818728,3428818735,GB +3428818736,3428894039,US +3428894040,3428894047,CA +3428894048,3428958207,US +3428958208,3428962303,CO +3428962304,3429171199,US +3429171200,3429236735,CA +3429236736,3429396223,US +3429396224,3429396479,DE +3429396480,3429408511,US +3429408512,3429408767,DE +3429408768,3429411583,US +3429411584,3429411839,DE +3429411840,3429500927,US +3429500928,3429502975,CA +3429502976,3429560319,US +3429564416,3429566975,US +3429567488,3429571071,US +3429571584,3429580799,US +3429581056,3429583103,US +3429583360,3429583615,US +3429583872,3429587199,US +3429587456,3429588223,US +3429588480,3429593855,US +3429594112,3429595647,US +3429595904,3429600511,US +3429600768,3429601535,US +3429601792,3429603071,US +3429603328,3429616639,US +3429616896,3429619711,US +3429619968,3429632767,US +3429633024,3429636607,US +3429637120,3429698815,US +3429699584,3429775359,US +3429775360,3429777407,TC +3429777408,3429808639,US +3429809152,3429816831,US +3429817344,3429892095,US +3429892096,3429957631,CA +3429957632,3430025471,US +3430026240,3430090239,US +3430090752,3430092287,US +3430092800,3430094335,US +3430094848,3430104575,US +3430105088,3430110975,US +3430111232,3430114559,US +3430115328,3430116863,US +3430117376,3430118655,US +3430119424,3430120959,US +3430121472,3430127103,US +3430127616,3430137343,US +3430137856,3430141439,US +3430141952,3430147839,US +3430148096,3430153727,US +3430154240,3430291295,US +3430291296,3430291327,IS +3430291328,3430313967,US +3430313968,3430313983,CA +3430313984,3430319135,US +3430319136,3430319143,SE +3430319144,3430328831,US +3430328832,3430329087,GH +3430329088,3430354943,US +3430354944,3430356991,PR +3430356992,3430681343,US +3430681600,3430682367,US +3430682624,3430683391,US +3430683648,3430699775,US +3430700032,3430700799,US +3430701056,3430702079,CA +3430702080,3430702847,US +3430703104,3430703871,US +3430704128,3430705151,US +3430705152,3430706175,MX +3430706176,3430707967,US +3430708224,3430714367,US +3430715392,3430719231,US +3430719488,3430721279,US +3430721536,3430722303,US +3430722560,3430727423,US +3430727680,3430730495,US +3430730752,3430734591,US +3430734848,3430738687,US +3430738944,3430739711,US +3430739968,3430742783,US +3430743040,3430812159,US +3430812672,3430813183,MX +3430813184,3430814207,US +3430814720,3430828287,US +3430828544,3430836735,US +3430837248,3430842367,US +3430842368,3430842879,DO +3430842880,3430845439,US +3430845440,3430845951,MX +3430845952,3430849535,US +3430850048,3430861823,US +3430862336,3430874367,US +3430874624,3430977791,US +3430978304,3430993151,US +3430993408,3430994431,US +3430994688,3431005183,US +3431005440,3431107583,US +3431107840,3431114495,US +3431114496,3431114751,CA +3431114752,3431133183,US +3431133440,3431399423,US +3431464960,3431467519,US +3431468032,3431469055,CA +3431469056,3431537151,US +3431537664,3431596031,US +3431596288,3431602687,CA +3431602944,3431613439,CA +3431613440,3431613695,US +3431613696,3431620095,CA +3431620352,3431621375,CA +3431622400,3431622655,CA +3431622912,3431624703,CA +3431624960,3431625215,CA +3431625472,3431638783,CA +3431639040,3431641855,CA +3431642624,3431657471,CA +3431657472,3431658495,US +3431658496,3431661311,CA +3431661568,3431733759,US +3431734272,3431753727,US +3431753728,3431759615,CA +3431759616,3432003839,US +3432004608,3432005631,CA +3432005632,3432009215,US +3432009216,3432009471,PR +3432009472,3432019455,US +3432019968,3432071167,US +3432083456,3432084479,US +3432085248,3432095231,US +3432095488,3432099839,US +3432100096,3432106239,US +3432106240,3432106495,MX +3432106496,3432108543,US +3432108800,3432110847,US +3432111104,3432112639,US +3432112896,3432113407,US +3432113408,3432113663,CA +3432113664,3432116479,US +3432116736,3432205311,US +3432205312,3432206335,CA +3432206336,3432237567,US +3432238080,3432513535,US +3432514048,3432515071,US +3432515584,3432517119,US +3432517632,3432518143,US +3432518656,3432519167,US +3432519680,3432520703,US +3432520704,3432520959,GB +3432520960,3432523263,US +3432523776,3432526335,US +3432526848,3432536575,US +3432537088,3432538879,US +3432539136,3432540415,US +3432540672,3432550911,US +3432551424,3432551935,US +3432552448,3432562687,US +3432570880,3432574975,US +3432580096,3432580863,US +3432581120,3432585215,US +3432585216,3432585727,MX +3432586240,3432588031,US +3432588288,3432589055,US +3432589312,3432593151,US +3432593408,3432596223,US +3432596480,3432605695,US +3432605952,3432610559,US +3432610816,3432611839,US +3432612864,3432613631,US +3432613888,3432614655,US +3432614912,3432615679,US +3432615936,3432634111,US +3432634368,3432635135,US +3432635392,3432660991,US +3432660992,3432662527,DE +3432662528,3432662531,PT +3432662532,3432663039,DE +3432663040,3432668671,US +3432669184,3432670719,US +3432671232,3432672511,US +3432673280,3432675583,US +3432677376,3432680703,US +3432681472,3432683263,US +3432683520,3432688895,US +3432689664,3432695807,US +3432697856,3432703231,US +3432704000,3432716799,US +3432717312,3432734463,US +3432734720,3432806655,US +3432807424,3432808447,CA +3432808448,3433955327,US +3433955584,3433964799,CA +3433965056,3433967359,CA +3433967616,3433981951,CA +3433981952,3433983999,US +3433984000,3434012671,CA +3434012928,3434014719,CA +3434015232,3434020607,CA +3434020864,3434299391,US +3434299392,3434303487,VE +3434303488,3434423295,US +3434423296,3434423303,CA +3434423304,3434427391,US +3434427392,3434428415,HN +3434428416,3434433279,US +3434433280,3434433535,PR +3434433536,3434571775,US +3434571776,3434573823,CO +3434573824,3434583039,US +3434583040,3434584063,NL +3434584064,3434807295,US +3434807552,3434810111,CA +3434810368,3434824191,CA +3434824448,3434831359,CA +3434831360,3434831615,US +3434831616,3434872575,CA +3434872832,3434907647,US +3434907648,3434909695,PA +3434909696,3434913791,US +3434913792,3434914047,AG +3434914048,3434914303,DM +3434914304,3434914815,AG +3434914816,3434915071,VG +3434915072,3434915327,AG +3434915328,3434915583,DM +3434915584,3434915839,KN +3434915840,3434916095,LC +3434916096,3434916351,AG +3434916352,3434916607,DM +3434916608,3434917119,AG +3434917120,3434917375,LC +3434917376,3434917887,AG +3434917888,3434921983,US +3434938368,3435069439,US +3435069440,3435134975,CA +3435134976,3435267839,US +3435268096,3435271423,US +3435272192,3435294463,US +3435294720,3435319039,US +3435319296,3435320831,US +3435321344,3435322879,US +3435323392,3435331583,US +3435397120,3435462655,US +3435528192,3436249087,US +3436249344,3436255743,CA +3436256256,3436282367,CA +3436282368,3436282623,US +3436282624,3436289791,CA +3436289792,3436290047,US +3436290048,3436314367,CA +3436314624,3436476415,US +3436476416,3436478463,AW +3436478464,3436697087,US +3436697088,3436697343,VE +3436697344,3437297663,US +3437297920,3437307391,CA +3437307904,3437310975,CA +3437310976,3437311487,US +3437311488,3437331711,CA +3437331712,3437331967,US +3437331968,3437332479,CA +3437332736,3437334015,CA +3437334016,3437334271,US +3437334272,3437336063,CA +3437336320,3437341695,CA +3437341696,3437341951,US +3437341952,3437343231,CA +3437343488,3437346303,CA +3437346560,3437350911,CA +3437351424,3437354751,CA +3437355008,3437358847,CA +3437358848,3437359103,US +3437359104,3437362943,CA +3437363200,3437428735,CA +3437428736,3437715711,US +3437715712,3437715967,IT +3437715968,3437736447,US +3437736448,3437737471,CL +3437737472,3437748223,US +3437748224,3437748479,GB +3437748480,3437748991,NL +3437748992,3437749247,US +3437749248,3437749503,DE +3437749504,3437749759,US +3437749760,3437750015,JP +3437750016,3437750271,BE +3437750272,3437750527,GB +3437750528,3437751551,US +3437751552,3437751807,IT +3437751808,3437752063,GB +3437752064,3437752319,ES +3437752320,3437752575,IE +3437752832,3437755135,US +3437755136,3437755647,JP +3437755648,3437755903,GB +3437755904,3437756159,US +3437756160,3437756415,IE +3437756416,3437772799,US +3437821952,3437961215,US +3437964288,3437979903,US +3437980672,3437984255,US +3437984768,3437989375,US +3437989888,3438006271,US +3438010368,3438026751,US +3438149632,3438160895,US +3438161152,3438200063,US +3438200576,3438214655,US +3438214912,3438215167,US +3438215424,3438215935,CA +3438216192,3438217983,CA +3438218240,3438218751,CA +3438219264,3438219519,CA +3438219776,3438246911,CA +3438247168,3438252543,CA +3438252800,3438261759,CA +3438262016,3438280447,CA +3438280704,3438542847,US +3438542848,3438545423,CA +3438545424,3438545431,US +3438545432,3438545471,CA +3438545472,3438545479,US +3438545480,3438550071,CA +3438550072,3438550079,US +3438550080,3438550447,CA +3438550448,3438550463,US +3438550464,3438552271,CA +3438552272,3438552287,US +3438552288,3438570031,CA +3438570032,3438570039,MY +3438570040,3438592255,CA +3438592256,3438592263,US +3438592264,3438600319,CA +3438600320,3438600351,US +3438600352,3438608383,CA +3438608384,3438678015,US +3438690304,3438714879,US +3438723072,3438813183,US +3438813184,3438814207,GH +3438814208,3438895103,US +3438895104,3438896639,HN +3438896640,3439183359,US +3439183360,3439183871,HT +3439183872,3447991551,US +3447991808,3448004095,US +3448004608,3448263423,US +3448263424,3448263935,AG +3448263936,3448338687,US +3448338688,3448339455,GB +3448339456,3448377343,US +3448377344,3448377855,AG +3448377856,3448379415,US +3448379416,3448379423,IL +3448379424,3448379519,US +3448379520,3448379647,IN +3448379648,3448379903,SG +3448379904,3448380063,US +3448380064,3448380079,SG +3448380080,3448380095,US +3448380096,3448380159,SG +3448380160,3448380415,US +3448380416,3448380671,SG +3448380672,3448380687,US +3448380688,3448380719,SG +3448380720,3448381183,US +3448381184,3448381439,SG +3448381440,3448397887,US +3448397888,3448397967,CA +3448397968,3448398335,US +3448398336,3448399103,CA +3448399104,3448399359,US +3448399360,3448399871,CA +3448399872,3448461311,US +3448461312,3448461391,GB +3448461392,3448461415,US +3448461416,3448461423,SG +3448461424,3448461543,US +3448461544,3448461551,GB +3448461552,3448461567,US +3448461568,3448461599,SG +3448461600,3448461631,US +3448461632,3448461695,SG +3448461696,3448462111,US +3448462112,3448462127,SG +3448462128,3448462143,US +3448462144,3448462223,SG +3448462224,3448462239,GB +3448462240,3448462255,US +3448462256,3448462271,GB +3448462272,3448556671,US +3448556672,3448556735,GB +3448556736,3448556799,US +3448556800,3448556815,GB +3448556816,3448558911,US +3448558912,3448558919,GB +3448558920,3448559103,US +3448559104,3448559359,GB +3448559360,3448637183,US +3448637440,3448638975,US +3448639488,3448647423,US +3448647680,3448651775,US +3448652800,3448725503,US +3448727552,3448871935,US +3448872448,3448872703,US +3448872960,3449001245,US +3449001246,3449001246,MC +3449001247,3449096191,US +3449098240,3449159679,US +3449159680,3449159935,CA +3449159936,3449160191,US +3449160192,3449160447,CA +3449160448,3449163775,US +3449163776,3449164031,CA +3449164032,3449164799,US +3449164800,3449165055,CA +3449165056,3449166847,US +3449166848,3449167103,CA +3449167104,3449167359,US +3449167360,3449167615,CA +3449167616,3449168383,US +3449168384,3449168639,CA +3449168640,3449171711,US +3449171712,3449172223,CA +3449172224,3449174015,US +3449174016,3449174783,CA +3449174784,3449176063,US +3449176064,3449176319,CA +3449176320,3449176831,US +3449176832,3449177599,CA +3449177600,3449178111,US +3449178112,3449178367,CA +3449178368,3449178623,US +3449178624,3449179647,CA +3449179648,3449180671,US +3449180672,3449180927,CA +3449180928,3449181439,US +3449181440,3449181695,CA +3449181696,3449182719,US +3449182720,3449182975,CA +3449182976,3449184255,US +3449184256,3449184511,CA +3449184512,3449185535,US +3449185536,3449185791,CA +3449185792,3449186559,US +3449186560,3449186815,CA +3449186816,3449187839,US +3449187840,3449188095,CA +3449188096,3449188607,US +3449188608,3449188671,CA +3449188672,3449188703,US +3449188704,3449188767,CA +3449188768,3449188863,US +3449188864,3449189119,CA +3449189120,3449191223,US +3449191224,3449191231,CA +3449191232,3449191295,US +3449191296,3449191303,CA +3449191304,3449191351,US +3449191352,3449191359,CA +3449191360,3449191423,US +3449191424,3449191679,CA +3449191680,3449194495,US +3449194496,3449194751,CA +3449194752,3449196031,US +3449196032,3449196287,CA +3449196288,3449198879,US +3449198880,3449199103,CA +3449199104,3449202983,US +3449202984,3449202991,CA +3449202992,3449203175,US +3449203176,3449203183,CA +3449203184,3449203543,US +3449203544,3449203551,CA +3449203552,3449203695,US +3449203696,3449203703,CA +3449203704,3449204735,US +3449204736,3449205759,CA +3449205760,3449210623,US +3449210624,3449211391,CA +3449211392,3449211647,US +3449211648,3449211903,CA +3449211904,3449213183,US +3449213184,3449213695,CA +3449213696,3449214551,US +3449214552,3449214559,CA +3449214560,3449214975,US +3449214976,3449215231,CA +3449215232,3449215487,US +3449215488,3449215743,CA +3449215744,3449220863,US +3449220864,3449221119,CA +3449221120,3449222655,US +3449222656,3449223423,CA +3449223424,3449224191,US +3449224192,3449224447,CA +3449224448,3449224703,US +3449224704,3449224959,CA +3449224960,3449225215,US +3449225472,3449254143,CA +3449254912,3449273599,CA +3449273856,3449278975,CA +3449280000,3449290495,CA +3449290752,3449409535,US +3449410560,3449598207,US +3449598208,3449598463,GB +3449598464,3449755391,US +3449755648,3449758207,US +3449758464,3449760767,US +3449761024,3449767935,US +3449768192,3449769727,US +3449769984,3449782271,US +3449782528,3449783551,US +3449783808,3449813503,US +3449813760,3449814783,US +3449815040,3449843199,US +3449843200,3449843711,YE +3449843712,3449874687,US +3449874688,3449874943,AG +3449874944,3449910719,US +3449910720,3449910783,CA +3449910784,3449960127,US +3449960128,3449960159,CA +3449960160,3450213887,US +3450214144,3450217215,US +3450217216,3450217471,LC +3450217472,3450228735,US +3450228992,3450235903,US +3450236160,3450239743,US +3450240000,3450245375,US +3450245632,3450248703,US +3450248960,3450252031,US +3450252288,3450254079,US +3450254336,3450254591,US +3450254848,3450271487,US +3450271744,3450272511,US +3450272512,3450272767,MX +3450272768,3450273535,US +3450273792,3450293759,US +3450294272,3450328831,US +3450329088,3450334719,US +3450335232,3450612479,US +3450612736,3450685183,US +3450685440,3450686719,US +3450687488,3450699007,US +3450699776,3450731519,US +3450731520,3450732543,CA +3450732544,3450773503,US +3450773504,3450777599,CA +3450777600,3451027455,US +3451027456,3451029503,CA +3451029504,3451030015,US +3451030016,3451031551,CA +3451031552,3451032319,US +3451032320,3451043839,CA +3451043840,3451453439,US +3451457536,3451469823,US +3451494400,3451502591,US +3451514880,3451527167,US +3451568128,3451572223,US +3451584512,3451715583,US +3451715840,3451724543,CA +3451725568,3451726847,CA +3451727360,3451737343,CA +3451737344,3451737599,US +3451737600,3451740927,CA +3451741184,3451741695,CA +3451742208,3451744255,CA +3451744256,3451745535,US +3451745536,3451749887,CA +3451750144,3451766783,CA +3451767296,3451767551,CA +3451767808,3451780863,CA +3451781120,3451912191,US +3451912192,3452174335,CA +3452174592,3452174847,US +3452176128,3452177407,US +3452177920,3452178175,US +3452178432,3452187135,US +3452187392,3452190463,US +3452191488,3452192255,US +3452192512,3452194047,US +3452194816,3452199423,US +3452199680,3452204287,US +3452205056,3452216831,US +3452217344,3452225791,US +3452226560,3452436479,US +3452436480,3452502015,CA +3452502016,3452764159,US +3452764160,3452793215,CA +3452793216,3452793343,US +3452793344,3452895231,CA +3452895488,3452914175,CA +3452914176,3452914431,US +3452914432,3452920831,CA +3452920832,3452922879,US +3452923392,3452931327,CA +3452931584,3452934911,CA +3452934912,3452936191,US +3452936192,3452940799,CA +3452941056,3452942847,CA +3452943104,3452953087,CA +3452953344,3452960511,CA +3452960768,3453026303,US +3453026560,3453028095,CA +3453028352,3453028607,CA +3453029376,3453032447,US +3453032448,3453032703,CA +3453032704,3453091839,US +3453092096,3453101055,CA +3453101056,3453101311,US +3453101312,3453123839,CA +3453124096,3453128959,CA +3453129216,3453129983,CA +3453130240,3453133823,CA +3453134848,3453139455,CA +3453139968,3453140991,US +3453140992,3453149183,CA +3453149184,3453149439,US +3453149440,3453151743,CA +3453152000,3453155327,CA +3453155584,3453157119,CA +3453157632,3453159423,CA +3453159424,3453159935,BM +3453159936,3453163519,CA +3453164032,3453180671,CA +3453180928,3453195263,CA +3453195520,3453199871,CA +3453200384,3453206527,CA +3453206528,3453207551,HN +3453207552,3453207807,NI +3453207808,3453208575,HN +3453208576,3453208831,NI +3453208832,3453209599,HN +3453209600,3453209855,US +3453209856,3453210367,HN +3453210368,3453210623,SV +3453210624,3453213183,CR +3453213184,3453214719,HN +3453214720,3453215231,GT +3453215232,3453215999,SV +3453216000,3453217023,CR +3453217024,3453217791,SV +3453217792,3453219327,CR +3453219328,3453219583,US +3453219584,3453219839,SV +3453219840,3453220607,US +3453220608,3453222911,HN +3453222912,3453375999,US +3453376000,3453376255,CA +3453376256,3453403135,US +3453403136,3453405951,BB +3453405952,3453406207,KN +3453406208,3453406463,BB +3453406464,3453406975,VC +3453406976,3453407231,GD +3453407232,3453407743,BB +3453407744,3453408255,GD +3453408256,3453409023,BB +3453409024,3453409535,KN +3453409536,3453411327,BB +3453411328,3453551839,US +3453551840,3453551879,GB +3453551880,3453551895,US +3453551896,3453551903,GB +3453551904,3453551935,US +3453551936,3453551967,GB +3453551968,3453552039,US +3453552040,3453552047,GB +3453552048,3453552399,US +3453552400,3453552407,GB +3453552408,3453552455,US +3453552456,3453552463,IE +3453552464,3453552471,GB +3453552472,3453552511,US +3453552512,3453552639,IE +3453552640,3453552895,GB +3453552896,3453553151,US +3453553152,3453553407,GB +3453553408,3453553631,US +3453553632,3453553639,GB +3453553640,3453553919,US +3453553920,3453553983,GB +3453553984,3453554063,US +3453554064,3453554095,GB +3453554096,3453607935,US +3453607936,3453608959,KN +3453608960,3453609983,LC +3453609984,3453612543,AG +3453612544,3453613055,KN +3453613056,3453615359,AG +3453615360,3453615615,KN +3453615616,3453616127,AG +3453616128,3454436351,US +3454436352,3454436607,GU +3454436608,3454599167,US +3454599424,3454601215,CA +3454601216,3454602239,US +3454603008,3454603263,US +3454603264,3454603519,CA +3454604032,3454604799,CA +3454604800,3454607359,US +3454607360,3454608127,CA +3454608128,3454608383,US +3454608384,3454609151,CA +3454609408,3454611455,US +3454611456,3454617343,CA +3454617600,3454617855,CA +3454618112,3454618367,CA +3454618624,3454619647,US +3454619648,3454634751,CA +3454635008,3454636031,US +3454636032,3454636799,CA +3454636800,3454637055,US +3454637056,3454652159,CA +3454652416,3454661631,CA +3454661632,3454662655,US +3454662656,3454664447,CA +3454664704,3454672895,US +3454672896,3454681087,CA +3454681088,3454705151,US +3454705152,3454705215,GB +3454705216,3454730239,US +3454730240,3454732287,EC +3454732288,3454795775,US +3454796032,3454808831,CA +3454808832,3454809087,US +3454809088,3454810111,CA +3454810368,3454814975,CA +3454814976,3454815231,US +3454815232,3454815743,CA +3454816256,3454816511,CA +3454816768,3454828287,CA +3454828544,3454861055,CA +3454861568,3454867711,CA +3454867968,3454881535,CA +3454881792,3454883839,CA +3454883840,3454914559,US +3454915072,3454926591,CA +3454926848,3455109119,US +3455109120,3455111167,HN +3455111168,3455122879,US +3455122880,3455122887,PR +3455122888,3455132159,US +3455132160,3455133695,BO +3455133696,3455242407,US +3455242408,3455242415,CA +3455242416,3455244847,US +3455244848,3455244855,CA +3455244856,3455320063,US +3455320064,3455322111,FR +3455322112,3455551999,US +3455552000,3455552255,EC +3455552256,3455566079,US +3455566080,3455566335,EC +3455566336,3455713279,US +3455713280,3455778815,CA +3455844352,3456303103,US +3456303104,3456311295,JP +3456311296,3456892927,US +3456892928,3456958463,CA +3456958464,3457683967,US +3457683968,3457684735,CA +3457684736,3457723535,US +3457723536,3457723551,GB +3457723552,3457859839,US +3457859840,3457860095,CA +3457860096,3457862847,US +3457862848,3457862911,CA +3457862912,3458195455,US +3458195456,3458196479,SG +3458196480,3458811903,US +3458813952,3458818047,CA +3458818048,3458820095,US +3458822144,3459055615,US +3459055616,3459121151,CA +3459121152,3459186687,US +3459186688,3459252223,CA +3459252224,3459266559,US +3459266560,3459267583,AG +3459267584,3459267839,LC +3459267840,3459268607,AG +3459268608,3459295231,US +3459295232,3459296255,KR +3459296256,3459326463,US +3459326464,3459327487,CA +3459327488,3459327999,CO +3459328000,3459329023,CL +3459329024,3459330047,US +3459330048,3459330303,CL +3459330304,3459331071,US +3459331072,3459331583,MX +3459331584,3459332607,PA +3459332608,3459334399,US +3459334400,3459334655,CA +3459334656,3459340031,US +3459340032,3459340287,VE +3459340288,3459340543,MX +3459340544,3459341823,US +3459341824,3459342079,IL +3459342080,3459342335,US +3459342336,3459342591,VE +3459342592,3459342847,US +3459342848,3459343103,VE +3459343104,3459343615,US +3459343616,3459344127,OM +3459344128,3459345663,US +3459345664,3459346175,OM +3459346176,3459347967,US +3459347968,3459348223,PR +3459348224,3459348479,AG +3459348480,3459348991,US +3459348992,3459349503,IT +3459349504,3459350527,US +3459350528,3459352575,VE +3459352576,3459352831,US +3459352832,3459353087,FM +3459353088,3459353599,US +3459353600,3459354623,CO +3459354624,3459357183,NI +3459357184,3459357439,VE +3459357440,3459362815,US +3459362816,3459364863,CO +3459364864,3459366911,AR +3459366912,3459368959,VE +3459368960,3459371007,MX +3459371008,3459373055,PE +3459373056,3459373311,US +3459373312,3459375103,CL +3459375104,3459448831,US +3459449088,3459450623,CA +3459450624,3459450879,US +3459450880,3459456511,CA +3459456512,3459456767,US +3459456768,3459457279,CA +3459457280,3459457535,US +3459457536,3459457791,CA +3459457792,3459458047,PR +3459458048,3459512319,US +3459512320,3459513855,CA +3459513856,3459592191,US +3459592192,3459596287,CA +3459596288,3459614719,US +3459616768,3459620863,CA +3459620864,3459622911,US +3459624960,3459629055,BM +3459629056,3459631103,US +3459633152,3459731455,US +3459731456,3459735551,CA +3459735552,3460108895,US +3460108896,3460108903,FI +3460108904,3460111871,US +3460111872,3460111887,CA +3460111888,3460161535,US +3460161536,3460163583,PR +3460163584,3460453631,US +3460453632,3460453887,BS +3460453888,3460761599,US +3460763648,3460794367,US +3460796416,3460894847,US +3460894848,3460894975,NL +3460894976,3460933887,US +3460933888,3460934143,DE +3460934144,3461021695,US +3461021696,3461031935,CA +3461031936,3461032191,US +3461032192,3461087231,CA +3461087232,3461285887,US +3461285888,3461285967,GB +3461285968,3461330943,US +3461330944,3461331199,SG +3461331200,3461331327,US +3461331328,3461331455,SG +3461331456,3461331711,US +3461331712,3461331967,SG +3461331968,3461332223,US +3461332224,3461332479,SG +3461332480,3461332735,US +3461332736,3461332991,SG +3461332992,3461408767,US +3461410816,3461414911,CA +3461414912,3461435647,US +3461435904,3461436159,US +3461436416,3461441535,US +3461443584,3461507071,US +3461509120,3461513215,US +3461513216,3461517311,CA +3461517312,3461548031,US +3461550080,3461554175,US +3461554176,3461556223,CA +3461558272,3461580799,US +3461582848,3461808127,US +3461808128,3461873663,CA +3461873664,3462571095,US +3462571096,3462571103,CA +3462571104,3462571663,US +3462571664,3462571671,CA +3462571672,3462593791,US +3462593792,3462594559,GN +3462594560,3462605823,US +3462605824,3462608895,UY +3462608896,3462633471,US +3462633472,3462633727,SG +3462633728,3462633799,BV +3462633800,3462633983,US +3462633984,3462634239,SG +3462634240,3462634247,US +3462634248,3462634255,SG +3462634256,3462634367,US +3462634368,3462634495,SG +3462634496,3462634751,US +3462634752,3462635007,SG +3462635008,3462635263,US +3462635264,3462635519,SG +3462635520,3462889479,US +3462889480,3462889487,GB +3462889488,3462991183,US +3462991184,3462991191,CA +3462991192,3463089151,US +3463089152,3463090175,CA +3463090176,3463156735,US +3463156736,3463157759,BO +3463157760,3463184383,US +3463184640,3463193087,CA +3463193600,3463194623,CA +3463194624,3463198719,US +3463198720,3463213311,CA +3463213312,3463213567,US +3463214080,3463215103,US +3463215104,3463229327,CA +3463229328,3463229335,US +3463229336,3463243775,CA +3463243776,3463244799,US +3463245056,3463249663,CA +3463249920,3463480063,US +3463480064,3463480319,CA +3463480320,3463518207,US +3463518208,3463520255,NL +3463520256,3463602687,US +3463602688,3463602943,PH +3463602944,3463708671,US +3463708672,3463774207,CA +3463774208,3464167423,US +3464167680,3464169215,CA +3464169472,3464171775,CA +3464171776,3464172031,US +3464172032,3464173567,CA +3464173824,3464174591,CA +3464175360,3464180735,CA +3464180736,3464190463,US +3464190464,3464190719,CA +3464190720,3464195543,US +3464195544,3464195551,IT +3464195552,3464195951,US +3464195952,3464195959,IT +3464195960,3464196183,US +3464196184,3464196191,IT +3464196192,3464208383,US +3464208384,3464216575,CA +3464216576,3464243199,US +3464245248,3464259583,US +3464261632,3464340479,US +3464340480,3464341503,CA +3464341504,3464349695,US +3464351744,3464382463,US +3464384512,3464388607,CA +3464388608,3464389631,US +3464389888,3464391935,US +3464392960,3464393215,US +3464393984,3464394751,US +3464394752,3464396799,VC +3464396800,3464415231,US +3464417280,3464464383,US +3464466432,3464472575,US +3464474624,3464548607,US +3464548608,3464548863,LC +3464548864,3464549119,US +3464549120,3464549375,VG +3464549376,3464550143,US +3464550144,3464550399,LC +3464550400,3464626175,US +3464626432,3464626687,CA +3464627968,3464628735,CA +3464628992,3464630015,CA +3464630272,3464631295,US +3464631296,3464631807,CA +3464632064,3464641791,CA +3464642560,3464642815,CA +3464643072,3464647935,CA +3464648192,3464648703,CA +3464649216,3464650239,CA +3464650752,3464664063,US +3464664320,3464684543,CA +3464684800,3464688383,CA +3464688640,3464691455,CA +3464691712,3464768607,US +3464768608,3464768623,IT +3464768624,3464768767,US +3464768768,3464768895,CA +3464768896,3464769535,US +3464769536,3464773631,CA +3464773632,3464802303,US +3464802304,3464806399,CA +3464806400,3465154559,US +3465154560,3465158655,BS +3465158656,3465177087,US +3465177088,3465179135,PE +3465179136,3465510911,US +3465510912,3465543679,JP +3465543680,3465982991,US +3465982992,3465983007,GB +3465983008,3465983023,US +3465983024,3465983127,GB +3465983128,3465983167,US +3465983168,3465983199,GB +3465983200,3465983207,ZA +3465983208,3465983263,GB +3465983264,3465983271,US +3465983272,3465983311,GB +3465983312,3465983463,US +3465983464,3465983487,GB +3465983488,3466044903,US +3466044904,3466044911,PH +3466044912,3466158079,US +3466158080,3466166271,PA +3466166272,3466489855,US +3466489856,3466490111,CA +3466490112,3466555199,US +3466555200,3466555215,CA +3466555216,3466558207,US +3466558208,3466558463,EC +3466558464,3466560255,US +3466560256,3466560511,GH +3466560512,3466627007,US +3466627008,3466627039,PR +3466627040,3466756095,US +3466756096,3466772479,CA +3466772480,3466780671,US +3466788864,3466846207,US +3466846208,3466854399,CA +3466854400,3467051007,US +3467051008,3467068927,CA +3467069440,3467116543,CA +3467116544,3467378687,US +3467378688,3467444223,CA +3467444224,3467554815,US +3467554816,3467567103,CA +3467567104,3467706367,US +3467706368,3467902975,CA +3467902976,3467964415,US +3467968512,3468084991,US +3468084992,3468085055,CA +3468085056,3468085119,US +3468085120,3468085183,CA +3468085184,3468127999,US +3468128000,3468128255,IN +3468128256,3468142591,US +3468144640,3468296191,US +3468296192,3468361727,CA +3468361728,3468443647,US +3468443648,3468460031,CA +3468460032,3468468223,BM +3468468224,3468623871,US +3468623872,3468656639,CA +3468656640,3469055743,US +3469055744,3469055999,CA +3469056000,3469068287,US +3469068800,3469070335,US +3469070592,3469893631,US +3469893632,3469901823,CA +3469901824,3469989887,US +3469990400,3470131199,US +3470155776,3470159871,US +3470176256,3470184447,US +3470196736,3470327807,US +3470336000,3470344191,US +3470368768,3470376959,US +3470385152,3470458879,US +3470458880,3470475263,KR +3470475264,3470558207,US +3470558208,3470559231,HK +3470559232,3470573567,US +3470573568,3470575615,CA +3470575616,3470610431,US +3470610432,3470614527,BR +3470614528,3470626815,US +3470630912,3470651391,US +3470651392,3470655487,CA +3470655488,3470671871,US +3470671872,3470680063,CA +3470680064,3470744063,US +3470744064,3470744575,CA +3470744576,3470745855,US +3470745856,3470746111,CA +3470746112,3470749951,US +3470749952,3470750207,CA +3470750208,3470751743,US +3470752256,3470752767,US +3470752768,3470753023,CO +3470753024,3470754303,US +3470754304,3470754559,PE +3470754560,3470755839,US +3470756096,3470761983,US +3470761984,3470762751,CA +3470762752,3470762759,NL +3470762760,3470767871,CA +3470767872,3470768127,IE +3470768128,3470770175,CA +3470770176,3470778367,US +3470778368,3470786559,CA +3470786560,3470794751,US +3470794752,3470802943,PA +3470802944,3470884863,US +3470884864,3470885887,HK +3470885888,3471057919,US +3471057920,3471058943,VE +3471058944,3471059455,US +3471059456,3471060223,ES +3471060224,3471060991,US +3471060992,3471061247,NL +3471061248,3471061503,US +3471061504,3471061759,NL +3471061760,3471529215,US +3471529216,3471529983,CA +3471529984,3471558655,US +3471558656,3471560703,CA +3471560704,3471570943,US +3471570944,3471572991,CA +3471572992,3472375807,US +3472375808,3472392191,PR +3472392192,3472408575,CA +3472408576,3472721919,US +3472723968,3473039359,US +3473039360,3473041407,BM +3473041408,3473108991,US +3473108992,3473113087,UY +3473113088,3473276927,US +3473276928,3473342463,CA +3473342464,3473362943,US +3473367040,3473755391,US +3473755392,3473755647,HN +3473755648,3473765887,US +3473765888,3473766399,EC +3473766400,3473813567,US +3473813568,3473813599,CA +3473813600,3473901055,US +3473901056,3473901311,EC +3473901312,3474046463,US +3474046464,3474046975,MX +3474046976,3474053119,US +3474053120,3474055167,PE +3474055168,3474391039,US +3474391040,3474456575,CA +3474456576,3475111935,US +3475112192,3475113215,CA +3475113216,3475115007,US +3475115008,3475120127,CA +3475120128,3475124223,US +3475124224,3475243007,CA +3475243008,3475589887,US +3475589888,3475590143,EC +3475590144,3475670015,US +3475670016,3475671039,AG +3475671040,3475719231,US +3475719232,3475719295,PR +3475719296,3475745503,US +3475745504,3475745535,CA +3475745536,3475851263,US +3475853312,3475881983,US +3475881984,3475890175,CA +3475890176,3475996671,US +3475996672,3476029439,CA +3476029440,3476111359,US +3476111360,3476111871,CA +3476111872,3476221951,US +3476221952,3476223999,UY +3476224000,3476418559,US +3476418560,3476422655,CA +3476422656,3476447231,US +3476447232,3476455423,CA +3476455424,3476881407,US +3476881408,3476946943,CA +3476946944,3478114303,US +3478114304,3478118399,PE +3478118400,3478192127,US +3478192128,3478257663,CA +3478257664,3478294527,US +3478294528,3478294543,GB +3478294544,3478352111,US +3478352112,3478352119,GB +3478352120,3478364159,US +3478364160,3478364167,BR +3478364168,3479207935,US +3479207936,3479214079,CA +3479214080,3479214335,US +3479214336,3479240703,CA +3479240704,3479568383,US +3479568384,3479633919,CA +3479633920,3479896063,US +3479896064,3479961599,CA +3479961600,3480223743,US +3480223744,3480256511,CA +3480256512,3480284159,US +3480284160,3480284671,CA +3480284672,3480444927,US +3480444928,3480449023,CA +3480449024,3481169151,US +3481169152,3481169407,NZ +3481169408,3481176063,US +3481178112,3481665535,US +3481665536,3481731071,CA +3481731072,3481812991,US +3481812992,3481829375,CA +3481829376,3481993215,US +3481993216,3481993887,CA +3481993888,3481993895,US +3481993896,3482058751,CA +3482058752,3482583039,US +3482583040,3482632191,CA +3482632192,3482775551,US +3482775552,3482779647,PR +3482779648,3482910719,US +3482910720,3482927103,CA +3482927104,3483296004,US +3483296005,3483296005,BE +3483296006,3483435007,US +3483435008,3483533311,CA +3483533312,3483631615,US +3483631616,3483697151,CA +3483697152,3483791359,US +3483791360,3483795455,PR +3483795456,3483828223,US +3483828224,3483836415,CA +3483836416,3483877375,US +3483877376,3483893759,CA +3483893760,3484319743,US +3484320256,3484320511,US +3484322048,3484323839,US +3484327168,3484327423,US +3484331264,3484331519,US +3484331776,3484332031,US +3484338432,3484338943,US +3484340736,3484341247,US +3484352512,3484450815,US +3484450816,3484451327,CA +3484451328,3484451871,US +3484451872,3484451903,CA +3484451904,3484451967,US +3484451968,3484451999,CA +3484452000,3484452031,US +3484452032,3484452063,CA +3484452064,3484452095,US +3484452096,3484452351,CA +3484452352,3484453887,US +3484453888,3484455167,CA +3484455168,3484455199,US +3484455200,3484455231,CA +3484455232,3484455359,US +3484455360,3484455423,CA +3484455424,3484457215,US +3484457216,3484457471,CA +3484457472,3484459007,US +3484459008,3484459775,CA +3484459776,3484460735,US +3484460736,3484460751,CA +3484460752,3484462335,US +3484462336,3484462591,CA +3484462592,3484463615,US +3484463616,3484464143,CA +3484464144,3484464831,US +3484464832,3484464895,CA +3484464896,3484465663,US +3484465664,3484465919,CA +3484465920,3484466687,US +3484466688,3484467199,CA +3484467200,3484467967,US +3484467968,3484468223,CA +3484468224,3484468479,US +3484468480,3484468991,CA +3484468992,3484469247,US +3484469248,3484469759,CA +3484469760,3484470271,US +3484470272,3484470527,CA +3484470528,3484471807,US +3484471808,3484472063,CA +3484472064,3484473343,US +3484473344,3484473599,CA +3484473600,3484473855,US +3484473856,3484474623,CA +3484474624,3484475135,US +3484475136,3484475647,CA +3484475648,3484475903,US +3484475904,3484476159,CA +3484476160,3484476415,US +3484476416,3484476927,CA +3484476928,3484480255,US +3484480256,3484481279,CA +3484481280,3484481791,US +3484481792,3484482047,CA +3484482048,3484482559,US +3484482560,3484482815,CA +3484482816,3484483071,US +3484483072,3484483327,CA +3484483328,3484647423,US +3484647424,3484663807,CA +3484663808,3484746815,US +3484746816,3484746943,GB +3484746944,3484762111,US +3484762112,3484778495,CA +3484778496,3484884991,US +3484884992,3484893183,CA +3484893184,3485220863,US +3485220864,3485229055,CA +3485229056,3485290463,US +3485290464,3485290479,GB +3485290480,3485327359,US +3485327360,3485335551,CA +3485335552,3485442047,US +3485446144,3485462527,US +3485466624,3485597695,US +3485597696,3485671583,CA +3485671584,3485671615,US +3485671616,3485672543,CA +3485672544,3485672551,US +3485672552,3485695999,CA +3485704192,3486023679,US +3486023680,3486031871,CA +3486031872,3486269439,US +3486269440,3486277631,JM +3486285824,3486302207,PR +3486302208,3486310399,CA +3486318592,3486646271,US +3486646272,3486662655,CA +3486662656,3486699519,US +3486699520,3486699775,CA +3486699776,3486700399,US +3486700400,3486700407,CA +3486700408,3486701311,US +3486701312,3486701567,CA +3486701568,3486711551,US +3486711552,3486711807,CA +3486711808,3487039487,US +3487039488,3487105023,CA +3487105024,3487187199,US +3487187200,3487187215,GB +3487187216,3487189247,US +3487189248,3487189503,DK +3487189504,3487193599,US +3487193600,3487193855,DK +3487193856,3487197183,US +3487197184,3487197439,DK +3487197440,3487203071,US +3487203072,3487203327,DK +3487203328,3487236095,US +3487236096,3487301631,CA +3487301632,3487498239,US +3487518720,3487522815,US +3487531008,3487539199,US +3487547392,3487559679,US +3487563776,3487766527,US +3487766528,3487768575,CA +3487768576,3487842303,US +3487842304,3487858687,CA +3487858688,3487859199,KY +3487859200,3487861759,BM +3487861760,3487862015,KY +3487862016,3487875071,BM +3487875072,3487891455,US +3487891456,3487907839,CA +3487907840,3488014335,US +3488014336,3488022527,CA +3488022528,3488049151,US +3488051200,3488065535,US +3488067584,3488071679,US +3488071680,3488072703,CA +3488072704,3488079871,US +3488079872,3488083967,CA +3488083968,3488089119,US +3488089120,3488089343,IL +3488089344,3488089887,US +3488089888,3488089983,IL +3488089984,3488090527,US +3488090528,3488090559,IL +3488090560,3488090623,US +3488090624,3488090687,IL +3488090688,3488090719,US +3488090720,3488090879,IL +3488090880,3488090943,US +3488090944,3488090975,IL +3488090976,3488091647,US +3488091648,3488091775,IL +3488091776,3488092943,US +3488092944,3488092959,IL +3488092960,3488092991,US +3488092992,3488093055,IL +3488093056,3488093951,US +3488093952,3488094015,IL +3488094016,3488094719,US +3488094720,3488094735,IL +3488094736,3488094751,US +3488094752,3488094783,IL +3488094784,3488094831,US +3488094832,3488094847,IL +3488094848,3488095103,US +3488095104,3488095119,IL +3488095120,3488112639,US +3488112640,3488120831,CA +3488120832,3488350207,US +3488350208,3488415743,CA +3488415744,3488722687,US +3488722688,3488723199,JM +3488723200,3488909311,US +3488911360,3488940031,US +3488940032,3488956415,CA +3488956416,3488989183,US +3488989184,3489005567,CA +3489005568,3489136639,US +3489136640,3489267711,MX +3489267712,3489341439,US +3489341440,3489345535,CA +3489345536,3489398783,US +3489398784,3489399039,IT +3489399040,3489464319,US +3489464320,3489529855,CA +3489529856,3489562623,US +3489562624,3489566719,JM +3489566720,3489583103,US +3489587200,3489717759,US +3489717760,3489718015,PR +3489718016,3489718271,US +3489718272,3489718527,AG +3489718528,3489719039,LC +3489719040,3489720063,AG +3489720064,3489720319,LC +3489720320,3489738751,US +3489738752,3489740799,PH +3489740800,3489741783,US +3489741784,3489741791,CA +3489741792,3489749503,US +3489749504,3489749519,CA +3489749520,3489756119,US +3489756120,3489756127,DE +3489756128,3489761743,US +3489761744,3489761759,CA +3489761760,3489774831,US +3489774832,3489774839,GB +3489774840,3489775103,US +3489775104,3489775359,BO +3489775360,3490041503,US +3490041504,3490041535,CA +3490041536,3490263039,US +3490263040,3490267135,CO +3490267136,3490653871,US +3490653872,3490653887,CA +3490653888,3490703615,US +3490703616,3490703871,PR +3490703872,3490732431,US +3490732432,3490732447,CA +3490732448,3490786047,US +3490786048,3490786303,PR +3490786304,3490863615,US +3490863616,3490863871,CA +3490863872,3490879231,US +3490879232,3490879487,PR +3490879488,3491219183,US +3491219184,3491219191,PR +3491219192,3491226687,US +3491226688,3491226719,CA +3491226720,3491231807,US +3491231808,3491231823,PR +3491231824,3491358183,US +3491358184,3491358191,PR +3491358192,3491381247,US +3491381248,3491389439,BM +3491389440,3491476991,US +3491476992,3491478527,VI +3491478528,3491506631,US +3491506632,3491506639,DK +3491506640,3491637247,US +3491637248,3491637759,CO +3491637760,3491651583,US +3491651584,3491659775,VI +3491659776,3491743743,US +3491743744,3491745791,CO +3491745792,3491764783,US +3491764784,3491764791,PR +3491764792,3491780607,US +3491780608,3491781631,EC +3491781632,3491968423,US +3491968424,3491968431,PR +3491968432,3491968447,AF +3491968448,3491971607,US +3491971608,3491971615,IT +3491971616,3491971751,US +3491971752,3491971759,AU +3491971760,3491971951,US +3491971952,3491971967,HK +3491971968,3491973151,US +3491973152,3491973159,VE +3491973160,3492005375,US +3492005376,3492005391,DK +3492005392,3492005439,US +3492005440,3492005447,DK +3492005448,3492005463,US +3492005464,3492005487,AU +3492005488,3492151295,US +3492151296,3492167679,CA +3492167680,3492188799,US +3492188800,3492188831,CH +3492188832,3492198655,US +3492198656,3492200447,GB +3492216832,3492669951,US +3492669952,3492671487,PA +3492671488,3492827391,US +3492827392,3492827423,CA +3492827424,3492827431,US +3492827432,3492827439,DE +3492827440,3492827455,AU +3492827456,3492827519,US +3492827520,3492827647,AU +3492827648,3492827903,US +3492827904,3492827967,AU +3492827968,3493070847,US +3493070848,3493071871,HT +3493071872,3493073151,US +3493073152,3493073407,BO +3493073408,3493073663,US +3493073664,3493073919,BO +3493073920,3493074175,US +3493074176,3493074431,BO +3493074432,3493078527,HT +3493078528,3493079039,US +3493079040,3493081087,HT +3493081088,3493081599,US +3493081600,3493082623,PY +3493082624,3493089279,US +3493089280,3493090815,BO +3493090816,3493091327,US +3493091328,3493092351,BO +3493092352,3493092607,NA +3493092608,3493135167,US +3493135168,3493135199,CY +3493135200,3493135807,US +3493135808,3493135839,CA +3493135840,3493135871,US +3493135872,3493136127,CA +3493136128,3493137919,US +3493137920,3493138175,CA +3493138176,3493139199,US +3493139200,3493139455,CA +3493139456,3493140127,US +3493140128,3493140159,CA +3493140160,3493141279,US +3493141280,3493141311,CY +3493141312,3493244927,US +3493244928,3493249023,PR +3493249024,3493866495,US +3493866496,3493867519,VG +3493867520,3493874687,US +3493874688,3493875711,BM +3493875712,3493881855,US +3493881856,3493882879,CA +3493882880,3493903551,US +3493903552,3493903567,KW +3493903568,3493936127,US +3493936128,3493937151,CA +3493937152,3493939199,US +3493939200,3493941247,CA +3493941248,3493980159,US +3493981184,3493982207,US +3493982208,3493984255,CA +3493984256,3493986303,US +3493986304,3493987327,CA +3493987328,3493990399,US +3493990400,3493991423,CA +3493991424,3493998591,US +3493998592,3494000639,AI +3494000640,3494003711,US +3494003712,3494004735,CA +3494004736,3494009855,US +3494009856,3494010879,CA +3494010880,3494014975,US +3494014976,3494017023,CA +3494017024,3494035807,US +3494035808,3494035823,CY +3494035824,3494036319,US +3494036320,3494036351,RU +3494036352,3494036417,EE +3494036418,3494036431,US +3494036432,3494036439,RU +3494036440,3494044671,US +3494044672,3494045695,CA +3494045696,3494049791,US +3494049792,3494051839,CA +3494051840,3494055935,US +3494057984,3494064127,US +3494066176,3494075391,US +3494075392,3494076415,CA +3494076416,3494088703,US +3494088704,3494090751,CA +3494090752,3494094847,US +3494094848,3494095871,CA +3494095872,3494114303,US +3494115328,3494121471,US +3494121472,3494122495,CA +3494122496,3494134783,US +3494135808,3494136831,CA +3494136832,3494139903,US +3494139904,3494141735,CA +3494141736,3494141743,US +3494141744,3494141951,CA +3494141952,3494143999,US +3494144000,3494145023,CA +3494145024,3494168575,US +3494168576,3494170623,CA +3494170624,3494184959,US +3494184960,3494187007,CA +3494187008,3494197247,US +3494197248,3494198271,CA +3494198272,3494244351,US +3494244352,3494246399,CA +3494246400,3494247423,US +3494247424,3494248703,CA +3494248704,3494248831,US +3494248832,3494250495,CA +3494250496,3494262783,US +3494262784,3494264831,CA +3494264832,3494271999,US +3494272000,3494273023,KN +3494273024,3494275071,US +3494275072,3494277119,CA +3494277120,3494290943,US +3494290944,3494291455,GB +3494291456,3494294527,US +3494295040,3494302719,US +3494302720,3494303743,CA +3494303744,3494310911,US +3494310912,3494311935,CA +3494311936,3494316031,US +3494316032,3494317055,CA +3494317056,3494336511,US +3494336512,3494337535,CA +3494337536,3494342655,US +3494342656,3494344703,CA +3494344704,3494359039,US +3494359040,3494360063,CA +3494360064,3494361087,US +3494361088,3494362111,CA +3494362112,3494380543,US +3494380544,3494381567,CA +3494381568,3494410239,US +3494410240,3494412287,CA +3494412288,3494424575,US +3494424576,3494425599,CA +3494425600,3494432767,US +3494432768,3494433791,CA +3494433792,3494437887,US +3494437888,3494438143,GP +3494438144,3494438399,VC +3494438400,3494438655,GP +3494438656,3494438911,GD +3494438912,3494439935,CA +3494439936,3494449151,US +3494449152,3494451199,CA +3494451200,3494454128,US +3494454129,3494454158,PH +3494454159,3494455295,US +3494455296,3494456319,CA +3494456320,3494459391,US +3494459392,3494460415,CA +3494460416,3494464511,US +3494464512,3494465535,CA +3494465536,3494510591,US +3494510592,3494512639,CA +3494512640,3494516735,US +3494516736,3494517759,CA +3494517760,3494563839,US +3494563840,3494565887,CA +3494565888,3494594559,US +3494594560,3494595583,CA +3494595584,3494605823,US +3494605824,3494606847,CA +3494606848,3494610943,US +3494610944,3494611967,CA +3494611968,3494624255,US +3494624256,3494625279,CA +3494625280,3494627327,US +3494627328,3494628351,BM +3494628352,3494651903,US +3494651904,3494652927,CA +3494652928,3494660095,US +3494660096,3494661119,CA +3494661120,3494668287,US +3494668288,3494669375,CA +3494669376,3494669439,US +3494669440,3494670335,CA +3494670336,3494700031,US +3494700032,3494701055,CA +3494701056,3494727679,US +3494727680,3494729727,CA +3494729728,3494730751,US +3494730752,3494731775,CA +3494731776,3494743039,US +3494743040,3494744063,CA +3494744064,3494757375,US +3494757376,3494758399,CA +3494758400,3494776831,US +3494776832,3494777855,CA +3494777856,3494785023,US +3494785024,3494787071,MF +3494787072,3494789119,CA +3494789120,3494852607,US +3494852608,3494854655,CA +3494854656,3494862847,US +3494862848,3494863615,VC +3494863616,3494863871,GP +3494863872,3494866943,US +3494866944,3494867967,CA +3494867968,3494893567,US +3494893568,3494894591,CA +3494894592,3494904831,US +3494905856,3494917119,US +3494917120,3494918143,CA +3494918144,3494928383,US +3494928384,3494930431,CA +3494930432,3494938623,US +3494938624,3494939647,CA +3494939648,3494946815,US +3494948864,3494964223,US +3494964224,3494965247,PR +3494965248,3494968319,US +3494968320,3494972415,CA +3494972416,3494978559,US +3494979584,3494981631,CA +3494981632,3495000063,US +3495000064,3495001087,CA +3495001088,3495006207,US +3495006208,3495007231,CA +3495007232,3495010303,US +3495010304,3495011327,KN +3495011328,3495012351,US +3495012352,3495014399,PR +3495014400,3495023615,US +3495023616,3495024639,CA +3495024640,3495065599,US +3495065600,3495066623,CA +3495066624,3495076863,US +3495076864,3495077887,BM +3495077888,3495090175,US +3495090176,3495091199,KY +3495091200,3495098367,US +3495098368,3495100415,CA +3495100416,3495120895,US +3495120896,3495122943,AG +3495122944,3495153663,US +3495153664,3495155711,CA +3495155712,3495192575,US +3495192576,3495193599,CA +3495193600,3495215103,US +3495215104,3495217151,VI +3495217152,3495219199,VC +3495219200,3495251967,US +3495251968,3495254015,CA +3495254016,3495260159,US +3495260160,3495261183,CA +3495261184,3495286783,US +3495286784,3495288831,CA +3495288832,3495332863,US +3495332864,3495333887,CA +3495333888,3495349247,US +3495349248,3495350271,CA +3495350272,3495358463,US +3495358464,3495359487,CA +3495359488,3495367679,US +3495367680,3495368703,CA +3495368704,3495370751,US +3495370752,3495372799,BS +3495372800,3495375871,US +3495375872,3495376895,CA +3495376896,3495399423,US +3495399424,3495400447,KN +3495400448,3495412735,US +3495412736,3495413759,CA +3495413760,3495424033,US +3495424034,3495424042,IN +3495424043,3495424286,US +3495424287,3495424308,IN +3495424309,3495424321,US +3495424322,3495424346,IN +3495424347,3495424355,US +3495424356,3495424381,IN +3495424382,3495424629,US +3495424630,3495424637,IN +3495424638,3495424789,US +3495424790,3495424797,IN +3495424798,3495424865,US +3495424866,3495424878,IN +3495424879,3495424913,US +3495424914,3495424919,IN +3495424920,3495429119,US +3495429120,3495430143,CA +3495430144,3495454719,US +3495455744,3495456767,CA +3495456768,3495463935,US +3495463936,3495464959,CA +3495464960,3495475199,US +3495475200,3495477247,CA +3495477248,3495478271,US +3495478272,3495479295,CA +3495479296,3495505919,US +3495505920,3495507967,CA +3495507968,3495515135,US +3495515136,3495516159,CA +3495516160,3495520303,US +3495520304,3495520307,CA +3495520308,3495526399,US +3495526400,3495527423,CA +3495527424,3495549183,US +3495549184,3495549439,CA +3495549440,3495550207,US +3495550208,3495550463,CA +3495550464,3495551999,US +3495552000,3495553023,BM +3495553024,3495579647,US +3495579648,3495581695,CA +3495581696,3495583743,US +3495583744,3495585791,CA +3495585792,3495587839,US +3495587840,3495588863,MS +3495588864,3495618559,US +3495618560,3495619583,CA +3495619584,3495620607,US +3495620608,3495622655,CA +3495622656,3495653375,US +3495653376,3495654399,CA +3495655424,3495673855,US +3495673856,3495674879,MF +3495674880,3495686143,US +3495687168,3495688191,US +3495688192,3495689215,CA +3495689216,3495694335,US +3495694336,3495696383,CA +3495696384,3495703551,US +3495703552,3495704575,CA +3495704576,3495718911,US +3495718912,3495720959,CA +3495720960,3495724031,US +3495724032,3495727103,CA +3495727104,3495740415,US +3495740416,3495741439,CA +3495741440,3495749631,US +3495749632,3495750655,CA +3495750656,3495774207,US +3495774208,3495776255,CA +3495776256,3495815167,US +3495815168,3495817215,CA +3495817216,3495828479,US +3495828480,3495829503,CA +3495829504,3495847935,US +3495847936,3495849983,CA +3495849984,3495862271,US +3495862272,3495864319,CA +3495864320,3495865343,GP +3495865344,3495866367,CA +3495866368,3495868415,VC +3495868416,3495871487,US +3495871488,3495872511,CA +3495872512,3495896063,US +3495896064,3495897087,PR +3495897088,3495930879,US +3495930880,3495931903,CA +3495931904,3495934975,US +3495936000,3495968767,US +3495968768,3495985151,CA +3495985152,3495988223,NI +3495988224,3495989247,GT +3495989248,3496034303,US +3496034304,3496050687,CA +3496050688,3496132607,US +3496132608,3496145951,CA +3496145952,3496145983,US +3496145984,3496148991,CA +3496148992,3496181759,US +3496181760,3496189951,CA +3496189952,3496288447,US +3496288448,3496288463,AR +3496288464,3496292319,US +3496292320,3496292335,PH +3496292336,3496295839,US +3496295840,3496295871,AR +3496295872,3496296447,US +3496296448,3496312831,CA +3496312832,3496468479,US +3496468480,3496476671,CA +3496476672,3496878079,US +3496878080,3496882175,CA +3496882176,3496894463,US +3496894464,3496902655,CA +3496902656,3496951807,US +3496951808,3496959999,CA +3496960000,3497066495,US +3497066496,3497082879,CA +3497082880,3497164799,US +3497164800,3497181183,CA +3497181184,3497222407,US +3497222408,3497222415,IN +3497222416,3497222463,US +3497222464,3497222479,IN +3497222480,3497223295,US +3497223296,3497223359,CH +3497223360,3497223791,US +3497223792,3497223807,CH +3497223808,3497223839,US +3497223840,3497223871,CH +3497223872,3497223879,US +3497223880,3497223887,ID +3497223888,3497224255,US +3497224256,3497224319,IN +3497224320,3497224831,US +3497224832,3497224863,CH +3497224864,3497225375,US +3497225376,3497225383,CN +3497225384,3497225471,US +3497225472,3497225535,IN +3497225536,3497226783,US +3497226784,3497226815,CH +3497226816,3497226831,US +3497226832,3497226855,CH +3497226856,3497226879,US +3497226880,3497226959,CH +3497226960,3497227023,US +3497227024,3497227039,GB +3497227040,3497227247,US +3497227248,3497227255,CN +3497227256,3497227391,US +3497227392,3497227407,CN +3497227408,3497227527,US +3497227528,3497227535,CN +3497227536,3497228015,US +3497228016,3497228023,CN +3497228024,3497228079,US +3497228080,3497228087,CN +3497228088,3497246719,US +3497263104,3497264913,US +3497264914,3497264950,GB +3497264951,3497266527,US +3497266528,3497266535,GB +3497266536,3497268223,US +3497268224,3497268287,GB +3497268288,3497410559,US +3497410560,3497431039,CA +3497431040,3497447423,US +3497447424,3497451519,CA +3497451520,3497717759,US +3497721856,3497739327,US +3497739328,3497739351,IN +3497739352,3497740071,US +3497740072,3497740095,CA +3497740096,3497820159,US +3497820160,3497852927,CA +3497852928,3498254591,US +3498254592,3498254847,JM +3498254848,3498287103,US +3498287104,3498292543,JM +3498292544,3498292551,US +3498292552,3498295295,JM +3498295296,3498405887,US +3498405888,3498409983,CA +3498409984,3498428415,US +3498428416,3498429439,CR +3498429440,3498429951,US +3498429952,3498430207,CR +3498430208,3498505343,US +3498505344,3498505375,SG +3498505376,3498509055,US +3498509056,3498510335,PR +3498510336,3498513151,US +3498513152,3498513407,CL +3498513408,3498513919,US +3498513920,3498514431,CL +3498514432,3498587135,US +3498587136,3498588159,NL +3498588160,3498708991,US +3498708992,3498713639,JM +3498713640,3498713647,CA +3498713648,3498717183,JM +3498717184,3498760191,US +3498760192,3498762239,PR +3498762240,3499403263,US +3499403264,3499403775,MW +3499403776,3499436031,US +3499436032,3499436287,DE +3499436288,3499437055,US +3499437056,3499437151,DE +3499437152,3499437423,US +3499437424,3499437431,IT +3499437432,3499450367,US +3499450368,3499451391,IN +3499451392,3499705343,US +3499705344,3499705855,TZ +3499705856,3499706367,MG +3499706368,3499986943,US +3499986944,3499988991,KY +3499988992,3500076415,US +3500076416,3500076543,SG +3500076544,3500144639,US +3500144640,3500144895,IT +3500144896,3500274175,US +3500274176,3500274239,IE +3500274240,3500351487,US +3500351488,3500359679,JM +3500359680,3500371583,US +3500371584,3500371599,GB +3500371600,3500396831,US +3500396832,3500396863,GB +3500396864,3500486655,US +3500486656,3500490751,CR +3500490752,3500689407,US +3500689408,3500689919,CL +3500689920,3500724991,US +3500724992,3500725503,EC +3500725504,3500725759,US +3500725760,3500726015,EC +3500726016,3500728319,US +3500728320,3500736511,KY +3500736512,3500752895,US +3500752896,3500761087,KY +3500761088,3501181703,US +3501181704,3501181711,AU +3501181712,3501181727,KR +3501181728,3501182975,US +3501182976,3501183007,SG +3501183008,3501183167,US +3501183168,3501183231,SG +3501183232,3501183487,US +3501183488,3501183743,GB +3501183744,3501183959,US +3501183960,3501183967,IL +3501183968,3501183999,SG +3501184000,3501522943,US +3501522944,3501588479,CA +3501588480,3502418175,US +3502418176,3502418431,GU +3502418432,3502929663,US +3502929664,3502929919,GU +3502929920,3502993407,US +3502993408,3502993919,NL +3502993920,3503215623,US +3503215624,3503215639,NL +3503215640,3503473151,US +3503473152,3503473663,NA +3503473664,3503757823,US +3503757824,3503758335,GU +3503758336,3503890431,US +3503890432,3503894527,CO +3503894528,3504193535,US +3504193536,3504194559,EC +3504194560,3504521215,US +3504521216,3504521727,GU +3504521728,3505004543,US +3505004544,3505012735,PR +3505012736,3505661951,US +3505661952,3505662463,JM +3505662464,3505818623,US +3505818624,3505819647,BS +3505819648,3506043135,US +3506043136,3506044927,PA +3506044928,3506765823,US +3506765824,3506831359,CA +3506831360,3507290111,US +3507290112,3507355647,AR +3507355648,3507540015,US +3507540016,3507540031,IN +3507540032,3507585023,US +3507585024,3507601407,CA +3507601408,3507748863,US +3507748864,3507765247,CA +3507765248,3508110591,US +3508110592,3508111103,GB +3508111104,3508118527,US +3508118528,3508118559,AU +3508118560,3508120063,US +3508120064,3508120319,GB +3508120320,3508126463,US +3508126464,3508126719,GB +3508126720,3508219903,US +3508219904,3508220927,CA +3508220928,3508221951,KY +3508221952,3508222975,US +3508222976,3508223999,KY +3508224000,3508224255,BM +3508224256,3508243967,US +3508243968,3508244223,BM +3508244224,3508338687,US +3508338688,3508404223,CA +3508404224,3508690943,US +3508690944,3508695039,CA +3508695040,3509153791,US +3509157888,3509166079,CA +3509166080,3509215231,US +3509215232,3509223423,CA +3509223424,3509326079,US +3509326080,3509326087,CA +3509326088,3509327695,US +3509327696,3509327711,CA +3509327712,3509327807,US +3509327808,3509327871,CA +3509327872,3509346303,US +3509346304,3509347103,CA +3509347104,3509347119,US +3509347120,3509350335,CA +3509350336,3509350343,US +3509350344,3509354495,CA +3509354496,3509387263,US +3509387264,3509420031,PE +3509420032,3509519871,US +3509519872,3509520255,CA +3509520256,3509521407,US +3509521408,3509521663,CA +3509521664,3509522175,US +3509522176,3509522431,CA +3509522432,3509522687,KW +3509522688,3509522943,CA +3509522944,3509523839,US +3509523840,3509523903,CA +3509523904,3509524223,US +3509524224,3509524479,CA +3509524480,3509524991,US +3509524992,3509525247,CA +3509525248,3509526015,US +3509526016,3509526271,CA +3509526272,3509527215,US +3509527216,3509527231,CA +3509527232,3509529855,US +3509529856,3509529887,CA +3509529888,3509529951,US +3509529952,3509530111,CA +3509530112,3509530367,US +3509530368,3509530431,CA +3509530432,3509530623,US +3509530624,3509532671,CA +3509532672,3509534719,US +3509534720,3509535231,CA +3509535232,3509535487,US +3509535488,3509535503,CA +3509535504,3509536255,US +3509536256,3509536511,CA +3509536512,3509537279,US +3509537280,3509538303,CA +3509538304,3509538463,US +3509538464,3509538479,CA +3509538480,3509539071,US +3509539072,3509539327,CA +3509539328,3509542783,US +3509542784,3509542815,CA +3509542816,3509543359,US +3509543360,3509543423,CA +3509543424,3509543999,US +3509544000,3509544063,CA +3509544064,3509544191,US +3509544192,3509544447,CA +3509544448,3509544703,US +3509544704,3509544959,CA +3509544960,3509554175,US +3509554176,3509554431,CA +3509554432,3509555455,US +3509555456,3509555711,CA +3509555712,3509555967,US +3509555968,3509556479,CA +3509556480,3509558015,US +3509558016,3509558079,CA +3509558080,3509559039,US +3509559040,3509559295,KW +3509559296,3509559551,US +3509559552,3509559807,CA +3509559808,3509559999,US +3509560000,3509560015,CA +3509560016,3509560063,US +3509560064,3509560319,CA +3509560320,3509560831,US +3509560832,3509561087,CA +3509561088,3509561599,US +3509561600,3509562111,CA +3509562112,3509562367,US +3509562368,3509562623,CA +3509562624,3509563903,US +3509563904,3509564223,CA +3509564224,3509564415,US +3509564416,3509564927,CA +3509564928,3509565183,US +3509565184,3509565951,CA +3509565952,3509566767,US +3509566768,3509566783,CA +3509566784,3509567487,US +3509567488,3509567743,CA +3509567744,3509568511,US +3509568512,3509569023,CA +3509569024,3509570079,US +3509570080,3509570111,CA +3509570112,3509571071,US +3509571072,3509571327,CA +3509571328,3509572351,US +3509572352,3509572863,CA +3509572864,3509574143,US +3509574144,3509574655,CA +3509574656,3509575935,US +3509575936,3509576191,CA +3509576192,3509580031,US +3509580032,3509580287,CA +3509580288,3509580799,US +3509580800,3509581055,CA +3509581056,3509581823,US +3509581824,3509582335,CA +3509582336,3509582591,US +3509582592,3509582847,CA +3509582848,3509583615,US +3509583616,3509583871,CA +3509583872,3509731327,US +3509731328,3509739519,CA +3509739520,3509846015,US +3509846016,3509977087,CA +3510042624,3510239231,US +3510239232,3510241063,CA +3510241064,3510241071,US +3510241072,3510271999,CA +3510272000,3510321151,US +3510321152,3510321663,VG +3510321664,3510321919,AG +3510321920,3510322175,KN +3510322176,3510323199,AG +3510323200,3510324223,KN +3510324224,3510324735,AG +3510324736,3510324991,AI +3510324992,3510326271,AG +3510326272,3510327295,VG +3510327296,3510328319,AG +3510328320,3510328575,KN +3510328576,3510331391,AG +3510331392,3510332415,DM +3510332416,3510332927,KN +3510332928,3510333183,LC +3510333184,3510333439,MS +3510333440,3510333951,KN +3510333952,3510334975,AG +3510334976,3510335231,KN +3510335232,3510335487,AI +3510335488,3510335743,AG +3510335744,3510335999,VG +3510336000,3510337279,AG +3510337280,3510337535,LC +3510337536,3510362111,US +3510370304,3510831527,US +3510831528,3510831535,GB +3510831536,3510833423,US +3510833424,3510833439,CA +3510833440,3510836671,US +3510836672,3510836687,CA +3510836688,3510839135,US +3510839136,3510839151,GB +3510839152,3510839215,US +3510839216,3510839231,GB +3510839232,3510839311,US +3510839312,3510839327,IN +3510839328,3510843087,US +3510843088,3510843095,CA +3510843096,3510843103,GB +3510843104,3510844415,US +3510844416,3510844927,CA +3510844928,3510846527,US +3510846528,3510846559,CA +3510846560,3510897442,US +3510897443,3510897443,IE +3510897444,3510935551,US +3510935552,3510943743,CA +3510943744,3511140351,US +3511140352,3511156735,CA +3511156736,3511314431,US +3511320576,3511331199,US +3511331200,3511331231,CA +3511331232,3511812095,US +3511812096,3511844863,CA +3511844864,3512011311,US +3512011312,3512011327,UM +3512011328,3512011359,US +3512011360,3512011375,TR +3512011376,3512011807,US +3512011808,3512011823,TW +3512011824,3512011855,US +3512011856,3512011871,SE +3512011872,3512011903,IN +3512011904,3512012095,US +3512012096,3512012159,GB +3512012160,3512012175,MX +3512012176,3512012191,US +3512012192,3512012223,BR +3512012224,3512012255,US +3512012256,3512012287,GB +3512012288,3512013583,US +3512013584,3512013599,CA +3512013600,3512013647,US +3512013648,3512013663,CA +3512013664,3512013679,US +3512013680,3512013695,GR +3512013696,3512013791,US +3512013792,3512013823,IN +3512013824,3512016543,US +3512016544,3512016559,IT +3512016560,3512016575,US +3512016576,3512016591,TW +3512016592,3512016607,US +3512016608,3512016623,CA +3512016624,3512016767,GB +3512016768,3512016831,US +3512016832,3512016895,JO +3512016896,3512017183,US +3512017184,3512017199,AR +3512017200,3512017231,US +3512017232,3512017247,ES +3512017248,3512017263,MX +3512017264,3512017279,GB +3512017280,3512017359,US +3512017360,3512017375,RU +3512017376,3512017407,GB +3512017408,3512017663,BR +3512017664,3512017695,CA +3512017696,3512017727,RU +3512017728,3512017743,US +3512017744,3512017759,IT +3512017760,3512017791,US +3512017792,3512017807,LT +3512017808,3512017823,US +3512017824,3512017855,JO +3512017856,3512019071,US +3512019072,3512019135,GB +3512019136,3512019151,MX +3512019152,3512019199,US +3512019200,3512019263,ES +3512019264,3512019295,US +3512019296,3512019311,CA +3512019312,3512019327,US +3512019328,3512019359,CA +3512019360,3512020095,US +3512020096,3512020223,ES +3512020224,3512020479,US +3512020480,3512020511,GB +3512020512,3512020543,US +3512020544,3512020607,CA +3512020608,3512021503,US +3512021504,3512021759,GB +3512021760,3512022335,US +3512022336,3512022399,ES +3512022400,3512022431,US +3512022432,3512022447,IN +3512022448,3512022463,GB +3512022464,3512023807,US +3512023808,3512023839,CA +3512023840,3512023855,GB +3512023856,3512023887,US +3512023888,3512023903,MX +3512023904,3512023999,US +3512024000,3512024063,BR +3512024064,3512024319,US +3512024320,3512024575,AU +3512024576,3512024591,CA +3512024592,3512025087,US +3512025088,3512025103,CA +3512025104,3512025183,US +3512025184,3512025215,CA +3512025216,3512025343,US +3512025344,3512025359,CA +3512025360,3512027391,US +3512027392,3512027519,AU +3512027520,3512028271,US +3512028272,3512028287,GB +3512028288,3512029119,US +3512029120,3512029135,CA +3512029136,3512029263,US +3512029264,3512029279,CA +3512029280,3512031295,US +3512031296,3512031359,JO +3512031360,3512031375,CA +3512031376,3512031535,US +3512031536,3512031551,CA +3512031552,3512031759,US +3512031760,3512031775,CA +3512031776,3512037247,US +3512037248,3512037311,AU +3512037312,3512038863,US +3512038864,3512038879,CA +3512038880,3512040143,US +3512040144,3512040159,CA +3512040160,3512139775,US +3512139776,3512156159,CA +3512156160,3512172543,US +3512172544,3512176639,CA +3512176640,3512197119,US +3512197120,3512205311,CA +3512205312,3512207359,US +3512207360,3512209407,CO +3512209408,3512221695,US +3512221696,3512223231,AG +3512223232,3512223487,LC +3512223488,3512223743,AG +3512223744,3512228351,US +3512228352,3512229887,ZW +3512229888,3512230143,VE +3512230144,3512233215,US +3512233216,3512233471,CL +3512233472,3512233727,US +3512233728,3512233983,HN +3512233984,3512244991,US +3512244992,3512246015,IL +3512246016,3512249343,US +3512249344,3512256511,IL +3512256512,3512258559,CL +3512258560,3512263679,US +3512263680,3512264703,VE +3512264704,3512269055,US +3512269056,3512269311,PR +3512269312,3512270847,US +3512270848,3512336383,CA +3512336384,3512369151,US +3512369152,3512385535,CA +3512385536,3512397823,US +3512397824,3512401919,CA +3512401920,3512418303,US +3512418304,3512451071,CA +3512451072,3512467455,PR +3512467456,3512647679,US +3512647680,3512655871,TT +3512655872,3512696831,US +3512696832,3512699775,SE +3512699776,3512699903,US +3512699904,3512705023,SE +3512705024,3512844287,US +3512844288,3512852479,CA +3512852480,3512983551,US +3512983552,3512987647,AR +3512987648,3513188351,US +3513188352,3513204735,CA +3513204736,3513270271,US +3513270272,3513286655,CA +3513286656,3513294847,US +3513294848,3513303039,CA +3513303040,3513368575,US +3513368576,3513376767,CA +3513376768,3513475071,US +3513475072,3513483263,CA +3513483264,3513778175,US +3513778176,3513794559,CA +3513794560,3514007551,US +3514007552,3514040319,CA +3514040320,3514367999,US +3514368000,3514433535,CA +3514433536,3514589439,US +3514589440,3514589695,GT +3514589696,3514590207,SV +3514590208,3514590719,US +3514590720,3514591103,SV +3514591104,3514591487,US +3514591488,3514592255,NI +3514592256,3514592767,SV +3514592768,3514593279,US +3514593280,3514597375,SV +3514597376,3514775295,US +3514775296,3514775551,PA +3514775552,3514791935,US +3514791936,3514793983,PA +3514793984,3514826751,US +3514826752,3514843135,CA +3514843136,3515301887,US +3515301888,3515318271,CA +3515318272,3515596799,US +3515596800,3515613183,CA +3515744256,3515867151,US +3515867152,3515867167,AU +3515867168,3515867391,US +3515867392,3515867519,AU +3515867520,3515868463,US +3515868464,3515868479,IT +3515868480,3515913631,US +3515913632,3515913663,CA +3515913664,3515916519,US +3515916520,3515916527,AU +3515916528,3515965439,US +3515965440,3515973631,CA +3515973632,3515990015,US +3516006400,3516039167,US +3516039168,3516071935,CA +3516071936,3516153855,US +3516153856,3516162047,CA +3516162048,3516170239,US +3516170240,3516203007,CA +3516203008,3516334079,US +3516334080,3516342271,CA +3516342272,3516355663,US +3516355664,3516355679,CA +3516355680,3516366847,US +3516366848,3516370943,CA +3516370944,3516379135,US +3516383232,3516514303,US +3516514304,3516530687,CA +3516530688,3516895231,US +3516899328,3516899839,ZA +3516899840,3516899847,US +3516899848,3516899855,NG +3516899856,3516899887,US +3516899888,3516899903,NG +3516899904,3516899935,EC +3516899936,3516900015,NG +3516900016,3516900095,US +3516900096,3516900351,ZA +3516900352,3516900607,NG +3516900608,3516900863,ZA +3516900864,3516901119,NG +3516901120,3516901887,ZA +3516901888,3516902399,NG +3516902400,3516902655,ZA +3516902656,3516902911,NG +3516902912,3516903167,ZA +3516903168,3516903423,NG +3516903424,3516907519,CA +3516907520,3517038591,US +3517038592,3517054975,CA +3517054976,3517095935,US +3517095936,3517100031,CA +3517100032,3517112319,US +3517112320,3517116159,CA +3517116160,3517116415,US +3517116416,3517120511,CA +3517120512,3517233151,US +3517233152,3517235199,GU +3517235200,3517309951,US +3517309952,3517313023,CA +3517313024,3517382911,US +3517382912,3517383423,CA +3517383424,3517385983,US +3517385984,3517386239,CA +3517386240,3517388287,US +3517388288,3517388543,CA +3517388544,3517391103,US +3517391104,3517391359,CA +3517391360,3517391439,US +3517391440,3517391455,CA +3517391456,3517391871,US +3517391872,3517392127,CA +3517392128,3517392383,US +3517392384,3517392639,CA +3517392640,3517394687,US +3517394688,3517394943,CA +3517394944,3517396063,US +3517396064,3517396079,CA +3517396080,3517396175,US +3517396176,3517396183,CA +3517396184,3517396479,US +3517396480,3517396543,CA +3517396544,3517396815,US +3517396816,3517396831,CA +3517396832,3517400063,US +3517400064,3517400319,CA +3517400320,3517400511,US +3517400512,3517400543,CA +3517400544,3517401343,US +3517401344,3517401375,CA +3517401376,3517401439,US +3517401440,3517401471,CA +3517401472,3517401855,US +3517401856,3517402111,CA +3517402112,3517403903,US +3517403904,3517404159,CA +3517404160,3517404671,US +3517404672,3517404927,CA +3517404928,3517405183,US +3517405184,3517405439,CA +3517405440,3517405631,US +3517405632,3517405647,CA +3517405648,3517405695,US +3517405696,3517406463,CA +3517406464,3517407231,US +3517407232,3517407359,CA +3517407360,3517407743,US +3517407744,3517408255,CA +3517408256,3517408959,US +3517408960,3517408975,CA +3517408976,3517409007,US +3517409008,3517409279,CA +3517409280,3517409791,US +3517409792,3517410815,CA +3517410816,3517411327,US +3517411328,3517411583,CA +3517411584,3517413119,US +3517413120,3517414399,CA +3517414400,3517414751,US +3517414752,3517414767,CA +3517414768,3517415167,US +3517415168,3517415423,CA +3517415424,3517416527,US +3517416528,3517416543,CA +3517416544,3517416655,US +3517416656,3517416687,CA +3517416688,3517416903,US +3517416904,3517416911,CA +3517416912,3517416959,US +3517416960,3517417471,CA +3517417472,3517417599,US +3517417600,3517417631,CA +3517417632,3517418303,US +3517418304,3517418335,CA +3517418336,3517419295,US +3517419296,3517419391,CA +3517419392,3517419423,US +3517419424,3517419775,CA +3517419776,3517420031,US +3517420032,3517420159,CA +3517420160,3517423871,US +3517423872,3517424127,CA +3517424128,3517424607,US +3517424608,3517424623,CA +3517424624,3517428991,US +3517428992,3517429247,CA +3517429248,3517429887,US +3517429888,3517429919,CA +3517429920,3517430223,US +3517430224,3517430239,CA +3517430240,3517432319,US +3517432320,3517432575,CA +3517432576,3517434111,US +3517434112,3517434367,CA +3517434368,3517434447,US +3517434448,3517434455,CA +3517434456,3517435583,US +3517435584,3517435647,CA +3517435648,3517438879,US +3517438880,3517438911,KW +3517438912,3517439423,US +3517439424,3517439487,CA +3517439488,3517439999,US +3517440000,3517440255,CA +3517440256,3517440511,US +3517440512,3517441535,CA +3517441536,3517441791,US +3517441792,3517442047,CA +3517442048,3517442527,US +3517442528,3517442543,CA +3517442544,3517442751,US +3517442752,3517443071,CA +3517443072,3517443327,US +3517443328,3517443583,CA +3517443584,3517443839,US +3517443840,3517443903,CA +3517443904,3517444031,US +3517444032,3517444095,CA +3517444096,3517445631,US +3517445632,3517445887,CA +3517445888,3517446015,US +3517446016,3517446143,CA +3517446144,3517447423,US +3517447424,3517447679,CA +3517447680,3517447743,US +3517447744,3517447759,CA +3517447760,3517447927,US +3517447928,3517448191,CA +3517448192,3517546495,US +3517546496,3517562879,CA +3517562880,3517596671,US +3517596672,3517597183,SE +3517597184,3517597695,US +3517597696,3517600767,SE +3517600768,3517601279,US +3517601280,3517602047,SE +3517602048,3517602303,DE +3517602304,3517603071,SE +3517603072,3517603327,US +3517603328,3517605119,SE +3517605120,3517605375,US +3517605376,3517605775,SE +3517605776,3517605791,US +3517605792,3517605887,SE +3517605888,3517606143,US +3517606144,3517606911,SE +3517606912,3517607935,US +3517607936,3517608191,SE +3517608192,3517608447,US +3517608448,3517608703,GB +3517608704,3517612031,SE +3517612032,3517644799,US +3517644800,3517710335,CA +3517710336,3517718527,US +3517718528,3517726719,CA +3517726720,3517989487,US +3517989488,3517989503,CA +3517989504,3517989695,US +3517989696,3517989727,CA +3517989728,3517990023,US +3517990024,3517990031,CA +3517990032,3517990911,US +3517990912,3517991423,CA +3517991424,3518056447,US +3518062592,3518066687,CA +3518066688,3518431231,US +3518431232,3518439423,CA +3518439424,3518463999,US +3518464000,3518472191,CA +3518472192,3518758911,US +3518758912,3518758975,CY +3518758976,3518759407,US +3518759408,3518759423,CY +3518759424,3518760511,US +3518760512,3518760575,AU +3518760576,3518760703,HU +3518760704,3518762495,US +3518762496,3518762751,GB +3518762752,3518764671,US +3518764672,3518764703,NL +3518764704,3518765311,US +3518765312,3518765567,CA +3518765568,3518766879,US +3518766880,3518766911,TH +3518766912,3518894439,US +3518894440,3518894447,TR +3518894448,3518911743,US +3518911744,3518911999,GB +3518912000,3518912511,US +3518912512,3518912767,IN +3518912768,3518929535,US +3518929536,3518929599,CA +3518929600,3519234047,US +3519234048,3519250431,CA +3519250432,3519340543,US +3519340544,3519344639,CA +3519344640,3519381503,US +3519381504,3519397887,CA +3519397888,3519406503,US +3519406504,3519406511,CA +3519406512,3519409295,US +3519409296,3519409303,CA +3519409304,3519676415,US +3519676416,3519702319,CA +3519702320,3519702327,US +3519702328,3519709183,CA +3519709184,3519709311,US +3519709312,3519709343,CA +3519709344,3519712447,US +3519712448,3519712511,CA +3519712512,3519715295,US +3519715296,3519715327,GB +3519715328,3519716863,US +3519716864,3519716991,CA +3519716992,3519741951,US +3519758336,3519791103,US +3519799296,3519873023,US +3519873024,3519901695,CA +3519901696,3519934463,US +3519934464,3519938559,CA +3519938560,3520020479,US +3520020480,3520036863,CA +3520036864,3520356351,US +3520364544,3520368639,US +3520372736,3520430079,US +3520438272,3520454655,US +3520454656,3520462847,CA +3520462848,3520626687,US +3520626688,3520634879,CA +3520634880,3520675839,US +3520675840,3520692223,CA +3520692224,3520749871,US +3520749872,3520749879,CA +3520749880,3520937983,US +3520937984,3520954367,CA +3520954368,3520987135,US +3520995328,3520999423,US +3520999424,3521003519,CA +3521003520,3521028095,US +3521028096,3521032191,CA +3521036288,3521044479,US +3521044480,3521048575,CA +3521048576,3521074735,US +3521074736,3521074751,AU +3521074752,3521086207,US +3521086208,3521086463,AU +3521086464,3521098551,US +3521098552,3521098559,MX +3521098560,3521103231,US +3521103232,3521103263,CA +3521103264,3521106527,US +3521106528,3521106543,CA +3521106544,3521186623,US +3521186624,3521186687,AR +3521186688,3521192703,US +3521192704,3521192735,FR +3521192736,3521249279,US +3521249280,3521314815,CA +3521314816,3521904639,US +3521904640,3521921023,JM +3521937408,3522101247,US +3522101248,3522109439,CA +3522109440,3522121983,US +3522121984,3522122239,AW +3522122240,3522132991,US +3522132992,3522133247,RU +3522133248,3522142207,US +3522150400,3522174975,US +3522174976,3522179071,BM +3522179072,3522195455,US +3522195456,3522199551,CA +3522199552,3522854911,US +3522854912,3522871295,CA +3522871296,3522893823,US +3522895872,3522937855,US +3522937856,3522938367,GB +3522938368,3523215359,US +3523215360,3523223551,AU +3523223552,3523231743,KR +3523231744,3523248127,AU +3523248128,3523280895,HK +3523280896,3523297279,TH +3523297280,3523317759,PH +3523317760,3523330047,JP +3523330048,3523342335,AU +3523342336,3523346431,BD +3523346432,3523354623,CN +3523354624,3523362815,KR +3523362816,3523379199,AU +3523379200,3523395583,PK +3523395584,3523411967,JP +3523411968,3523477503,HK +3523477504,3523493887,PH +3523493888,3523497983,BD +3523497984,3523500031,AU +3523500032,3523502079,KR +3523502080,3523510271,PH +3523510272,3523518463,TH +3523518464,3523526655,JP +3523526656,3523530751,US +3523530752,3523532799,NZ +3523532800,3523534847,KR +3523534848,3523538943,AU +3523538944,3523543039,JP +3523543040,3523551231,CN +3523551232,3523553279,AU +3523553280,3523555327,MY +3523555328,3523557375,NZ +3523557376,3523559423,AU +3523559424,3523575807,PH +3523575808,3523579903,AU +3523579904,3523583999,CN +3523584000,3523592479,HK +3523592480,3523592495,YE +3523592496,3523592511,HK +3523592512,3523592575,PK +3523592576,3523592703,LB +3523592704,3523592735,HK +3523592736,3523592751,AF +3523592752,3523593215,HK +3523593216,3523593231,KW +3523593232,3523593239,AE +3523593240,3523593279,HK +3523593280,3523593343,IR +3523593344,3523593535,HK +3523593536,3523593599,IR +3523593600,3523593743,HK +3523593744,3523593751,IQ +3523593752,3523593759,HK +3523593760,3523593767,IR +3523593768,3523593775,HK +3523593776,3523593791,IQ +3523593792,3523593807,IR +3523593808,3523593823,HK +3523593824,3523593951,IR +3523593952,3523593959,HK +3523593960,3523593983,IQ +3523593984,3523594239,PK +3523594240,3523595263,IN +3523595264,3523595391,IR +3523595392,3523595519,PK +3523595520,3523595583,IR +3523595584,3523595591,HK +3523595592,3523595599,KE +3523595600,3523595631,IQ +3523595632,3523595647,LB +3523595648,3523596287,PK +3523596288,3523596351,IR +3523596352,3523596359,HK +3523596360,3523596375,PK +3523596376,3523596415,HK +3523596416,3523596671,IR +3523596672,3523596735,PK +3523596736,3523596751,IN +3523596752,3523596759,US +3523596760,3523596767,HK +3523596768,3523596775,IN +3523596776,3523596783,HK +3523596784,3523596791,PK +3523596792,3523596815,HK +3523596816,3523596831,IQ +3523596832,3523596863,HK +3523596864,3523596927,IQ +3523596928,3523597127,PK +3523597128,3523597311,HK +3523597312,3523597567,AE +3523597568,3523597823,PK +3523597824,3523597951,TZ +3523597952,3523597959,HK +3523597960,3523597983,IQ +3523597984,3523597991,KZ +3523597992,3523597999,US +3523598000,3523598015,HK +3523598016,3523598079,IR +3523598080,3523598207,TZ +3523598208,3523598335,HK +3523598336,3523598591,AE +3523598592,3523598847,PK +3523598848,3523598911,HK +3523598912,3523599103,IR +3523599104,3523599359,AE +3523599360,3523599615,HK +3523599616,3523599623,PK +3523599624,3523599631,HK +3523599632,3523599647,PK +3523599648,3523599871,HK +3523599872,3523600383,AE +3523600384,3523600895,HK +3523600896,3523601151,AF +3523601152,3523602431,HK +3523602432,3523602559,IR +3523602560,3523602687,TR +3523602688,3523602879,IR +3523602880,3523602895,IQ +3523602896,3523602903,HK +3523602904,3523602943,IQ +3523602944,3523603207,HK +3523603208,3523603247,IQ +3523603248,3523603255,HK +3523603256,3523603263,IQ +3523603264,3523603279,HK +3523603280,3523603311,IQ +3523603312,3523603319,HK +3523603320,3523603343,IQ +3523603344,3523603383,HK +3523603384,3523603415,IQ +3523603416,3523603495,HK +3523603496,3523603503,IQ +3523603504,3523603535,HK +3523603536,3523603559,IQ +3523603560,3523603575,HK +3523603576,3523603583,IQ +3523603584,3523603607,HK +3523603608,3523603615,IQ +3523603616,3523603647,HK +3523603648,3523603663,IQ +3523603664,3523603679,HK +3523603680,3523603695,IQ +3523603696,3523603703,HK +3523603704,3523603711,IQ +3523603712,3523604223,HK +3523604224,3523604479,AE +3523604480,3523604991,HK +3523604992,3523605503,AE +3523605504,3523606015,HK +3523606016,3523606527,AE +3523606528,3523608319,HK +3523608320,3523608575,QA +3523608576,3523674111,HK +3523674112,3523682303,FJ +3523682304,3523686399,NZ +3523686400,3523690495,AU +3523690496,3523698687,IN +3523698688,3523698863,HK +3523698864,3523698879,AU +3523698880,3523698943,HK +3523698944,3523698975,AU +3523698976,3523699007,HK +3523699008,3523699071,AU +3523699072,3523699199,HK +3523699200,3523699711,US +3523699712,3523700223,AU +3523700224,3523700287,US +3523700288,3523700351,AU +3523700352,3523700415,US +3523700416,3523700671,AU +3523700672,3523700679,HK +3523700680,3523700735,AU +3523700736,3523701759,HK +3523701760,3523702783,AU +3523702784,3523702799,SG +3523702800,3523702807,SN +3523702808,3523702847,SG +3523702848,3523702871,AU +3523702872,3523702911,SG +3523702912,3523703039,AU +3523703040,3523703103,SG +3523703104,3523704703,AU +3523704704,3523704719,SG +3523704720,3523704751,AU +3523704752,3523704783,SG +3523704784,3523704791,AU +3523704792,3523704831,SG +3523704832,3523704839,HK +3523704840,3523707135,AU +3523707136,3523707903,GB +3523707904,3523713279,AU +3523713280,3523713535,NL +3523713536,3523714943,AU +3523714944,3523715007,GB +3523715008,3523723263,AU +3523723264,3523725311,US +3523725312,3523731455,AU +3523731456,3523731503,JP +3523731504,3523731519,AU +3523731520,3523731567,JP +3523731568,3523731583,AU +3523731584,3523731615,JP +3523731616,3523737599,AU +3523737600,3523738111,US +3523738112,3523739135,AU +3523739136,3523739455,JP +3523739456,3523739519,AU +3523739520,3523739551,JP +3523739552,3523739575,AU +3523739576,3523739647,JP +3523739648,3524001791,AU +3524001792,3524132863,CN +3524132864,3524145151,PH +3524145152,3524149247,JP +3524149248,3524157439,CN +3524157440,3524161535,AU +3524161536,3524247551,CN +3524247552,3524263935,AU +3524263936,3524266495,PH +3524266496,3524266751,SG +3524266752,3524274175,PH +3524274176,3524274431,SG +3524274432,3524296703,PH +3524296704,3524313087,CN +3524313088,3524329471,KR +3524329472,3524362239,TW +3524362240,3524395007,HK +3524395008,3524444159,IN +3524444160,3524460543,AU +3524460544,3524526079,MY +3524526080,3524591615,JP +3524591616,3524722687,CN +3524722688,3524730879,SG +3524730880,3524739071,CN +3524739072,3524743167,ID +3524743168,3524747263,MP +3524747264,3524755455,PH +3524755456,3524763647,AU +3524763648,3524781791,PH +3524781792,3524781823,SG +3524781824,3524788223,PH +3524788224,3524853759,SG +3524853760,3525300739,CN +3525300740,3525300743,US +3525300744,3526361087,CN +3526361088,3526393855,NZ +3526393856,3526395903,JP +3526395904,3526397951,KH +3526397952,3526402047,MY +3526402048,3526410239,NZ +3526410240,3526414335,MY +3526414336,3526416383,AU +3526416384,3526418431,MY +3526418432,3526426623,JP +3526426624,3526557695,AU +3526557696,3526754303,CN +3526754304,3526885375,NZ +3526885376,3526893567,PK +3526893568,3526897663,NZ +3526897664,3526901759,HK +3526901760,3526909951,AU +3526909952,3526918143,IN +3526918144,3526922239,SG +3526922240,3526924287,BD +3526924288,3526926335,AU +3526926336,3526934527,JP +3526934528,3526942719,CN +3526942720,3526950911,AU +3526950912,3527004159,JP +3527004160,3527008255,ID +3527008256,3527016447,KR +3527016448,3527933951,TW +3527933952,3528392703,CN +3528392704,3528396799,JP +3528396800,3528400895,AU +3528400896,3528404991,JP +3528404992,3528407039,NZ +3528407040,3528409087,AU +3528409088,3528425471,CN +3528425472,3528445951,JP +3528445952,3528450047,ID +3528450048,3528458239,CN +3528458240,3528464895,AU +3528464896,3528465151,HK +3528465152,3528474623,AU +3528474624,3528482815,TW +3528482816,3528491007,KR +3528491008,3528505007,AU +3528505008,3528505023,HK +3528505024,3528506543,AU +3528506544,3528506559,NZ +3528506560,3528507391,AU +3528507392,3528589311,JP +3528589312,3528720383,CN +3528720384,3528785919,AU +3528785920,3528851455,TW +3528851456,3528884223,NZ +3528884224,3528908799,TH +3528908800,3528912895,VN +3528912896,3528933375,AU +3528933376,3528949759,JP +3528949760,3528966143,CN +3528966144,3528974335,KR +3528974336,3528978431,JP +3528978432,3528982527,HK +3528982528,3529011135,JP +3529011136,3529011151,NZ +3529011152,3529056255,JP +3529056256,3529064447,IN +3529064448,3529071935,HK +3529071936,3529071999,US +3529072000,3529072639,HK +3529072640,3529080831,JP +3529080832,3529089023,AU +3529089024,3529097215,KR +3529097216,3529113599,JP +3529113600,3531603967,KR +3531603968,3534749695,JP +3534749696,3534757887,HK +3534757888,3534757951,IN +3534757952,3534757983,HK +3534757984,3534761023,IN +3534761024,3534761119,HK +3534761120,3534761983,IN +3534761984,3534880767,HK +3534880768,3535273983,KR +3535273984,3535339519,HK +3535339520,3535355903,NZ +3535355904,3535372287,AU +3535372288,3535380479,JP +3535380480,3535388671,PH +3535388672,3535405055,CN +3535405056,3535480703,MY +3535480704,3535480831,TH +3535480832,3535536127,MY +3535536128,3535798271,JP +3535798272,3535814655,TW +3535814656,3535822847,KR +3535822848,3535831039,CN +3535831040,3535863807,TW +3535863808,3535880191,SG +3535880192,3535896575,JP +3535896576,3535929343,AU +3535929344,3535994879,JP +3535994880,3536060415,MY +3536060416,3536322559,JP +3536322560,3536551935,TW +3536551936,3536568319,TH +3536568320,3536584703,JP +3536584704,3536846847,KR +3536846848,3536928767,TW +3536928768,3536945151,HK +3536945152,3536977919,TW +3536977920,3537010687,IN +3537010688,3537027071,ID +3537027072,3537043455,KR +3537043456,3537047551,AU +3537047552,3537049599,ID +3537049600,3537051647,HK +3537051648,3537057791,JP +3537057792,3537076223,AU +3537076224,3537174527,IN +3537174528,3537190911,TH +3537190912,3537240063,PH +3537240064,3537305599,IN +3537305600,3537371135,AU +3537371136,3537895423,KR +3537895424,3538943999,JP +3538944000,3539271679,TW +3539271680,3539304447,VN +3539304448,3539337215,HK +3539337216,3539353599,NZ +3539353600,3539402751,TH +3539402752,3539435519,JP +3539435520,3539468287,AU +3539468288,3541303295,JP +3541303296,3541565439,TW +3541565440,3541696511,MY +3541696512,3542089727,AU +3542089728,3544186879,KR +3544186880,3544711167,CN +3544711168,3545235455,TW +3545235456,3546808319,CN +3546808320,3547856895,KR +3547856896,3548905471,JP +3548905472,3551002623,CN +3551002624,3554544607,KR +3554544608,3554544639,DE +3554544640,3556769791,KR +3556769792,3556774399,DE +3556786176,3556794367,RU +3556794368,3556795647,ES +3556795648,3556795679,IT +3556795680,3556802559,ES +3556810752,3556818943,PT +3556818944,3556827135,MD +3556827136,3556843519,NL +3556843520,3556847935,DE +3556847936,3556847967,US +3556847968,3556851711,DE +3556851712,3556868095,UA +3556868096,3556876287,GB +3556876288,3556884479,NL +3556884480,3556900863,RU +3556900864,3556909055,GB +3556909056,3556925439,DE +3556925440,3556933631,PL +3556933632,3556941823,UA +3556941824,3556950015,IE +3556950016,3556958207,TR +3556958208,3556966399,KG +3556966400,3556974591,SE +3556974592,3556982783,ES +3556982784,3556990975,DE +3556990976,3556999167,UA +3556999168,3557007359,RU +3557007360,3557015551,GB +3557015552,3557023743,DE +3557023744,3557023879,BE +3557023880,3557023903,GB +3557023904,3557023999,BE +3557024000,3557024255,GB +3557024256,3557025279,BE +3557025280,3557025791,GB +3557025792,3557026047,BE +3557026048,3557026303,GB +3557026304,3557026815,BE +3557026816,3557027071,GB +3557027072,3557027839,BE +3557027840,3557027863,GB +3557027864,3557027871,BE +3557027872,3557027887,GB +3557027888,3557028031,BE +3557028032,3557028063,GB +3557028064,3557028095,BE +3557028096,3557028351,GB +3557028352,3557028735,BE +3557028736,3557028799,GB +3557028800,3557028911,BE +3557028912,3557028927,GB +3557028928,3557029059,BE +3557029060,3557029071,GB +3557029072,3557029567,BE +3557029568,3557029631,GB +3557029632,3557030079,BE +3557030080,3557030143,GB +3557030144,3557030719,BE +3557030720,3557030751,GB +3557030752,3557030767,BE +3557030768,3557030783,GB +3557030784,3557030975,BE +3557030976,3557031039,GB +3557031040,3557031423,BE +3557031424,3557031679,GB +3557031680,3557031807,BE +3557031808,3557031935,GB +3557031936,3557033575,IT +3557033576,3557033583,GB +3557033584,3557034143,IT +3557034144,3557034175,GB +3557034176,3557040127,IT +3557040128,3557048319,NO +3557048320,3557056511,CH +3557056512,3557064703,ES +3557064704,3557072895,CZ +3557072896,3557081087,DE +3557081088,3557086015,NL +3557086016,3557086047,DE +3557086048,3557086079,GB +3557086080,3557086719,NL +3557086720,3557086783,CH +3557086784,3557086847,IT +3557086848,3557089279,NL +3557089280,3557105663,DE +3557105664,3557110783,BG +3557110784,3557112575,RS +3557112576,3557113855,BG +3557113856,3557130239,RU +3557130240,3557138431,BG +3557138432,3557146623,RU +3557146624,3557154815,SK +3557154816,3557171199,RU +3557171200,3557172991,IR +3557172992,3557173503,IQ +3557173504,3557173631,IR +3557173632,3557173695,IQ +3557173696,3557173703,AE +3557173704,3557173759,IT +3557173760,3557174015,IR +3557174016,3557174527,IQ +3557174528,3557174783,IR +3557174784,3557175039,AE +3557175040,3557176127,IR +3557176128,3557176319,IT +3557176320,3557176619,NE +3557176620,3557176831,IT +3557176832,3557177023,IQ +3557177024,3557177199,IT +3557177200,3557177215,IR +3557177216,3557178367,IT +3557178368,3557179391,IR +3557179392,3557213351,DE +3557213352,3557213359,US +3557213360,3557228543,DE +3557228544,3557236735,EE +3557236736,3557244927,ES +3557244928,3557253119,IT +3557253120,3557261311,AT +3557261312,3557277695,DE +3557277696,3557285887,BG +3557285888,3557294079,RU +3557294080,3557302271,DE +3557302272,3557310463,UA +3557310464,3557326847,ES +3557326848,3557335039,DE +3557335040,3557335391,BE +3557335456,3557335535,BE +3557335552,3557335967,BE +3557336000,3557336191,BE +3557336256,3557336639,BE +3557338112,3557338367,BE +3557338496,3557339135,BE +3557339152,3557339175,BE +3557339184,3557339199,BE +3557339216,3557339223,BE +3557339232,3557339267,BE +3557339272,3557340159,BE +3557340192,3557340927,BE +3557341184,3557341455,BE +3557341472,3557341527,BE +3557341536,3557341567,BE +3557341632,3557341679,BE +3557341952,3557342479,BE +3557342496,3557342511,BE +3557342528,3557342543,BE +3557342560,3557342623,BE +3557342720,3557343231,BE +3557343232,3557351423,DE +3557351424,3557359615,RU +3557359616,3557365439,GB +3557365440,3557365503,JE +3557365504,3557367807,GB +3557367808,3557375999,DE +3557376000,3557384191,ES +3557384192,3557392383,GB +3557392384,3557400575,AT +3557400576,3557408767,DE +3557408768,3557416959,GB +3557416960,3557425151,UA +3557425152,3557490687,DK +3557490688,3557507071,FR +3557507072,3557515263,GB +3557515264,3557523455,CZ +3557523456,3557531647,RU +3557531648,3557539839,SA +3557539840,3557548031,SY +3557548032,3557556223,DE +3557556224,3557564415,RU +3557564416,3557570319,DE +3557570320,3557570335,ES +3557570336,3557571295,DE +3557571296,3557571315,GB +3557571316,3557572607,DE +3557572608,3557580799,RU +3557580800,3557584287,DE +3557584288,3557584319,GB +3557584320,3557585151,DE +3557585152,3557585279,CH +3557585280,3557585695,DE +3557585696,3557585711,CH +3557585712,3557585887,DE +3557585888,3557585903,CH +3557585904,3557588991,DE +3557588992,3557597183,TR +3557597184,3557597711,SA +3557597712,3557597719,AS +3557597720,3557605375,SA +3557605376,3557613567,LT +3557621760,3557629951,RU +3557629952,3557638143,PT +3557638144,3557646335,MK +3557646336,3557654527,RU +3557654528,3557670911,KZ +3557670912,3557679103,GB +3557679104,3557687295,SI +3557687296,3557703679,PL +3557703680,3557711871,DE +3557711872,3557720063,ES +3557720064,3557728255,IT +3557728256,3557744639,RU +3557744640,3557752831,PS +3557752832,3557761023,TR +3557761024,3557769215,RU +3557769216,3557777407,GB +3557777408,3557785599,RU +3557785600,3557793791,UA +3557793792,3557801983,HR +3557801984,3557810175,DE +3557810176,3557818367,ES +3557818368,3557826559,RU +3557826560,3557834751,AT +3557834752,3557842943,IR +3557842944,3557851135,FI +3557851136,3557859327,HU +3557859328,3557867519,SE +3557867520,3557875711,RU +3557875712,3557883903,DE +3557883904,3557892095,RU +3557892096,3557900287,IE +3557900288,3557916671,AT +3557916672,3557924863,NO +3557924864,3557933055,FI +3557933056,3557941247,IT +3557941248,3557945183,DE +3557945184,3557945199,GB +3557945200,3557957631,DE +3557957632,3557960975,SI +3557960976,3557960983,AE +3557960984,3557961375,SI +3557961376,3557961407,AE +3557961408,3557965823,SI +3557965824,3557974015,DE +3557974016,3557982207,CH +3557982208,3557990399,NO +3557990400,3557998591,PT +3557998592,3558006783,DE +3558006784,3558014975,GB +3558014976,3558023167,RU +3558023168,3558023199,GB +3558023200,3558030655,DE +3558030656,3558030659,LI +3558030660,3558031359,DE +3558031360,3558039551,GB +3558039552,3558047743,IT +3558047744,3558055935,KZ +3558055936,3558064127,FR +3558064128,3558067839,NL +3558067840,3558067855,US +3558067856,3558080511,NL +3558080512,3558096895,RU +3558096896,3558113279,CZ +3558113280,3558114767,DE +3558114768,3558114775,FR +3558114776,3558122767,DE +3558122768,3558122783,CH +3558122784,3558129663,DE +3558129664,3558137855,NO +3558137856,3558146047,GB +3558154240,3558154367,NG +3558154368,3558154495,SD +3558154496,3558154623,MZ +3558154624,3558154751,CI +3558154752,3558154879,CM +3558154880,3558155007,SD +3558155008,3558155135,DE +3558155136,3558155263,SD +3558155264,3558155391,ET +3558155392,3558155519,DE +3558155520,3558156031,SD +3558156032,3558156032,DE +3558156033,3558156287,KG +3558156288,3558170623,DE +3558170624,3558178815,GB +3558178816,3558187007,BG +3558187008,3558195199,DE +3558195200,3558195455,BE +3558195456,3558196031,ES +3558196032,3558196047,IT +3558196048,3558196095,ES +3558196096,3558196127,IT +3558196128,3558196159,ES +3558196160,3558196167,IT +3558196168,3558196175,ES +3558196176,3558196191,IT +3558196192,3558196199,ES +3558196200,3558196271,IT +3558196272,3558196351,ES +3558196352,3558196355,IT +3558196356,3558196359,ES +3558196360,3558196415,IT +3558196416,3558196479,ES +3558196480,3558196495,IT +3558196496,3558196527,ES +3558196528,3558196607,IT +3558196608,3558196719,ES +3558196720,3558196727,IT +3558196728,3558196735,ES +3558196736,3558203391,US +3558203392,3558211583,ES +3558211584,3558219775,GB +3558219776,3558227967,ES +3558227968,3558236159,RU +3558236160,3558244351,GB +3558244352,3558252543,IT +3558260736,3558268927,UA +3558268928,3558269439,GB +3558269440,3558269951,GI +3558269952,3558270463,GB +3558270464,3558271231,GI +3558271232,3558271487,GB +3558271488,3558276095,GI +3558276096,3558276863,GB +3558276864,3558277119,GI +3558277120,3558285567,GB +3558285568,3558285599,DE +3558285600,3558285631,GB +3558285632,3558285823,DE +3558285824,3558285951,GB +3558285952,3558286079,DE +3558286080,3558286591,GB +3558286592,3558286655,FR +3558286656,3558286719,GB +3558286720,3558286847,FR +3558286848,3558287679,GB +3558287680,3558287743,BE +3558287744,3558287871,NL +3558287872,3558287935,FR +3558287936,3558287999,IT +3558288000,3558288063,DE +3558288064,3558288127,ES +3558288128,3558288191,AT +3558288192,3558288255,SE +3558288256,3558288319,US +3558288320,3558288383,CH +3558288384,3558288427,US +3558288428,3558288447,GB +3558288448,3558288483,US +3558288484,3558288487,GB +3558288488,3558288639,US +3558288640,3558288671,BE +3558288672,3558288687,DE +3558288688,3558288703,BE +3558288704,3558288719,GB +3558288720,3558288895,BE +3558288896,3558289103,FR +3558289104,3558289119,GB +3558289120,3558289151,FR +3558289152,3558289407,GB +3558289408,3558289663,NL +3558289664,3558289747,IT +3558289748,3558289751,GB +3558289752,3558289919,IT +3558289920,3558290175,CZ +3558290176,3558290431,GB +3558290432,3558290575,BE +3558290576,3558290591,GB +3558290592,3558290615,BE +3558290616,3558290655,GB +3558290656,3558290663,BE +3558290664,3558290671,GB +3558290672,3558290687,BE +3558290688,3558290943,ES +3558290944,3558290959,DE +3558290960,3558290967,NL +3558290968,3558290975,GB +3558290976,3558290991,NL +3558290992,3558291007,DE +3558291008,3558291023,GB +3558291024,3558291031,SE +3558291032,3558291135,DE +3558291136,3558291199,GB +3558291200,3558291215,CH +3558291216,3558291231,AT +3558291232,3558291239,CH +3558291240,3558291247,GB +3558291248,3558291263,CH +3558291264,3558291279,AT +3558291280,3558291311,GB +3558291312,3558291455,CH +3558291456,3558291903,GB +3558291904,3558291967,DE +3558291968,3558292223,GB +3558292224,3558292271,SE +3558292272,3558292287,GB +3558292288,3558292543,NL +3558292544,3558292607,GB +3558292608,3558292735,NL +3558292736,3558292863,GB +3558292864,3558292871,DE +3558292872,3558293503,NL +3558293504,3558301695,RU +3558301696,3558318079,DE +3558318080,3558319889,FR +3558319890,3558319891,ES +3558319892,3558334463,FR +3558334464,3558334935,CH +3558334936,3558334943,FR +3558334944,3558335499,CH +3558335500,3558335503,DE +3558335504,3558335511,CH +3558335512,3558335519,DE +3558335520,3558337515,CH +3558337516,3558337519,ES +3558337520,3558337527,DE +3558337528,3558337783,CH +3558337784,3558337787,DE +3558337788,3558339359,CH +3558339360,3558339367,ES +3558339368,3558339699,CH +3558339700,3558339703,DE +3558339704,3558340039,CH +3558340040,3558340043,DE +3558340044,3558342655,CH +3558342656,3558350847,IT +3558350848,3558359039,RU +3558359040,3558367231,GB +3558367232,3558367271,AT +3558367272,3558367279,GI +3558367280,3558368015,AT +3558368016,3558368031,AR +3558368032,3558368063,CL +3558368064,3558368079,ES +3558368080,3558368095,DE +3558368096,3558368111,US +3558368112,3558368127,GB +3558368128,3558368159,AT +3558368160,3558368191,DE +3558368192,3558368207,US +3558368208,3558368223,GB +3558368224,3558368239,ES +3558368240,3558368255,AR +3558368256,3558368271,AT +3558368272,3558368287,GB +3558368288,3558368319,CL +3558368320,3558368383,AR +3558368384,3558368447,AT +3558368448,3558368479,DE +3558368480,3558368495,ES +3558368496,3558368511,US +3558368512,3558369503,AT +3558369504,3558369511,FR +3558369512,3558372351,AT +3558372352,3558372607,BG +3558372608,3558372735,AT +3558372736,3558372863,ES +3558372864,3558375423,AT +3558375424,3558383615,CZ +3558383616,3558391807,HU +3558391808,3558399999,LU +3558400000,3558408191,SA +3558408192,3558416383,CH +3558416384,3558424575,BG +3558424576,3558440959,IL +3558440960,3558449151,ES +3558449152,3558457343,IT +3558457344,3558457407,BE +3558457408,3558457599,GB +3558457600,3558457727,FR +3558457728,3558465535,NL +3558465536,3558473727,GB +3558473728,3558506495,SA +3558506496,3558514687,UA +3558514688,3558522879,SK +3558522880,3558531071,NL +3558531072,3558539263,RU +3558539264,3558543359,SE +3558543360,3558547455,DK +3558547456,3558555647,FR +3558555648,3558572031,AT +3558572032,3558579839,DE +3558579840,3558579871,GB +3558579872,3558580223,DE +3558580224,3558581119,CH +3558581120,3558581151,DE +3558581152,3558581423,CH +3558581424,3558581439,DE +3558581440,3558586303,CH +3558586304,3558586335,NL +3558586336,3558588415,CH +3558588416,3558596607,CZ +3558596608,3558604799,EE +3558604800,3558612991,GB +3558612992,3558621183,DE +3558621184,3558629375,RU +3558629376,3558637567,DE +3558637568,3558645759,CH +3558645760,3558653951,IT +3558653952,3558662143,SE +3558662144,3558670335,LB +3558670336,3558686719,DE +3558686720,3558703103,TR +3558703104,3558711295,IT +3558711296,3558719487,NL +3558719488,3558735871,IL +3558735872,3558744063,GB +3558744064,3558752255,LB +3558752256,3558760447,SI +3558760448,3558768639,FR +3558768640,3558785023,RU +3558785024,3558801407,IS +3558801408,3558809599,TR +3558809600,3558817791,ES +3558817792,3558821655,AT +3558821656,3558821663,DE +3558821664,3558821795,AT +3558821796,3558821799,DE +3558821800,3558821823,AT +3558821824,3558821831,DE +3558821832,3558825983,AT +3558825984,3558832383,CY +3558832384,3558832639,LB +3558832640,3558834175,CY +3558834176,3558842367,FR +3558842368,3558850559,SE +3558850560,3558850815,ES +3558850816,3558851327,US +3558851328,3558851359,ES +3558851360,3558851391,GB +3558851392,3558851471,ES +3558851472,3558851479,NO +3558851480,3558851807,ES +3558851808,3558851815,PT +3558851816,3558852095,ES +3558852096,3558852607,GB +3558852608,3558852863,DE +3558852864,3558853119,ES +3558853120,3558853375,BE +3558853376,3558853399,ES +3558853400,3558853407,DE +3558853408,3558853439,ES +3558853440,3558853455,DE +3558853456,3558853463,ES +3558853464,3558853467,DE +3558853468,3558853503,ES +3558853504,3558853511,DE +3558853512,3558853535,ES +3558853536,3558853547,DE +3558853548,3558853615,ES +3558853616,3558853631,DE +3558853632,3558854655,ES +3558854656,3558854911,US +3558854912,3558854975,ES +3558854976,3558855039,US +3558855040,3558855167,GB +3558855168,3558855183,US +3558855184,3558855423,ES +3558855424,3558855431,NL +3558855432,3558855935,ES +3558855936,3558856191,US +3558856192,3558856575,GB +3558856576,3558856639,ES +3558856640,3558856703,NL +3558856704,3558858751,US +3558858752,3558866943,IT +3558866944,3558899711,GB +3558899712,3558916095,SE +3558916096,3558924287,RU +3558924288,3558932479,NL +3558932480,3558940671,RU +3558940672,3558948863,AT +3558948864,3558957055,PL +3558957056,3558965247,PS +3558965248,3558973439,NO +3558973440,3558981631,SA +3558981632,3558989823,IR +3558989824,3558998015,RU +3558998016,3559006207,JO +3559006208,3559014399,RU +3559014400,3559016191,DE +3559016192,3559016207,GB +3559016208,3559022591,DE +3559022592,3559030783,RU +3559030784,3559038720,ES +3559038721,3559038975,US +3559038976,3559047167,DE +3559047168,3559055359,IT +3559055360,3559063551,AM +3559063552,3559079935,CH +3559079936,3559088127,JO +3559088128,3559088283,BE +3559088284,3559088287,GB +3559088288,3559088367,BE +3559088368,3559088371,GB +3559088372,3559088919,BE +3559088920,3559088927,GB +3559088928,3559089055,BE +3559089056,3559089063,DE +3559089064,3559089143,BE +3559089144,3559089151,GB +3559089152,3559089159,BE +3559089160,3559089167,GB +3559089168,3559089175,BE +3559089176,3559089215,GB +3559089216,3559089303,BE +3559089304,3559089311,GB +3559089312,3559089327,BE +3559089328,3559089343,GB +3559089344,3559089563,BE +3559089564,3559089567,GB +3559089568,3559089583,BE +3559089584,3559089599,GB +3559089600,3559089607,BE +3559089608,3559089611,GB +3559089612,3559089663,BE +3559089664,3559089919,GB +3559089920,3559089983,BE +3559089984,3559090047,GB +3559090048,3559090071,BE +3559090072,3559090079,NL +3559090080,3559090175,BE +3559090176,3559090191,GB +3559090192,3559090223,BE +3559090224,3559090239,GB +3559090240,3559090519,BE +3559090520,3559090527,GB +3559090528,3559090815,BE +3559090816,3559090823,GB +3559090824,3559090895,BE +3559090896,3559090899,GB +3559090900,3559090919,BE +3559090920,3559090927,GB +3559090928,3559091111,BE +3559091112,3559091115,GB +3559091116,3559091131,BE +3559091132,3559091151,GB +3559091152,3559091223,BE +3559091224,3559091231,GB +3559091232,3559091239,BE +3559091240,3559091247,GB +3559091248,3559091327,BE +3559091328,3559091391,GB +3559091392,3559091399,BE +3559091400,3559091407,GB +3559091408,3559091423,BE +3559091424,3559091427,GB +3559091428,3559091507,BE +3559091508,3559091511,GB +3559091512,3559091519,BE +3559091520,3559091535,GB +3559091536,3559091583,BE +3559091584,3559091615,GB +3559091616,3559091631,BE +3559091632,3559091635,GB +3559091636,3559091791,BE +3559091792,3559091807,GB +3559091808,3559092159,BE +3559092160,3559092160,GB +3559092161,3559092222,BE +3559092223,3559092223,GB +3559092224,3559092239,BE +3559092240,3559092247,GB +3559092248,3559092287,BE +3559092288,3559092295,GB +3559092296,3559092311,BE +3559092312,3559092351,GB +3559092352,3559092367,BE +3559092368,3559092383,GB +3559092384,3559092447,BE +3559092448,3559092463,GB +3559092464,3559092471,BE +3559092472,3559092739,GB +3559092740,3559092783,BE +3559092784,3559092791,GB +3559092792,3559092855,BE +3559092856,3559092863,GB +3559092864,3559092879,BE +3559092880,3559092895,GB +3559092896,3559092959,BE +3559092960,3559092975,GB +3559092976,3559093007,BE +3559093008,3559093015,GB +3559093016,3559093019,BE +3559093020,3559093023,GB +3559093024,3559093083,BE +3559093084,3559093087,GB +3559093088,3559093135,BE +3559093136,3559093159,GB +3559093160,3559093247,BE +3559093248,3559093263,GB +3559093264,3559093299,BE +3559093300,3559093303,GB +3559093304,3559093311,BE +3559093312,3559093319,GB +3559093320,3559093351,BE +3559093352,3559093355,GB +3559093356,3559093567,BE +3559093568,3559093599,GB +3559093600,3559093671,BE +3559093672,3559093675,GB +3559093676,3559093679,BE +3559093680,3559093695,GB +3559093696,3559093759,BE +3559093760,3559093975,GB +3559093976,3559094071,BE +3559094072,3559094079,GB +3559094080,3559094087,BE +3559094088,3559094095,GB +3559094096,3559094103,BE +3559094104,3559094111,GB +3559094112,3559094151,BE +3559094152,3559094159,GB +3559094160,3559094183,BE +3559094184,3559094191,GB +3559094192,3559094415,BE +3559094416,3559094431,GB +3559094432,3559094527,BE +3559094528,3559095039,GB +3559095040,3559095063,BE +3559095064,3559095071,GB +3559095072,3559095119,BE +3559095120,3559095135,GB +3559095136,3559095263,BE +3559095264,3559095303,GB +3559095304,3559095351,BE +3559095352,3559095359,GB +3559095360,3559095423,BE +3559095424,3559095455,GB +3559095456,3559095487,BE +3559095488,3559095551,GB +3559095552,3559095575,BE +3559095576,3559095583,GB +3559095584,3559095591,BE +3559095592,3559095623,GB +3559095624,3559095631,BE +3559095632,3559095647,GB +3559095648,3559095767,BE +3559095768,3559095775,GB +3559095776,3559096087,BE +3559096088,3559096103,GB +3559096104,3559096123,BE +3559096124,3559096127,GB +3559096128,3559096215,BE +3559096216,3559096223,NL +3559096224,3559096247,BE +3559096248,3559096251,GB +3559096252,3559096255,BE +3559096256,3559096319,GB +3559096320,3559103231,RO +3559103232,3559103487,GB +3559103488,3559104511,RO +3559104512,3559112703,UA +3559112704,3559120895,IT +3559120896,3559129087,GB +3559129088,3559137279,BG +3559137280,3559145471,GB +3559145472,3559153663,ES +3559153664,3559177215,GB +3559177216,3559177471,DE +3559177472,3559177727,GB +3559177728,3559178239,DE +3559178240,3559186431,LB +3559186432,3559194623,RU +3559194624,3559202815,SE +3559202816,3559211007,DE +3559211008,3559219199,GR +3559219200,3559227391,SE +3559227392,3559235583,DK +3559235584,3559243775,DE +3559243776,3559251967,FR +3559251968,3559260159,NO +3559260160,3559268351,DE +3559268352,3559276543,IT +3559276544,3559284735,GB +3559284736,3559284895,RU +3559284896,3559284911,UA +3559284912,3559288175,RU +3559288176,3559288191,UA +3559288192,3559288207,AZ +3559288208,3559288575,RU +3559288576,3559289855,AZ +3559289856,3559291391,RU +3559291392,3559291647,AZ +3559291648,3559291903,RU +3559291904,3559292159,AZ +3559292160,3559292927,RU +3559292928,3559301119,JO +3559301120,3559309311,GB +3559309312,3559317503,PL +3559317504,3559325695,FI +3559325696,3559333887,IT +3559333888,3559336447,SE +3559336448,3559336703,US +3559336704,3559342079,SE +3559342080,3559350271,BG +3559350272,3559358463,BA +3559358464,3559366655,FR +3559366656,3559374847,GB +3559374848,3559383039,AT +3559383040,3559391231,GB +3559391232,3559399423,CH +3559399424,3559403775,UA +3559403776,3559404031,GB +3559404032,3559407615,UA +3559407616,3559423999,HU +3559424000,3559432191,LB +3559432192,3559440383,DE +3559440384,3559448575,RU +3559448576,3559456767,ES +3559456768,3559473151,RU +3559473152,3559489535,CH +3559489536,3559490591,NL +3559490592,3559490623,DE +3559490624,3559490751,NL +3559490752,3559490783,ES +3559490784,3559490791,CH +3559490792,3559490799,BE +3559490800,3559490815,ES +3559490816,3559491135,NL +3559491136,3559491167,ES +3559491168,3559491231,NL +3559491232,3559491263,ES +3559491264,3559491447,NL +3559491448,3559491455,ES +3559491456,3559491767,NL +3559491768,3559491771,ES +3559491772,3559491839,NL +3559491840,3559491871,ES +3559491872,3559491903,GB +3559491904,3559491935,NL +3559491936,3559491967,ES +3559491968,3559492013,NL +3559492014,3559492015,ES +3559492016,3559492023,NL +3559492024,3559492031,ES +3559492032,3559493151,NL +3559493152,3559493167,IT +3559493168,3559493247,NL +3559493248,3559493279,ES +3559493280,3559493311,GB +3559493312,3559493349,NL +3559493350,3559493359,ES +3559493360,3559497727,NL +3559497728,3559505919,GB +3559505920,3559514111,CH +3559514112,3559522303,AT +3559522304,3559530495,GB +3559530496,3559538687,RU +3559538688,3559546879,UA +3559546880,3559555071,KG +3559555072,3559563263,CH +3559563264,3559571455,GB +3559571456,3559579647,AM +3559579648,3559586271,DE +3559586272,3559586303,US +3559586304,3559587839,DE +3559587840,3559596031,KW +3559596032,3559604223,BG +3559604224,3559612415,DE +3559612416,3559620607,IT +3559620608,3559628799,CH +3559628800,3559636991,GB +3559636992,3559653375,FR +3559653376,3559669759,GB +3559669760,3559677951,RU +3559677952,3559686143,SI +3559686144,3559694335,RU +3559694336,3559702655,DE +3559702656,3559702719,RU +3559702720,3559703039,DE +3559703040,3559703551,UA +3559703552,3559703679,IR +3559703680,3559703807,DE +3559703808,3559704063,IR +3559704064,3559710463,DE +3559710464,3559710719,IR +3559710720,3559718911,FR +3559718912,3559727103,RU +3559727104,3559735295,NL +3559735296,3559743487,BG +3559743488,3559759871,IT +3559759872,3559768063,NO +3559768064,3559776255,CH +3559776256,3559792639,RU +3559792640,3559800831,SA +3559800832,3559809023,IT +3559809024,3559817215,DE +3559817216,3559825407,GB +3559825408,3559833599,IT +3559833600,3559849983,RU +3559849984,3559858175,CZ +3559858176,3559866367,IT +3559866368,3559874559,GB +3559874560,3559877951,LT +3559877952,3559877967,CH +3559877968,3559882751,LT +3559882752,3559890943,AZ +3559890944,3559899135,CH +3559899136,3559899911,EE +3559899912,3559899935,RU +3559899936,3559899959,EE +3559899960,3559899991,RU +3559899992,3559902063,EE +3559902064,3559902071,UA +3559902072,3559905139,EE +3559905140,3559905143,DE +3559905144,3559907327,EE +3559907328,3559915519,FR +3559915520,3559923711,IT +3559923712,3559931903,RU +3559931904,3559940095,IL +3559940096,3559945471,DE +3559945472,3559945727,US +3559945728,3559948287,DE +3559948288,3559956479,RU +3559956480,3559956543,IT +3559956544,3559956551,NL +3559956552,3559957567,IT +3559957568,3559957599,NL +3559957600,3559964671,IT +3559964672,3559972863,RU +3559972864,3559981055,TR +3559981056,3559989247,EE +3559989248,3559997439,PL +3560005632,3560013823,RU +3560013824,3560030207,ES +3560030208,3560046591,GB +3560046592,3560054783,BG +3560054784,3560062975,TR +3560062976,3560071167,BG +3560071168,3560079359,CY +3560079360,3560087551,FI +3560087552,3560095743,GB +3560095744,3560103935,FI +3560103936,3560112127,IR +3560112128,3560120319,DE +3560120320,3560128511,ES +3560128512,3560144895,HU +3560144896,3560153087,CH +3560153088,3560161279,FR +3560161280,3560169471,PL +3560169472,3560177663,AT +3560177664,3560185855,NL +3560185856,3560194047,LT +3560194048,3560210431,IT +3560218624,3560226815,HU +3560226816,3560235007,AT +3560235008,3560243199,DE +3560243200,3560247295,BE +3560247296,3560247999,NL +3560248000,3560251391,BE +3560251392,3560252519,RU +3560252520,3560252527,UA +3560252528,3560253439,RU +3560253440,3560253695,CZ +3560253696,3560259583,RU +3560259584,3560267775,GB +3560267776,3560275967,CH +3560275968,3560308735,DE +3560308736,3560316927,FI +3560316928,3560325119,NL +3560325120,3560333311,DK +3560333312,3560341503,RO +3560341504,3560349695,PT +3560349696,3560357887,GB +3560357888,3560366079,GR +3560366080,3560366687,CH +3560366688,3560366695,IT +3560366696,3560366703,CH +3560366704,3560366711,IT +3560366712,3560374271,CH +3560374272,3560382463,ES +3560382464,3560387103,FO +3560387104,3560387111,DK +3560387112,3560390655,FO +3560390656,3560407039,RU +3560407040,3560423423,PT +3560423424,3560431615,CH +3560431616,3560439807,SK +3560439808,3560447999,BG +3560448000,3560449791,GB +3560449792,3560450047,US +3560450048,3560472575,GB +3560472576,3560480767,MT +3560480768,3560488959,IT +3560488960,3560497151,MD +3560497152,3560505343,LU +3560505344,3560513535,TR +3560513536,3560521727,GB +3560521728,3560529919,PT +3560529920,3560554495,RU +3560554496,3560570879,GB +3560570880,3560579071,TR +3560579072,3560587263,GB +3560587264,3560595455,DE +3560595456,3560603647,GE +3560603648,3560611839,GB +3560611840,3560620031,UA +3560620032,3560628223,RU +3560628224,3560632207,GB +3560632208,3560632215,NL +3560632216,3560636415,GB +3560636416,3560644607,LT +3560644608,3560652799,DE +3560652800,3560660991,GB +3560660992,3560669183,RU +3560669184,3560685567,CH +3560685568,3560693759,ES +3560693760,3560701951,PL +3560701952,3560710143,DE +3560710144,3560718335,CH +3560726528,3560734719,DK +3560734720,3560742623,DE +3560742624,3560742631,GB +3560742632,3560742911,DE +3560742912,3560751103,AT +3560751104,3560767487,DE +3560767488,3560832255,NL +3560832256,3560832511,GB +3560832512,3560832791,NL +3560832792,3560832799,BE +3560832800,3560833023,NL +3560833024,3560841215,GB +3560841216,3560842015,CS +3560842016,3560842047,RS +3560842048,3560842447,CS +3560842448,3560842455,RS +3560842456,3560842751,CS +3560842752,3560843007,RS +3560843008,3560844031,CS +3560844032,3560844223,RS +3560844224,3560844227,CS +3560844228,3560844287,RS +3560844288,3560844667,CS +3560844668,3560844679,RS +3560844680,3560844687,CS +3560844688,3560844735,RS +3560844736,3560844751,CS +3560844752,3560844759,RS +3560844760,3560844767,CS +3560844768,3560844775,RS +3560844776,3560844799,CS +3560844800,3560844863,RS +3560844864,3560844875,CS +3560844876,3560844879,RS +3560844880,3560844895,CS +3560844896,3560844899,RS +3560844900,3560844991,CS +3560844992,3560844995,RS +3560844996,3560845023,CS +3560845024,3560845055,RS +3560845056,3560845071,CS +3560845072,3560845103,RS +3560845104,3560845183,CS +3560845184,3560845247,RS +3560845248,3560845327,CS +3560845328,3560845343,RS +3560845344,3560845351,CS +3560845352,3560845355,RS +3560845356,3560845407,CS +3560845408,3560845455,RS +3560845456,3560845535,CS +3560845536,3560845551,CS +3560845552,3560845567,CS +3560845568,3560845631,RS +3560845632,3560845695,CS +3560845696,3560845703,CS +3560845704,3560845715,CS +3560845716,3560845716,RS +3560845717,3560845717,CS +3560845718,3560845718,RS +3560845719,3560845759,CS +3560845760,3560845775,RS +3560845776,3560846079,CS +3560846080,3560846087,RS +3560846088,3560846351,CS +3560846352,3560846367,RS +3560846368,3560846783,CS +3560846784,3560846815,CS +3560846816,3560846847,CS +3560846848,3560846863,RS +3560846864,3560846975,CS +3560846976,3560848031,RS +3560848032,3560848127,CS +3560848128,3560848255,RS +3560848256,3560848383,CS +3560848384,3560848655,RS +3560848656,3560848671,CS +3560848672,3560848679,RS +3560848680,3560848695,CS +3560848696,3560849407,RS +3560849408,3560852911,DE +3560852912,3560852919,TH +3560852920,3560857599,DE +3560857600,3560865791,SA +3560865792,3560882175,FR +3560882176,3560890367,DE +3560890368,3560898559,NO +3560898560,3560906751,FI +3560906752,3560916383,DE +3560916384,3560916391,CH +3560916392,3560919047,DE +3560919048,3560919055,CH +3560919056,3560923135,DE +3560923136,3560931327,ES +3560931328,3560939523,DE +3560939524,3560939527,AT +3560939528,3560939535,DE +3560939536,3560939539,PT +3560939540,3560939543,IT +3560939544,3560939555,DE +3560939556,3560939559,ES +3560939560,3560939563,DE +3560939564,3560939567,IT +3560939568,3560939571,NL +3560939572,3560939579,ES +3560939580,3560939583,BE +3560939584,3560939587,DE +3560939588,3560939591,BE +3560939592,3560939607,DE +3560939608,3560939611,IT +3560939612,3560939623,DE +3560939624,3560939627,NL +3560939628,3560939631,CH +3560939632,3560939643,DE +3560939644,3560939647,BE +3560939648,3560939655,DE +3560939656,3560939659,CH +3560939660,3560939663,DE +3560939664,3560939667,DK +3560939668,3560939675,DE +3560939676,3560939679,PL +3560939680,3560939683,IT +3560939684,3560939687,AT +3560939688,3560939691,ES +3560939692,3560939695,FR +3560939696,3560939703,DE +3560939704,3560939707,ES +3560939708,3560939719,DE +3560939720,3560939727,GR +3560939728,3560939735,NL +3560939736,3560939751,FR +3560939752,3560939755,IT +3560939756,3560939759,DE +3560939760,3560939763,IT +3560939764,3560939767,DE +3560939768,3560939771,IE +3560939772,3560939775,CZ +3560939776,3560939779,BE +3560939780,3560939783,DK +3560939784,3560939791,DE +3560939792,3560939795,FR +3560939796,3560939799,GB +3560939800,3560939803,DE +3560939804,3560939807,IT +3560939808,3560939811,FR +3560939812,3560939815,DE +3560939816,3560939819,CH +3560939820,3560939823,DE +3560939824,3560939827,LI +3560939828,3560939831,FR +3560939832,3560939839,DE +3560939840,3560939843,GB +3560939844,3560939847,ES +3560939848,3560939851,BE +3560939852,3560939855,ES +3560939856,3560939859,FR +3560939860,3560939863,HU +3560939864,3560939867,ES +3560939868,3560939875,DE +3560939876,3560939879,CH +3560939880,3560939887,DE +3560939888,3560939891,CH +3560939892,3560939895,DE +3560939896,3560939899,ES +3560939900,3560939903,GB +3560939904,3560939907,BR +3560939908,3560939911,NL +3560939912,3560939915,RE +3560939916,3560939919,ES +3560939920,3560939927,DE +3560939928,3560939931,NL +3560939932,3560939935,IT +3560939936,3560939939,DE +3560939940,3560939943,AT +3560939944,3560939951,FR +3560939952,3560939955,DE +3560939956,3560939959,AT +3560939960,3560939963,CH +3560939964,3560939967,DE +3560939968,3560939971,ES +3560939972,3560939975,DE +3560939976,3560939983,BE +3560939984,3560939987,FR +3560939988,3560939991,ES +3560939992,3560939995,IT +3560939996,3560939999,DE +3560940000,3560940007,ES +3560940008,3560940015,DE +3560940016,3560940019,BE +3560940020,3560940023,GB +3560940024,3560940027,GR +3560940028,3560940043,DE +3560940044,3560940047,GB +3560940048,3560940051,ES +3560940052,3560940055,BE +3560940056,3560940059,NL +3560940060,3560940063,LU +3560940064,3560940067,CH +3560940068,3560940071,FR +3560940072,3560940075,DE +3560940076,3560940079,ES +3560940080,3560940087,DE +3560940088,3560940091,IT +3560940092,3560940095,CH +3560940096,3560940099,IT +3560940100,3560940103,FR +3560940104,3560940115,DE +3560940116,3560940119,FR +3560940120,3560940123,GB +3560940124,3560940127,DE +3560940128,3560940135,IT +3560940136,3560940139,AT +3560940140,3560940143,HU +3560940144,3560940147,DE +3560940148,3560940151,IT +3560940152,3560940155,FR +3560940156,3560940159,ES +3560940160,3560940163,IT +3560940164,3560940171,FR +3560940172,3560940175,DE +3560940176,3560940179,FR +3560940180,3560940183,BE +3560940184,3560940187,FR +3560940188,3560940191,IT +3560940192,3560940195,AT +3560940196,3560940199,DE +3560940200,3560940203,CY +3560940204,3560940207,DE +3560940208,3560940211,ES +3560940212,3560940215,FR +3560940216,3560940219,IE +3560940220,3560940227,DE +3560940228,3560940231,CH +3560940232,3560940235,IT +3560940236,3560940239,DE +3560940240,3560940243,PT +3560940244,3560940247,GB +3560940248,3560940251,DE +3560940252,3560940255,CH +3560940256,3560940263,DE +3560940264,3560940267,AT +3560940268,3560940275,GB +3560940276,3560940279,FR +3560940280,3560940283,AT +3560940284,3560940287,DE +3560940288,3560940291,FR +3560940292,3560940307,DE +3560940308,3560940311,BE +3560940312,3560940327,DE +3560940328,3560940331,ES +3560940332,3560940339,DE +3560940340,3560940343,CH +3560940344,3560940347,NL +3560940348,3560940367,DE +3560940368,3560940371,FR +3560940372,3560940379,CH +3560940380,3560940387,DE +3560940388,3560940391,ES +3560940392,3560940395,DE +3560940396,3560940399,IL +3560940400,3560940403,CH +3560940404,3560940407,DE +3560940408,3560940411,IT +3560940412,3560940419,DE +3560940420,3560940423,GR +3560940424,3560940431,DE +3560940432,3560940435,FR +3560940436,3560940439,DE +3560940440,3560940443,BE +3560940444,3560940447,SL +3560940448,3560940451,DE +3560940452,3560940455,NL +3560940456,3560940459,DE +3560940460,3560940463,HU +3560940464,3560940467,CY +3560940468,3560940471,DE +3560940472,3560940475,FR +3560940476,3560940479,CH +3560940480,3560940487,ES +3560940488,3560940491,CZ +3560940492,3560940495,ES +3560940496,3560940499,IT +3560940500,3560940503,DE +3560940504,3560940507,GB +3560940508,3560940511,IT +3560940512,3560940523,DE +3560940524,3560940527,FR +3560940528,3560940531,DE +3560940532,3560940535,FR +3560940536,3560940539,HU +3560940540,3560940543,IT +3560940544,3560940547,DE +3560940548,3560940551,IE +3560940552,3560940563,DE +3560940564,3560940567,GB +3560940568,3560940571,DE +3560940572,3560940575,DK +3560940576,3560940579,ES +3560940580,3560940583,IT +3560940584,3560940587,FR +3560940588,3560940591,IT +3560940592,3560940595,GR +3560940596,3560940599,CH +3560940600,3560940603,MA +3560940604,3560940607,GB +3560940608,3560940611,FR +3560940612,3560940615,CH +3560940616,3560940619,DE +3560940620,3560940623,AT +3560940624,3560940627,SM +3560940628,3560940631,PL +3560940632,3560940635,AT +3560940636,3560940639,DE +3560940640,3560940647,GB +3560940648,3560940655,DE +3560940656,3560940663,IT +3560940664,3560940683,DE +3560940684,3560940687,DK +3560940688,3560940691,IT +3560940692,3560940695,NO +3560940696,3560940699,FR +3560940700,3560940703,GB +3560940704,3560940707,ES +3560940708,3560940711,BE +3560940712,3560940715,DE +3560940716,3560940719,ES +3560940720,3560940723,PL +3560940724,3560940727,DE +3560940728,3560940731,FR +3560940732,3560940735,DE +3560940736,3560940739,DK +3560940740,3560940743,IT +3560940744,3560940751,DE +3560940752,3560940755,IE +3560940756,3560940763,FR +3560940764,3560940767,CH +3560940768,3560940779,DE +3560940780,3560940783,IT +3560940784,3560940787,NL +3560940788,3560940791,GB +3560940792,3560940799,ES +3560940800,3560940803,DE +3560940804,3560940807,GB +3560940808,3560940811,IT +3560940812,3560940815,DE +3560940816,3560940819,FR +3560940820,3560940823,NL +3560940824,3560940827,IT +3560940828,3560940831,ES +3560940832,3560940835,DE +3560940836,3560940839,FR +3560940840,3560940843,IT +3560940844,3560940851,ES +3560940852,3560940859,DE +3560940860,3560940863,PT +3560940864,3560940867,IT +3560940868,3560940875,DE +3560940876,3560940879,FR +3560940880,3560940883,IT +3560940884,3560940887,NL +3560940888,3560940891,LU +3560940892,3560940895,ES +3560940896,3560940899,DE +3560940900,3560940903,NL +3560940904,3560940907,DE +3560940908,3560940915,GB +3560940916,3560940923,DE +3560940924,3560940927,ES +3560940928,3560940931,GR +3560940932,3560940935,CH +3560940936,3560940939,IT +3560940940,3560940951,DE +3560940952,3560940955,AT +3560940956,3560940963,NL +3560940964,3560940967,DE +3560940968,3560940971,NL +3560940972,3560940975,DE +3560940976,3560940979,FR +3560940980,3560940983,LU +3560940984,3560940987,IT +3560940988,3560940995,DE +3560940996,3560940999,DK +3560941000,3560941003,ES +3560941004,3560941007,PL +3560941008,3560941011,DE +3560941012,3560941015,FR +3560941016,3560941019,DE +3560941020,3560941023,IT +3560941024,3560941027,FR +3560941028,3560941031,CH +3560941032,3560941035,FR +3560941036,3560941039,DE +3560941040,3560941043,FR +3560941044,3560941047,DE +3560941048,3560941051,GR +3560941052,3560941059,FR +3560941060,3560941063,GB +3560941064,3560941071,FR +3560941072,3560941075,NL +3560941076,3560941079,GB +3560941080,3560941083,BE +3560941084,3560941087,IT +3560941088,3560941091,DE +3560941092,3560941095,BE +3560941096,3560941099,AT +3560941100,3560941103,IT +3560941104,3560941107,FR +3560941108,3560941119,DE +3560941120,3560941123,BE +3560941124,3560941127,FR +3560941128,3560941131,DE +3560941132,3560941135,GB +3560941136,3560941139,ES +3560941140,3560941147,DE +3560941148,3560941151,IT +3560941152,3560941155,DK +3560941156,3560941159,ES +3560941160,3560941163,IT +3560941164,3560941167,DE +3560941168,3560941171,NL +3560941172,3560941175,DE +3560941176,3560941179,ES +3560941180,3560941183,GB +3560941184,3560941187,IT +3560941188,3560941191,ES +3560941192,3560941195,CH +3560941196,3560941199,FR +3560941200,3560941203,DE +3560941204,3560941207,IT +3560941208,3560941211,MA +3560941212,3560941215,DE +3560941216,3560941219,NL +3560941220,3560941223,GB +3560941224,3560941227,DE +3560941228,3560941231,SE +3560941232,3560941235,FR +3560941236,3560941243,DE +3560941244,3560941251,IT +3560941252,3560941255,FR +3560941256,3560941259,AT +3560941260,3560941263,GB +3560941264,3560941271,ES +3560941272,3560941275,DK +3560941276,3560941279,GR +3560941280,3560941283,NL +3560941284,3560941287,DE +3560941288,3560941291,ES +3560941292,3560941295,DE +3560941296,3560941303,IT +3560941304,3560941307,FR +3560941308,3560941315,DE +3560941316,3560941319,SE +3560941320,3560941323,ES +3560941324,3560941331,IT +3560941332,3560941335,PT +3560941336,3560941339,BE +3560941340,3560941343,GB +3560941344,3560941347,FR +3560941348,3560941351,IE +3560941352,3560941355,NL +3560941356,3560941359,ES +3560941360,3560941363,DE +3560941364,3560941367,SG +3560941368,3560941371,DK +3560941372,3560941379,DE +3560941380,3560941383,CH +3560941384,3560941387,IE +3560941388,3560941391,SE +3560941392,3560941395,DK +3560941396,3560941399,IS +3560941400,3560941407,DE +3560941408,3560941411,CH +3560941412,3560941415,IT +3560941416,3560941419,DE +3560941420,3560941423,FR +3560941424,3560941427,DE +3560941428,3560941431,FR +3560941432,3560941435,DE +3560941436,3560941439,IN +3560941440,3560941443,DE +3560941444,3560941447,ES +3560941448,3560941459,GB +3560941460,3560941467,DE +3560941468,3560941471,CH +3560941472,3560941475,BE +3560941476,3560941479,ES +3560941480,3560941483,DE +3560941484,3560941487,ES +3560941488,3560941491,DE +3560941492,3560941495,GB +3560941496,3560941499,FR +3560941500,3560941503,ES +3560941504,3560941507,DE +3560941508,3560941511,IT +3560941512,3560941515,AT +3560941516,3560941519,SE +3560941520,3560941523,NO +3560941524,3560941535,DE +3560941536,3560941539,DK +3560941540,3560941543,FR +3560941544,3560941547,GB +3560941548,3560941551,DE +3560941552,3560941555,IT +3560941556,3560941559,DE +3560941560,3560941563,GB +3560941564,3560941567,GR +3560941568,3560941571,DE +3560941572,3560941575,GB +3560941576,3560941587,DE +3560941588,3560941591,ES +3560941592,3560941599,DE +3560941600,3560941603,FR +3560941604,3560941607,CH +3560941608,3560941611,GB +3560941612,3560941623,DE +3560941624,3560941627,GB +3560941628,3560941631,ES +3560941632,3560941635,NL +3560941636,3560941639,BE +3560941640,3560941643,GB +3560941644,3560941647,BE +3560941648,3560941651,NO +3560941652,3560941655,DE +3560941656,3560941659,GB +3560941660,3560941663,NL +3560941664,3560941671,DE +3560941672,3560941679,FR +3560941680,3560941683,GB +3560941684,3560941687,IT +3560941688,3560941691,DE +3560941692,3560941695,IT +3560941696,3560941699,FR +3560941700,3560941703,GB +3560941704,3560941707,DE +3560941708,3560941711,CH +3560941712,3560941715,FR +3560941716,3560941723,DE +3560941724,3560941727,FR +3560941728,3560941735,DE +3560941736,3560941739,NL +3560941740,3560941743,NO +3560941744,3560941747,FR +3560941748,3560941751,ES +3560941752,3560941755,BE +3560941756,3560941771,DE +3560941772,3560941787,GB +3560941788,3560941791,DE +3560941792,3560941795,ES +3560941796,3560941799,FR +3560941800,3560941803,NL +3560941804,3560941807,ES +3560941808,3560941811,FR +3560941812,3560941815,NO +3560941816,3560941819,FR +3560941820,3560941823,NL +3560941824,3560941827,DE +3560941828,3560941831,ES +3560941832,3560941835,GB +3560941836,3560941839,DE +3560941840,3560941843,GB +3560941844,3560941847,IT +3560941848,3560941851,BE +3560941852,3560941855,CH +3560941856,3560941859,BE +3560941860,3560941867,DE +3560941868,3560941871,AT +3560941872,3560941875,GB +3560941876,3560941879,NL +3560941880,3560941883,BG +3560941884,3560941887,DE +3560941888,3560941891,ES +3560941892,3560941895,IT +3560941896,3560941899,ES +3560941900,3560941903,DE +3560941904,3560941907,GB +3560941908,3560941911,DE +3560941912,3560941919,FR +3560941920,3560941931,DE +3560941932,3560941935,CH +3560941936,3560941947,DE +3560941948,3560941951,DK +3560941952,3560941955,IT +3560941956,3560941959,DE +3560941960,3560941963,LU +3560941964,3560941967,FR +3560941968,3560941971,DE +3560941972,3560941975,DK +3560941976,3560941979,IT +3560941980,3560941983,DE +3560941984,3560941987,NL +3560941988,3560941991,DE +3560941992,3560941995,GB +3560941996,3560941999,BE +3560942000,3560942003,FR +3560942004,3560942007,GB +3560942008,3560942011,IT +3560942012,3560942015,DE +3560942016,3560942019,NL +3560942020,3560942023,ES +3560942024,3560942027,CH +3560942028,3560942035,DE +3560942036,3560942039,GB +3560942040,3560942047,DE +3560942048,3560942051,IT +3560942052,3560942055,DE +3560942056,3560942059,IS +3560942060,3560942063,GB +3560942064,3560942067,ES +3560942068,3560942071,BE +3560942072,3560942083,DE +3560942084,3560942087,FR +3560942088,3560942095,DE +3560942096,3560942099,FR +3560942100,3560942103,DE +3560942104,3560942107,NL +3560942108,3560942115,DE +3560942116,3560942119,HU +3560942120,3560942123,AT +3560942124,3560942127,BE +3560942128,3560942131,DE +3560942132,3560942135,ES +3560942136,3560942143,DE +3560942144,3560942147,GB +3560942148,3560942151,DE +3560942152,3560942155,IT +3560942156,3560942159,ES +3560942160,3560942163,DE +3560942164,3560942171,ES +3560942172,3560942175,SE +3560942176,3560942179,BE +3560942180,3560942183,ES +3560942184,3560942191,DE +3560942192,3560942195,HU +3560942196,3560942199,ES +3560942200,3560942203,FR +3560942204,3560942207,AT +3560942208,3560942211,DE +3560942212,3560942219,IT +3560942220,3560942227,FR +3560942228,3560942231,IT +3560942232,3560942243,DE +3560942244,3560942247,IT +3560942248,3560942251,TR +3560942252,3560942255,GB +3560942256,3560942259,DE +3560942260,3560942263,ES +3560942264,3560942267,NL +3560942268,3560942271,DE +3560942272,3560942275,PL +3560942276,3560942279,IT +3560942280,3560942283,NL +3560942284,3560942287,DK +3560942288,3560942291,FR +3560942292,3560942295,BH +3560942296,3560942299,MA +3560942300,3560942307,DE +3560942308,3560942319,ES +3560942320,3560942323,DE +3560942324,3560942327,IT +3560942328,3560942339,PT +3560942340,3560942343,DE +3560942344,3560942347,FR +3560942348,3560942351,GR +3560942352,3560942355,ES +3560942356,3560942359,IT +3560942360,3560942363,AT +3560942364,3560942367,DE +3560942368,3560942375,FR +3560942376,3560942379,DE +3560942380,3560942383,GB +3560942384,3560942387,DE +3560942388,3560942391,IT +3560942392,3560942407,DE +3560942408,3560942411,GB +3560942412,3560942415,DE +3560942416,3560942419,IT +3560942420,3560942423,FR +3560942424,3560942427,NO +3560942428,3560942447,DE +3560942448,3560942455,CH +3560942456,3560942459,ES +3560942460,3560942463,RU +3560942464,3560942467,BE +3560942468,3560942471,ES +3560942472,3560942475,DE +3560942476,3560942479,CH +3560942480,3560942483,ES +3560942484,3560942487,HU +3560942488,3560942495,FR +3560942496,3560942499,ES +3560942500,3560942503,FR +3560942504,3560942511,ES +3560942512,3560942515,IT +3560942516,3560942523,DE +3560942524,3560942527,NL +3560942528,3560942535,DE +3560942536,3560942539,FR +3560942540,3560942543,DE +3560942544,3560942547,CH +3560942548,3560942551,DK +3560942552,3560942555,DE +3560942556,3560942559,FR +3560942560,3560942563,IT +3560942564,3560942567,ES +3560942568,3560942571,DE +3560942572,3560942579,FR +3560942580,3560942583,DE +3560942584,3560942587,GB +3560942588,3560942590,ES +3560942591,3560942599,DE +3560942600,3560942603,DK +3560942604,3560942607,LU +3560942608,3560942619,DE +3560942620,3560942623,BE +3560942624,3560942627,IT +3560942628,3560942631,GB +3560942632,3560942635,FR +3560942636,3560942643,DE +3560942644,3560942647,FR +3560942648,3560942651,DE +3560942652,3560942655,GR +3560942656,3560942663,ES +3560942664,3560942667,NL +3560942668,3560942675,IT +3560942676,3560942679,BE +3560942680,3560942683,DE +3560942684,3560942687,BE +3560942688,3560942691,NL +3560942692,3560942695,LU +3560942696,3560942699,DE +3560942700,3560942703,ES +3560942704,3560942707,DE +3560942708,3560942711,IT +3560942712,3560942715,LU +3560942716,3560942719,BE +3560942720,3560942727,IT +3560942728,3560942731,GB +3560942732,3560942735,DE +3560942736,3560942739,CH +3560942740,3560942743,ES +3560942744,3560942751,GB +3560942752,3560942763,DE +3560942764,3560942767,FR +3560942768,3560942771,NL +3560942772,3560942775,ES +3560942776,3560942779,DE +3560942780,3560942783,CH +3560942784,3560942787,DE +3560942788,3560942791,HU +3560942792,3560942795,DE +3560942796,3560942799,FR +3560942800,3560942803,AT +3560942804,3560942807,TR +3560942808,3560942811,AT +3560942812,3560942815,FR +3560942816,3560942819,TR +3560942820,3560942823,ES +3560942824,3560942827,GB +3560942828,3560942831,AT +3560942832,3560942835,IT +3560942836,3560942839,CH +3560942840,3560942843,BE +3560942844,3560942847,ES +3560942848,3560942851,IT +3560942852,3560942855,ES +3560942856,3560942859,DE +3560942860,3560942863,IT +3560942864,3560942871,DE +3560942872,3560942875,IT +3560942876,3560942879,PL +3560942880,3560942883,GB +3560942884,3560942887,DE +3560942888,3560942891,FR +3560942892,3560942895,DE +3560942896,3560942899,ES +3560942900,3560942903,DE +3560942904,3560942907,CH +3560942908,3560942911,DE +3560942912,3560942915,ES +3560942916,3560942919,BE +3560942920,3560942923,DE +3560942924,3560942927,IT +3560942928,3560942931,SE +3560942932,3560942935,AT +3560942936,3560942939,DE +3560942940,3560942943,AE +3560942944,3560942951,DE +3560942952,3560942955,ES +3560942956,3560942959,DE +3560942960,3560942963,GB +3560942964,3560942975,DE +3560942976,3560942979,IT +3560942980,3560942987,DE +3560942988,3560942999,IT +3560943000,3560943003,PL +3560943004,3560943007,DK +3560943008,3560943011,CH +3560943012,3560943015,IT +3560943016,3560943019,ES +3560943020,3560943023,DE +3560943024,3560943027,GR +3560943028,3560943031,DE +3560943032,3560943035,FR +3560943036,3560943039,PL +3560943040,3560943043,NO +3560943044,3560943047,ES +3560943048,3560943051,HR +3560943052,3560943055,CY +3560943056,3560943059,BE +3560943060,3560943075,DE +3560943076,3560943079,ES +3560943080,3560943095,DE +3560943096,3560943099,PL +3560943100,3560943109,DE +3560943110,3560943111,ES +3560943112,3560943113,DE +3560943114,3560943115,ES +3560943116,3560943116,DK +3560943117,3560943117,IL +3560943118,3560943118,DE +3560943119,3560943119,IT +3560943120,3560943120,DE +3560943121,3560943121,CH +3560943122,3560943122,ES +3560943123,3560943125,DE +3560943126,3560943126,FR +3560943127,3560943127,HU +3560943128,3560943129,DE +3560943130,3560943130,BE +3560943131,3560943131,RU +3560943132,3560943132,BE +3560943133,3560943133,ES +3560943134,3560943136,DE +3560943137,3560943137,ES +3560943138,3560943138,CH +3560943139,3560943139,DE +3560943140,3560943140,ES +3560943141,3560943141,CH +3560943142,3560943142,DE +3560943143,3560943145,HU +3560943146,3560943146,IE +3560943147,3560943147,CH +3560943148,3560943149,DE +3560943150,3560943150,ES +3560943151,3560943151,IT +3560943152,3560943152,HU +3560943153,3560943154,DE +3560943155,3560943155,FR +3560943156,3560943157,DE +3560943158,3560943158,FR +3560943159,3560943159,IT +3560943160,3560943160,NO +3560943161,3560943161,BE +3560943162,3560943162,GR +3560943163,3560943163,CH +3560943164,3560943164,PL +3560943165,3560943165,FR +3560943166,3560943166,GB +3560943167,3560943167,FR +3560943168,3560943168,ES +3560943169,3560943169,DE +3560943170,3560943170,ES +3560943171,3560943171,IT +3560943172,3560943172,ES +3560943173,3560943173,BE +3560943174,3560943175,DE +3560943176,3560943177,CH +3560943178,3560943178,IT +3560943179,3560943179,PL +3560943180,3560943180,GB +3560943181,3560943181,DE +3560943182,3560943183,ES +3560943184,3560943184,IT +3560943185,3560943185,DK +3560943186,3560943186,ES +3560943187,3560943187,PT +3560943188,3560943188,IT +3560943189,3560943192,DE +3560943193,3560943193,ES +3560943194,3560943194,AT +3560943195,3560943195,PL +3560943196,3560943197,IT +3560943198,3560943198,DE +3560943199,3560943199,PT +3560943200,3560943200,AT +3560943201,3560943201,IT +3560943202,3560943202,IL +3560943203,3560943203,FR +3560943204,3560943204,CH +3560943205,3560943205,IT +3560943206,3560943207,DE +3560943208,3560943208,AT +3560943209,3560943210,ES +3560943211,3560943211,FR +3560943212,3560943212,DE +3560943213,3560943213,FR +3560943214,3560943214,PL +3560943215,3560943218,DE +3560943219,3560943219,ES +3560943220,3560943221,DE +3560943222,3560943222,ES +3560943223,3560943223,FR +3560943224,3560943224,DE +3560943225,3560943226,GR +3560943227,3560943227,DE +3560943228,3560943230,NL +3560943231,3560943232,FR +3560943233,3560943233,PL +3560943234,3560943234,EE +3560943235,3560943235,CH +3560943236,3560943237,NL +3560943238,3560943238,ES +3560943239,3560943239,FR +3560943240,3560943240,GB +3560943241,3560943241,FR +3560943242,3560943242,DE +3560943243,3560943243,FR +3560943244,3560943244,PL +3560943245,3560943245,CH +3560943246,3560943247,DE +3560943248,3560943248,GR +3560943249,3560943249,CH +3560943250,3560943250,AT +3560943251,3560943251,GB +3560943252,3560943252,BE +3560943253,3560943253,DE +3560943254,3560943254,ES +3560943255,3560943255,GB +3560943256,3560943256,DE +3560943257,3560943257,ES +3560943258,3560943258,FR +3560943259,3560943259,DE +3560943260,3560943260,ES +3560943261,3560943261,IE +3560943262,3560943262,DE +3560943263,3560943263,IT +3560943264,3560943264,CZ +3560943265,3560943265,DE +3560943266,3560943266,GB +3560943267,3560943267,DE +3560943268,3560943269,IT +3560943270,3560943270,GB +3560943271,3560943271,IT +3560943272,3560943272,ES +3560943273,3560943273,FR +3560943274,3560943274,GB +3560943275,3560943275,DE +3560943276,3560943276,FR +3560943277,3560943277,IT +3560943278,3560943278,DE +3560943279,3560943279,FR +3560943280,3560943280,GR +3560943281,3560943281,ES +3560943282,3560943282,FR +3560943283,3560943283,ES +3560943284,3560943286,DE +3560943287,3560943287,NL +3560943288,3560943290,FR +3560943291,3560943292,IT +3560943293,3560943293,ES +3560943294,3560943294,IT +3560943295,3560943295,DE +3560943296,3560943296,RU +3560943297,3560943297,ES +3560943298,3560943298,FR +3560943299,3560943299,GB +3560943300,3560943300,DE +3560943301,3560943301,FR +3560943302,3560943302,ES +3560943303,3560943303,IT +3560943304,3560943304,FR +3560943305,3560943306,DE +3560943307,3560943307,ES +3560943308,3560943309,DE +3560943310,3560943311,IT +3560943312,3560943312,PL +3560943313,3560943313,FR +3560943314,3560943314,ES +3560943315,3560943315,IT +3560943316,3560943316,GB +3560943317,3560943317,IT +3560943318,3560943318,CH +3560943319,3560943319,ES +3560943320,3560943320,IT +3560943321,3560943321,GB +3560943322,3560943322,DE +3560943323,3560943323,NL +3560943324,3560943324,DE +3560943325,3560943325,CH +3560943326,3560943326,RU +3560943327,3560943329,DE +3560943330,3560943331,IT +3560943332,3560943335,DE +3560943336,3560943336,ES +3560943337,3560943337,IT +3560943338,3560943338,BE +3560943339,3560943339,NL +3560943340,3560943341,DE +3560943342,3560943342,ES +3560943343,3560943343,FR +3560943344,3560943344,NL +3560943345,3560943345,CH +3560943346,3560943346,IT +3560943347,3560943347,ES +3560943348,3560943348,FR +3560943349,3560943349,DE +3560943350,3560943350,BE +3560943351,3560943351,SE +3560943352,3560943352,IT +3560943353,3560943354,DE +3560943355,3560943355,IT +3560943356,3560943356,DE +3560943357,3560943357,ES +3560943358,3560943358,BE +3560943359,3560943361,DE +3560943362,3560943362,GB +3560943363,3560943365,DE +3560943366,3560943367,IT +3560943368,3560943368,GB +3560943369,3560943369,GR +3560943370,3560943370,DE +3560943371,3560943371,AT +3560943372,3560943372,FR +3560943373,3560943375,DE +3560943376,3560943376,ES +3560943377,3560943377,GB +3560943378,3560943378,DE +3560943379,3560943380,ES +3560943381,3560943383,DE +3560943384,3560943384,FR +3560943385,3560943385,ES +3560943386,3560943386,CH +3560943387,3560943387,GB +3560943388,3560943391,DE +3560943392,3560943392,GB +3560943393,3560943393,DE +3560943394,3560943394,ES +3560943395,3560943395,NL +3560943396,3560943396,BE +3560943397,3560943397,DE +3560943398,3560943398,BE +3560943399,3560943399,CH +3560943400,3560943400,IT +3560943401,3560943401,DE +3560943402,3560943402,NL +3560943403,3560943403,DE +3560943404,3560943404,BE +3560943405,3560943405,DE +3560943406,3560943407,ES +3560943408,3560943408,IT +3560943409,3560943409,ES +3560943410,3560943410,NL +3560943411,3560943411,DE +3560943412,3560943412,IT +3560943413,3560943413,ES +3560943414,3560943415,DE +3560943416,3560943416,FR +3560943417,3560943417,DE +3560943418,3560943418,GB +3560943419,3560943419,FR +3560943420,3560943420,DE +3560943421,3560943421,HU +3560943422,3560943422,CH +3560943423,3560943423,FR +3560943424,3560943424,DE +3560943425,3560943425,ES +3560943426,3560943426,IT +3560943427,3560943427,FR +3560943428,3560943428,NO +3560943429,3560943430,NL +3560943431,3560943432,DE +3560943433,3560943433,GB +3560943434,3560943434,SE +3560943435,3560943435,NL +3560943436,3560943436,FR +3560943437,3560943437,ES +3560943438,3560943438,FR +3560943439,3560943439,NO +3560943440,3560943440,FR +3560943441,3560943441,DE +3560943442,3560943442,ES +3560943443,3560943443,BE +3560943444,3560943444,CH +3560943445,3560943445,PT +3560943446,3560943446,DE +3560943447,3560943447,GB +3560943448,3560943450,DE +3560943451,3560943451,PL +3560943452,3560943452,GB +3560943453,3560943454,DE +3560943455,3560943456,GB +3560943457,3560943457,ES +3560943458,3560943459,IT +3560943460,3560943460,ES +3560943461,3560943461,CH +3560943462,3560943462,FR +3560943463,3560943463,NL +3560943464,3560943464,ES +3560943465,3560943465,FR +3560943466,3560943466,NO +3560943467,3560943467,IT +3560943468,3560943468,CH +3560943469,3560943469,IT +3560943470,3560943470,DE +3560943471,3560943471,GB +3560943472,3560943472,BE +3560943473,3560943473,AT +3560943474,3560943474,CH +3560943475,3560943475,ES +3560943476,3560943476,BE +3560943477,3560943477,DE +3560943478,3560943478,IT +3560943479,3560943479,GB +3560943480,3560943480,NL +3560943481,3560943481,BG +3560943482,3560943482,DE +3560943483,3560943486,ES +3560943487,3560943487,DE +3560943488,3560943488,ES +3560943489,3560943489,DE +3560943490,3560943490,GB +3560943491,3560943491,DE +3560943492,3560943493,FR +3560943494,3560943494,GB +3560943495,3560943495,IT +3560943496,3560943499,DE +3560943500,3560943500,CH +3560943501,3560943501,ES +3560943502,3560943507,DE +3560943508,3560943508,DK +3560943509,3560943510,DE +3560943511,3560943511,IT +3560943512,3560943512,DE +3560943513,3560943513,LU +3560943514,3560943515,ES +3560943516,3560943517,DE +3560943518,3560943518,LU +3560943519,3560943519,DE +3560943520,3560943520,DK +3560943521,3560943521,DE +3560943522,3560943522,GB +3560943523,3560943523,IT +3560943524,3560943524,DE +3560943525,3560943525,NL +3560943526,3560943526,IT +3560943527,3560943527,DE +3560943528,3560943528,FR +3560943529,3560943529,DE +3560943530,3560943530,CH +3560943531,3560943532,DE +3560943533,3560943533,HU +3560943534,3560943534,BY +3560943535,3560943535,FR +3560943536,3560943536,BE +3560943537,3560943537,DE +3560943538,3560943538,GB +3560943539,3560943539,DE +3560943540,3560943540,BE +3560943541,3560943541,NL +3560943542,3560943542,DE +3560943543,3560943543,NL +3560943544,3560943544,ES +3560943545,3560943546,DE +3560943547,3560943547,SI +3560943548,3560943548,GB +3560943549,3560943549,DE +3560943550,3560943550,HU +3560943551,3560943551,FR +3560943552,3560943552,IT +3560943553,3560943553,DE +3560943554,3560943554,IS +3560943555,3560943555,FR +3560943556,3560943556,DE +3560943557,3560943557,ES +3560943558,3560943558,DE +3560943559,3560943559,GB +3560943560,3560943562,IT +3560943563,3560943563,HU +3560943564,3560943564,DE +3560943565,3560943565,GB +3560943566,3560943566,DE +3560943567,3560943567,FR +3560943568,3560943568,GB +3560943569,3560943570,FR +3560943571,3560943572,DE +3560943573,3560943573,FR +3560943574,3560943574,NO +3560943575,3560943575,BE +3560943576,3560943576,IT +3560943577,3560943577,DK +3560943578,3560943578,ES +3560943579,3560943580,DE +3560943581,3560943581,NL +3560943582,3560943582,DE +3560943583,3560943583,ES +3560943584,3560943584,IT +3560943585,3560943585,FR +3560943586,3560943586,ES +3560943587,3560943587,DE +3560943588,3560943588,IT +3560943589,3560943589,NL +3560943590,3560943590,HU +3560943591,3560943591,AT +3560943592,3560943592,SK +3560943593,3560943593,PL +3560943594,3560943594,FR +3560943595,3560943596,ES +3560943597,3560943599,DE +3560943600,3560943600,AT +3560943601,3560943602,IT +3560943603,3560943603,CH +3560943604,3560943604,ES +3560943605,3560943605,GB +3560943606,3560943607,DE +3560943608,3560943608,IT +3560943609,3560943610,DE +3560943611,3560943611,FR +3560943612,3560943612,DE +3560943613,3560943613,ES +3560943614,3560943617,DE +3560943618,3560943618,FR +3560943619,3560943620,ES +3560943621,3560943621,SE +3560943622,3560943622,BE +3560943623,3560943623,DE +3560943624,3560943624,ES +3560943625,3560943625,AT +3560943626,3560943626,ES +3560943627,3560943627,DK +3560943628,3560943628,DE +3560943629,3560943629,IT +3560943630,3560943630,DE +3560943631,3560943631,HU +3560943632,3560943632,CH +3560943633,3560943633,ES +3560943634,3560943634,FR +3560943635,3560943635,ES +3560943636,3560943636,DE +3560943637,3560943637,PL +3560943638,3560943638,IT +3560943639,3560943639,ES +3560943640,3560943640,FR +3560943641,3560943643,IT +3560943644,3560943644,DE +3560943645,3560943645,GB +3560943646,3560943646,DE +3560943647,3560943647,ES +3560943648,3560943648,DE +3560943649,3560943649,NL +3560943650,3560943651,DE +3560943652,3560943652,AT +3560943653,3560943653,DE +3560943654,3560943654,IT +3560943655,3560943655,DE +3560943656,3560943656,IT +3560943657,3560943657,DE +3560943658,3560943658,GB +3560943659,3560943659,DE +3560943660,3560943660,PT +3560943661,3560943661,DK +3560943662,3560943662,DE +3560943663,3560943664,NL +3560943665,3560943666,DE +3560943667,3560943667,PL +3560943668,3560943668,DK +3560943669,3560943669,FR +3560943670,3560943671,DE +3560943672,3560943672,BH +3560943673,3560943673,SE +3560943674,3560943674,MA +3560943675,3560943675,FR +3560943676,3560943677,DE +3560943678,3560943680,ES +3560943681,3560943682,DE +3560943683,3560943683,GR +3560943684,3560943684,NL +3560943685,3560943685,IT +3560943686,3560943686,FR +3560943687,3560943687,PT +3560943688,3560943688,DE +3560943689,3560943689,PT +3560943690,3560943690,IT +3560943691,3560943691,DE +3560943692,3560943692,SE +3560943693,3560943693,DE +3560943694,3560943694,FR +3560943695,3560943695,GR +3560943696,3560943697,CH +3560943698,3560943698,DE +3560943699,3560943699,IT +3560943700,3560943700,DE +3560943701,3560943701,AT +3560943702,3560943702,DE +3560943703,3560943703,FR +3560943704,3560943704,DE +3560943705,3560943705,CH +3560943706,3560943706,LI +3560943707,3560943709,DE +3560943710,3560943710,NL +3560943711,3560943711,DE +3560943712,3560943712,IT +3560943713,3560943713,PL +3560943714,3560943714,NL +3560943715,3560943715,DE +3560943716,3560943716,GB +3560943717,3560943717,FR +3560943718,3560943719,DE +3560943720,3560943721,IT +3560943722,3560943726,DE +3560943727,3560943727,ES +3560943728,3560943728,GB +3560943729,3560943729,DE +3560943730,3560943730,NL +3560943731,3560943731,IT +3560943732,3560943732,FR +3560943733,3560943733,NO +3560943734,3560943736,DE +3560943737,3560943737,GR +3560943738,3560943738,PT +3560943739,3560943740,DE +3560943741,3560943741,FR +3560943742,3560943742,DE +3560943743,3560943743,PL +3560943744,3560943744,DE +3560943745,3560943745,PL +3560943746,3560943748,DE +3560943749,3560943749,GB +3560943750,3560943750,DE +3560943751,3560943751,IT +3560943752,3560943752,DE +3560943753,3560943753,ES +3560943754,3560943754,HU +3560943755,3560943755,BE +3560943756,3560943756,IT +3560943757,3560943757,DE +3560943758,3560943758,CZ +3560943759,3560943759,IE +3560943760,3560943760,NO +3560943761,3560943761,GB +3560943762,3560943762,IT +3560943763,3560943763,FR +3560943764,3560943764,PL +3560943765,3560943765,SE +3560943766,3560943766,CY +3560943767,3560943768,DE +3560943769,3560943769,FR +3560943770,3560943770,NL +3560943771,3560943771,IT +3560943772,3560943774,DE +3560943775,3560943775,FR +3560943776,3560943780,DE +3560943781,3560943781,ES +3560943782,3560943782,DE +3560943783,3560943783,BE +3560943784,3560943786,DE +3560943787,3560943787,ES +3560943788,3560943788,DK +3560943789,3560943789,IT +3560943790,3560943790,DE +3560943791,3560943791,IT +3560943792,3560943793,DE +3560943794,3560943794,FR +3560943795,3560943795,DE +3560943796,3560943796,IT +3560943797,3560943797,DE +3560943798,3560943798,DK +3560943799,3560943799,DE +3560943800,3560943800,CH +3560943801,3560943801,FR +3560943802,3560943802,IT +3560943803,3560943803,HU +3560943804,3560943804,ES +3560943805,3560943805,DE +3560943806,3560943806,ES +3560943807,3560943807,DK +3560943808,3560943810,DE +3560943811,3560943811,ES +3560943812,3560943812,IT +3560943813,3560943813,CH +3560943814,3560943814,DE +3560943815,3560943815,IT +3560943816,3560943817,FR +3560943818,3560943818,PT +3560943819,3560943819,DE +3560943820,3560943820,FR +3560943821,3560943821,IT +3560943822,3560943822,DE +3560943823,3560943823,GR +3560943824,3560943827,DE +3560943828,3560943828,ES +3560943829,3560943829,NL +3560943830,3560943830,DK +3560943831,3560943833,FR +3560943834,3560943835,DE +3560943836,3560943836,BE +3560943837,3560943837,CH +3560943838,3560943838,DE +3560943839,3560943839,NO +3560943840,3560943840,LU +3560943841,3560943841,GB +3560943842,3560943842,DE +3560943843,3560943843,GB +3560943844,3560943844,BE +3560943845,3560943845,CZ +3560943846,3560943846,LU +3560943847,3560943847,CZ +3560943848,3560943848,FR +3560943849,3560943849,DE +3560943850,3560943850,NL +3560943851,3560943857,DE +3560943858,3560943858,GB +3560943859,3560943859,DE +3560943860,3560943860,GB +3560943861,3560943865,DE +3560943866,3560943866,BE +3560943867,3560943867,ES +3560943868,3560943868,FR +3560943869,3560943869,LU +3560943870,3560943871,DE +3560943872,3560943875,BR +3560943876,3560943879,DE +3560943880,3560943887,US +3560943888,3560943891,CA +3560943892,3560943895,DE +3560943896,3560943899,CL +3560943900,3560943903,MX +3560943904,3560943915,US +3560943916,3560943919,CA +3560943920,3560943923,US +3560943924,3560943927,MX +3560943928,3560943935,US +3560943936,3560943939,PE +3560943940,3560943943,DE +3560943944,3560943947,US +3560943948,3560943975,DE +3560943976,3560943979,US +3560943980,3560943983,DE +3560943984,3560943987,US +3560943988,3560943991,DE +3560943992,3560943999,US +3560944000,3560944023,DE +3560944024,3560944031,US +3560944032,3560944035,MX +3560944036,3560944039,US +3560944040,3560944043,MX +3560944044,3560944059,DE +3560944060,3560944063,US +3560944064,3560944067,DE +3560944068,3560944071,US +3560944072,3560944079,DE +3560944080,3560944083,US +3560944084,3560944087,CL +3560944088,3560944103,DE +3560944104,3560944107,US +3560944108,3560944119,DE +3560944120,3560944135,US +3560944136,3560944139,DE +3560944140,3560944159,US +3560944160,3560944163,MX +3560944164,3560944167,AR +3560944168,3560944175,US +3560944176,3560944179,BR +3560944180,3560944183,PA +3560944184,3560944187,US +3560944188,3560944191,CA +3560944192,3560944195,US +3560944196,3560944199,DE +3560944200,3560944203,BO +3560944204,3560944207,DE +3560944208,3560944211,CA +3560944212,3560944215,DE +3560944216,3560944219,BR +3560944220,3560944227,US +3560944228,3560944231,IT +3560944232,3560944235,US +3560944236,3560944239,CA +3560944240,3560944243,US +3560944244,3560944247,MX +3560944248,3560944267,US +3560944268,3560944271,CO +3560944272,3560944275,BR +3560944276,3560944279,PE +3560944280,3560944283,DE +3560944284,3560944295,US +3560944296,3560944299,CO +3560944300,3560944307,US +3560944308,3560944311,MX +3560944312,3560944315,US +3560944316,3560944323,AR +3560944324,3560944339,US +3560944340,3560944343,CO +3560944344,3560944351,US +3560944352,3560944355,GT +3560944356,3560944359,CA +3560944360,3560944363,DO +3560944364,3560944367,AR +3560944368,3560944371,BR +3560944372,3560944375,DE +3560944376,3560944379,AR +3560944380,3560944383,DE +3560944384,3560944395,US +3560944396,3560944399,PR +3560944400,3560944403,CA +3560944404,3560944411,DE +3560944412,3560944415,US +3560944416,3560944419,SG +3560944420,3560944431,US +3560944432,3560944435,DE +3560944436,3560944447,US +3560944448,3560944451,DE +3560944452,3560944459,US +3560944460,3560944460,AR +3560944461,3560944463,DE +3560944464,3560944467,CA +3560944468,3560944471,BR +3560944472,3560944475,US +3560944476,3560944479,AR +3560944480,3560944487,US +3560944488,3560944491,CA +3560944492,3560944519,US +3560944520,3560944523,DE +3560944524,3560944531,US +3560944532,3560944535,MX +3560944536,3560944551,US +3560944552,3560944555,BR +3560944556,3560944559,MX +3560944560,3560944563,US +3560944564,3560944567,ES +3560944568,3560944575,US +3560944576,3560944579,BR +3560944580,3560944603,US +3560944604,3560944607,CA +3560944608,3560944615,US +3560944616,3560944619,EC +3560944620,3560944623,US +3560944624,3560944627,CL +3560944628,3560944631,DE +3560944632,3560944635,CA +3560944636,3560944639,DE +3560944640,3560944643,TR +3560944644,3560944647,ES +3560944648,3560944651,TR +3560944652,3560944655,HU +3560944656,3560944659,TR +3560944660,3560944663,MZ +3560944664,3560944667,FR +3560944668,3560944671,TR +3560944672,3560944675,KZ +3560944676,3560944679,GR +3560944680,3560944687,TR +3560944688,3560944691,FR +3560944692,3560944695,SA +3560944696,3560944699,TR +3560944700,3560944703,CU +3560944704,3560944707,ZW +3560944708,3560944711,TR +3560944712,3560944715,IL +3560944716,3560944719,ZW +3560944720,3560944723,SK +3560944724,3560944727,TR +3560944728,3560944731,KZ +3560944732,3560944735,TR +3560944736,3560944743,FR +3560944744,3560944747,GR +3560944748,3560944755,TR +3560944756,3560944759,MZ +3560944760,3560944767,TR +3560944768,3560944771,MZ +3560944772,3560944779,DE +3560944780,3560944783,ES +3560944784,3560944787,FR +3560944788,3560944791,NL +3560944792,3560944795,ES +3560944796,3560944799,GB +3560944800,3560944803,ES +3560944804,3560944807,FR +3560944808,3560944811,DE +3560944812,3560944815,ES +3560944816,3560944823,IT +3560944824,3560944827,DE +3560944828,3560944831,IE +3560944832,3560944835,DE +3560944836,3560944839,IT +3560944840,3560944843,TR +3560944844,3560944847,DE +3560944848,3560944855,FR +3560944856,3560944859,NL +3560944860,3560944863,DK +3560944864,3560944871,FR +3560944872,3560944875,DE +3560944876,3560944879,ES +3560944880,3560944883,SA +3560944884,3560944887,ES +3560944888,3560944891,CH +3560944892,3560944895,DE +3560944896,3560944899,TW +3560944900,3560944903,SG +3560944904,3560944907,MY +3560944908,3560944919,SG +3560944920,3560944923,MY +3560944924,3560944927,CN +3560944928,3560944931,MY +3560944932,3560944935,SG +3560944936,3560944943,CN +3560944944,3560944947,MY +3560944948,3560944951,SG +3560944952,3560944955,TW +3560944956,3560944959,SG +3560944960,3560944963,IN +3560944964,3560944967,MY +3560944968,3560944971,SG +3560944972,3560944975,CN +3560944976,3560944987,IN +3560944988,3560944991,SG +3560944992,3560944995,MY +3560944996,3560944999,SG +3560945000,3560945003,MY +3560945004,3560945007,IN +3560945008,3560945011,SG +3560945012,3560945015,DE +3560945016,3560945027,IN +3560945028,3560945031,MY +3560945032,3560945035,IN +3560945036,3560945039,CN +3560945040,3560945043,SG +3560945044,3560945047,TW +3560945048,3560945059,IN +3560945060,3560945063,SG +3560945064,3560945067,MY +3560945068,3560945075,IN +3560945076,3560945083,CN +3560945084,3560945091,IN +3560945092,3560945095,SG +3560945096,3560945099,CN +3560945100,3560945103,SG +3560945104,3560945107,MY +3560945108,3560945111,TW +3560945112,3560945115,SG +3560945116,3560945119,IN +3560945120,3560945123,CN +3560945124,3560945131,SG +3560945132,3560945135,TW +3560945136,3560945139,MY +3560945140,3560945143,SG +3560945144,3560945147,IN +3560945148,3560945151,SG +3560945152,3560945153,DE +3560945154,3560945156,AU +3560945157,3560945157,NZ +3560945158,3560945167,AU +3560945168,3560945168,DE +3560945169,3560945169,AU +3560945170,3560945191,DE +3560945192,3560945192,AU +3560945193,3560945194,DE +3560945195,3560945195,AU +3560945196,3560945204,DE +3560945205,3560945205,AU +3560945206,3560945206,IN +3560945207,3560945209,AU +3560945210,3560945227,DE +3560945228,3560945231,IN +3560945232,3560945267,DE +3560945268,3560945271,AU +3560945272,3560945275,DE +3560945276,3560945279,AU +3560945280,3560945355,JP +3560945356,3560945359,TH +3560945360,3560945403,JP +3560945404,3560945407,TH +3560945408,3560945409,DE +3560945410,3560945410,MY +3560945411,3560945411,TW +3560945412,3560945412,CN +3560945413,3560945413,SG +3560945414,3560945414,IN +3560945415,3560945416,SG +3560945417,3560945418,CN +3560945419,3560945419,MY +3560945420,3560945420,IN +3560945421,3560945422,SG +3560945423,3560945423,CN +3560945424,3560945424,MY +3560945425,3560945425,IN +3560945426,3560945426,MY +3560945427,3560945427,CN +3560945428,3560945428,SG +3560945429,3560945429,TW +3560945430,3560945430,MY +3560945431,3560945431,CN +3560945432,3560945433,IN +3560945434,3560945434,TW +3560945435,3560945435,MY +3560945436,3560945436,CN +3560945437,3560945437,SG +3560945438,3560945438,TW +3560945439,3560945439,SG +3560945440,3560945440,ID +3560945441,3560945441,SG +3560945442,3560945443,IN +3560945444,3560945448,SG +3560945449,3560945449,IN +3560945450,3560945450,SG +3560945451,3560945451,IN +3560945452,3560945452,SG +3560945453,3560945453,IN +3560945454,3560945458,SG +3560945459,3560945459,TW +3560945460,3560945461,SG +3560945462,3560945462,IN +3560945463,3560945465,SG +3560945466,3560945466,CN +3560945467,3560945467,MY +3560945468,3560945469,SG +3560945470,3560945470,CN +3560945471,3560945471,SG +3560945472,3560945472,CN +3560945473,3560945473,TW +3560945474,3560945475,SG +3560945476,3560945476,CN +3560945477,3560945477,TW +3560945478,3560945478,IN +3560945479,3560945479,SG +3560945480,3560945481,IN +3560945482,3560945482,DE +3560945483,3560945485,MY +3560945486,3560945487,IN +3560945488,3560945488,DE +3560945489,3560945489,MY +3560945490,3560945490,TH +3560945491,3560945492,IN +3560945493,3560945495,DE +3560945496,3560945496,IN +3560945497,3560945497,DE +3560945498,3560945499,IN +3560945500,3560945500,SG +3560945501,3560945501,US +3560945502,3560945502,IN +3560945503,3560945535,DE +3560945536,3560945539,IN +3560945540,3560945543,SG +3560945544,3560945559,IN +3560945560,3560945563,DE +3560945564,3560945567,SG +3560945568,3560945575,IN +3560945576,3560945579,SG +3560945580,3560945583,MY +3560945584,3560945587,SG +3560945588,3560945591,TW +3560945592,3560945603,SG +3560945604,3560945607,US +3560945608,3560945611,IN +3560945612,3560945619,SG +3560945620,3560945627,CN +3560945628,3560945635,SG +3560945636,3560945639,CN +3560945640,3560945643,IN +3560945644,3560945647,MY +3560945648,3560945651,IN +3560945652,3560945659,DE +3560945660,3560945663,IN +3560945664,3560945667,US +3560945668,3560945671,BR +3560945672,3560945675,US +3560945676,3560945679,PE +3560945680,3560945683,BR +3560945684,3560945691,CO +3560945692,3560945699,US +3560945700,3560945703,CO +3560945704,3560945707,US +3560945708,3560945711,CO +3560945712,3560945727,US +3560945728,3560945731,AR +3560945732,3560945739,US +3560945740,3560945743,BR +3560945744,3560945747,US +3560945748,3560945751,AR +3560945752,3560945763,US +3560945764,3560945767,AR +3560945768,3560945771,BR +3560945772,3560945775,CA +3560945776,3560945787,US +3560945788,3560945791,CO +3560945792,3560945795,AR +3560945796,3560945799,US +3560945800,3560945803,BR +3560945804,3560945807,US +3560945808,3560945811,CO +3560945812,3560945815,US +3560945816,3560945819,AR +3560945820,3560945823,US +3560945824,3560945827,BR +3560945828,3560945835,US +3560945836,3560945839,CL +3560945840,3560945843,BR +3560945844,3560945851,US +3560945852,3560945855,DE +3560945856,3560945859,US +3560945860,3560945863,DE +3560945864,3560945867,US +3560945868,3560945871,DE +3560945872,3560945875,CA +3560945876,3560945911,US +3560945912,3560945915,CA +3560945916,3560945919,US +3560945920,3560946017,DE +3560946018,3560946018,FI +3560946019,3560946019,CZ +3560946020,3560946176,DE +3560946177,3560946189,US +3560946190,3560946190,AR +3560946191,3560946194,US +3560946195,3560946195,PE +3560946196,3560946196,CA +3560946197,3560946197,US +3560946198,3560946198,CA +3560946199,3560946199,AR +3560946200,3560946200,US +3560946201,3560946201,CA +3560946202,3560946202,DE +3560946203,3560946203,CA +3560946204,3560946204,US +3560946205,3560946205,PE +3560946206,3560946208,US +3560946209,3560946209,CA +3560946210,3560946212,US +3560946213,3560946213,CO +3560946214,3560946214,CA +3560946215,3560946215,PE +3560946216,3560946229,US +3560946230,3560946230,AR +3560946231,3560946231,US +3560946232,3560946232,CA +3560946233,3560946234,US +3560946235,3560946235,CL +3560946236,3560946237,US +3560946238,3560946238,AR +3560946239,3560946253,US +3560946254,3560946254,SG +3560946255,3560946256,US +3560946257,3560946257,MX +3560946258,3560946259,US +3560946260,3560946260,AR +3560946261,3560946262,US +3560946263,3560946263,AR +3560946264,3560946266,US +3560946267,3560946267,CA +3560946268,3560946271,US +3560946272,3560946272,DE +3560946273,3560946273,CA +3560946274,3560946279,US +3560946280,3560946280,ES +3560946281,3560946282,US +3560946283,3560946283,CL +3560946284,3560946284,US +3560946285,3560946285,CO +3560946286,3560946290,US +3560946291,3560946291,CA +3560946292,3560946295,US +3560946296,3560946296,CL +3560946297,3560946297,DE +3560946298,3560946298,US +3560946299,3560946299,DE +3560946300,3560946300,CL +3560946301,3560946311,DE +3560946312,3560946312,US +3560946313,3560946317,DE +3560946318,3560946319,US +3560946320,3560946320,DE +3560946321,3560946326,US +3560946327,3560946327,CA +3560946328,3560946328,US +3560946329,3560946329,DO +3560946330,3560946330,US +3560946331,3560946331,DO +3560946332,3560946333,CA +3560946334,3560946335,US +3560946336,3560946336,CA +3560946337,3560946337,DE +3560946338,3560946338,CA +3560946339,3560946339,US +3560946340,3560946340,CL +3560946341,3560946342,CA +3560946343,3560946343,DO +3560946344,3560946344,AR +3560946345,3560946345,US +3560946346,3560946346,PE +3560946347,3560946347,US +3560946348,3560946361,DE +3560946362,3560946363,US +3560946364,3560946367,DE +3560946368,3560946368,US +3560946369,3560946372,DE +3560946373,3560946373,US +3560946374,3560946374,DE +3560946375,3560946375,US +3560946376,3560946398,DE +3560946399,3560946399,US +3560946400,3560946408,DE +3560946409,3560946409,US +3560946410,3560946419,DE +3560946420,3560946420,US +3560946421,3560946431,DE +3560946432,3560946443,US +3560946444,3560946447,BR +3560946448,3560946451,DE +3560946452,3560946455,BO +3560946456,3560946467,US +3560946468,3560946471,BR +3560946472,3560946483,US +3560946484,3560946487,MX +3560946488,3560946491,US +3560946492,3560946495,BR +3560946496,3560946499,VE +3560946500,3560946503,AR +3560946504,3560946507,US +3560946508,3560946511,MX +3560946512,3560946523,US +3560946524,3560946527,MX +3560946528,3560946531,US +3560946532,3560946535,CA +3560946536,3560946539,PE +3560946540,3560946543,US +3560946544,3560946547,CA +3560946548,3560946551,US +3560946552,3560946555,PE +3560946556,3560946559,US +3560946560,3560946563,BR +3560946564,3560946567,US +3560946568,3560946571,BR +3560946572,3560946579,US +3560946580,3560946583,CA +3560946584,3560946587,US +3560946588,3560946591,AR +3560946592,3560946603,US +3560946604,3560946607,AR +3560946608,3560946611,BR +3560946612,3560946623,US +3560946624,3560946635,MX +3560946636,3560946643,US +3560946644,3560946647,AR +3560946648,3560946651,MX +3560946652,3560946655,CL +3560946656,3560946659,BR +3560946660,3560946663,MX +3560946664,3560946667,US +3560946668,3560946671,MX +3560946672,3560946679,BR +3560946680,3560946687,US +3560946688,3560946689,DE +3560946690,3560946695,US +3560946696,3560946696,BR +3560946697,3560946698,US +3560946699,3560946700,DE +3560946701,3560946701,CO +3560946702,3560946706,US +3560946707,3560946707,VE +3560946708,3560946708,BR +3560946709,3560946710,VE +3560946711,3560946711,US +3560946712,3560946712,VE +3560946713,3560946714,US +3560946715,3560946715,CO +3560946716,3560946716,US +3560946717,3560946717,AR +3560946718,3560946718,US +3560946719,3560946720,BR +3560946721,3560946723,CO +3560946724,3560946724,MX +3560946725,3560946729,US +3560946730,3560946730,MX +3560946731,3560946733,US +3560946734,3560946734,PR +3560946735,3560946747,US +3560946748,3560946748,DE +3560946749,3560946760,US +3560946761,3560946761,DE +3560946762,3560946767,US +3560946768,3560946768,CA +3560946769,3560946769,US +3560946770,3560946825,DE +3560946826,3560946826,US +3560946827,3560946835,DE +3560946836,3560946836,US +3560946837,3560946839,DE +3560946840,3560946840,US +3560946841,3560946943,DE +3560946944,3560946947,US +3560946948,3560946951,BR +3560946952,3560946955,MX +3560946956,3560946959,CO +3560946960,3560946963,MX +3560946964,3560946967,AR +3560946968,3560946979,US +3560946980,3560946987,DE +3560946988,3560946991,US +3560946992,3560946995,DE +3560946996,3560946999,UY +3560947000,3560947015,US +3560947016,3560947019,AR +3560947020,3560947027,US +3560947028,3560947031,CO +3560947032,3560947039,US +3560947040,3560947043,BR +3560947044,3560947067,US +3560947068,3560947071,AR +3560947072,3560947075,BR +3560947076,3560947095,US +3560947096,3560947099,MX +3560947100,3560947107,US +3560947108,3560947111,DE +3560947112,3560947123,US +3560947124,3560947127,CO +3560947128,3560947143,US +3560947144,3560947147,DE +3560947148,3560947191,US +3560947192,3560947195,VE +3560947196,3560947199,DE +3560947200,3560947203,CA +3560947204,3560947207,US +3560947208,3560947211,DE +3560947212,3560947231,US +3560947232,3560947235,CA +3560947236,3560947239,CO +3560947240,3560947247,US +3560947248,3560947251,CA +3560947252,3560947267,US +3560947268,3560947271,CO +3560947272,3560947275,US +3560947276,3560947279,AR +3560947280,3560947283,MX +3560947284,3560947287,US +3560947288,3560947291,BR +3560947292,3560947331,US +3560947332,3560947335,MX +3560947336,3560947343,US +3560947344,3560947347,MX +3560947348,3560947351,CO +3560947352,3560947355,US +3560947356,3560947359,AN +3560947360,3560947363,US +3560947364,3560947367,HN +3560947368,3560947371,BR +3560947372,3560947375,CA +3560947376,3560947383,US +3560947384,3560947391,CO +3560947392,3560947395,MX +3560947396,3560947399,US +3560947400,3560947407,AR +3560947408,3560947411,US +3560947412,3560947415,AR +3560947416,3560947431,US +3560947432,3560947435,MX +3560947436,3560947439,DE +3560947440,3560947443,BR +3560947444,3560947455,US +3560947456,3560947495,JP +3560947496,3560947499,KR +3560947500,3560947686,JP +3560947687,3560947687,DE +3560947688,3560947711,JP +3560947712,3560950863,SE +3560950864,3560950867,DK +3560950868,3560951039,SE +3560951040,3560951043,NO +3560951044,3560951195,SE +3560951196,3560951199,DK +3560951200,3560951207,SE +3560951208,3560951211,DK +3560951212,3560951383,SE +3560951384,3560951387,NO +3560951388,3560951391,SE +3560951392,3560951395,IT +3560951396,3560951423,SE +3560951424,3560951427,NL +3560951428,3560951447,SE +3560951448,3560951451,FR +3560951452,3560951551,SE +3560951552,3560951555,ES +3560951556,3560951559,NO +3560951560,3560951583,SE +3560951584,3560951587,FI +3560951588,3560955903,SE +3560955904,3560964095,BE +3560964096,3560996863,NL +3560996864,3561005055,SA +3561005056,3561013247,ES +3561013248,3561021439,TR +3561021440,3561022719,DE +3561022720,3561022975,AT +3561022976,3561037823,DE +3561037824,3561046015,BE +3561046016,3561054207,RU +3561054208,3561062399,MT +3561062400,3561070591,TR +3561070592,3561070847,DE +3561070848,3561078783,CH +3561078784,3561095167,CZ +3561095168,3561103359,DE +3561103360,3561111551,UA +3561111552,3561119743,LU +3561119744,3561127935,IT +3561127936,3561136127,DE +3561136128,3561144319,ES +3561144320,3561152511,FI +3561152512,3561160703,IT +3561160704,3561168895,RU +3561168896,3561177087,FR +3561177088,3561185279,CZ +3561185280,3561193471,GB +3561193472,3561201663,PL +3561201664,3561206655,NL +3561206656,3561206663,BE +3561206664,3561209855,NL +3561209856,3561218047,GB +3561218048,3561226239,AT +3561226240,3561234431,FI +3561234432,3561242623,TR +3561242624,3561259007,DE +3561259008,3561267199,IL +3561267200,3561275391,UA +3561275392,3561291775,BE +3561291776,3561299967,CS +3561299968,3561308159,GB +3561308160,3561316351,PL +3561316352,3561324543,RU +3561324544,3561332735,IT +3561332736,3561340927,AT +3561340928,3561357311,GB +3561357312,3561365503,DK +3561365504,3561373695,SA +3561373696,3561381887,GB +3561381888,3561382479,AT +3561382480,3561382495,DE +3561382496,3561390079,AT +3561390080,3561398271,BG +3561398272,3561406463,LV +3561406464,3561414655,GR +3561414656,3561422847,IT +3561422848,3561427207,BE +3561427208,3561427211,NL +3561427212,3561428135,BE +3561428136,3561428143,NL +3561428144,3561429279,BE +3561429280,3561429287,NL +3561429288,3561431039,BE +3561431040,3561439231,SA +3561439232,3561447423,NO +3561447424,3561455615,CH +3561455616,3561471999,CZ +3561472000,3561480191,DE +3561480192,3561488383,GB +3561488384,3561496575,OM +3561496576,3561496735,NL +3561496736,3561497215,GB +3561497216,3561497423,NL +3561497424,3561497471,GB +3561497472,3561498367,NL +3561498368,3561498399,GB +3561498400,3561498431,NL +3561498432,3561498487,GB +3561498488,3561498491,NL +3561498492,3561498495,GB +3561498496,3561498559,NL +3561498560,3561498607,GB +3561498608,3561498615,NL +3561498616,3561498623,GB +3561498624,3561500415,NL +3561500416,3561500671,GB +3561500672,3561500751,NL +3561500752,3561500763,GB +3561500764,3561500767,NL +3561500768,3561500775,GB +3561500776,3561500807,NL +3561500808,3561500815,GB +3561500816,3561500991,NL +3561500992,3561501055,GB +3561501056,3561501375,NL +3561501376,3561501407,GB +3561501408,3561501455,NL +3561501456,3561501487,GB +3561501488,3561501631,NL +3561501632,3561501695,GB +3561501696,3561502047,NL +3561502048,3561502079,GB +3561502080,3561502143,NL +3561502144,3561502207,GB +3561502208,3561502631,NL +3561502632,3561502655,GB +3561502656,3561504319,NL +3561504320,3561504383,GB +3561504384,3561504767,NL +3561504768,3561512959,DE +3561512960,3561521151,SI +3561521152,3561529343,GE +3561529344,3561534559,DE +3561534560,3561534575,US +3561534576,3561537535,DE +3561537536,3561545727,BG +3561545728,3561553919,NL +3561553920,3561562111,SE +3561562112,3561570303,ES +3561570304,3561578495,AM +3561578496,3561586687,RU +3561586688,3561594879,BG +3561594880,3561594935,SE +3561594936,3561594939,DK +3561594940,3561594975,SE +3561594976,3561595007,DK +3561595008,3561603071,SE +3561603072,3561603263,FR +3561603264,3561603295,GB +3561603296,3561603455,FR +3561603456,3561603487,GB +3561603488,3561604351,FR +3561604352,3561604895,GB +3561604896,3561604911,FR +3561604912,3561605119,GB +3561605120,3561607231,FR +3561607232,3561607235,GB +3561607236,3561607239,FR +3561607240,3561607247,GB +3561607248,3561607343,FR +3561607344,3561607359,GB +3561607360,3561607679,FR +3561607680,3561607711,GB +3561607712,3561610239,FR +3561610240,3561610495,US +3561610496,3561610511,FR +3561610512,3561610719,GB +3561610720,3561611295,FR +3561611296,3561611559,GB +3561611560,3561611567,FR +3561611568,3561614175,GB +3561614176,3561614199,FR +3561614200,3561614335,GB +3561614336,3561614591,FR +3561614592,3561615359,GB +3561615360,3561615615,FR +3561615616,3561615871,IT +3561615872,3561616383,FR +3561616384,3561616511,GB +3561616512,3561616543,FR +3561616544,3561616559,GB +3561616560,3561616575,FR +3561616576,3561616895,GB +3561616896,3561616959,FR +3561616960,3561617151,GB +3561617152,3561617407,FR +3561617408,3561617919,CH +3561617920,3561618175,SE +3561618176,3561618431,IE +3561618432,3561618687,DK +3561618688,3561618815,FR +3561618816,3561618943,PL +3561618944,3561619455,FR +3561619456,3561636863,GB +3561636864,3561637119,BE +3561637120,3561637375,ES +3561637376,3561637631,CH +3561637632,3561637887,IT +3561637888,3561638143,AT +3561638144,3561638399,SE +3561638400,3561638655,US +3561638656,3561638911,DK +3561638912,3561639423,GB +3561639424,3561639679,DE +3561639680,3561640575,GB +3561640576,3561640831,FR +3561640832,3561641983,GB +3561641984,3561642239,DE +3561642240,3561652223,GB +3561652224,3561668607,CH +3561668608,3561679359,RU +3561679360,3561679615,UA +3561679616,3561684991,RU +3561684992,3561693183,BG +3561693184,3561694487,DE +3561694488,3561694495,CH +3561694496,3561701375,DE +3561701376,3561706031,SE +3561706032,3561706047,DK +3561706048,3561709567,SE +3561709568,3561717759,PL +3561717760,3561725951,RU +3561725952,3561734143,ES +3561734144,3561742335,RU +3561742336,3561750527,KW +3561750528,3561758719,KZ +3561758720,3561766911,PL +3561766912,3561775103,SA +3561775104,3561783295,IL +3561783296,3561791487,DE +3561791488,3561799679,RU +3561799680,3561807871,DE +3561807872,3561816063,BE +3561816064,3561824255,VA +3561824256,3561832447,LI +3561832448,3561840639,IT +3561840640,3561848831,PL +3561848832,3561857023,RU +3561857024,3561865215,DE +3561865216,3561873407,QA +3561873408,3561881599,DE +3561881600,3561889791,IT +3561889792,3561897983,FR +3561897984,3561906175,GB +3561906176,3561907759,DE +3561907760,3561907763,GB +3561907764,3561910207,DE +3561910208,3561910223,GB +3561910224,3561914367,DE +3561914368,3561922559,ES +3561922560,3561922855,NL +3561922856,3561922911,GB +3561922912,3561922975,NL +3561922976,3561922991,GB +3561922992,3561923015,NL +3561923016,3561923063,GB +3561923064,3561923067,NL +3561923068,3561923071,GB +3561923072,3561923551,NL +3561923552,3561923583,GB +3561923584,3561923679,NL +3561923680,3561923871,GB +3561923872,3561924159,NL +3561924160,3561924199,GB +3561924200,3561924215,NL +3561924216,3561924223,GB +3561924224,3561924351,NL +3561924352,3561924639,GB +3561924640,3561924647,NL +3561924648,3561924663,GB +3561924664,3561924671,NL +3561924672,3561924679,GB +3561924680,3561924687,NL +3561924688,3561924703,GB +3561924704,3561924719,NL +3561924720,3561924911,GB +3561924912,3561924943,NL +3561924944,3561924975,GB +3561924976,3561924991,NL +3561924992,3561925007,GB +3561925008,3561925039,NL +3561925040,3561925087,GB +3561925088,3561925103,NL +3561925104,3561926943,GB +3561926944,3561926975,NL +3561926976,3561927167,GB +3561927168,3561927423,NL +3561927424,3561927551,GB +3561927552,3561927647,NL +3561927648,3561927663,GB +3561927664,3561927679,NL +3561927680,3561928191,GB +3561928192,3561929727,NL +3561929728,3561929743,GB +3561929744,3561929791,NL +3561929792,3561929879,GB +3561929880,3561929919,NL +3561929920,3561929967,GB +3561929968,3561930335,NL +3561930336,3561930503,GB +3561930504,3561930511,NL +3561930512,3561930751,GB +3561930752,3561931647,DE +3561931648,3561931711,SE +3561931712,3561931791,DE +3561931792,3561932031,SE +3561932032,3561934847,DE +3561934848,3561935359,SE +3561935360,3561935871,DE +3561935872,3561936127,SE +3561936128,3561938175,DE +3561938176,3561938431,SE +3561938432,3561938687,DE +3561938688,3561938943,SE +3561938944,3561940991,IE +3561940992,3561942015,GB +3561942016,3561947135,IE +3561947136,3561963519,DE +3561963520,3561971711,BE +3561971712,3561976831,TR +3561976832,3561977343,DE +3561977344,3561977855,US +3561977856,3561978367,PK +3561978368,3561979903,TR +3561979904,3561988095,ES +3561988096,3562004479,DE +3562004480,3562006159,NL +3562006160,3562006175,DE +3562006176,3562006819,NL +3562006820,3562006823,VG +3562006824,3562007839,NL +3562007840,3562007871,VG +3562007872,3562007903,KN +3562007904,3562010399,NL +3562010400,3562010431,KN +3562010432,3562010943,NL +3562010944,3562010975,VG +3562010976,3562012031,NL +3562012032,3562012063,VG +3562012064,3562012479,NL +3562012480,3562012483,KN +3562012484,3562012671,NL +3562012672,3562020863,IR +3562020864,3562029055,UA +3562029056,3562037247,CZ +3562037248,3562045439,CH +3562045440,3562056711,ES +3562056712,3562056719,NL +3562056720,3562056911,ES +3562056912,3562056927,FR +3562056928,3562057215,ES +3562057216,3562057247,NL +3562057248,3562057263,BE +3562057264,3562057471,ES +3562057472,3562057727,DE +3562057728,3562057975,ES +3562057976,3562057983,FR +3562057984,3562058303,ES +3562058304,3562058367,IT +3562058368,3562059327,ES +3562059328,3562059335,CH +3562059336,3562059391,ES +3562059392,3562059775,CH +3562059776,3562061823,ES +3562061824,3562070015,IT +3562070016,3562078207,DE +3562078208,3562086399,SK +3562086400,3562087423,SE +3562087424,3562088447,GB +3562088448,3562094591,SE +3562094592,3562098879,FR +3562098880,3562098895,BE +3562098896,3562102415,FR +3562102416,3562102431,NL +3562102432,3562105503,FR +3562105504,3562105535,DE +3562105536,3562110975,FR +3562110976,3562143743,ES +3562143744,3562151935,GB +3562151936,3562160127,DE +3562160128,3562161151,GB +3562161152,3562161183,NL +3562161184,3562170367,GB +3562170368,3562172415,IE +3562172416,3562173951,CH +3562173952,3562174463,GB +3562174464,3562176511,CH +3562176512,3562184703,FR +3562184704,3562192895,DE +3562192896,3562201087,UA +3562201088,3562209279,DE +3562209280,3562217471,RU +3562217472,3562220287,DE +3562220288,3562220799,CH +3562220800,3562225663,DE +3562225664,3562233855,NL +3562233856,3562242047,FI +3562242048,3562258431,FR +3562258432,3562283007,NL +3562283008,3562291199,IT +3562291200,3562307583,GB +3562307584,3562315775,NL +3562315776,3562323967,GB +3562323968,3562340351,DE +3562340352,3562348543,GB +3562348544,3562356735,ES +3562356736,3562364927,SE +3562364928,3562373119,PL +3562373120,3562381311,FR +3562381312,3562389503,IT +3562397696,3562405887,GB +3562405888,3562414079,FI +3562414080,3562422271,DE +3562422272,3562430463,GB +3562430464,3562438655,UA +3562438656,3562463231,DE +3562463232,3562471423,UA +3562471424,3562479615,PL +3562479616,3562487807,DE +3562487808,3562495999,GB +3562496000,3562504191,BE +3562504192,3562512383,DE +3562512384,3562520575,UA +3562520576,3562528767,ES +3562528768,3562536959,PL +3562536960,3562545151,AT +3562545152,3562553343,GB +3562553344,3562561535,DK +3562569728,3562572143,DE +3562572144,3562572159,LU +3562572160,3562572223,DE +3562572224,3562572239,US +3562572240,3562572543,DE +3562572544,3562572799,LU +3562572800,3562577919,DE +3562577920,3562586111,AT +3562586112,3562594303,DE +3562594304,3562595423,BE +3562595424,3562595455,LU +3562595456,3562598207,BE +3562598208,3562598223,LU +3562598224,3562602495,BE +3562602496,3562610687,ES +3562610688,3562618879,NO +3562618880,3562627071,GB +3562627072,3562643455,DE +3562643456,3562651647,GR +3562651648,3562659839,DE +3562659840,3562668031,SK +3562668032,3562676223,IT +3562676224,3562684415,GB +3562684416,3562692607,FI +3562692608,3562695375,UA +3562695376,3562695379,CZ +3562695380,3562700799,UA +3562700800,3562708991,DE +3562708992,3562717183,UA +3562717184,3562725375,CH +3562725376,3562733567,CZ +3562733568,3562741759,PL +3562741760,3562758143,IT +3562758144,3562766335,HR +3562766336,3562774527,SE +3562774528,3562782719,BG +3562782720,3562790911,RU +3562790912,3562799103,DE +3562799104,3562803471,HU +3562803472,3562803479,UA +3562803480,3562807295,HU +3562807296,3562815487,ES +3562815488,3562823679,NL +3562823680,3562848255,RU +3562848256,3562856447,HR +3562856448,3562864639,UA +3562864640,3562872831,DE +3562872832,3562881023,DK +3562881024,3562889215,GB +3562889216,3562897407,LV +3562897408,3562905599,RO +3562905600,3562921983,SA +3562921984,3562930175,SI +3562930176,3562938367,RU +3562938368,3562946559,CH +3562946560,3562954751,FI +3562954752,3562962943,RU +3562962944,3562971135,IT +3562971136,3562987519,FR +3562987520,3562995711,DE +3562995712,3563003903,AT +3563003904,3563005183,DE +3563005184,3563005311,KZ +3563005312,3563005439,DE +3563005440,3563005695,TR +3563005696,3563005951,DE +3563005952,3563006463,TR +3563006464,3563006591,DE +3563006592,3563006719,CA +3563006720,3563006729,DE +3563006730,3563006847,CN +3563006848,3563006975,CA +3563006976,3563007487,DE +3563007488,3563007999,TR +3563008000,3563008255,PA +3563008256,3563008511,PL +3563008512,3563009279,DE +3563009280,3563009535,LT +3563009536,3563009791,BY +3563009792,3563010047,CN +3563010048,3563010063,DE +3563010064,3563010079,KZ +3563010080,3563010303,DE +3563010304,3563010559,NL +3563010560,3563010815,BY +3563010816,3563011071,PL +3563011072,3563011583,DE +3563011584,3563011839,ES +3563011840,3563012095,BY +3563012096,3563020287,FR +3563020288,3563028479,DE +3563028480,3563036671,IR +3563036672,3563044863,BG +3563044864,3563053055,ES +3563053056,3563053503,GB +3563053504,3563053527,US +3563053528,3563061247,GB +3563069440,3563077631,HU +3563077632,3563085823,FR +3563085824,3563094015,RU +3563094016,3563096255,DE +3563096256,3563096287,GB +3563096288,3563097087,DE +3563097088,3563097119,GB +3563097120,3563097151,DE +3563097152,3563097183,GB +3563097184,3563097215,DE +3563097216,3563097247,GB +3563097248,3563097311,DE +3563097312,3563097343,GB +3563097344,3563102207,DE +3563102208,3563110399,CZ +3563110400,3563118591,RU +3563118592,3563126783,DE +3563126784,3563134975,KG +3563134976,3563143167,IT +3563143168,3563151359,GB +3563151360,3563159551,DE +3563159552,3563163647,DK +3563163648,3563164159,SE +3563164160,3563167743,DK +3563167744,3563175935,ES +3563175936,3563192319,DK +3563192320,3563200511,TR +3563200512,3563208703,CH +3563208704,3563225087,DK +3563225088,3563233279,LB +3563233280,3563241471,BY +3563241472,3563257855,TR +3563257856,3563290623,FR +3563290624,3563315199,DE +3563315200,3563323391,DK +3563323392,3563329791,GB +3563331584,3563339775,DE +3563347968,3563356159,GB +3563356160,3563364351,RU +3563364352,3563372543,BE +3563372544,3563380735,SA +3563380736,3563381951,GB +3563381952,3563381959,IT +3563381960,3563382383,GB +3563382384,3563382391,AU +3563382392,3563382495,GB +3563382496,3563382503,AT +3563382504,3563382583,GB +3563382584,3563382587,AT +3563382588,3563382589,DE +3563382590,3563382767,GB +3563382768,3563382775,IE +3563382776,3563388927,GB +3563388928,3563397119,CH +3563397120,3563405311,DE +3563405312,3563407871,ES +3563407872,3563407903,US +3563407904,3563413503,ES +3563413504,3563421695,TR +3563421696,3563438079,CH +3563438080,3563446271,DE +3563446272,3563454463,LB +3563454464,3563462655,SA +3563462656,3563479039,IT +3563479040,3563487231,GB +3563487232,3563488255,RS +3563488256,3563488351,CS +3563488352,3563488383,CS +3563488384,3563488447,RS +3563488448,3563488511,CS +3563488512,3563489535,RS +3563489536,3563491323,CS +3563491324,3563491327,RS +3563491328,3563495423,CS +3563495424,3563503615,DE +3563503616,3563511807,GB +3563511808,3563519999,DE +3563520000,3563528191,FR +3563528192,3563536383,DE +3563536384,3563539087,CH +3563539088,3563539095,US +3563539096,3563539119,CH +3563539120,3563539135,DE +3563539136,3563540191,CH +3563540192,3563540199,DE +3563540200,3563544575,CH +3563544576,3563552767,DE +3563552768,3563560959,SI +3563569152,3563577343,IT +3563577344,3563585535,GB +3563585536,3563601919,IT +3563601920,3563610111,GR +3563610112,3563618303,BG +3563618304,3563626495,GB +3563626496,3563634687,ES +3563634688,3563651071,NL +3563651072,3563683839,SE +3563683840,3563692031,BE +3563692032,3563700223,GB +3563700224,3563708415,DE +3563708416,3563716607,HU +3563716608,3563724799,PL +3563724800,3563732991,RU +3563732992,3563741183,PS +3563741184,3563749375,GB +3563749376,3563765759,PL +3563765760,3563782143,ES +3563782144,3563790335,GR +3563790336,3563798527,EE +3563798528,3563800447,FR +3563800448,3563800463,GB +3563800464,3563800495,FR +3563800496,3563800511,GB +3563800512,3563800607,FR +3563800608,3563800623,GB +3563800624,3563800767,FR +3563800768,3563800783,GB +3563800784,3563800911,FR +3563800912,3563800927,GB +3563800928,3563800943,FR +3563800944,3563800991,GB +3563800992,3563801135,FR +3563801136,3563801151,DE +3563801152,3563801183,FR +3563801184,3563801199,DE +3563801200,3563801279,FR +3563801280,3563801295,NL +3563801296,3563801375,FR +3563801376,3563801391,GB +3563801392,3563801407,IT +3563801408,3563801423,DE +3563801424,3563801455,FR +3563801456,3563801519,GB +3563801520,3563801551,FR +3563801552,3563801567,GB +3563801568,3563801599,FR +3563801600,3563801631,GB +3563801632,3563801647,FR +3563801648,3563801743,GB +3563801744,3563801775,FR +3563801776,3563801791,BE +3563801792,3563801839,FR +3563801840,3563801855,GB +3563801856,3563801871,FR +3563801872,3563801887,GB +3563801888,3563801922,FR +3563801923,3563801935,GB +3563801936,3563802015,FR +3563802016,3563802031,BE +3563802032,3563802047,FR +3563802048,3563802063,IT +3563802064,3563802207,FR +3563802208,3563802223,GB +3563802224,3563802255,FR +3563802256,3563802271,GB +3563802272,3563802303,FR +3563802304,3563802319,IT +3563802320,3563802447,FR +3563802448,3563802463,GB +3563802464,3563802623,FR +3563802624,3563802655,GB +3563802656,3563802735,FR +3563802736,3563802751,US +3563802752,3563802783,GB +3563802784,3563803007,FR +3563803008,3563803023,GB +3563803024,3563803039,FR +3563803040,3563803055,GB +3563803056,3563803119,FR +3563803120,3563803135,NL +3563803136,3563803151,FR +3563803152,3563803167,GB +3563803168,3563803183,FR +3563803184,3563803215,GB +3563803216,3563803247,FR +3563803248,3563803263,GB +3563803264,3563803279,FR +3563803280,3563803295,GB +3563803296,3563803311,FR +3563803312,3563803327,GB +3563803328,3563803359,FR +3563803360,3563803423,GB +3563803424,3563803439,FR +3563803440,3563803455,DE +3563803456,3563803487,GB +3563803488,3563803503,US +3563803504,3563803519,GB +3563803520,3563803631,FR +3563803632,3563803647,GB +3563803648,3563803967,FR +3563803968,3563803983,BE +3563803984,3563804695,FR +3563804696,3563804703,GB +3563804704,3563804719,FR +3563804720,3563804727,GB +3563804728,3563806543,FR +3563806544,3563806559,DE +3563806560,3563806687,FR +3563806688,3563806703,DE +3563806704,3563806719,FR +3563806720,3563814911,SA +3563814912,3563823103,SE +3563823104,3563831295,DE +3563831296,3563847679,RU +3563847680,3563848383,NL +3563848384,3563848447,ES +3563848448,3563848575,NL +3563848576,3563848583,ES +3563848584,3563848671,NL +3563848672,3563848703,ES +3563848704,3563848959,US +3563848960,3563848967,NL +3563848968,3563848983,ES +3563848984,3563849015,NL +3563849016,3563849023,ES +3563849024,3563849151,NL +3563849152,3563849183,ES +3563849184,3563849197,NL +3563849198,3563849199,ES +3563849200,3563849211,NL +3563849212,3563849215,ES +3563849216,3563849727,GB +3563849728,3563849991,NL +3563849992,3563849999,SA +3563850000,3563850007,FI +3563850008,3563850239,NL +3563850240,3563850751,GB +3563850752,3563850815,NL +3563850816,3563850831,ES +3563850832,3563850847,NL +3563850848,3563850879,ES +3563850880,3563851839,NL +3563851840,3563852095,ES +3563852096,3563852191,NL +3563852192,3563852207,GB +3563852208,3563852216,NL +3563852217,3563852223,ES +3563852224,3563852543,NL +3563852544,3563852799,ES +3563852800,3563853375,NL +3563853376,3563853439,ES +3563853440,3563853567,NL +3563853568,3563854079,ES +3563854080,3563854095,NL +3563854096,3563854103,ES +3563854104,3563854175,NL +3563854176,3563854239,ES +3563854240,3563854259,NL +3563854260,3563854591,ES +3563854592,3563854847,NL +3563854848,3563855359,ES +3563855360,3563855487,NL +3563855488,3563855551,ES +3563855552,3563855583,NL +3563855584,3563855615,ES +3563855616,3563855871,US +3563855872,3563864063,AT +3563864064,3563872255,GB +3563872256,3563880447,RU +3563880448,3563888639,TR +3563888640,3563896831,DE +3563896832,3563899391,HU +3563899392,3563899647,SK +3563899648,3563899903,HU +3563899904,3563900159,SK +3563900160,3563900415,HU +3563900416,3563900671,SK +3563900672,3563902975,HU +3563902976,3563903231,SK +3563903232,3563913215,HU +3563913216,3563921407,SE +3563921408,3563929599,UA +3563929600,3563937791,CH +3563937792,3563945983,TR +3563945984,3563954175,PL +3563954176,3563962367,IT +3563962368,3563970559,RU +3563970560,3563978751,TR +3563978752,3563995135,IT +3563995136,3564003327,MK +3564003328,3564008191,DE +3564008192,3564008223,CH +3564008224,3564011519,DE +3564011520,3564019711,UA +3564019712,3564027903,GB +3564027904,3564036351,DE +3564036352,3564037631,RU +3564037632,3564038143,KZ +3564038144,3564039167,RU +3564039168,3564039679,AZ +3564039680,3564039935,RU +3564039936,3564040191,KZ +3564040192,3564040447,RU +3564040448,3564040703,UZ +3564040704,3564042239,RU +3564042240,3564042495,TJ +3564042496,3564043007,RU +3564043008,3564044287,DE +3564044288,3564052479,CZ +3564052480,3564060671,GB +3564060672,3564068863,RU +3564068864,3564077055,ES +3564077056,3564093439,GB +3564093440,3564101631,UA +3564101632,3564109823,DE +3564109824,3564126207,SE +3564126208,3564134399,IT +3564134400,3564142591,KG +3564142592,3564146175,DE +3564146176,3564150783,DK +3564150784,3564152607,SE +3564152608,3564152639,NO +3564152640,3564157207,SE +3564157208,3564157215,NO +3564157216,3564158975,SE +3564158976,3564161855,DE +3564161856,3564161891,NL +3564161892,3564165119,DE +3564165120,3564165439,NL +3564165440,3564175359,DE +3564175360,3564183551,GB +3564183552,3564191743,UA +3564191744,3564199935,BE +3564199936,3564208127,RU +3564208128,3564216319,GB +3564216320,3564224511,PT +3564224512,3564232703,GB +3564232704,3564240895,RU +3564240896,3564241407,TJ +3564241408,3564249087,RU +3564249088,3564260735,DE +3564260736,3564260863,NL +3564260864,3564265471,DE +3564265472,3564273663,GR +3564273664,3564302655,DE +3564302656,3564302687,BE +3564302688,3564306431,DE +3564306432,3564314623,TR +3564314624,3564322815,GB +3564322816,3564331007,IT +3564331008,3564339199,ES +3564339200,3564339967,GB +3564339968,3564339999,NL +3564340000,3564340351,GB +3564340352,3564340415,NL +3564340416,3564340479,GB +3564340480,3564340735,NL +3564340736,3564340991,GB +3564340992,3564341119,NL +3564341120,3564341183,GB +3564341184,3564341247,NL +3564341248,3564341759,GB +3564341760,3564342063,NL +3564342064,3564342207,GB +3564342208,3564342271,NL +3564342272,3564342335,GB +3564342336,3564342431,NL +3564342432,3564342527,GB +3564342528,3564342783,NL +3564342784,3564343583,GB +3564343584,3564343615,NL +3564343616,3564343679,GB +3564343680,3564343743,NL +3564343744,3564343775,GB +3564343776,3564343807,NL +3564343808,3564343839,GB +3564343840,3564343871,NL +3564343872,3564343967,GB +3564343968,3564343999,NL +3564344000,3564344031,GB +3564344032,3564344231,NL +3564344232,3564344239,GB +3564344240,3564344247,NL +3564344248,3564344575,GB +3564344576,3564344831,NL +3564344832,3564344895,GB +3564344896,3564344959,NL +3564344960,3564345023,GB +3564345024,3564345087,NL +3564345088,3564345127,GB +3564345128,3564345151,NL +3564345152,3564345215,GB +3564345216,3564345343,NL +3564345344,3564346143,GB +3564346144,3564346175,NL +3564346176,3564346207,GB +3564346208,3564346239,NL +3564346240,3564346271,GB +3564346272,3564346303,NL +3564346304,3564347391,GB +3564347392,3564347583,NL +3564347584,3564347647,GB +3564347648,3564348159,NL +3564348160,3564348191,GB +3564348192,3564348239,NL +3564348240,3564348255,GB +3564348256,3564348287,NL +3564348288,3564348399,GB +3564348400,3564348415,NL +3564348416,3564348479,GB +3564348480,3564348495,NL +3564348496,3564348527,GB +3564348528,3564348543,NL +3564348544,3564348559,GB +3564348560,3564348639,NL +3564348640,3564348671,GB +3564348672,3564348991,NL +3564348992,3564349183,GB +3564349184,3564349311,NL +3564349312,3564349375,GB +3564349376,3564349407,NL +3564349408,3564349503,GB +3564349504,3564349583,NL +3564349584,3564349615,GB +3564349616,3564349695,NL +3564349696,3564350335,GB +3564350336,3564350351,NL +3564350352,3564350367,GB +3564350368,3564350719,NL +3564350720,3564351231,GB +3564351232,3564351295,NL +3564351296,3564351375,GB +3564351376,3564351391,NL +3564351392,3564351439,GB +3564351440,3564351455,NL +3564351456,3564351471,GB +3564351472,3564351487,NL +3564351488,3564351503,GB +3564351504,3564351679,NL +3564351680,3564351999,GB +3564352000,3564352079,NL +3564352080,3564352095,GB +3564352096,3564352127,NL +3564352128,3564352191,GB +3564352192,3564352511,NL +3564352512,3564352543,GB +3564352544,3564352575,NL +3564352576,3564352735,GB +3564352736,3564352767,NL +3564352768,3564353023,GB +3564353024,3564353087,NL +3564353088,3564353111,GB +3564353112,3564353167,NL +3564353168,3564353199,GB +3564353200,3564353215,NL +3564353216,3564353223,GB +3564353224,3564353263,NL +3564353264,3564353295,GB +3564353296,3564353311,NL +3564353312,3564353343,GB +3564353344,3564353359,NL +3564353360,3564353407,GB +3564353408,3564353487,NL +3564353488,3564353503,GB +3564353504,3564353535,NL +3564353536,3564353791,GB +3564353792,3564353919,NL +3564353920,3564354063,GB +3564354064,3564354079,NL +3564354080,3564354303,GB +3564354304,3564354335,NL +3564354336,3564354367,GB +3564354368,3564354559,NL +3564354560,3564354943,GB +3564354944,3564355039,NL +3564355040,3564355135,GB +3564355136,3564355199,NL +3564355200,3564355295,GB +3564355296,3564355311,NL +3564355312,3564355583,GB +3564355584,3564363775,NL +3564363776,3564371967,UA +3564371968,3564380159,DE +3564380160,3564388351,FI +3564388352,3564392959,SE +3564392960,3564393087,NO +3564393088,3564396543,SE +3564396544,3564404735,RU +3564404736,3564412927,BG +3564412928,3564421119,IL +3564421120,3564429311,SA +3564429312,3564431567,KZ +3564431568,3564431583,AF +3564431584,3564437503,KZ +3564437504,3564445695,LT +3564445696,3564453887,BG +3564453888,3564462079,DE +3564462080,3564470271,CH +3564470272,3564478463,IL +3564478464,3564486655,LU +3564486656,3564494847,CH +3564494848,3564494907,GB +3564494908,3564494911,FR +3564494912,3564494975,GB +3564494976,3564494983,CH +3564494984,3564495103,GB +3564495104,3564495167,DE +3564495168,3564495203,GB +3564495616,3564495743,GB +3564495872,3564495927,GB +3564495936,3564496111,GB +3564496128,3564496175,GB +3564496184,3564496199,GB +3564496208,3564496215,GB +3564496224,3564496263,GB +3564496272,3564496319,GB +3564496320,3564496327,FR +3564496336,3564496607,GB +3564496640,3564496655,GB +3564496672,3564496847,GB +3564496848,3564496863,FR +3564496864,3564496895,GB +3564498944,3564499007,NL +3564499008,3564499055,GB +3564499200,3564499215,NL +3564499216,3564499231,DK +3564499232,3564499239,NL +3564499248,3564499335,GB +3564499456,3564499551,NL +3564499552,3564499711,GB +3564500992,3564500999,SE +3564501248,3564501263,DE +3564501264,3564501279,SE +3564501280,3564501311,GB +3564501504,3564501507,SE +3564501508,3564501511,DE +3564501760,3564501887,DE +3564502528,3564502559,DE +3564502560,3564502591,GB +3564503040,3564511231,JO +3564511232,3564519423,RU +3564519424,3564527615,SI +3564527616,3564543999,SA +3564544000,3564560383,DE +3564560384,3564560391,US +3564560392,3564560399,CA +3564560400,3564560415,US +3564560416,3564560511,GB +3564560512,3564560639,US +3564560640,3564560927,GB +3564560928,3564560959,US +3564560960,3564561039,GB +3564561040,3564561055,US +3564561056,3564561151,GB +3564561152,3564561407,US +3564561408,3564561663,GB +3564561664,3564561791,US +3564561792,3564561919,GB +3564561920,3564562431,CH +3564562432,3564562687,GB +3564562688,3564562815,US +3564562816,3564562879,GB +3564562880,3564562943,US +3564562944,3564563711,GB +3564563712,3564563967,US +3564563968,3564564223,GB +3564564224,3564564239,US +3564564240,3564565247,GB +3564565248,3564565279,US +3564565280,3564565327,GB +3564565328,3564565407,US +3564565408,3564566271,GB +3564566272,3564566527,US +3564566528,3564567143,GB +3564567144,3564567151,US +3564567152,3564567247,GB +3564567248,3564567255,US +3564567256,3564567295,GB +3564567296,3564567423,US +3564567424,3564567807,GB +3564567808,3564567935,US +3564567936,3564568039,GB +3564568040,3564568183,US +3564568184,3564568223,GB +3564568224,3564568231,US +3564568232,3564568255,GB +3564568256,3564568319,US +3564568320,3564571055,GB +3564571056,3564571071,DE +3564571072,3564571135,GB +3564571136,3564571455,FR +3564571456,3564571479,GB +3564571480,3564571487,FR +3564571488,3564571511,GB +3564571512,3564571519,FR +3564571520,3564571567,GB +3564571568,3564571583,FR +3564571584,3564571591,GB +3564571592,3564571599,FR +3564571600,3564572271,GB +3564572272,3564572287,DE +3564572288,3564576767,GB +3564576768,3564584959,RU +3564584960,3564593151,SA +3564593152,3564601343,RU +3564601344,3564609535,AT +3564609536,3564634111,RU +3564634112,3564642303,MK +3564642304,3564650495,CH +3564650496,3564666879,NL +3564666880,3564668943,IE +3564668944,3564668991,GB +3564668992,3564669103,IE +3564669104,3564669119,GB +3564669120,3564669343,IE +3564669344,3564669359,GB +3564669360,3564669407,IE +3564669408,3564669439,GB +3564669440,3564670207,IE +3564670208,3564670239,GB +3564670240,3564673023,IE +3564673024,3564673055,GB +3564673056,3564673135,IE +3564673136,3564673215,GB +3564673216,3564673407,IE +3564673408,3564673663,GB +3564673664,3564673791,IE +3564673792,3564673807,GB +3564673808,3564673823,IE +3564673824,3564673839,GB +3564673840,3564674047,IE +3564674048,3564674431,GB +3564674432,3564675071,IE +3564675072,3564683263,RU +3564683264,3564691455,IR +3564691456,3564699647,GI +3564699648,3564716031,GB +3564716032,3564724223,IT +3564724224,3564732415,GR +3564732416,3564733439,DE +3564733440,3564733695,GB +3564733696,3564734239,DE +3564734240,3564734271,GB +3564734272,3564734287,DE +3564734288,3564734303,GB +3564734304,3564734335,DE +3564734336,3564734431,GB +3564734432,3564734719,DE +3564734720,3564734807,GB +3564734808,3564734815,DE +3564734816,3564734819,GB +3564734820,3564736511,DE +3564736512,3564736527,GB +3564736528,3564736583,DE +3564736584,3564736603,GB +3564736604,3564736607,DE +3564736608,3564736611,GB +3564736612,3564736767,DE +3564736768,3564736887,GB +3564736888,3564736895,DE +3564736896,3564736903,GB +3564736904,3564736927,DE +3564736928,3564736959,GB +3564736960,3564736967,DE +3564736968,3564736975,GB +3564736976,3564736991,DE +3564736992,3564737023,GB +3564737024,3564737535,DE +3564737536,3564737791,GB +3564737792,3564738047,DE +3564738048,3564738303,GB +3564738304,3564739327,DE +3564739328,3564739335,GB +3564739336,3564739351,DE +3564739352,3564739391,GB +3564739392,3564739455,DE +3564739456,3564739503,GB +3564739504,3564739519,DE +3564739520,3564739807,GB +3564739808,3564739815,DE +3564739816,3564739823,GB +3564739824,3564740351,DE +3564740352,3564740383,GB +3564740384,3564740415,DE +3564740416,3564740447,GB +3564740448,3564740455,DE +3564740456,3564740459,GB +3564740460,3564740463,DE +3564740464,3564740471,GB +3564740472,3564740479,DE +3564740480,3564740495,GB +3564740496,3564740503,DE +3564740504,3564740527,GB +3564740528,3564740543,DE +3564740544,3564740575,GB +3564740576,3564740591,DE +3564740592,3564740595,GB +3564740596,3564740599,DE +3564740600,3564740603,GB +3564740604,3564740607,DE +3564740608,3564748799,FR +3564748800,3564756991,GB +3564756992,3564765183,ES +3564765184,3564773375,RU +3564773376,3564781567,DE +3564781568,3564789759,LT +3564789760,3564797951,ES +3564797952,3564806143,DE +3564806144,3564814335,BG +3564814336,3564822527,PL +3564830720,3564838911,BE +3564838912,3564847103,DE +3564847104,3564855295,IT +3564855296,3564862863,DE +3564862864,3564862871,AE +3564862872,3564863487,DE +3564863488,3564880895,NL +3564880896,3564880911,GB +3564880912,3564880935,NL +3564880936,3564880943,GB +3564880944,3564880951,NL +3564880952,3564880975,GB +3564880976,3564880991,NL +3564880992,3564881167,GB +3564881168,3564881183,NL +3564881184,3564881231,GB +3564881232,3564881263,NL +3564881264,3564881375,GB +3564881376,3564881391,NL +3564881392,3564881455,GB +3564881456,3564881471,NL +3564881472,3564881519,GB +3564881520,3564881535,NL +3564881536,3564881551,GB +3564881552,3564881567,NL +3564881568,3564881663,GB +3564881664,3564881727,NL +3564881728,3564881919,GB +3564881920,3564881939,NL +3564881940,3564881983,GB +3564881984,3564881991,NL +3564881992,3564881999,GB +3564882000,3564882079,NL +3564882080,3564882095,GB +3564882096,3564882119,NL +3564882120,3564882127,GB +3564882128,3564882239,NL +3564882240,3564882255,GB +3564882256,3564882279,NL +3564882280,3564882335,GB +3564882336,3564882367,NL +3564882368,3564882399,GB +3564882400,3564882943,NL +3564882944,3564883007,GB +3564883008,3564883039,NL +3564883040,3564883047,GB +3564883048,3564883055,NL +3564883056,3564883087,GB +3564883088,3564883095,NL +3564883096,3564883167,GB +3564883168,3564883967,NL +3564883968,3564884223,GB +3564884224,3564884235,NL +3564884236,3564884239,GB +3564884240,3564884255,NL +3564884256,3564884303,GB +3564884304,3564884319,NL +3564884320,3564884335,GB +3564884336,3564884343,NL +3564884344,3564884359,GB +3564884360,3564884367,NL +3564884368,3564884375,GB +3564884376,3564884399,NL +3564884400,3564884407,GB +3564884408,3564884415,NL +3564884416,3564884431,GB +3564884432,3564884439,NL +3564884440,3564884455,GB +3564884456,3564884463,NL +3564884464,3564884735,GB +3564884736,3564884991,NL +3564884992,3564885007,GB +3564885008,3564885023,NL +3564885024,3564885087,GB +3564885088,3564885135,NL +3564885136,3564885215,GB +3564885216,3564885231,NL +3564885232,3564885343,GB +3564885344,3564885359,NL +3564885360,3564885439,GB +3564885440,3564885455,NL +3564885456,3564885527,GB +3564885528,3564885546,NL +3564885547,3564885551,GB +3564885552,3564885583,NL +3564885584,3564885631,GB +3564885632,3564885695,NL +3564885696,3564885727,GB +3564885728,3564885743,NL +3564885744,3564885775,GB +3564885776,3564885799,NL +3564885800,3564885839,GB +3564885840,3564885903,NL +3564885904,3564885919,GB +3564885920,3564885967,NL +3564885968,3564885983,GB +3564885984,3564885999,NL +3564886000,3564886015,GB +3564886016,3564886031,NL +3564886032,3564886271,GB +3564886272,3564886279,NL +3564886280,3564886287,GB +3564886288,3564886295,NL +3564886296,3564886303,GB +3564886304,3564886367,NL +3564886368,3564886375,GB +3564886376,3564886415,NL +3564886416,3564886431,GB +3564886432,3564886527,NL +3564886528,3564886655,GB +3564886656,3564886751,NL +3564886752,3564886919,GB +3564886920,3564886927,NL +3564886928,3564886943,GB +3564886944,3564886951,NL +3564886952,3564887039,GB +3564887040,3564888207,NL +3564888208,3564888223,GB +3564888224,3564888327,NL +3564888328,3564888335,GB +3564888336,3564888367,NL +3564888368,3564888383,GB +3564888384,3564888463,NL +3564888464,3564888479,DE +3564888480,3564888503,NL +3564888504,3564888511,GB +3564888512,3564888527,DE +3564888528,3564888591,NL +3564888592,3564888607,GB +3564888608,3564888623,NL +3564888624,3564888663,GB +3564888664,3564888671,NL +3564888672,3564888799,GB +3564888800,3564888815,NL +3564888816,3564888823,GB +3564888824,3564888879,NL +3564888880,3564888895,GB +3564888896,3564888991,NL +3564888992,3564889023,FR +3564889024,3564889087,NL +3564889088,3564889151,GB +3564889152,3564889167,NL +3564889168,3564889199,GB +3564889200,3564889215,NL +3564889216,3564889295,GB +3564889296,3564889311,NL +3564889312,3564889343,GB +3564889344,3564889375,NL +3564889376,3564889407,GB +3564889408,3564889511,NL +3564889512,3564889519,GB +3564889520,3564889631,NL +3564889632,3564889647,GB +3564889648,3564889663,NL +3564889664,3564889695,GB +3564889696,3564889727,DE +3564889728,3564889887,NL +3564889888,3564890239,GB +3564890240,3564890271,NL +3564890272,3564890303,GB +3564890304,3564890367,NL +3564890368,3564890399,FR +3564890400,3564890527,NL +3564890528,3564890543,GB +3564890544,3564890579,NL +3564890580,3564890591,GB +3564890592,3564890623,NL +3564890624,3564890703,GB +3564890704,3564890719,NL +3564890720,3564890751,GB +3564890752,3564890783,NL +3564890784,3564890927,GB +3564890928,3564890943,NL +3564890944,3564892431,GB +3564892432,3564892447,NL +3564892448,3564892463,GB +3564892464,3564892479,NL +3564892480,3564892607,GB +3564892608,3564892639,NL +3564892640,3564892735,GB +3564892736,3564892751,NL +3564892752,3564894207,GB +3564894208,3564896255,NL +3564896256,3564904447,RU +3564904448,3564912639,DE +3564912640,3564920831,BG +3564920832,3564921855,ES +3564921856,3564923007,US +3564923008,3564923135,RU +3564923136,3564924671,US +3564924672,3564929023,RU +3564929024,3564937215,AT +3564937216,3564941311,CS +3564941312,3564945407,CS +3564945408,3564947175,GB +3564947176,3564947183,FR +3564947184,3564948063,GB +3564948064,3564948071,IE +3564948072,3564948319,GB +3564948320,3564948351,IE +3564948352,3564953647,GB +3564953648,3564953651,CH +3564953652,3564954111,GB +3564954112,3564954131,AT +3564954132,3564954139,GB +3564954140,3564954143,AT +3564954144,3564954155,GB +3564954156,3564954159,AT +3564954160,3564954175,DE +3564954176,3564954183,AT +3564954184,3564954191,CH +3564954192,3564954211,AT +3564954212,3564954231,GB +3564954232,3564954239,AT +3564954240,3564954303,GB +3564954304,3564954311,AT +3564954312,3564954367,GB +3564954368,3564954383,AT +3564954384,3564954415,GB +3564954416,3564954431,DE +3564954432,3564956160,GB +3564956161,3564956543,AT +3564956544,3564956671,GB +3564956672,3564956703,GR +3564956704,3564956719,AT +3564956720,3564956735,GB +3564956736,3564956751,AT +3564956752,3564956767,US +3564956768,3564956831,AT +3564956832,3564956839,GB +3564956840,3564956855,AT +3564956856,3564956903,GB +3564956904,3564956907,AT +3564956908,3564956911,CH +3564956912,3564956927,AT +3564956928,3564956967,GB +3564956968,3564956971,CH +3564956972,3564956975,US +3564956976,3564956979,GB +3564956980,3564956991,AT +3564956992,3564956999,GB +3564957000,3564957007,AT +3564957008,3564957023,GB +3564957024,3564957039,AT +3564957040,3564957087,GB +3564957088,3564957119,AT +3564957120,3564957183,GB +3564957184,3564957255,AT +3564957256,3564957263,GB +3564957264,3564957439,AT +3564957440,3564957447,GB +3564957448,3564957455,CH +3564957456,3564957459,AT +3564957460,3564957471,GB +3564957472,3564957499,AT +3564957500,3564957511,GB +3564957512,3564957519,AT +3564957520,3564957527,GB +3564957528,3564957531,AT +3564957532,3564957547,GB +3564957548,3564957551,AT +3564957552,3564957559,GB +3564957560,3564957591,AT +3564957592,3564957595,GB +3564957596,3564957599,AT +3564957600,3564957607,GB +3564957608,3564957631,AT +3564957632,3564957663,GB +3564957664,3564957671,AT +3564957672,3564957679,GB +3564957680,3564957695,AT +3564957696,3564957855,GB +3564957856,3564957859,ES +3564957860,3564957863,AT +3564957864,3564957867,IT +3564957868,3564957871,AT +3564957872,3564957891,GB +3564957892,3564957903,AT +3564957904,3564957911,GB +3564957912,3564957919,AT +3564957920,3564957951,GB +3564957952,3564957967,AT +3564957968,3564957987,GB +3564957988,3564958015,AT +3564958016,3564958111,GB +3564958112,3564958143,AT +3564958144,3564958147,GB +3564958148,3564958179,AT +3564958180,3564958183,US +3564958184,3564958191,AT +3564958192,3564958207,GB +3564958208,3564958463,AT +3564958464,3564958487,GB +3564958488,3564958495,AT +3564958496,3564958719,GB +3564958720,3564958799,AT +3564958800,3564958807,GB +3564958808,3564958815,AT +3564958816,3564958816,GB +3564958817,3564958847,AT +3564958848,3564958911,GB +3564958912,3564958943,AT +3564958944,3564958975,GB +3564958976,3564959007,NL +3564959008,3564959008,GB +3564959009,3564959039,AT +3564959040,3564959075,GB +3564959076,3564959091,AT +3564959092,3564959095,GB +3564959096,3564959103,AT +3564959104,3564959119,GB +3564959120,3564959127,AT +3564959128,3564959191,GB +3564959192,3564959195,AT +3564959196,3564959199,GB +3564959200,3564959227,AT +3564959228,3564959263,GB +3564959264,3564959295,AT +3564959296,3564959383,GB +3564959384,3564959391,AT +3564959392,3564959399,SA +3564959400,3564959407,AT +3564959408,3564959423,CH +3564959424,3564959443,GB +3564959444,3564959451,AT +3564959452,3564959455,FR +3564959456,3564959471,GB +3564959472,3564959479,AT +3564959480,3564959487,GB +3564959488,3564959495,AT +3564959496,3564959499,GB +3564959500,3564959519,AT +3564959520,3564959535,GB +3564959536,3564959551,AT +3564959552,3564959567,GB +3564959568,3564959579,AT +3564959580,3564959623,GB +3564959624,3564959639,AT +3564959640,3564959655,GB +3564959656,3564959663,CH +3564959664,3564959679,AT +3564959680,3564959695,GB +3564959696,3564959711,AT +3564959712,3564959755,GB +3564959756,3564959759,AT +3564959760,3564959904,GB +3564959905,3564959935,AT +3564959936,3564960127,GB +3564960128,3564960135,DE +3564960136,3564960191,GB +3564960192,3564960195,AT +3564960196,3564960211,GB +3564960212,3564960223,AT +3564960224,3564960231,GB +3564960232,3564960383,AT +3564960384,3564960551,GB +3564960552,3564960559,AT +3564960560,3564960615,GB +3564960616,3564960623,FR +3564960624,3564960635,GB +3564960636,3564960639,AT +3564960640,3564960767,GB +3564960768,3564960799,AT +3564960800,3564960871,GB +3564960872,3564960879,IT +3564960880,3564960927,GB +3564960928,3564960959,AT +3564960960,3564960991,GB +3564960992,3564961007,AT +3564961008,3564961023,GB +3564961024,3564961079,AT +3564961080,3564961279,GB +3564961280,3564961311,AT +3564961312,3564961319,GB +3564961320,3564961791,AT +3564961792,3564969983,TR +3564969984,3564972607,DE +3564972608,3564972631,AT +3564972632,3564972639,LI +3564972640,3564978175,DE +3564978176,3564986367,GB +3564986368,3564994559,DE +3564994560,3565002751,NL +3565002752,3565007247,NO +3565007248,3565007251,SE +3565007252,3565027327,NO +3565027328,3565035519,PL +3565035520,3565043711,IE +3565043712,3565045247,AT +3565045248,3565045503,SK +3565045504,3565051903,AT +3565051904,3565068287,GB +3565068288,3565076479,CH +3565076480,3565084671,DE +3565084672,3565092863,IS +3565092864,3565093055,GB +3565093056,3565093087,PS +3565093088,3565093391,GB +3565093392,3565093399,NO +3565093400,3565096759,GB +3565096760,3565096767,IE +3565096768,3565099647,GB +3565099648,3565099651,US +3565099652,3565101055,GB +3565101056,3565109247,DE +3565109248,3565117439,PL +3565117440,3565125631,TR +3565125632,3565158399,NL +3565158400,3565223935,ES +3565223936,3565240319,FR +3565240320,3565248511,IE +3565248512,3565256703,RU +3565256704,3565289471,NL +3565289472,3565355007,DK +3565355008,3565420543,IT +3565420544,3565486079,GB +3565486080,3565486335,IE +3565486336,3565486975,FR +3565486976,3565487615,NL +3565487616,3565487871,SE +3565487872,3565488383,GB +3565488384,3565488639,ES +3565488640,3565488895,GB +3565488896,3565489535,DE +3565489536,3565489791,GB +3565489792,3565489823,DE +3565489824,3565490175,GB +3565490176,3565490431,NL +3565490432,3565491199,GB +3565491200,3565491215,FR +3565491216,3565491455,GB +3565491456,3565491711,IT +3565491712,3565491839,GB +3565491840,3565491903,IT +3565491904,3565491967,NL +3565491968,3565492223,DE +3565492224,3565492295,GB +3565492296,3565492303,IE +3565492304,3565492319,GB +3565492320,3565492327,DE +3565492328,3565492335,GB +3565492336,3565492351,FR +3565492352,3565492479,GB +3565492480,3565492607,NL +3565492608,3565492639,GB +3565492640,3565492655,FR +3565492656,3565492671,GB +3565492672,3565492735,IT +3565492736,3565492991,CH +3565492992,3565493247,NL +3565493248,3565493583,GB +3565493584,3565493591,DE +3565493592,3565493679,GB +3565493680,3565493687,FR +3565493688,3565493759,GB +3565493760,3565493775,NL +3565493776,3565493983,GB +3565493984,3565494055,DE +3565494056,3565494063,GB +3565494064,3565494079,NL +3565494080,3565494143,GB +3565494144,3565494271,DE +3565494272,3565494527,IS +3565494528,3565494543,GB +3565494544,3565494551,IT +3565494552,3565494559,DE +3565494560,3565494591,GB +3565494592,3565494655,FR +3565494656,3565494671,SE +3565494672,3565494687,DE +3565494688,3565494703,SE +3565494704,3565494719,DK +3565494720,3565494735,GB +3565494736,3565494743,CA +3565494744,3565495295,GB +3565495296,3565496447,FR +3565496448,3565496511,DE +3565496512,3565496575,US +3565496576,3565496831,GB +3565496832,3565497087,IT +3565497088,3565497103,GB +3565497104,3565497119,IE +3565497120,3565497151,DE +3565497152,3565497159,IE +3565497160,3565497167,US +3565497168,3565497199,GB +3565497200,3565497207,IT +3565497208,3565497215,GB +3565497216,3565497279,CZ +3565497280,3565497287,NL +3565497288,3565497343,GB +3565497344,3565497599,US +3565497600,3565497871,GB +3565497872,3565497887,DE +3565497888,3565497903,GB +3565497904,3565497911,IE +3565497912,3565497919,DE +3565497920,3565497927,PR +3565497928,3565497951,GB +3565497952,3565497967,US +3565497968,3565498111,GB +3565498112,3565498367,NL +3565498368,3565498431,FR +3565498432,3565498479,US +3565498480,3565498519,GB +3565498520,3565498527,ZA +3565498528,3565499815,GB +3565499816,3565499823,FR +3565499824,3565500479,GB +3565500480,3565500543,DE +3565500544,3565500567,GB +3565500568,3565500575,IE +3565500576,3565500591,GB +3565500592,3565500599,DE +3565500600,3565500607,GB +3565500608,3565500623,FR +3565500624,3565501095,GB +3565501096,3565501103,FR +3565501104,3565501119,FI +3565501120,3565501231,GB +3565501232,3565501247,DE +3565501248,3565501311,GB +3565501312,3565501439,DE +3565501440,3565501679,GB +3565501680,3565501695,IE +3565501696,3565502207,GB +3565502208,3565502239,IT +3565502240,3565502463,GB +3565502464,3565503487,NL +3565503488,3565503999,GB +3565504000,3565504511,NL +3565504512,3565510655,GB +3565510656,3565511679,NL +3565511680,3565512191,CH +3565512192,3565512703,DE +3565512704,3565512767,GB +3565512768,3565512959,DE +3565512960,3565514111,GB +3565514112,3565514239,DE +3565514240,3565514495,DK +3565514496,3565518847,GB +3565518848,3565551615,TR +3565551616,3565578495,GB +3565578496,3565578751,CA +3565578752,3565682687,GB +3565682688,3565688063,NL +3565688064,3565688319,GB +3565688320,3565748223,NL +3565748224,3565752407,GB +3565752416,3565752463,GB +3565752472,3565752479,GB +3565752488,3565752535,GB +3565752544,3565752839,GB +3565752856,3565752879,GB +3565752888,3565752983,GB +3565752992,3565752999,GB +3565753016,3565753031,GB +3565753040,3565753071,GB +3565753080,3565753183,GB +3565753248,3565753279,GB +3565753344,3565753791,GB +3565753800,3565753815,GB +3565753824,3565753831,GB +3565753840,3565753847,GB +3565753984,3565754367,GB +3565754496,3565754511,GB +3565754624,3565755263,GB +3565755280,3565755359,GB +3565755376,3565755583,GB +3565755648,3565755695,GB +3565755704,3565755727,GB +3565755736,3565755831,GB +3565755840,3565755847,GB +3565755856,3565755871,GB +3565755880,3565755919,GB +3565755928,3565755935,GB +3565755944,3565755959,GB +3565755968,3565755999,GB +3565756008,3565756063,GB +3565756072,3565756087,GB +3565756096,3565756119,GB +3565756136,3565756159,GB +3565756288,3565760783,GB +3565760792,3565760799,GB +3565760808,3565760823,GB +3565760832,3565760855,GB +3565760864,3565760935,GB +3565760944,3565760967,GB +3565760976,3565761007,GB +3565761016,3565761279,GB +3565761344,3565761535,GB +3565761544,3565761599,GB +3565761616,3565761631,GB +3565761640,3565761647,GB +3565761656,3565761687,GB +3565761704,3565761727,GB +3565761752,3565761783,GB +3565761792,3565762047,GB +3565762048,3565762303,ZA +3565762560,3565762815,GB +3565763072,3565763455,GB +3565763488,3565763599,GB +3565763616,3565763671,GB +3565763680,3565763703,GB +3565763720,3565763735,GB +3565763744,3565763751,GB +3565763760,3565763799,GB +3565763808,3565763815,GB +3565763832,3565763839,GB +3565763884,3565763891,GB +3565764096,3565764183,GB +3565764192,3565764207,GB +3565764256,3565764367,GB +3565764376,3565764439,GB +3565764448,3565764455,GB +3565764464,3565764551,GB +3565764576,3565766655,GB +3565766912,3565767167,GB +3565767176,3565767255,GB +3565767272,3565767287,GB +3565767296,3565767351,GB +3565767360,3565767399,GB +3565767408,3565767439,GB +3565767456,3565767487,GB +3565767504,3565767599,GB +3565767616,3565767631,GB +3565767680,3565767999,GB +3565768208,3565768271,GB +3565768280,3565768295,GB +3565768312,3565768335,GB +3565768448,3565768575,GB +3565768704,3565768983,GB +3565769216,3565769471,GB +3565777920,3565813759,GB +3565813760,3565879295,SA +3565879296,3566010367,GB +3566010368,3566075903,IT +3566075904,3566092287,NL +3566092288,3566108671,LV +3566108672,3566141439,ES +3566141440,3566206975,IL +3566206976,3566272511,DE +3566272512,3566338047,ES +3566338048,3566354431,FI +3566354432,3566370815,RO +3566370816,3566403583,TR +3566403584,3566436351,CH +3566436352,3566439615,IE +3566439616,3566439631,GB +3566439632,3566469119,IE +3566469120,3566534655,GB +3566534656,3566551039,DE +3566551040,3566600191,FI +3566600192,3566607359,IL +3566607360,3566607615,GN +3566607616,3566627583,IL +3566627584,3566627839,CA +3566627840,3566665727,IL +3566665728,3566723071,SE +3566723072,3566723327,FR +3566723328,3566731263,SE +3566731264,3566739455,CH +3566739456,3566747647,RU +3566747648,3566764031,GR +3566764032,3566796799,AT +3566796800,3566816511,NL +3566816512,3566816767,US +3566816768,3566862335,NL +3566862336,3566895103,TR +3566895104,3566897279,KZ +3566897280,3566897311,KG +3566897312,3566927871,KZ +3566927872,3566960127,FR +3566960128,3566960143,GB +3566960144,3566993407,FR +3566993408,3567058943,TR +3567058944,3567103047,FR +3567103048,3567103055,IT +3567103056,3567108255,FR +3567108256,3567108263,SE +3567108264,3567124479,FR +3567124992,3567125023,GB +3567125248,3567125503,GB +3567126688,3567126759,GB +3567127552,3567127807,GB +3567129856,3567129887,GB +3567130016,3567130079,GB +3567131384,3567131647,GB +3567133216,3567133247,GB +3567133368,3567133375,GB +3567134208,3567134335,GB +3567134848,3567134975,GB +3567136000,3567136255,GB +3567136512,3567136575,GB +3567136640,3567136671,GB +3567136768,3567136895,GB +3567137024,3567137279,GB +3567137600,3567137663,GB +3567137988,3567137991,GB +3567138000,3567138003,GB +3567138040,3567138047,GB +3567140096,3567140351,GB +3567140864,3567140927,GB +3567141632,3567141887,GB +3567142272,3567142399,GB +3567143432,3567143439,GB +3567143520,3567143551,GB +3567143680,3567143687,GB +3567143872,3567143935,GB +3567143952,3567143967,GB +3567144048,3567144063,GB +3567144172,3567144175,GB +3567144320,3567144447,GB +3567144768,3567144831,GB +3567147528,3567147535,GB +3567147552,3567147559,GB +3567147936,3567147967,GB +3567148520,3567148527,GB +3567148800,3567149055,GB +3567149088,3567149119,GB +3567149904,3567149911,GB +3567149920,3567149935,GB +3567151104,3567151199,GB +3567151232,3567151263,GB +3567152000,3567152127,GB +3567152160,3567152191,GB +3567152256,3567152383,GB +3567152392,3567152407,GB +3567152640,3567152647,GB +3567152664,3567152671,GB +3567152744,3567152751,GB +3567152832,3567152863,GB +3567152960,3567152991,GB +3567153024,3567153055,GB +3567153600,3567153623,GB +3567153648,3567153663,GB +3567153688,3567153703,GB +3567153720,3567153727,GB +3567153824,3567153847,GB +3567154304,3567154367,GB +3567155200,3567155967,GB +3567156416,3567156607,GB +3567156992,3567157247,GB +3567157248,3567165439,CZ +3567165440,3567169535,RU +3567169536,3567173631,MK +3567173632,3567239167,GB +3567239168,3567250143,NL +3567250176,3567250943,NL +3567255552,3567321087,PL +3567321088,3567353855,GB +3567353856,3567386623,CH +3567386624,3567386879,GB +3567386880,3567386883,DE +3567386884,3567386975,GB +3567386976,3567387007,DE +3567387008,3567387071,GB +3567387072,3567387391,DE +3567387392,3567387439,GB +3567387440,3567387455,DE +3567387456,3567387471,GB +3567387472,3567387539,DE +3567387540,3567387543,GB +3567387544,3567387547,DE +3567387548,3567387583,GB +3567387584,3567388031,DE +3567388032,3567388159,GB +3567388160,3567388399,DE +3567388400,3567388415,GB +3567388416,3567388479,DE +3567388480,3567388543,GB +3567388544,3567388607,DE +3567388608,3567388671,GB +3567388672,3567388927,CZ +3567388928,3567389183,DE +3567389184,3567389695,GB +3567389696,3567390847,DE +3567390848,3567390879,GB +3567390880,3567390975,DE +3567390976,3567391231,GB +3567391232,3567391743,DE +3567391744,3567391759,GB +3567391760,3567391791,DE +3567391792,3567391807,GB +3567391808,3567391839,DE +3567391840,3567392767,GB +3567392768,3567393023,DE +3567393024,3567393279,FR +3567393280,3567394975,GB +3567394976,3567395007,DE +3567395008,3567395071,GB +3567395072,3567395327,DE +3567395328,3567396863,GB +3567396864,3567397119,DE +3567397120,3567397375,GB +3567397376,3567397503,ES +3567397504,3567397887,GB +3567397888,3567398143,DE +3567398144,3567398655,GB +3567398656,3567398911,DE +3567398912,3567398991,GB +3567398992,3567399031,DE +3567399032,3567399039,GB +3567399040,3567399055,DE +3567399056,3567399071,GB +3567399072,3567399103,DE +3567399104,3567399167,GB +3567399168,3567399439,DE +3567399440,3567399487,GB +3567399488,3567399647,DE +3567399648,3567399687,GB +3567399688,3567399695,DE +3567399696,3567399711,GB +3567399712,3567400703,DE +3567400704,3567400735,GB +3567400736,3567400751,DE +3567400752,3567400959,GB +3567400960,3567401471,DE +3567401472,3567401503,GB +3567401504,3567401519,DE +3567401520,3567401543,GB +3567401544,3567401551,DE +3567401552,3567401727,GB +3567401728,3567402367,DE +3567402368,3567402495,GB +3567402496,3567403007,DE +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 +3567441376,3567441407,NL +3567441408,3567444223,GB +3567444224,3567444475,TZ +3567444476,3567444479,NL +3567444480,3567445951,GB +3567445952,3567445983,NL +3567445984,3567446367,GB +3567446368,3567446399,CH +3567446400,3567446607,GB +3567446608,3567446623,IT +3567446624,3567452031,GB +3567452032,3567452047,GR +3567452048,3567452159,GB +3567452160,3567507455,ES +3567507456,3567509503,NL +3567509504,3567512575,ES +3567512576,3567513599,NL +3567513600,3567517695,ES +3567517696,3567583231,RU +3567583232,3567583487,AT +3567583744,3567583871,AT +3567583936,3567583999,AT +3567584256,3567584383,AT +3567584400,3567584407,AT +3567584512,3567584639,AT +3567585792,3567586303,GB +3567587328,3567591423,GB +3567591424,3567599615,IT +3567599616,3567606271,NL +3567606272,3567606783,DZ +3567606784,3567615999,NL +3567616000,3567616511,BD +3567616512,3567617087,GB +3567617088,3567617119,NG +3567617120,3567617151,GB +3567617152,3567617279,NG +3567617280,3567617535,IN +3567617536,3567617791,KE +3567617792,3567618047,NG +3567618048,3567619071,IN +3567619072,3567619075,NG +3567619076,3567619087,GB +3567619088,3567619095,NG +3567619096,3567619103,GB +3567619104,3567619111,KE +3567619112,3567619135,GB +3567619136,3567619583,NG +3567619584,3567620095,TZ +3567620096,3567620351,GB +3567620352,3567620479,TZ +3567620480,3567620623,GB +3567620624,3567620631,PK +3567620632,3567620639,IN +3567620640,3567620679,PK +3567620680,3567620695,GB +3567620696,3567620719,PK +3567620720,3567620727,GB +3567620728,3567620735,IN +3567620736,3567620863,GB +3567620864,3567620927,NG +3567620928,3567620931,GB +3567620932,3567620935,TZ +3567620936,3567620959,KE +3567620960,3567620991,GB +3567620992,3567621055,NG +3567621056,3567621119,KE +3567621120,3567621631,GB +3567621632,3567621887,ID +3567621888,3567621895,TZ +3567621896,3567621903,KE +3567621904,3567621911,NG +3567621912,3567621919,TZ +3567621920,3567621951,NG +3567621952,3567622655,GB +3567622656,3567622951,KE +3567622952,3567622959,GB +3567622960,3567622963,TZ +3567622964,3567622967,NG +3567622968,3567622975,GB +3567622976,3567623039,TZ +3567623040,3567623055,GA +3567623056,3567623071,NG +3567623072,3567623087,TZ +3567623088,3567623095,GB +3567623096,3567623103,GA +3567623104,3567623135,TZ +3567623136,3567623143,GB +3567623144,3567623151,TZ +3567623152,3567623167,GB +3567623168,3567623423,KE +3567623424,3567623471,GB +3567623472,3567623479,KE +3567623480,3567623727,GB +3567623728,3567623759,PK +3567623760,3567623767,GB +3567623768,3567623775,PK +3567623776,3567623791,GB +3567623792,3567623839,PK +3567623840,3567623935,GB +3567623936,3567624191,PK +3567624192,3567624447,GB +3567624448,3567625727,TZ +3567625728,3567625983,PK +3567625984,3567626239,KE +3567626240,3567627008,NG +3567627009,3567629311,GB +3567629312,3567630207,TJ +3567630208,3567648767,GB +3567648768,3567665151,BE +3567665152,3567673343,ES +3567673344,3567673647,AT +3567673648,3567673655,GI +3567673656,3567681535,AT +3567681536,3567714303,ES +3567714304,3567715327,GB +3567715584,3567715839,GB +3567716352,3567716383,GB +3567716608,3567716639,IL +3567716944,3567717119,GB +3567717120,3567717375,DE +3567717376,3567717631,GB +3567717632,3567717679,DE +3567717760,3567717887,DE +3567717888,3567718015,GB +3567718144,3567718399,CH +3567718400,3567719423,US +3567719424,3567719679,GB +3567779840,3567845375,DE +3567845376,3567861759,GB +3567861760,3567878143,NO +3567878144,3567976447,ES +3567976448,3568041983,IT +3568041984,3568107519,DE +3568107520,3568153759,GB +3568153760,3568153767,CH +3568153768,3568173055,GB +3568173056,3568304127,TR +3568304128,3568309775,RU +3568309776,3568309791,UZ +3568309792,3568309919,BY +3568309920,3568309951,RU +3568309952,3568310015,BY +3568310016,3568369663,RU +3568369664,3568369743,IT +3568369744,3568369751,FR +3568369752,3568435199,IT +3568435200,3568443391,UA +3568443392,3568476159,NL +3568476160,3568484351,DK +3568484352,3568492543,NL +3568492544,3568493055,CS +3568493056,3568493567,RS +3568493568,3568494591,CS +3568494592,3568500735,RS +3568500736,3568566271,IL +3568566272,3568599039,FR +3568599040,3568631807,PL +3568631808,3568697343,SE +3568697344,3568730111,PL +3568730112,3568746495,NL +3568746496,3568752895,FI +3568752896,3568752959,EE +3568752960,3568762879,FI +3568762880,3568795647,AT +3568795648,3568803839,GB +3568803840,3568812031,IT +3568812032,3568828415,ES +3568828416,3568829631,DE +3568829632,3568829639,CH +3568829640,3568836247,DE +3568836248,3568836255,NL +3568836256,3568848791,DE +3568848792,3568848799,PL +3568848800,3568848871,DE +3568848872,3568848879,GB +3568848880,3568876159,DE +3568876160,3568876287,ES +3568876288,3568877583,DE +3568877584,3568877591,NL +3568877592,3568916399,DE +3568916400,3568916407,IT +3568916408,3568938311,DE +3568938312,3568938319,FI +3568938320,3568939519,DE +3568939520,3568939527,IT +3568939528,3568946663,DE +3568946664,3568946671,IT +3568946672,3568959487,DE +3568959488,3569025023,AT +3569025024,3569057791,NL +3569057792,3569068415,GB +3569068416,3569068543,DE +3569068544,3569068671,BG +3569068672,3569068951,GB +3569068952,3569068991,DE +3569068992,3569075711,GB +3569075712,3569075839,FR +3569075840,3569083903,GB +3569083904,3569084159,US +3569084160,3569090559,GB +3569090560,3569123327,RU +3569123328,3569156095,GB +3569156096,3569188863,NL +3569188864,3569221631,IT +3569221632,3569238399,BE +3569238400,3569238527,AT +3569238528,3569239071,BE +3569239072,3569239103,LU +3569239104,3569239231,BE +3569239232,3569239263,LU +3569239264,3569239519,BE +3569239520,3569239551,LU +3569239552,3569239903,BE +3569239904,3569239935,LU +3569239936,3569239983,BE +3569239984,3569239999,BN +3569240000,3569240031,BE +3569240032,3569240063,FR +3569240064,3569241583,BE +3569241584,3569241599,LU +3569241600,3569241887,BE +3569241888,3569241903,LU +3569241904,3569242047,BE +3569242048,3569242111,LU +3569242112,3569242551,BE +3569242552,3569242559,LU +3569242560,3569242879,BE +3569242880,3569243135,US +3569243136,3569243903,BE +3569243904,3569244031,NL +3569244032,3569244303,BE +3569244304,3569244319,LU +3569244320,3569245695,BE +3569245696,3569245727,LU +3569245728,3569250879,BE +3569250880,3569250895,LU +3569250896,3569250927,BE +3569250928,3569250935,CA +3569250936,3569251071,BE +3569251072,3569251327,LU +3569251328,3569251839,US +3569251840,3569252991,BE +3569252992,3569253007,LU +3569253008,3569253095,BE +3569253096,3569253103,LU +3569253104,3569254911,BE +3569254912,3569254959,LU +3569254960,3569255007,BE +3569255008,3569255055,LU +3569255056,3569255071,BE +3569255072,3569255103,LU +3569255104,3569258783,BE +3569258784,3569258815,LU +3569258816,3569258847,US +3569258848,3569258975,BE +3569258976,3569259007,LU +3569259008,3569271815,BE +3569271816,3569271823,LU +3569271824,3569271871,BE +3569271872,3569271903,NL +3569271904,3569271911,BE +3569271912,3569271919,DE +3569271920,3569271935,BE +3569271936,3569271943,IT +3569271944,3569272063,BE +3569272064,3569272079,LU +3569272080,3569272239,BE +3569272240,3569272255,LU +3569272256,3569273167,BE +3569273168,3569273183,LU +3569273184,3569273791,BE +3569273792,3569273823,LU +3569273824,3569273935,BE +3569273936,3569273951,LI +3569273952,3569274143,BE +3569274144,3569274175,CA +3569274176,3569274303,BE +3569274304,3569274311,LU +3569274312,3569274335,BE +3569274336,3569274383,LU +3569274384,3569274495,BE +3569274496,3569274559,LU +3569274560,3569274687,BE +3569274688,3569274719,LU +3569274720,3569277183,BE +3569277184,3569277439,LU +3569277440,3569278311,BE +3569278312,3569278319,LU +3569278320,3569278703,BE +3569278704,3569278719,NL +3569278720,3569279223,BE +3569279224,3569279231,US +3569279232,3569279263,BE +3569279264,3569279279,US +3569279280,3569287167,BE +3569287168,3569352703,PL +3569352704,3569483775,RU +3569483776,3569614847,FR +3569614848,3569680383,GB +3569680384,3569683711,SK +3569683712,3569683719,IQ +3569683720,3569710959,SK +3569710960,3569710975,NL +3569710976,3569713151,SK +3569713152,3569729535,AT +3569729536,3569731167,FR +3569731168,3569731183,IT +3569731184,3569731215,GB +3569731216,3569731231,FR +3569731232,3569731247,DE +3569731248,3569731263,GB +3569731264,3569731311,FR +3569731312,3569731327,GB +3569731328,3569731375,FR +3569731376,3569731391,GB +3569731392,3569731423,FR +3569731424,3569731439,GB +3569731440,3569731455,FR +3569731456,3569731471,GB +3569731472,3569731487,FR +3569731488,3569731503,GB +3569731504,3569731519,IT +3569731520,3569731551,GB +3569731552,3569731583,FR +3569731584,3569731599,GB +3569731600,3569731615,FR +3569731616,3569731631,DE +3569731632,3569731647,IT +3569731648,3569731727,FR +3569731728,3569731743,GB +3569731744,3569731791,FR +3569731792,3569731807,GB +3569731808,3569731839,FR +3569731840,3569731871,GB +3569731872,3569731903,FR +3569731904,3569731919,BE +3569731920,3569731951,FR +3569731952,3569731967,NL +3569731968,3569731983,GB +3569731984,3569732031,FR +3569732032,3569732047,DE +3569732048,3569732063,GB +3569732064,3569732079,FR +3569732080,3569732095,GB +3569732096,3569732143,FR +3569732144,3569732191,GB +3569732192,3569732207,DE +3569732208,3569732287,FR +3569732288,3569732303,GB +3569732304,3569732319,DE +3569732320,3569732335,FR +3569732336,3569732351,GB +3569732352,3569732383,FR +3569732384,3569732399,US +3569732400,3569732447,FR +3569732448,3569732479,US +3569732480,3569732495,GB +3569732496,3569732543,FR +3569732544,3569732575,GB +3569732576,3569732607,FR +3569732608,3569732639,GB +3569732640,3569732671,FR +3569732672,3569732703,GB +3569732704,3569732719,FR +3569732720,3569732735,GB +3569732736,3569732751,FR +3569732752,3569732767,GB +3569732768,3569732783,FR +3569732784,3569732847,GB +3569732848,3569732863,FR +3569732864,3569732879,GB +3569732880,3569732895,FR +3569732896,3569732911,IT +3569732912,3569733007,FR +3569733008,3569733023,IE +3569733024,3569733055,FR +3569733056,3569733087,GB +3569733088,3569733103,IT +3569733104,3569733183,FR +3569733184,3569733199,GB +3569733200,3569733263,FR +3569733264,3569733279,US +3569733280,3569733295,DE +3569733296,3569733311,GB +3569733312,3569733327,FR +3569733328,3569733343,GB +3569733344,3569733423,FR +3569733424,3569733439,GB +3569733440,3569733471,FR +3569733472,3569733487,GB +3569733488,3569733519,FR +3569733520,3569733535,GB +3569733536,3569733551,NL +3569733552,3569733567,FR +3569733568,3569733583,GB +3569733584,3569733599,FR +3569733600,3569733615,GB +3569733616,3569733647,FR +3569733648,3569733663,GB +3569733664,3569733679,FR +3569733680,3569733695,GB +3569733696,3569733775,FR +3569733776,3569733791,IE +3569733792,3569733807,FR +3569733808,3569733823,GB +3569733824,3569733887,FR +3569733888,3569733919,GB +3569733920,3569733935,FR +3569733936,3569733951,GB +3569733952,3569733967,FR +3569733968,3569733983,ES +3569733984,3569733999,GB +3569734000,3569734047,FR +3569734048,3569734079,GB +3569734080,3569734143,FR +3569734144,3569734159,GB +3569734160,3569734191,FR +3569734192,3569734207,GB +3569734208,3569734367,FR +3569734368,3569734399,GB +3569734400,3569734447,BE +3569734448,3569734463,FR +3569734464,3569734511,BE +3569734512,3569736047,FR +3569736048,3569736063,GB +3569736064,3569736071,FR +3569736072,3569736079,ES +3569736080,3569736191,FR +3569736192,3569736223,NL +3569736224,3569736239,FR +3569736240,3569736383,NL +3569736384,3569736399,SE +3569736400,3569736655,NL +3569736656,3569736671,FR +3569736672,3569736703,NL +3569736704,3569739263,FR +3569739264,3569739295,NL +3569739296,3569739327,FR +3569739328,3569739471,NL +3569739472,3569739487,FR +3569739488,3569739599,NL +3569739600,3569739631,FR +3569739632,3569739647,NL +3569739648,3569739663,FR +3569739664,3569739679,NL +3569739680,3569739695,FR +3569739696,3569739839,NL +3569739840,3569739855,FR +3569739856,3569739903,NL +3569739904,3569739919,FR +3569739920,3569739935,NL +3569739936,3569739951,FR +3569739952,3569740047,NL +3569740048,3569740063,FR +3569740064,3569740111,NL +3569740112,3569740127,FR +3569740128,3569740255,NL +3569740256,3569740271,FR +3569740272,3569740303,NL +3569740304,3569740319,FR +3569740320,3569740367,NL +3569740368,3569740383,FR +3569740384,3569740415,NL +3569740416,3569740431,FR +3569740432,3569740463,NL +3569740464,3569740479,FR +3569740480,3569740495,NL +3569740496,3569740511,FR +3569740512,3569740543,NL +3569740544,3569740559,FR +3569740560,3569740655,NL +3569740656,3569740671,FR +3569740672,3569740687,NL +3569740688,3569740703,FR +3569740704,3569740799,NL +3569740800,3569741311,FR +3569741312,3569741823,BE +3569741824,3569741843,FR +3569741844,3569741859,NL +3569741860,3569742335,FR +3569742336,3569742351,BE +3569742352,3569742383,FR +3569742384,3569742399,BE +3569742400,3569742415,FR +3569742416,3569742511,BE +3569742512,3569742527,FR +3569742528,3569742623,BE +3569742624,3569742639,FR +3569742640,3569742671,BE +3569742672,3569742687,FR +3569742688,3569742735,BE +3569742736,3569742751,FR +3569742752,3569742767,BE +3569742768,3569742783,FR +3569742784,3569742927,BE +3569742928,3569742943,FR +3569742944,3569743087,BE +3569743088,3569743103,FR +3569743104,3569743135,BE +3569743136,3569743199,FR +3569743200,3569743215,BE +3569743216,3569743359,FR +3569743360,3569743391,BE +3569743392,3569743407,FR +3569743408,3569743423,BE +3569743424,3569743455,FR +3569743456,3569743583,BE +3569743584,3569743599,NL +3569743600,3569743615,FR +3569743616,3569743631,BE +3569743632,3569743647,FR +3569743648,3569743679,BE +3569743680,3569743711,FR +3569743712,3569743775,BE +3569743776,3569743791,FR +3569743792,3569743871,BE +3569743872,3569743983,NL +3569743984,3569743999,FR +3569744000,3569744047,NL +3569744048,3569744063,FR +3569744064,3569744127,NL +3569744128,3569744143,FR +3569744144,3569744543,NL +3569744544,3569744559,FR +3569744560,3569744575,NL +3569744576,3569744623,FR +3569744624,3569744815,NL +3569744816,3569744831,FR +3569744832,3569744911,NL +3569744912,3569744927,FR +3569744928,3569744975,NL +3569744976,3569744991,FR +3569744992,3569745007,NL +3569745008,3569745023,FR +3569745024,3569745039,NL +3569745040,3569745055,FR +3569745056,3569745103,NL +3569745104,3569745119,FR +3569745120,3569745167,NL +3569745168,3569745183,FR +3569745184,3569745215,NL +3569745216,3569745231,FR +3569745232,3569745247,NL +3569745248,3569745279,FR +3569745280,3569745311,NL +3569745312,3569745327,FR +3569745328,3569745359,NL +3569745360,3569745375,FR +3569745376,3569745407,NL +3569745408,3569745663,FR +3569745664,3569745727,NL +3569745728,3569745743,FR +3569745744,3569745813,NL +3569745814,3569745823,FR +3569745824,3569745839,NL +3569745840,3569745871,FR +3569745872,3569745887,NL +3569745888,3569745903,FR +3569745904,3569745919,NL +3569745920,3569811455,FR +3569811456,3569830463,IL +3569830464,3569830527,GB +3569830528,3569876991,IL +3569876992,3569877247,CS +3569877248,3569878015,RS +3569878016,3569879295,CS +3569879296,3569879807,RS +3569879808,3569885183,CS +3569885184,3569885439,CS +3569885440,3569885951,RS +3569885952,3569889791,CS +3569889792,3569890047,RS +3569890048,3569890575,CS +3569890576,3569890591,RS +3569890592,3569890615,CS +3569890616,3569890623,RS +3569890624,3569891071,CS +3569891072,3569891327,RS +3569891328,3569891583,CS +3569891584,3569891839,RS +3569891840,3569892351,CS +3569892352,3569892607,CS +3569892608,3569892863,CS +3569892864,3569893375,RS +3569893376,3569893887,CS +3569893888,3569894143,RS +3569894144,3569895943,CS +3569895944,3569895951,RS +3569895952,3569896047,CS +3569896048,3569896063,RS +3569896064,3569896083,CS +3569896084,3569896087,RS +3569896088,3569896103,CS +3569896104,3569896111,RS +3569896112,3569896143,CS +3569896144,3569896155,RS +3569896156,3569896447,CS +3569896448,3569896703,CS +3569896704,3569898495,CS +3569898496,3569899007,CS +3569899008,3569899775,CS +3569899776,3569900031,RS +3569900032,3569900319,CS +3569900320,3569900543,RS +3569900544,3569902847,CS +3569902848,3569903359,RS +3569903360,3569903999,CS +3569904000,3569904127,RS +3569904128,3569905499,CS +3569905500,3569905503,RS +3569905504,3569905539,CS +3569905540,3569905543,RS +3569905544,3569905631,CS +3569905632,3569905663,RS +3569905664,3569907711,CS +3569907712,3569907719,RS +3569907720,3569907723,CS +3569907724,3569907731,RS +3569907732,3569907787,CS +3569907788,3569907791,RS +3569907792,3569907799,CS +3569907800,3569907807,RS +3569907808,3569907847,CS +3569907848,3569907855,RS +3569907856,3569907911,CS +3569907912,3569907927,RS +3569907928,3569907975,CS +3569907976,3569907983,RS +3569907984,3569911039,CS +3569911040,3569911295,RS +3569911296,3569912623,CS +3569912624,3569912627,RS +3569912628,3569912751,CS +3569912752,3569912831,RS +3569912832,3569913599,CS +3569913600,3569913607,RS +3569913608,3569913655,CS +3569913656,3569913663,RS +3569913664,3569913711,CS +3569913712,3569913719,RS +3569913720,3569914015,CS +3569914016,3569914047,RS +3569914048,3569914191,CS +3569914192,3569914239,RS +3569914240,3569914351,CS +3569914352,3569914495,RS +3569914496,3569914623,CS +3569914624,3569914879,RS +3569914880,3569915831,CS +3569915832,3569915839,RS +3569915840,3569916331,CS +3569916332,3569916335,RS +3569916336,3569916671,CS +3569916672,3569916735,RS +3569916736,3569918463,CS +3569918464,3569918719,RS +3569918720,3569918847,CS +3569918848,3569918855,RS +3569918856,3569918863,CS +3569918864,3569918951,RS +3569918952,3569922047,CS +3569922048,3569925375,RS +3569925376,3569934335,CS +3569934336,3569934847,RS +3569934848,3569942527,CS +3569942528,3570073599,DE +3570073600,3570076943,NL +3570076944,3570076951,PH +3570076952,3570081791,NL +3570081792,3570096831,CH +3570096832,3570096895,US +3570096896,3570106367,CH +3570106368,3570139135,PL +3570139136,3570170079,DE +3570170080,3570170111,BE +3570170112,3570171903,DE +3570171904,3570204671,NL +3570204672,3570270207,GR +3570270208,3570335743,NL +3570335744,3570401279,GB +3570401280,3570442687,FR +3570442688,3570442695,IT +3570442696,3570466815,FR +3570466816,3570507439,SE +3570507440,3570507455,CH +3570507456,3570532351,SE +3570532352,3570597887,IT +3570597888,3570607103,GB +3570607104,3570608127,DE +3570608128,3570611199,GB +3570611200,3570611455,FR +3570611456,3570614271,GB +3570614272,3570617343,DE +3570617344,3570617855,GB +3570617856,3570622463,DE +3570622464,3570630655,GB +3570630656,3570633343,DE +3570633344,3570633471,CH +3570633472,3570663423,DE +3570663424,3570728959,GB +3570728960,3570729983,FI +3570729984,3570731007,SE +3570731008,3570756191,FI +3570756192,3570756223,RU +3570756224,3570760543,FI +3570760544,3570760575,RU +3570760576,3570794495,FI +3570794496,3570860031,SE +3570860032,3570892799,CH +3570892800,3570925567,SA +3570925568,3570991103,IT +3571023872,3571056639,SE +3571056640,3571122175,DE +3571122176,3571187711,GB +3571187712,3571253247,RU +3571253248,3571259551,BE +3571259552,3571259583,LU +3571259584,3571261359,BE +3571261360,3571261367,LU +3571261368,3571262335,BE +3571262336,3571262367,LU +3571262368,3571264607,BE +3571264608,3571264639,FR +3571264640,3571265935,BE +3571265936,3571265951,LU +3571265952,3571267199,BE +3571267200,3571267263,LU +3571267264,3571268607,BE +3571268608,3571268639,LU +3571268640,3571269823,BE +3571269824,3571269855,LU +3571269856,3571271423,BE +3571271424,3571271439,LU +3571271440,3571271551,BE +3571271552,3571271679,LU +3571271680,3571272447,BE +3571272448,3571272575,LU +3571272576,3571277119,BE +3571277120,3571277151,DE +3571277152,3571286015,BE +3571286016,3571321055,DE +3571321056,3571321087,GB +3571321088,3571326255,DE +3571326256,3571326259,BE +3571326260,3571343495,DE +3571343496,3571343503,ES +3571343504,3571347455,DE +3571347456,3571347711,BE +3571347712,3571349743,DE +3571349744,3571349759,CH +3571349760,3571349791,DE +3571349792,3571349799,SE +3571349800,3571349807,DE +3571349808,3571349815,BE +3571349816,3571349819,SE +3571349820,3571364951,DE +3571364952,3571364955,GB +3571364956,3571366399,DE +3571366400,3571366511,NL +3571366512,3571379311,DE +3571379312,3571379315,NL +3571379316,3571381631,DE +3571381632,3571381695,AT +3571381696,3571382783,DE +3571382784,3571383039,AT +3571383040,3571383135,DE +3571383136,3571383151,AT +3571383152,3571385151,DE +3571385152,3571385183,GB +3571385184,3571385631,DE +3571385632,3571385663,GB +3571385664,3571389471,DE +3571389472,3571389475,ES +3571389476,3571389503,DE +3571389504,3571389519,HU +3571389520,3571425695,DE +3571425696,3571425727,ES +3571425728,3571426895,DE +3571426896,3571426903,ES +3571426904,3571426931,DE +3571426932,3571426935,ES +3571426936,3571456575,DE +3571456576,3571456591,GB +3571456592,3571472383,DE +3571472384,3571472639,NL +3571472640,3571481343,DE +3571481344,3571481359,AT +3571481360,3571481599,DE +3571481600,3571481855,NL +3571481856,3571482367,DE +3571482368,3571482623,CH +3571482624,3571515391,BE +3571515392,3571548159,GB +3571548160,3571580927,ES +3571580928,3571646463,FI +3571646464,3571675679,DE +3571675680,3571675687,GB +3571675688,3571711999,DE +3571712000,3571843071,GB +3571843072,3571974143,ES +3571974144,3571978495,AT +3571978496,3571979007,SK +3571979008,3572006911,AT +3572006912,3572039679,CH +3572039680,3572047871,BE +3572047872,3572049407,LU +3572049408,3572050687,BE +3572050688,3572051711,LU +3572051712,3572051967,BE +3572051968,3572056063,LU +3572056064,3572072447,RU +3572072448,3572105215,BG +3572105216,3572148223,FR +3572148224,3572148479,MC +3572148480,3572170751,FR +3572170752,3572195791,IL +3572195792,3572195807,GB +3572195808,3572203519,IL +3572203520,3572236287,SI +3572236288,3572301823,AT +3572301824,3572367359,DK +3572367360,3572432895,NL +3572432896,3572436047,IT +3572436048,3572436063,GB +3572436064,3572442495,IT +3572442496,3572442511,NL +3572442512,3572447231,IT +3572447232,3572447239,AT +3572447240,3572447247,FR +3572447248,3572447255,GB +3572447256,3572447263,ES +3572447264,3572465663,IT +3572465664,3572498431,BE +3572498432,3572563967,GB +3572563968,3572572159,KG +3572572160,3572580351,NL +3572580352,3572596735,AT +3572596736,3572629503,GB +3572629504,3572695039,DK +3572695040,3572704951,CH +3572704952,3572704959,DE +3572704960,3572705479,CH +3572705480,3572705487,NL +3572705488,3572715519,CH +3572715520,3572715775,GB +3572715776,3572760575,CH +3572760576,3572826111,PL +3572826112,3572891647,IT +3572891648,3572957183,FI +3572957184,3573022719,SE +3573022720,3573055487,RU +3573055488,3573088255,GB +3573088256,3573142015,CH +3573142016,3573142271,AT +3573142272,3573153791,CH +3573153792,3573175711,GB +3573175712,3573175727,IE +3573175728,3573208511,GB +3573208512,3573208543,IE +3573208544,3573219327,GB +3573219328,3573252095,GR +3573252096,3573284863,NO +3573284864,3573415935,TR +3573415936,3573481471,CH +3573481472,3573547007,DE +3573547008,3573612543,ES +3573612544,3573733375,GB +3573733376,3573734399,IT +3573734400,3573743615,GB +3573743616,3573809151,CH +3573809152,3573874687,ES +3573874688,3573940223,GR +3573940224,3574005759,PS +3574005760,3574071295,CY +3574071296,3574136831,IL +3574136832,3574137783,DE +3574137784,3574137791,AT +3574137792,3574138559,DE +3574138560,3574138623,NL +3574138624,3574138735,DE +3574138736,3574138751,NL +3574138752,3574138767,DE +3574138768,3574138775,NL +3574138776,3574151823,DE +3574151824,3574151831,AT +3574151832,3574153351,DE +3574153352,3574153359,LU +3574153360,3574153367,AT +3574153368,3574153615,DE +3574153616,3574153623,AT +3574153624,3574153731,DE +3574153732,3574153735,HU +3574153736,3574154831,DE +3574154832,3574154847,LU +3574154848,3574155551,DE +3574155552,3574155583,CH +3574155584,3574155591,DE +3574155592,3574155595,FR +3574155596,3574155727,DE +3574155728,3574155731,AT +3574155732,3574155739,DE +3574155740,3574155743,AT +3574155744,3574155811,DE +3574155812,3574155815,LU +3574155816,3574155819,DE +3574155820,3574155823,NO +3574155824,3574155851,DE +3574155852,3574155855,NO +3574155856,3574155859,DE +3574155860,3574155863,NO +3574155864,3574157551,DE +3574157552,3574157559,AT +3574157560,3574159871,DE +3574159872,3574159875,GB +3574159876,3574159919,DE +3574159920,3574159927,NL +3574159928,3574160931,DE +3574160932,3574160935,NL +3574160936,3574160959,DE +3574160960,3574161023,GB +3574161024,3574161039,DE +3574161040,3574161043,NL +3574161044,3574161055,DE +3574161056,3574161087,NL +3574161088,3574161107,DE +3574161108,3574161111,NL +3574161112,3574161171,DE +3574161172,3574161175,NO +3574161176,3574161319,DE +3574161320,3574161323,NO +3574161324,3574161335,DE +3574161336,3574161339,AI +3574161340,3574161343,AT +3574161344,3574161383,DE +3574161384,3574161387,GB +3574161388,3574169599,DE +3574169600,3574202367,ES +3574202368,3574267903,NL +3574267904,3574333439,FR +3574333440,3574341631,GB +3574348288,3574348543,GB +3574398976,3574464511,PT +3574464512,3574530047,TR +3574530048,3574563679,SE +3574563680,3574563695,FI +3574563696,3574563727,SE +3574563728,3574563775,FI +3574563776,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 +3574594560,3574595583,GB +3574595584,3574595839,FR +3574595840,3574596095,MQ +3574596096,3574596351,FR +3574596352,3574596863,MQ +3574596864,3574597119,FR +3574597120,3574597631,MQ +3574597632,3574598143,GP +3574598144,3574598399,FR +3574598400,3574598655,RE +3574598656,3574599679,MQ +3574599680,3574600191,FR +3574600192,3574601215,MQ +3574601216,3574601471,RE +3574601472,3574601983,MQ +3574601984,3574602239,GF +3574602240,3574602495,FR +3574602496,3574603263,MQ +3574603264,3574603775,FR +3574603776,3574611967,BG +3574611968,3574628351,HU +3574628352,3574661119,GR +3574661120,3574693887,NL +3574693888,3574726655,PL +3574726656,3574792191,GB +3574792192,3574824959,CZ +3574824960,3574825215,NL +3574825216,3574825279,GB +3574825280,3574825407,NL +3574825408,3574825471,GB +3574825472,3574826111,NL +3574826112,3574826239,GB +3574826240,3574829055,NL +3574829056,3574829567,GB +3574829568,3574829823,NL +3574829824,3574830079,GB +3574830080,3574831359,NL +3574831360,3574833279,GB +3574833280,3574833311,NL +3574833312,3574833343,GB +3574833344,3574833359,NL +3574833360,3574833407,GB +3574833408,3574833439,NL +3574833440,3574833663,GB +3574833664,3574834175,NL +3574834176,3574834431,GB +3574834432,3574834559,NL +3574834560,3574834687,GB +3574834688,3574835199,NL +3574835200,3574836351,GB +3574836352,3574838015,NL +3574838016,3574838271,GB +3574838272,3574838527,NL +3574838528,3574857727,GB +3574857728,3574917375,DE +3574917376,3574917631,CH +3574917632,3574919359,DE +3574919360,3574919391,FR +3574919392,3574923263,DE +3574923264,3574939647,RU +3574939648,3574956031,SE +3574956032,3574972415,IT +3574972416,3574988799,LV +3574988800,3575054335,PT +3575054336,3575086175,DE +3575086176,3575086207,MT +3575086208,3575119871,DE +3575119872,3575185407,RU +3575185408,3575250943,PL +3575250944,3575316479,IT +3575316480,3575349247,RU +3575349248,3575355231,ES +3575355232,3575355247,GB +3575355248,3575367111,ES +3575367112,3575367119,DE +3575367120,3575372239,ES +3575372240,3575372247,PT +3575372248,3575382015,ES +3575382016,3575412991,FI +3575412992,3575413119,RU +3575413120,3575447551,FI +3575447552,3575513087,CZ +3575513088,3575545855,PT +3575545856,3575562239,FR +3575562240,3575578623,DE +3575578624,3575580671,BE +3575580672,3575580927,NL +3575580928,3575581439,ES +3575581440,3575581567,GB +3575581568,3575581695,BE +3575581696,3575581823,FR +3575581824,3575581951,ES +3575581952,3575582207,GR +3575582208,3575583103,BE +3575583104,3575583111,HU +3575583112,3575583999,BE +3575584000,3575584255,FR +3575584256,3575586943,BE +3575586944,3575587071,GB +3575587072,3575587103,BE +3575587104,3575587119,ES +3575587120,3575587135,BE +3575587136,3575587151,GB +3575587152,3575587247,BE +3575587248,3575587255,FR +3575587256,3575587263,BE +3575587264,3575587271,CH +3575587272,3575587295,BE +3575587296,3575587311,RU +3575587312,3575587839,BE +3575587840,3575588351,GB +3575588352,3575588863,BE +3575588864,3575589375,FR +3575589376,3575590399,BE +3575590400,3575590911,FR +3575590912,3575622607,BE +3575622608,3575622611,GB +3575622612,3575622655,BE +3575622656,3575622815,GB +3575622816,3575622847,DK +3575622848,3575622911,BE +3575622912,3575623167,GB +3575623168,3575624703,BE +3575624704,3575624831,FR +3575624832,3575624839,PT +3575624840,3575624863,GB +3575624864,3575624895,BE +3575624896,3575624911,GB +3575624912,3575624927,ES +3575624928,3575624943,GB +3575624944,3575624951,BE +3575624952,3575624959,IE +3575624960,3575624991,GB +3575624992,3575624999,IT +3575625000,3575625087,BE +3575625088,3575625095,US +3575625096,3575625375,BE +3575625376,3575625407,IT +3575625408,3575625439,BE +3575625440,3575625455,ES +3575625456,3575625471,BE +3575625472,3575625503,NO +3575625504,3575625983,BE +3575625984,3575625991,SE +3575625992,3575626047,BE +3575626048,3575626111,FR +3575626112,3575626319,BE +3575626320,3575626335,GB +3575626336,3575626351,ES +3575626352,3575626367,DE +3575626368,3575626503,BE +3575626504,3575626511,CH +3575626512,3575626519,BE +3575626520,3575626527,FR +3575626528,3575626567,BE +3575626568,3575626575,RO +3575626576,3575626599,BE +3575626600,3575626607,IE +3575626608,3575626631,BE +3575626632,3575626639,GB +3575626640,3575626647,DE +3575626648,3575626655,IT +3575626656,3575627311,BE +3575627312,3575627327,ES +3575627328,3575627335,SE +3575627336,3575627359,BE +3575627360,3575627367,ES +3575627368,3575627423,BE +3575627424,3575627431,DE +3575627432,3575627487,BE +3575627488,3575627503,GB +3575627504,3575627775,BE +3575627776,3575628543,NL +3575628544,3575628631,BE +3575628632,3575628639,GB +3575628640,3575628815,BE +3575628816,3575628823,ES +3575628824,3575628831,FR +3575628832,3575629183,BE +3575629184,3575629247,NL +3575629248,3575629279,BE +3575629280,3575629287,GB +3575629288,3575629295,BE +3575629296,3575629303,NL +3575629304,3575629823,BE +3575629824,3575629855,GR +3575629856,3575629871,DE +3575629872,3575629935,BE +3575629936,3575629951,FR +3575629952,3575630015,BE +3575630016,3575630023,GR +3575630024,3575630063,BE +3575630064,3575630079,ZA +3575630080,3575630335,BE +3575630336,3575630463,IT +3575630464,3575630591,CH +3575630592,3575630847,IL +3575630848,3575630975,BE +3575630976,3575630991,FR +3575630992,3575631103,BE +3575631104,3575631111,AT +3575631112,3575631119,CH +3575631120,3575631127,DE +3575631128,3575631135,BE +3575631136,3575631143,HU +3575631144,3575631183,BE +3575631184,3575631199,HU +3575631200,3575631207,IE +3575631208,3575631231,BE +3575631232,3575631295,CH +3575631296,3575631303,BE +3575631304,3575631311,FI +3575631312,3575631615,BE +3575631616,3575631631,SE +3575631632,3575631639,BE +3575631640,3575631647,CH +3575631648,3575631663,SE +3575631664,3575631679,DE +3575631680,3575631695,SE +3575631696,3575631711,IT +3575631712,3575631759,BE +3575631760,3575631775,ZA +3575631776,3575631791,BE +3575631792,3575631799,ES +3575631800,3575631807,CZ +3575631808,3575631855,BE +3575631856,3575631863,ZA +3575631864,3575631871,BE +3575631872,3575632639,IL +3575632640,3575632655,NO +3575632656,3575632703,BE +3575632704,3575632711,GB +3575632712,3575632783,BE +3575632784,3575632791,GB +3575632792,3575632847,BE +3575632848,3575632863,CH +3575632864,3575632879,BE +3575632880,3575632895,DE +3575632896,3575632967,BE +3575632968,3575632975,GB +3575632976,3575632991,BE +3575632992,3575632999,IT +3575633000,3575633039,BE +3575633040,3575633055,DE +3575633056,3575633063,SE +3575633064,3575633071,NL +3575633072,3575633087,BE +3575633088,3575633119,GB +3575633120,3575633135,BE +3575633136,3575633143,GB +3575633144,3575633599,BE +3575633600,3575633663,NL +3575633664,3575633727,BE +3575633728,3575633735,AT +3575633736,3575633743,IT +3575633744,3575633783,BE +3575633784,3575633791,DE +3575633792,3575633887,BE +3575633888,3575633895,SE +3575633896,3575633919,BE +3575633920,3575633983,CH +3575633984,3575633991,DE +3575633992,3575633999,BE +3575634000,3575634007,PT +3575634008,3575634015,DK +3575634016,3575634047,GB +3575634048,3575634183,BE +3575634184,3575634191,AT +3575634192,3575634255,BE +3575634256,3575634271,IT +3575634272,3575634367,BE +3575634368,3575634399,NO +3575634400,3575634431,GB +3575634432,3575634455,BE +3575634456,3575634463,DE +3575634464,3575634495,BE +3575634496,3575634511,FI +3575634512,3575634519,CH +3575634520,3575634591,BE +3575634592,3575634599,ES +3575634600,3575634607,BE +3575634608,3575634615,GB +3575634616,3575634623,DE +3575634624,3575634695,BE +3575634696,3575634703,FI +3575634704,3575634711,BE +3575634712,3575634719,DE +3575634720,3575634767,BE +3575634768,3575634775,NO +3575634776,3575634783,BE +3575634784,3575634791,FR +3575634792,3575634799,ES +3575634800,3575634807,BE +3575634808,3575634815,SE +3575634816,3575634879,BE +3575634880,3575634911,GB +3575634912,3575634919,SE +3575634920,3575634927,GB +3575634928,3575634935,IT +3575634936,3575635015,BE +3575635016,3575635023,CH +3575635024,3575635039,ES +3575635040,3575635055,BE +3575635056,3575635063,CH +3575635064,3575635071,BE +3575635072,3575635087,SE +3575635088,3575635103,BE +3575635104,3575635119,PT +3575635120,3575635135,PL +3575635136,3575635151,DE +3575635152,3575635159,PT +3575635160,3575635167,DE +3575635168,3575635175,GB +3575635176,3575635199,BE +3575635200,3575635455,NO +3575635456,3575635463,RU +3575635464,3575635471,GB +3575635472,3575635583,BE +3575635584,3575635615,EG +3575635616,3575635631,FI +3575635632,3575635647,BE +3575635648,3575635679,GB +3575635680,3575635695,BE +3575635696,3575635703,GB +3575635704,3575635775,BE +3575635776,3575635839,CH +3575635840,3575635847,GB +3575635848,3575635855,FR +3575635856,3575635871,TR +3575635872,3575635983,BE +3575635984,3575635999,DE +3575636000,3575636143,BE +3575636144,3575636151,HU +3575636152,3575636607,BE +3575636608,3575636735,FR +3575636736,3575636807,BE +3575636808,3575636815,GB +3575636816,3575636823,BE +3575636824,3575636831,RU +3575636832,3575636855,BE +3575636856,3575636863,DE +3575636864,3575636871,BE +3575636872,3575636879,CZ +3575636880,3575636895,BE +3575636896,3575636903,PL +3575636904,3575636911,CZ +3575636912,3575636927,BE +3575636928,3575636959,DE +3575636960,3575636983,BE +3575636984,3575636991,FR +3575636992,3575637039,BE +3575637040,3575637055,DE +3575637056,3575637151,BE +3575637152,3575637183,GB +3575637184,3575637407,BE +3575637408,3575637439,LU +3575637440,3575637471,GB +3575637472,3575638103,BE +3575638104,3575638111,GB +3575638112,3575638175,BE +3575638176,3575638239,GB +3575638240,3575638279,BE +3575638280,3575638287,RU +3575638288,3575638303,BE +3575638304,3575638335,NO +3575638336,3575638527,BE +3575638528,3575638543,DE +3575638544,3575638559,BE +3575638560,3575638591,GB +3575638592,3575638623,BE +3575638624,3575638639,PL +3575638640,3575638719,BE +3575638720,3575638735,NL +3575638736,3575638751,GR +3575638752,3575638767,BE +3575638768,3575638783,SE +3575638784,3575638911,BE +3575638912,3575638943,FR +3575638944,3575638975,GB +3575638976,3575639007,BE +3575639008,3575639011,GB +3575639012,3575639023,IE +3575639024,3575639039,PL +3575639040,3575644159,BE +3575644160,3575709695,DK +3575709696,3575730175,AT +3575730176,3575730183,SA +3575730184,3575732735,AT +3575732736,3575732991,LI +3575732992,3575736319,AT +3575736320,3575736895,LI +3575736896,3575738407,AT +3575738408,3575738415,SA +3575738416,3575738431,AT +3575738432,3575738463,SA +3575738464,3575738751,AT +3575738752,3575738759,SA +3575738760,3575742463,AT +3575742464,3575775231,RU +3575775232,3575775295,AT +3575775296,3575775487,NL +3575775488,3575775743,AT +3575775744,3575824383,NL +3575824384,3575832575,KW +3575832576,3575857151,NL +3575857152,3575857407,BE +3575857408,3575858529,NL +3575858530,3575858543,US +3575858544,3575860299,NL +3575860300,3575860303,BE +3575860304,3575866367,NL +3575866368,3575867135,US +3575867136,3575873535,NL +3575873536,3575906303,EE +3575906304,3575971839,FR +3575971840,3576037375,ES +3576038208,3576038271,GB +3576038336,3576038463,GB +3576038528,3576038591,GB +3576038912,3576038975,GB +3576039168,3576039231,GB +3576039360,3576039383,GB +3576039392,3576039455,GB +3576039520,3576039551,GB +3576039584,3576039647,GB +3576039808,3576039839,GB +3576039904,3576039935,GB +3576040064,3576040127,GB +3576040216,3576040223,GB +3576040272,3576040287,GB +3576040352,3576040383,GB +3576040832,3576040959,GB +3576041472,3576041535,GB +3576041728,3576041799,GB +3576041832,3576041847,GB +3576041864,3576041871,GB +3576041880,3576041887,GB +3576041904,3576041919,GB +3576041936,3576041943,GB +3576041952,3576041975,GB +3576042112,3576042239,GB +3576042496,3576042623,GB +3576042688,3576042815,GB +3576045568,3576045599,GB +3576045616,3576045631,GB +3576045664,3576045679,GB +3576045712,3576045735,GB +3576045800,3576045807,GB +3576045816,3576045823,GB +3576048640,3576048767,GB +3576048960,3576049023,GB +3576049152,3576050047,GB +3576053760,3576054911,GB +3576055104,3576055111,GB +3576055120,3576055127,GB +3576055152,3576055167,GB +3576055184,3576055199,GB +3576055208,3576055215,GB +3576055280,3576055551,GB +3576055680,3576055871,GB +3576055936,3576055999,GB +3576056192,3576056255,GB +3576056320,3576056447,GB +3576056704,3576056767,GB +3576056856,3576056871,GB +3576056880,3576056887,GB +3576056896,3576056903,GB +3576056920,3576056927,GB +3576056936,3576056943,GB +3576056952,3576056975,GB +3576056992,3576057007,GB +3576057040,3576057055,GB +3576057632,3576057647,GB +3576057712,3576057743,GB +3576057760,3576057775,GB +3576057824,3576057839,GB +3576058880,3576059007,GB +3576059648,3576059679,GB +3576059712,3576059743,GB +3576059776,3576059807,GB +3576060096,3576060159,GB +3576060288,3576060351,GB +3576061040,3576061055,GB +3576061120,3576061135,GB +3576061184,3576061247,GB +3576061312,3576061439,GB +3576061584,3576061591,GB +3576061620,3576061631,GB +3576061640,3576061647,GB +3576061688,3576061695,GB +3576062464,3576062479,GB +3576064320,3576064448,GB +3576064544,3576064559,GB +3576065408,3576065535,GB +3576065856,3576065887,GB +3576066288,3576066295,GB +3576066304,3576066431,GB +3576067072,3576067199,GB +3576067248,3576067255,GB +3576068352,3576068479,GB +3576068864,3576068927,GB +3576069056,3576069119,GB +3576069248,3576069279,GB +3576069312,3576069343,GB +3576070696,3576070703,GB +3576070712,3576070719,GB +3576070728,3576070735,GB +3576070776,3576070783,GB +3576071296,3576071423,GB +3576071552,3576071679,GB +3576071936,3576071951,GB +3576072064,3576072079,GB +3576072288,3576072319,GB +3576072416,3576072511,GB +3576073216,3576073279,GB +3576074752,3576074879,GB +3576075104,3576075135,GB +3576075264,3576075327,GB +3576075648,3576075711,GB +3576075776,3576075903,GB +3576076272,3576076351,GB +3576076568,3576076575,GB +3576076624,3576076631,GB +3576076704,3576076719,GB +3576076784,3576076791,GB +3576077440,3576077471,GB +3576077568,3576077695,GB +3576077872,3576077887,GB +3576077936,3576077967,GB +3576078080,3576078175,GB +3576078464,3576078591,GB +3576079616,3576079871,GB +3576080000,3576080127,GB +3576080224,3576080255,GB +3576080776,3576080799,GB +3576080808,3576080815,GB +3576080824,3576080831,GB +3576082080,3576082111,GB +3576082192,3576082223,GB +3576082688,3576082943,GB +3576083968,3576084031,GB +3576084480,3576084543,GB +3576084608,3576084671,GB +3576084704,3576084735,GB +3576084864,3576084927,GB +3576085184,3576085215,GB +3576085696,3576085711,GB +3576086016,3576086143,GB +3576086368,3576086431,GB +3576086496,3576086527,GB +3576086568,3576086571,GB +3576086576,3576086591,GB +3576086600,3576086603,GB +3576087808,3576087823,GB +3576087952,3576087967,GB +3576088032,3576088047,GB +3576088224,3576088231,GB +3576088376,3576088383,GB +3576088480,3576088511,GB +3576088960,3576088967,GB +3576089024,3576089039,GB +3576089440,3576089471,GB +3576089776,3576089791,GB +3576089824,3576089839,GB +3576091408,3576091423,GB +3576091456,3576091479,GB +3576091520,3576091535,GB +3576091968,3576091983,GB +3576092000,3576092031,GB +3576092128,3576092159,GB +3576092864,3576092895,GB +3576093064,3576093071,GB +3576093184,3576093247,GB +3576095232,3576096767,GB +3576099072,3576100863,GB +3576101376,3576102911,GB +3576102912,3576109023,FR +3576109024,3576109055,DE +3576109056,3576119295,FR +3576119296,3576119455,CH +3576119456,3576119471,BE +3576119472,3576127487,CH +3576127488,3576131583,FR +3576131584,3576135679,CH +3576135680,3576168447,DE +3576168448,3576233983,GB +3576233984,3576236671,FR +3576236672,3576236703,GB +3576236704,3576236879,FR +3576236880,3576237055,GB +3576237056,3576237063,FR +3576237064,3576237071,GB +3576237072,3576237087,FR +3576237088,3576237119,GB +3576237120,3576237215,FR +3576237216,3576237279,GB +3576237280,3576237455,FR +3576237456,3576237503,GB +3576237504,3576237567,FR +3576237568,3576237583,GB +3576237584,3576237599,FR +3576237600,3576237679,GB +3576237680,3576237695,FR +3576237696,3576237759,GB +3576237760,3576237791,FR +3576237792,3576237823,GB +3576237824,3576237855,FR +3576237856,3576237871,GB +3576237872,3576237887,FR +3576237888,3576237919,GB +3576237920,3576237935,FR +3576237936,3576237967,GB +3576237968,3576237983,FR +3576237984,3576238015,GB +3576238016,3576238143,FR +3576238144,3576238159,GB +3576238160,3576238271,FR +3576238272,3576238335,GB +3576238336,3576238447,FR +3576238448,3576238463,GB +3576238464,3576238511,FR +3576238512,3576238527,GB +3576238528,3576238559,FR +3576238560,3576238575,GB +3576238576,3576238607,FR +3576238608,3576238623,GB +3576238624,3576238639,FR +3576238640,3576238911,GB +3576238912,3576238927,FR +3576238928,3576238975,GB +3576238976,3576239007,FR +3576239008,3576239023,GB +3576239024,3576239039,FR +3576239040,3576239071,GB +3576239072,3576239087,FR +3576239088,3576239103,GB +3576239104,3576240039,FR +3576240040,3576240047,GB +3576240048,3576240111,FR +3576240112,3576240127,GB +3576240128,3576240639,FR +3576240640,3576240895,GB +3576240896,3576241287,FR +3576241288,3576241295,GB +3576241296,3576241343,FR +3576241344,3576241351,GB +3576241352,3576241391,FR +3576241392,3576241399,GB +3576241400,3576241791,FR +3576241792,3576241799,GB +3576241800,3576241815,FR +3576241816,3576241823,GB +3576241824,3576241919,FR +3576241920,3576242111,GB +3576242112,3576246399,FR +3576246400,3576246527,GB +3576246528,3576246656,FR +3576246657,3576246783,GB +3576246784,3576248575,FR +3576248576,3576248831,GB +3576248832,3576249463,FR +3576249464,3576249471,GB +3576249472,3576249527,FR +3576249528,3576249535,GB +3576249536,3576249743,FR +3576249744,3576249791,GB +3576249792,3576249799,FR +3576249800,3576249823,GB +3576249824,3576249831,FR +3576249832,3576249839,GB +3576249840,3576251407,FR +3576251408,3576251519,GB +3576251520,3576251583,FR +3576251584,3576251599,GB +3576251600,3576251615,FR +3576251616,3576251647,GB +3576251648,3576252415,FR +3576252416,3576252671,GB +3576252672,3576253159,FR +3576253160,3576253183,GB +3576253184,3576254479,FR +3576254480,3576254495,GB +3576254496,3576254551,FR +3576254552,3576254559,GB +3576254560,3576254575,FR +3576254576,3576254615,GB +3576254616,3576254623,FR +3576254624,3576254639,GB +3576254640,3576254647,FR +3576254648,3576254679,GB +3576254680,3576254695,FR +3576254696,3576254711,GB +3576254712,3576254767,FR +3576254768,3576254783,GB +3576254784,3576254847,FR +3576254848,3576254855,GB +3576254856,3576254863,FR +3576254864,3576254879,GB +3576254880,3576254895,FR +3576254896,3576254903,GB +3576254904,3576255087,FR +3576255088,3576255199,GB +3576255200,3576255215,FR +3576255216,3576255263,GB +3576255264,3576255319,FR +3576255320,3576255327,GB +3576255328,3576255375,FR +3576255376,3576255383,GB +3576255384,3576255407,FR +3576255408,3576255423,GB +3576255424,3576255431,FR +3576255432,3576255439,GB +3576255440,3576255503,FR +3576255504,3576255511,GB +3576255512,3576255519,FR +3576255520,3576255527,GB +3576255528,3576255543,FR +3576255544,3576255551,GB +3576255552,3576255575,FR +3576255576,3576255583,GB +3576255584,3576255631,FR +3576255632,3576255647,GB +3576255648,3576255671,FR +3576255672,3576255679,GB +3576255680,3576255703,FR +3576255704,3576255727,GB +3576255728,3576255743,FR +3576255744,3576255759,GB +3576255760,3576255839,FR +3576255840,3576255871,GB +3576255872,3576255887,FR +3576255888,3576255935,GB +3576255936,3576255943,FR +3576255944,3576256047,GB +3576256048,3576256111,FR +3576256112,3576256143,GB +3576256144,3576256239,FR +3576256240,3576256255,GB +3576256256,3576256351,FR +3576256352,3576256367,GB +3576256368,3576256383,FR +3576256384,3576256415,GB +3576256416,3576256431,FR +3576256432,3576256447,GB +3576256448,3576256463,FR +3576256464,3576256527,GB +3576256528,3576256543,FR +3576256544,3576256559,GB +3576256560,3576256607,FR +3576256608,3576256623,GB +3576256624,3576256639,FR +3576256640,3576256671,GB +3576256672,3576256687,FR +3576256688,3576256767,GB +3576256768,3576256895,FR +3576256896,3576256959,GB +3576256960,3576256991,FR +3576256992,3576257007,GB +3576257008,3576257103,FR +3576257104,3576257111,GB +3576257112,3576257135,FR +3576257136,3576257151,GB +3576257152,3576257159,FR +3576257160,3576257167,GB +3576257168,3576257287,FR +3576257288,3576257295,GB +3576257296,3576257327,FR +3576257328,3576257359,GB +3576257360,3576257367,FR +3576257368,3576257375,GB +3576257376,3576257487,FR +3576257488,3576257495,GB +3576257496,3576257503,FR +3576257504,3576257535,GB +3576257536,3576257551,FR +3576257552,3576257583,GB +3576257584,3576257631,FR +3576257632,3576257647,GB +3576257648,3576257727,FR +3576257728,3576257807,GB +3576257808,3576257823,FR +3576257824,3576257839,GB +3576257840,3576257855,FR +3576257856,3576257871,GB +3576257872,3576257887,FR +3576257888,3576257903,GB +3576257904,3576257983,FR +3576257984,3576257999,GB +3576258000,3576258055,FR +3576258056,3576258063,GB +3576258064,3576258095,FR +3576258096,3576258127,GB +3576258128,3576258160,FR +3576258161,3576258175,GB +3576258176,3576258191,FR +3576258192,3576258207,GB +3576258208,3576258351,FR +3576258352,3576258399,GB +3576258400,3576258415,FR +3576258416,3576258431,GB +3576258432,3576258447,FR +3576258448,3576258463,GB +3576258464,3576258495,FR +3576258496,3576258511,GB +3576258512,3576258527,FR +3576258528,3576258575,GB +3576258576,3576258591,FR +3576258592,3576258623,GB +3576258624,3576258671,FR +3576258672,3576258687,GB +3576258688,3576258719,FR +3576258720,3576258783,GB +3576258784,3576258863,FR +3576258864,3576258895,GB +3576258896,3576258911,FR +3576258912,3576258927,GB +3576258928,3576259023,FR +3576259024,3576259039,GB +3576259040,3576259071,FR +3576259072,3576259087,GB +3576259088,3576259103,FR +3576259104,3576259199,GB +3576259200,3576259231,FR +3576259232,3576259247,GB +3576259248,3576259279,FR +3576259280,3576259295,GB +3576259296,3576259311,FR +3576259312,3576259327,GB +3576259328,3576259343,FR +3576259344,3576259391,GB +3576259392,3576259423,FR +3576259424,3576259439,GB +3576259440,3576259519,FR +3576259520,3576259583,GB +3576259584,3576259919,FR +3576259920,3576259935,GB +3576259936,3576259991,FR +3576259992,3576259999,GB +3576260000,3576260015,FR +3576260016,3576260031,GB +3576260032,3576260063,FR +3576260064,3576260087,GB +3576260088,3576260175,FR +3576260176,3576260191,GB +3576260192,3576260207,FR +3576260208,3576260223,GB +3576260224,3576260239,FR +3576260240,3576260255,GB +3576260256,3576260271,FR +3576260272,3576260335,GB +3576260336,3576260463,FR +3576260464,3576260543,GB +3576260544,3576260559,FR +3576260560,3576260607,GB +3576260608,3576260623,FR +3576260624,3576260639,GB +3576260640,3576260655,FR +3576260656,3576260687,GB +3576260688,3576260703,FR +3576260704,3576260735,GB +3576260736,3576260895,FR +3576260896,3576260927,GB +3576260928,3576260959,FR +3576260960,3576260999,GB +3576261000,3576261015,FR +3576261016,3576261023,GB +3576261024,3576261047,FR +3576261048,3576261055,GB +3576261056,3576261063,FR +3576261064,3576261071,GB +3576261072,3576261087,FR +3576261088,3576261095,GB +3576261096,3576261103,FR +3576261104,3576261111,GB +3576261112,3576261375,FR +3576261376,3576261631,GB +3576261632,3576261927,FR +3576261928,3576261935,GB +3576261936,3576262023,FR +3576262024,3576262031,GB +3576262032,3576262063,FR +3576262064,3576262071,GB +3576262072,3576263439,FR +3576263440,3576263455,GB +3576263456,3576263519,FR +3576263520,3576263551,GB +3576263552,3576263567,FR +3576263568,3576263575,GB +3576263576,3576263583,FR +3576263584,3576263599,GB +3576263600,3576263615,FR +3576263616,3576263623,GB +3576263624,3576263751,FR +3576263752,3576263759,GB +3576263760,3576263791,FR +3576263792,3576263887,GB +3576263888,3576263911,FR +3576263912,3576263919,GB +3576263920,3576264303,FR +3576264304,3576264311,GB +3576264312,3576264383,FR +3576264384,3576264399,GB +3576264400,3576264447,FR +3576264448,3576264511,GB +3576264512,3576264543,FR +3576264544,3576264559,GB +3576264560,3576264575,FR +3576264576,3576264607,GB +3576264608,3576264639,FR +3576264640,3576264687,GB +3576264688,3576265311,FR +3576265312,3576265319,GB +3576265320,3576265399,FR +3576265400,3576265415,GB +3576265416,3576265463,FR +3576265464,3576265471,GB +3576265472,3576265807,FR +3576265808,3576265823,GB +3576265824,3576265831,FR +3576265832,3576265839,GB +3576265840,3576265847,FR +3576265848,3576265863,GB +3576265864,3576265879,FR +3576265880,3576265895,GB +3576265896,3576265911,FR +3576265912,3576265935,GB +3576265936,3576266655,FR +3576266656,3576266671,GB +3576266672,3576266687,FR +3576266688,3576266751,GB +3576266752,3576299519,FR +3576299520,3576365055,AE +3576365056,3576430591,TR +3576430592,3576496127,FR +3576496128,3576561663,IT +3576561664,3576603135,NL +3576603136,3576603391,BE +3576603392,3576603647,FR +3576603648,3576604159,NL +3576604160,3576604415,HU +3576604416,3576605183,NL +3576605184,3576605439,RO +3576605440,3576605695,NL +3576605696,3576605951,CZ +3576605952,3576606207,AT +3576606208,3576606463,GB +3576606464,3576606719,NL +3576606720,3576606975,SE +3576606976,3576607231,NO +3576607232,3576607487,PL +3576607488,3576607743,DE +3576607744,3576620031,NL +3576620032,3576620543,SE +3576620544,3576620799,GB +3576620800,3576622335,NL +3576622336,3576622591,GB +3576622592,3576623871,NL +3576623872,3576624127,AT +3576624128,3576626943,NL +3576626944,3576692735,AT +3576692736,3576758271,GB +3576758272,3576823807,BE +3576823808,3576889343,SE +3576889344,3576954879,NL +3576954880,3576987647,NO +3576987648,3577020415,GB +3577020416,3577085951,NL +3577085952,3577151487,DE +3577151488,3577167871,GB +3577184256,3577217023,CH +3577217024,3577263167,FR +3577263168,3577263199,US +3577263200,3577282559,FR +3577282560,3577348095,IL +3577348096,3577392767,PT +3577392768,3577392783,DE +3577392784,3577413631,PT +3577413632,3577417519,RU +3577417520,3577417535,KZ +3577417536,3577479167,RU +3577479168,3577544703,ES +3577544704,3577545795,DE +3577545796,3577545799,GB +3577545800,3577545863,DE +3577545864,3577545871,US +3577545872,3577545903,DE +3577545904,3577545919,GB +3577545920,3577545983,DE +3577545984,3577546111,SE +3577546112,3577546143,DE +3577546144,3577546151,GB +3577546152,3577546159,DE +3577546160,3577546175,GB +3577546176,3577546239,DE +3577546240,3577546367,US +3577546368,3577546383,GB +3577546384,3577546415,DE +3577546416,3577546423,GB +3577546424,3577546703,DE +3577546704,3577546719,GB +3577546720,3577547223,DE +3577547224,3577547231,GB +3577547232,3577547375,DE +3577547376,3577547383,GB +3577547384,3577547455,DE +3577547456,3577547519,FR +3577547520,3577547631,DE +3577547632,3577547663,GB +3577547664,3577547743,DE +3577547744,3577547775,GB +3577547776,3577548287,DE +3577548288,3577548303,GB +3577548304,3577548319,DE +3577548320,3577548351,GB +3577548352,3577549055,DE +3577549056,3577549079,GB +3577549080,3577549119,DE +3577549120,3577549151,GB +3577549152,3577549599,DE +3577549600,3577549631,GB +3577549632,3577549695,DE +3577549696,3577549823,GB +3577549824,3577550847,DE +3577550848,3577550983,GB +3577550984,3577551047,DE +3577551048,3577551055,GB +3577551056,3577551087,DE +3577551088,3577551095,GB +3577551096,3577551103,DE +3577551104,3577551111,GB +3577551112,3577551119,DE +3577551120,3577551127,GB +3577551128,3577551151,DE +3577551152,3577551159,GB +3577551160,3577551271,DE +3577551272,3577551279,GB +3577551280,3577551287,DE +3577551288,3577551327,GB +3577551328,3577551343,DE +3577551344,3577551351,GB +3577551352,3577551407,DE +3577551408,3577551411,US +3577551412,3577551423,DE +3577551424,3577551455,GB +3577551456,3577552151,DE +3577552152,3577552183,GB +3577552184,3577552191,DE +3577552192,3577552199,GB +3577552200,3577552215,DE +3577552216,3577552223,GB +3577552224,3577552239,DE +3577552240,3577552247,GB +3577552248,3577552255,DE +3577552256,3577552271,GB +3577552272,3577552319,DE +3577552320,3577552359,GB +3577552360,3577552367,DE +3577552368,3577552383,GB +3577552384,3577552399,DE +3577552400,3577552447,GB +3577552448,3577552959,DE +3577552960,3577552967,GB +3577552968,3577552983,DE +3577552984,3577552991,GB +3577552992,3577553015,DE +3577553016,3577553023,GB +3577553024,3577553103,DE +3577553104,3577553119,GB +3577553120,3577553191,DE +3577553192,3577553199,GB +3577553200,3577553223,DE +3577553224,3577553407,GB +3577553408,3577553503,DE +3577553504,3577553575,GB +3577553576,3577553583,DE +3577553584,3577553615,GB +3577553616,3577553623,DE +3577553624,3577553663,GB +3577553664,3577553983,DE +3577553984,3577554047,GB +3577554048,3577554175,DE +3577554176,3577554463,GB +3577554464,3577554467,DE +3577554468,3577554483,GB +3577554484,3577554487,DE +3577554488,3577554647,GB +3577554648,3577554659,DE +3577554660,3577554663,GB +3577554664,3577554671,DE +3577554672,3577554687,GB +3577554688,3577554815,DE +3577554816,3577554943,GB +3577554944,3577556999,DE +3577557000,3577557007,GB +3577557008,3577557071,DE +3577557072,3577557103,GB +3577557104,3577557215,DE +3577557216,3577557231,US +3577557232,3577557247,GB +3577557248,3577558143,DE +3577558144,3577558207,GB +3577558208,3577558359,DE +3577558360,3577558367,GB +3577558368,3577558383,DE +3577558384,3577558391,GB +3577558392,3577558431,DE +3577558432,3577558439,GB +3577558440,3577558783,DE +3577558784,3577559167,GB +3577559168,3577559183,DE +3577559184,3577559199,GB +3577559200,3577559231,DE +3577559232,3577559247,GB +3577559248,3577559279,DE +3577559280,3577559303,GB +3577559304,3577559311,DE +3577559312,3577559319,GB +3577559320,3577559327,DE +3577559328,3577559351,GB +3577559352,3577559383,DE +3577559384,3577559391,GB +3577559392,3577559399,DE +3577559400,3577559407,GB +3577559408,3577559431,DE +3577559432,3577559447,GB +3577559448,3577559455,DE +3577559456,3577559463,GB +3577559464,3577559471,DE +3577559472,3577559487,GB +3577559488,3577559519,DE +3577559520,3577559527,GB +3577559528,3577559535,DE +3577559536,3577559543,GB +3577559544,3577559559,DE +3577559560,3577559567,GB +3577559568,3577559607,DE +3577559608,3577559615,GB +3577559616,3577559663,DE +3577559664,3577559671,GB +3577559672,3577559679,DE +3577559680,3577559687,GB +3577559688,3577559815,DE +3577559816,3577559823,GB +3577559824,3577559983,DE +3577559984,3577559999,GB +3577560000,3577560063,DE +3577560064,3577560079,GB +3577560080,3577560095,DE +3577560096,3577560103,GB +3577560104,3577560111,DE +3577560112,3577560167,GB +3577560168,3577560175,DE +3577560176,3577560271,GB +3577560272,3577560287,DE +3577560288,3577560295,GB +3577560296,3577560343,DE +3577560344,3577560351,GB +3577560352,3577560447,DE +3577560448,3577560463,GB +3577560464,3577560479,DE +3577560480,3577560487,GB +3577560488,3577560495,DE +3577560496,3577560511,GB +3577560512,3577560559,DE +3577560560,3577560575,GB +3577560576,3577561087,DE +3577561088,3577561127,GB +3577561128,3577561131,DE +3577561132,3577561235,GB +3577561236,3577561263,DE +3577561264,3577561267,GB +3577561268,3577561271,DE +3577561272,3577561287,GB +3577561288,3577561323,DE +3577561324,3577561327,GB +3577561328,3577561331,DE +3577561332,3577561595,GB +3577561596,3577561623,DE +3577561624,3577561631,GB +3577561632,3577561679,DE +3577561680,3577561687,GB +3577561688,3577561695,DE +3577561696,3577561703,GB +3577561704,3577561711,DE +3577561712,3577561719,GB +3577561720,3577561791,DE +3577561792,3577561823,GB +3577561824,3577561839,DE +3577561840,3577561855,GB +3577561856,3577562087,DE +3577562088,3577562095,GB +3577562096,3577562103,DE +3577562104,3577562111,GB +3577562112,3577562391,DE +3577562392,3577562399,GB +3577562400,3577562415,DE +3577562416,3577562423,GB +3577562424,3577562431,DE +3577562432,3577562439,GB +3577562440,3577562463,DE +3577562464,3577562471,GB +3577562472,3577562479,DE +3577562480,3577562487,GB +3577562488,3577562511,DE +3577562512,3577562527,GB +3577562528,3577562535,DE +3577562536,3577562551,GB +3577562552,3577562559,DE +3577562560,3577562623,GB +3577562624,3577562935,DE +3577562936,3577562991,GB +3577562992,3577562999,DE +3577563000,3577563007,GB +3577563008,3577563015,DE +3577563016,3577563135,GB +3577563136,3577563279,DE +3577563280,3577563287,GB +3577563288,3577563295,DE +3577563296,3577563311,GB +3577563312,3577563327,DE +3577563328,3577563359,GB +3577563360,3577563375,DE +3577563376,3577563383,GB +3577563384,3577563919,DE +3577563920,3577563927,GB +3577563928,3577563935,DE +3577563936,3577563943,GB +3577563944,3577563983,DE +3577563984,3577564031,GB +3577564032,3577564039,DE +3577564040,3577564043,GB +3577564044,3577564087,DE +3577564088,3577564095,GB +3577564096,3577564111,DE +3577564112,3577564119,GB +3577564120,3577564191,DE +3577564192,3577564303,GB +3577564304,3577564359,DE +3577564360,3577564367,GB +3577564368,3577564375,DE +3577564376,3577564383,GB +3577564384,3577564575,DE +3577564576,3577564583,GB +3577564584,3577564599,DE +3577564600,3577564607,GB +3577564608,3577564655,DE +3577564656,3577564663,GB +3577564664,3577564927,DE +3577564928,3577565227,GB +3577565228,3577565255,DE +3577565256,3577565259,GB +3577565260,3577565271,DE +3577565272,3577565283,GB +3577565284,3577565287,DE +3577565288,3577565695,GB +3577565696,3577565711,DE +3577565712,3577565719,GB +3577565720,3577565743,DE +3577565744,3577565759,GB +3577565760,3577565775,DE +3577565776,3577565791,GB +3577565792,3577565823,DE +3577565824,3577565839,GB +3577565840,3577565847,DE +3577565848,3577565855,GB +3577565856,3577565863,DE +3577565864,3577565879,GB +3577565880,3577565895,DE +3577565896,3577565903,GB +3577565904,3577565911,DE +3577565912,3577565919,GB +3577565920,3577565943,DE +3577565944,3577565967,GB +3577565968,3577565975,DE +3577565976,3577565999,GB +3577566000,3577566007,DE +3577566008,3577566063,GB +3577566064,3577566087,DE +3577566088,3577566103,GB +3577566104,3577566119,DE +3577566120,3577566135,GB +3577566136,3577566143,DE +3577566144,3577566151,GB +3577566152,3577566175,DE +3577566176,3577566183,GB +3577566184,3577566191,DE +3577566192,3577566207,GB +3577566208,3577566219,DE +3577566220,3577566423,GB +3577566424,3577566431,DE +3577566432,3577566463,GB +3577566464,3577566711,DE +3577566712,3577566719,GB +3577566720,3577566871,DE +3577566872,3577566879,GB +3577566880,3577567039,DE +3577567040,3577567047,GB +3577567048,3577567111,DE +3577567112,3577567119,GB +3577567120,3577567127,DE +3577567128,3577567135,GB +3577567136,3577567167,DE +3577567168,3577567199,GB +3577567200,3577567495,DE +3577567496,3577567503,GB +3577567504,3577567511,DE +3577567512,3577567519,GB +3577567520,3577567615,DE +3577567616,3577567623,GB +3577567624,3577567639,DE +3577567640,3577567647,GB +3577567648,3577567663,DE +3577567664,3577567671,GB +3577567672,3577567679,DE +3577567680,3577567871,GB +3577567872,3577568351,DE +3577568352,3577568359,GB +3577568360,3577568479,DE +3577568480,3577568487,GB +3577568488,3577568495,DE +3577568496,3577568519,GB +3577568520,3577568527,DE +3577568528,3577569279,GB +3577569280,3577569383,DE +3577569384,3577569391,GB +3577569392,3577569407,DE +3577569408,3577569431,GB +3577569432,3577569439,DE +3577569440,3577569471,GB +3577569472,3577569499,DE +3577569500,3577569503,GB +3577569504,3577569519,DE +3577569520,3577569535,GB +3577569536,3577569855,DE +3577569856,3577569863,GB +3577569864,3577569887,DE +3577569888,3577569895,GB +3577569896,3577569911,DE +3577569912,3577569919,GB +3577569920,3577569999,DE +3577570000,3577570015,GB +3577570016,3577570159,DE +3577570160,3577570167,GB +3577570168,3577570367,DE +3577570368,3577570559,GB +3577570560,3577570703,DE +3577570704,3577570707,GB +3577570708,3577570783,DE +3577570784,3577570791,GB +3577570792,3577570847,DE +3577570848,3577570855,GB +3577570856,3577570911,DE +3577570912,3577571007,GB +3577571008,3577571327,DE +3577571328,3577571343,GB +3577571344,3577571359,DE +3577571360,3577571391,GB +3577571392,3577571399,DE +3577571400,3577571407,GB +3577571408,3577571695,DE +3577571696,3577571703,GB +3577571704,3577571791,DE +3577571792,3577571839,GB +3577571840,3577572095,DE +3577572096,3577572415,GB +3577572416,3577572463,DE +3577572464,3577572471,GB +3577572472,3577572487,DE +3577572488,3577572495,GB +3577572496,3577572607,DE +3577572608,3577572863,GB +3577572864,3577572927,DE +3577572928,3577572935,GB +3577572936,3577572943,DE +3577572944,3577572959,GB +3577572960,3577573039,DE +3577573040,3577573047,GB +3577573048,3577573051,DE +3577573052,3577573055,GB +3577573056,3577573071,DE +3577573072,3577573079,GB +3577573080,3577573119,DE +3577573120,3577573151,GB +3577573152,3577573175,DE +3577573176,3577573183,GB +3577573184,3577573191,DE +3577573192,3577573207,GB +3577573208,3577573287,DE +3577573288,3577573295,GB +3577573296,3577573439,DE +3577573440,3577574399,GB +3577574400,3577574407,DE +3577574408,3577574415,GB +3577574416,3577574479,DE +3577574480,3577575183,GB +3577575184,3577575191,DE +3577575192,3577575431,GB +3577575432,3577575583,DE +3577575584,3577575599,GB +3577575600,3577575655,DE +3577575656,3577575663,GB +3577575664,3577576799,DE +3577576800,3577576815,GB +3577576816,3577576847,DE +3577576848,3577576863,GB +3577576864,3577576911,DE +3577576912,3577576927,GB +3577576928,3577577231,DE +3577577232,3577577247,US +3577577248,3577577391,DE +3577577392,3577577407,GB +3577577408,3577577543,DE +3577577544,3577577551,GB +3577577552,3577577647,DE +3577577648,3577577655,GB +3577577656,3577577695,DE +3577577696,3577577703,GB +3577577704,3577577743,DE +3577577744,3577577759,GB +3577577760,3577577783,DE +3577577784,3577577791,GB +3577577792,3577577823,DE +3577577824,3577577855,GB +3577577856,3577577887,DE +3577577888,3577577903,GB +3577577904,3577577923,DE +3577577924,3577577935,GB +3577577936,3577578095,DE +3577578096,3577578103,GB +3577578104,3577579191,DE +3577579192,3577579199,GB +3577579200,3577579231,DE +3577579232,3577579239,GB +3577579240,3577579839,DE +3577579840,3577579871,GB +3577579872,3577579879,DE +3577579880,3577579903,GB +3577579904,3577580087,DE +3577580088,3577580095,GB +3577580096,3577580111,DE +3577580112,3577580119,GB +3577580120,3577580127,DE +3577580128,3577580135,GB +3577580136,3577580175,DE +3577580176,3577580191,GB +3577580192,3577580335,DE +3577580336,3577580351,GB +3577580352,3577580375,DE +3577580376,3577580383,GB +3577580384,3577580407,DE +3577580408,3577580415,GB +3577580416,3577580463,DE +3577580464,3577580471,GB +3577580472,3577580483,DE +3577580484,3577580487,GB +3577580488,3577580511,DE +3577580512,3577580543,GB +3577580544,3577580799,DE +3577580800,3577580807,GB +3577580808,3577580891,DE +3577580892,3577580911,GB +3577580912,3577580927,DE +3577580928,3577580959,GB +3577580960,3577581007,DE +3577581008,3577581055,GB +3577581056,3577581903,DE +3577581904,3577581911,GB +3577581912,3577581919,DE +3577581920,3577581927,GB +3577581928,3577582015,DE +3577582016,3577582023,GB +3577582024,3577582047,DE +3577582048,3577582055,GB +3577582056,3577582111,DE +3577582112,3577582335,GB +3577582336,3577582343,DE +3577582344,3577582351,GB +3577582352,3577582463,DE +3577582464,3577582471,GB +3577582472,3577582511,DE +3577582512,3577582519,GB +3577582520,3577582575,DE +3577582576,3577582591,GB +3577582592,3577582847,DE +3577582848,3577583103,GB +3577583104,3577583247,DE +3577583248,3577583255,GB +3577583256,3577583263,DE +3577583264,3577583295,GB +3577583296,3577583359,DE +3577583360,3577583615,GB +3577583616,3577584143,DE +3577584144,3577584147,GB +3577584148,3577584159,DE +3577584160,3577584167,GB +3577584168,3577584171,DE +3577584172,3577584191,GB +3577584192,3577584279,DE +3577584280,3577584291,GB +3577584292,3577584295,DE +3577584296,3577584303,GB +3577584304,3577584335,DE +3577584336,3577584343,GB +3577584344,3577584351,DE +3577584352,3577584359,GB +3577584360,3577584383,DE +3577584384,3577584407,GB +3577584408,3577584463,DE +3577584464,3577584471,GB +3577584472,3577584591,DE +3577584592,3577584599,GB +3577584600,3577584607,DE +3577584608,3577584615,GB +3577584616,3577584639,DE +3577584640,3577584895,GB +3577584896,3577584903,DE +3577584904,3577584911,GB +3577584912,3577584927,DE +3577584928,3577584959,GB +3577584960,3577584991,DE +3577584992,3577585023,GB +3577585024,3577585415,DE +3577585416,3577585423,GB +3577585424,3577585439,DE +3577585440,3577585447,GB +3577585448,3577585455,DE +3577585456,3577585487,GB +3577585488,3577585567,DE +3577585568,3577585615,GB +3577585616,3577585631,DE +3577585632,3577585639,GB +3577585640,3577585647,DE +3577585648,3577586067,GB +3577586068,3577586071,DE +3577586072,3577586075,GB +3577586076,3577586079,DE +3577586080,3577586083,GB +3577586084,3577586087,DE +3577586088,3577586171,GB +3577586172,3577586175,DE +3577586176,3577586215,GB +3577586216,3577586319,DE +3577586320,3577586327,GB +3577586328,3577586375,DE +3577586376,3577586383,GB +3577586384,3577586415,DE +3577586416,3577586447,GB +3577586448,3577586463,DE +3577586464,3577586567,GB +3577586568,3577586575,DE +3577586576,3577586583,GB +3577586584,3577586647,DE +3577586648,3577586687,GB +3577586688,3577586711,DE +3577586712,3577586719,GB +3577586720,3577586751,DE +3577586752,3577586783,GB +3577586784,3577587079,DE +3577587080,3577587087,GB +3577587088,3577587103,DE +3577587104,3577587135,GB +3577587136,3577587183,DE +3577587184,3577587199,GB +3577587200,3577587239,DE +3577587240,3577587319,GB +3577587320,3577587327,DE +3577587328,3577587471,GB +3577587472,3577587479,DE +3577587480,3577587519,GB +3577587520,3577587615,DE +3577587616,3577587623,GB +3577587624,3577587631,DE +3577587632,3577587711,GB +3577587712,3577587775,DE +3577587776,3577587791,GB +3577587792,3577587847,DE +3577587848,3577587863,GB +3577587864,3577587871,DE +3577587872,3577587879,GB +3577587880,3577587919,DE +3577587920,3577587927,GB +3577587928,3577588095,DE +3577588096,3577588099,GB +3577588100,3577588103,DE +3577588104,3577588151,GB +3577588152,3577588155,DE +3577588156,3577588223,GB +3577588224,3577588511,DE +3577588512,3577588551,GB +3577588552,3577588559,DE +3577588560,3577588735,GB +3577588736,3577588743,DE +3577588744,3577588751,GB +3577588752,3577588783,DE +3577588784,3577588799,GB +3577588800,3577588803,DE +3577588804,3577588815,GB +3577588816,3577588863,DE +3577588864,3577588879,GB +3577588880,3577589007,DE +3577589008,3577589023,GB +3577589024,3577589119,DE +3577589120,3577589135,GB +3577589136,3577589151,DE +3577589152,3577589167,GB +3577589168,3577589311,DE +3577589312,3577589375,GB +3577589376,3577589391,DE +3577589392,3577589407,GB +3577589408,3577589455,DE +3577589456,3577589471,GB +3577589472,3577589503,DE +3577589504,3577589515,GB +3577589516,3577589519,DE +3577589520,3577589551,GB +3577589552,3577589555,DE +3577589556,3577589703,GB +3577589704,3577589735,DE +3577589736,3577589759,GB +3577589760,3577590015,DE +3577590016,3577590023,GB +3577590024,3577590047,DE +3577590048,3577590079,GB +3577590080,3577590175,DE +3577590176,3577590191,GB +3577590192,3577590199,DE +3577590200,3577590207,GB +3577590208,3577590219,DE +3577590220,3577590223,GB +3577590224,3577590239,DE +3577590240,3577590247,GB +3577590248,3577590263,DE +3577590264,3577590271,GB +3577590272,3577590295,DE +3577590296,3577590303,GB +3577590304,3577590311,DE +3577590312,3577590319,GB +3577590320,3577590399,DE +3577590400,3577590407,GB +3577590408,3577590455,DE +3577590456,3577590527,GB +3577590528,3577590911,DE +3577590912,3577590919,GB +3577590920,3577590975,DE +3577590976,3577591055,GB +3577591056,3577591071,DE +3577591072,3577591079,GB +3577591080,3577591111,DE +3577591112,3577591119,GB +3577591120,3577591127,DE +3577591128,3577591135,GB +3577591136,3577591143,DE +3577591144,3577591147,GB +3577591148,3577591175,DE +3577591176,3577591183,GB +3577591184,3577591215,DE +3577591216,3577591231,GB +3577591232,3577591271,DE +3577591272,3577591287,GB +3577591288,3577591807,DE +3577591808,3577591871,GB +3577591872,3577591887,DE +3577591888,3577591951,GB +3577591952,3577591959,DE +3577591960,3577591963,GB +3577591964,3577592007,DE +3577592008,3577592015,GB +3577592016,3577592335,DE +3577592336,3577592343,GB +3577592344,3577592383,DE +3577592384,3577592391,GB +3577592392,3577592407,DE +3577592408,3577592415,GB +3577592416,3577592543,DE +3577592544,3577592551,GB +3577592552,3577592583,DE +3577592584,3577592607,GB +3577592608,3577592623,DE +3577592624,3577592639,GB +3577592640,3577592703,DE +3577592704,3577592735,GB +3577592736,3577592743,DE +3577592744,3577592751,IE +3577592752,3577592783,GB +3577592784,3577593103,DE +3577593104,3577593111,GB +3577593112,3577593127,DE +3577593128,3577593135,GB +3577593136,3577593143,DE +3577593144,3577593147,GB +3577593148,3577593171,DE +3577593172,3577593175,GB +3577593176,3577593187,DE +3577593188,3577593207,GB +3577593208,3577593215,DE +3577593216,3577593223,GB +3577593224,3577593231,DE +3577593232,3577593239,GB +3577593240,3577593391,DE +3577593392,3577593415,GB +3577593416,3577593423,DE +3577593424,3577593439,GB +3577593440,3577593487,DE +3577593488,3577593495,GB +3577593496,3577600687,DE +3577600688,3577600703,GB +3577600704,3577600795,DE +3577600796,3577600831,GB +3577600832,3577600863,DE +3577600864,3577600895,GB +3577600896,3577600918,DE +3577600919,3577600919,GB +3577600920,3577601007,DE +3577601008,3577601023,GB +3577601024,3577601319,DE +3577601320,3577601327,GB +3577601328,3577601375,DE +3577601376,3577601383,GB +3577601384,3577601399,DE +3577601400,3577601407,GB +3577601408,3577601447,DE +3577601448,3577601455,GB +3577601456,3577601791,DE +3577601792,3577602071,GB +3577602072,3577602095,DE +3577602096,3577602111,GB +3577602112,3577602175,DE +3577602176,3577602367,GB +3577602368,3577602503,DE +3577602504,3577602511,GB +3577602512,3577602519,DE +3577602520,3577602527,GB +3577602528,3577602847,DE +3577602848,3577602879,GB +3577602880,3577602919,DE +3577602920,3577602927,GB +3577602928,3577602959,DE +3577602960,3577602967,GB +3577602968,3577603039,DE +3577603040,3577603055,GB +3577603056,3577603063,DE +3577603064,3577603079,GB +3577603080,3577603103,DE +3577603104,3577603111,GB +3577603112,3577603131,DE +3577603132,3577603135,GB +3577603136,3577603151,DE +3577603152,3577603159,GB +3577603160,3577603199,DE +3577603200,3577603247,GB +3577603248,3577603263,DE +3577603264,3577603271,GB +3577603272,3577603319,DE +3577603320,3577603327,GB +3577603328,3577603455,DE +3577603456,3577603471,GB +3577603472,3577603543,DE +3577603544,3577603583,GB +3577603584,3577603655,DE +3577603656,3577603663,GB +3577603664,3577603887,DE +3577603888,3577603903,GB +3577603904,3577604031,DE +3577604032,3577604095,GB +3577604096,3577606175,DE +3577606176,3577606183,GB +3577606184,3577606191,DE +3577606192,3577606199,GB +3577606200,3577606215,DE +3577606216,3577606231,GB +3577606232,3577606279,DE +3577606280,3577606287,GB +3577606288,3577606399,DE +3577606400,3577606455,GB +3577606456,3577606479,DE +3577606480,3577606487,GB +3577606488,3577606655,DE +3577606656,3577606663,GB +3577606664,3577606735,DE +3577606736,3577606783,GB +3577606784,3577606815,DE +3577606816,3577606831,GB +3577606832,3577606847,DE +3577606848,3577606855,GB +3577606856,3577606871,DE +3577606872,3577606879,GB +3577606880,3577606887,DE +3577606888,3577606895,GB +3577606896,3577606911,DE +3577606912,3577607007,GB +3577607008,3577607055,DE +3577607056,3577607071,GB +3577607072,3577607199,DE +3577607200,3577607423,GB +3577607424,3577607559,DE +3577607560,3577607567,GB +3577607568,3577607583,DE +3577607584,3577607615,GB +3577607616,3577607663,DE +3577607664,3577607679,GB +3577607680,3577607711,DE +3577607712,3577607719,GB +3577607720,3577607727,DE +3577607728,3577607735,GB +3577607736,3577607743,DE +3577607744,3577607775,GB +3577607776,3577607807,DE +3577607808,3577607815,GB +3577607816,3577607823,DE +3577607824,3577607839,GB +3577607840,3577607847,DE +3577607848,3577607855,GB +3577607856,3577608191,DE +3577608192,3577608447,GB +3577608448,3577608703,DE +3577608704,3577608743,GB +3577608744,3577608751,ES +3577608752,3577608815,GB +3577608816,3577608823,DE +3577608824,3577608959,GB +3577608960,3577608999,DE +3577609000,3577609007,GB +3577609008,3577609023,DE +3577609024,3577609071,GB +3577609072,3577609087,DE +3577609088,3577609215,GB +3577609216,3577609359,DE +3577609360,3577610239,GB +3577610240,3577610367,DE +3577610368,3577610495,GB +3577610496,3577610751,DE +3577610752,3577611199,CH +3577611264,3577612287,DE +3577612320,3577612383,DE +3577612416,3577612543,NO +3577612544,3577612799,HU +3577612800,3577613055,FI +3577613312,3577613567,DE +3577613888,3577613951,TR +3577614080,3577614111,DE +3577614144,3577614207,DE +3577618432,3577618447,GB +3577618448,3577618463,NL +3577618464,3577618559,GB +3577618560,3577618623,BE +3577618656,3577618663,AT +3577618688,3577619935,GB +3577619968,3577620575,GB +3577620624,3577620671,GB +3577620672,3577620735,TR +3577620992,3577621055,GB +3577621120,3577621151,GB +3577621216,3577621223,SK +3577621248,3577622143,GB +3577622144,3577622271,DE +3577622272,3577622527,GB +3577622592,3577622927,GB +3577623040,3577623935,GB +3577624064,3577624319,GB +3577624448,3577624879,GB +3577624896,3577625199,GB +3577625208,3577625215,GB +3577625232,3577625599,GB +3577625824,3577625839,GB +3577625856,3577626143,GB +3577626240,3577626367,GB +3577626624,3577627135,FR +3577627392,3577627647,GB +3577627648,3577627967,FR +3577628000,3577628671,FR +3577628672,3577630719,CH +3577630720,3577630975,GB +3577631232,3577631743,GB +3577633792,3577633951,CZ +3577633960,3577633967,CZ +3577634048,3577634239,CZ +3577634816,3577635455,FR +3577635520,3577635839,FR +3577635840,3577636863,DE +3577636864,3577638143,GB +3577638144,3577638399,BE +3577638400,3577638911,GB +3577638912,3577638959,FR +3577638968,3577639239,FR +3577639248,3577639679,FR +3577639760,3577639783,FR +3577639792,3577639807,FR +3577639840,3577639847,FR +3577639856,3577639871,FR +3577639936,3577640719,FR +3577640728,3577641151,FR +3577641160,3577641175,FR +3577641184,3577641199,FR +3577641216,3577641279,FR +3577641344,3577641407,FR +3577641416,3577641423,FR +3577641472,3577641983,FR +3577641984,3577642047,GB +3577642056,3577642079,GB +3577642088,3577642111,GB +3577642176,3577642239,GB +3577642240,3577642623,FR +3577642752,3577643007,FR +3577643008,3577643231,NL +3577643232,3577643247,GB +3577643248,3577643263,NL +3577645432,3577645447,NL +3577645456,3577645503,NL +3577645504,3577645567,SK +3577645824,3577645887,NL +3577645904,3577645951,NL +3577646080,3577646207,NL +3577646208,3577646335,NO +3577646336,3577646407,NL +3577646416,3577646527,NL +3577646592,3577646847,NL +3577647104,3577647911,DK +3577647936,3577647967,DK +3577648000,3577648127,DK +3577648384,3577649151,NL +3577651200,3577651455,GB +3577652224,3577652671,IT +3577652736,3577652743,NO +3577652752,3577652767,NO +3577652864,3577652943,NO +3577652992,3577653119,NO +3577653248,3577655295,IT +3577655296,3577655519,AT +3577655552,3577655647,AT +3577655664,3577655679,AT +3577655712,3577655743,AT +3577655808,3577656447,AT +3577657344,3577659391,GB +3577659392,3577659679,GR +3577659712,3577659743,GR +3577660160,3577660607,BE +3577660672,3577661439,BE +3577663488,3577665215,SE +3577665248,3577665311,SE +3577665344,3577665375,SE +3577665408,3577665455,SE +3577665536,3577665591,ES +3577665600,3577665607,ES +3577665616,3577665679,ES +3577665792,3577665823,BE +3577665824,3577665855,RO +3577665856,3577665919,LU +3577666048,3577666175,ES +3577667584,3577667743,PL +3577668640,3577668671,IE +3577668736,3577668799,IE +3577669120,3577669383,HU +3577669504,3577669631,HU +3577669632,3577671679,BE +3577671680,3577672191,ZA +3577672192,3577673727,DE +3577675776,3577741311,PT +3577741312,3578003455,SE +3578003456,3578049023,DE +3578049024,3578049055,CH +3578049056,3578235279,DE +3578235280,3578235295,NL +3578235296,3578265599,DE +3578265600,3578331135,GB +3578331136,3578339327,PL +3578339328,3578347519,ES +3578347520,3578363903,DE +3578363904,3578396671,NL +3578396672,3578462207,TR +3578462208,3578527743,NL +3578527744,3578658815,PL +3578658816,3578724351,GB +3578724352,3578732543,RU +3578732544,3578740735,IE +3578740736,3578757119,RU +3578757120,3578822655,SE +3578822656,3578855423,RU +3578855424,3578888191,GB +3578888192,3578920959,SK +3578920960,3578986495,IT +3578986496,3578988095,DE +3578988096,3578988099,LI +3578988100,3578996999,DE +3578997000,3578997007,CH +3578997008,3578998575,DE +3578998576,3578998583,GB +3578998584,3579002879,DE +3579002880,3579019263,GB +3579019264,3579052031,DK +3579052032,3579117567,NL +3579117568,3579132159,RU +3579132160,3579132415,BY +3579132416,3579183103,RU +3579183104,3579191759,GB +3579191760,3579191775,DE +3579191776,3579193599,GB +3579193600,3579193647,NL +3579193648,3579193663,GB +3579193664,3579193695,NL +3579193696,3579193711,GB +3579193712,3579193727,BE +3579193728,3579193743,GB +3579193744,3579193855,NL +3579193856,3579197055,GB +3579197056,3579197183,US +3579197184,3579197871,GB +3579197872,3579197887,US +3579197888,3579197903,IT +3579197904,3579228159,GB +3579228160,3579228415,US +3579228416,3579228671,GB +3579228672,3579228799,US +3579228800,3579241151,GB +3579241152,3579241215,IE +3579241216,3579242751,GB +3579242752,3579243007,US +3579243008,3579248639,GB +3579248640,3579314175,RU +3579314176,3579346943,IT +3579346944,3579361535,SE +3579361536,3579361791,NO +3579361792,3579362047,SE +3579362048,3579362063,NO +3579362064,3579362303,SE +3579362304,3579362559,NO +3579362560,3579362815,SE +3579362816,3579363327,NO +3579363328,3579445247,SE +3579445248,3579463679,AT +3579463680,3579463683,US +3579463684,3579478015,AT +3579478016,3579480847,FR +3579480848,3579480855,NL +3579480856,3579480863,FR +3579480864,3579480871,NL +3579480872,3579481095,FR +3579481096,3579481103,CH +3579481104,3579481119,FR +3579481120,3579481127,GB +3579481128,3579481143,FR +3579481144,3579481151,CH +3579481152,3579481159,FR +3579481160,3579481167,GB +3579481168,3579481191,FR +3579481192,3579481199,CH +3579481200,3579481247,FR +3579481248,3579481255,GB +3579481256,3579481263,CH +3579481264,3579481279,FR +3579481280,3579481287,GB +3579481288,3579482623,FR +3579482624,3579482783,NL +3579482784,3579482799,FR +3579482800,3579482927,NL +3579482928,3579482943,FR +3579482944,3579482991,NL +3579482992,3579483151,FR +3579483152,3579483263,NL +3579483264,3579483295,FR +3579483296,3579483311,NL +3579483312,3579483359,FR +3579483360,3579483375,NL +3579483376,3579484751,FR +3579484752,3579484767,BE +3579484768,3579485263,FR +3579485264,3579485279,BE +3579485280,3579485695,FR +3579485696,3579485711,GB +3579485712,3579485714,FR +3579485715,3579485727,GB +3579485728,3579485807,FR +3579485808,3579485823,GB +3579485824,3579485887,FR +3579485888,3579485888,GB +3579485889,3579485903,FR +3579485904,3579485919,DE +3579485920,3579485983,FR +3579485984,3579485999,CH +3579486000,3579486015,FR +3579486016,3579486031,GB +3579486032,3579486047,DE +3579486048,3579486095,GB +3579486096,3579486143,FR +3579486144,3579486175,GB +3579486176,3579486191,FR +3579486192,3579486207,GB +3579486208,3579486271,FR +3579486272,3579486287,GB +3579486288,3579486303,FR +3579486304,3579486319,GB +3579486320,3579486335,FR +3579486336,3579486351,GB +3579486352,3579486367,FR +3579486368,3579486383,IT +3579486384,3579486399,DE +3579486400,3579486415,FR +3579486416,3579486431,DE +3579486432,3579486447,GB +3579486448,3579486735,FR +3579486736,3579486751,DE +3579486752,3579486831,FR +3579486832,3579486847,BE +3579486848,3579486863,FR +3579486864,3579486879,GB +3579486880,3579487007,FR +3579487008,3579487039,GB +3579487040,3579487055,DE +3579487056,3579487103,FR +3579487104,3579487119,GB +3579487120,3579487215,FR +3579487216,3579487231,GB +3579487232,3579487247,FR +3579487248,3579487263,GB +3579487264,3579487471,FR +3579487472,3579487487,ES +3579487488,3579487519,FR +3579487520,3579487531,IT +3579487532,3579487535,FR +3579487536,3579487551,GB +3579487552,3579487567,FR +3579487568,3579487583,GB +3579487584,3579487599,FR +3579487600,3579487615,IT +3579487616,3579487663,FR +3579487664,3579487711,DE +3579487712,3579487727,SE +3579487728,3579487743,GB +3579487744,3579487807,FR +3579487808,3579487823,GB +3579487824,3579487855,FR +3579487856,3579487871,GB +3579487872,3579487887,IE +3579487888,3579487903,DE +3579487904,3579487951,FR +3579487952,3579487967,GB +3579487968,3579487983,IT +3579487984,3579487999,GB +3579488000,3579488047,FR +3579488048,3579488079,GB +3579488080,3579490559,FR +3579490560,3579490655,PT +3579490656,3579490671,FR +3579490672,3579490719,PT +3579490720,3579490735,NL +3579490736,3579490751,FR +3579490752,3579490799,PT +3579490800,3579490831,FR +3579490832,3579490943,PT +3579490944,3579490959,FR +3579490960,3579490975,PT +3579490976,3579491007,FR +3579491008,3579491023,PT +3579491024,3579491231,FR +3579491232,3579491247,PT +3579491248,3579491263,NL +3579491264,3579491471,FR +3579491472,3579491487,PT +3579491488,3579497983,FR +3579497984,3579497991,NL +3579497992,3579527167,FR +3579527168,3579543551,BA +3579543552,3579576319,BG +3579576320,3579579263,IT +3579579264,3579579295,US +3579579296,3579582367,IT +3579582368,3579582399,US +3579582400,3579596927,IT +3579596928,3579597055,GR +3579597056,3579600191,IT +3579600192,3579600207,US +3579600208,3579601471,IT +3579601472,3579601487,US +3579601488,3579605487,IT +3579605488,3579605503,DE +3579605504,3579607551,IT +3579607552,3579607807,US +3579607808,3579609087,IT +3579609088,3579641855,PL +3579641856,3579707391,NL +3579707392,3579723775,ES +3579723776,3579740159,AT +3579740160,3579772927,IE +3579772928,3579838463,DE +3579838464,3580100607,ES +3580100608,3580198911,SE +3580198912,3580199423,LV +3580199424,3580199935,SE +3580199936,3580200447,EE +3580200448,3580200959,SE +3580200960,3580201471,LT +3580201472,3580203519,SE +3580203520,3580204543,RU +3580204544,3580205055,SE +3580205056,3580205567,HR +3580205568,3580208127,SE +3580208128,3580208639,EE +3580208640,3580213247,SE +3580213248,3580214271,CH +3580214272,3580214783,LV +3580214784,3580222463,SE +3580222464,3580222719,FR +3580222720,3580223487,SE +3580223488,3580231679,DE +3580231680,3580231935,LV +3580231936,3580232191,LT +3580232192,3580233215,LV +3580233216,3580233727,LT +3580233728,3580235263,SE +3580235264,3580235775,LT +3580235776,3580236799,SE +3580236800,3580237567,LV +3580237568,3580237823,LT +3580237824,3580239359,SE +3580239360,3580239871,LV +3580239872,3580241919,SE +3580241920,3580243967,CH +3580243968,3580248063,NL +3580248064,3580250111,ES +3580250112,3580252671,SE +3580252672,3580254207,EE +3580254208,3580260351,DE +3580260352,3580265727,AT +3580265728,3580266495,SE +3580266496,3580272639,PL +3580272640,3580329983,SE +3580329984,3580338175,CH +3580338176,3580338432,HR +3580338433,3580362751,SE +3580362752,3580473375,GB +3580473376,3580473391,IE +3580473392,3580473503,GB +3580473504,3580473511,IE +3580473512,3580473519,GB +3580473520,3580473527,IE +3580473528,3580473695,GB +3580473696,3580473727,IE +3580473728,3580473759,GB +3580473760,3580473887,IE +3580473888,3580473951,GB +3580473952,3580473959,IE +3580473960,3580473967,GB +3580473968,3580473983,IE +3580473984,3580473999,GB +3580474000,3580474007,IE +3580474008,3580474095,GB +3580474096,3580474111,IE +3580474112,3580474495,GB +3580474496,3580474559,IE +3580474560,3580474639,GB +3580474640,3580474647,IE +3580474648,3580474655,GB +3580474656,3580474671,IE +3580474672,3580474687,GB +3580474688,3580474703,IE +3580474704,3580474719,GB +3580474720,3580474735,IE +3580474736,3580474807,GB +3580474808,3580474879,IE +3580474880,3580475055,GB +3580475056,3580475063,IE +3580475064,3580475123,GB +3580475124,3580475127,IE +3580475128,3580475343,GB +3580475344,3580475351,IE +3580475352,3580624895,GB +3580624896,3580626943,RU +3580626944,3580628991,PL +3580628992,3580631039,RU +3580887040,3581149183,SE +3581150368,3581150463,IE +3581150592,3581150719,NL +3581150720,3581150783,SE +3581150976,3581151039,SE +3581151232,3581151295,SE +3581154048,3581154303,NL +3581157120,3581158655,AT +3581159168,3581159295,AT +3581159424,3581161471,IE +3581173760,3581196799,NL +3581197312,3581197567,IE +3581197824,3581200127,NL +3581203968,3581214719,SE +3581214720,3581231103,NL +3581239296,3581241343,NL +3581255680,3581259263,FR +3581261312,3581261439,FR +3581279104,3581279199,NL +3581280256,3581411327,BE +3581411328,3581673471,GB +3581673472,3581935615,NL +3581935616,3581943807,RU +3581943808,3581951999,FR +3581952000,3581960191,TR +3581960192,3581976575,DE +3581976576,3581984767,NO +3581984768,3581992959,RU +3581992960,3582001151,GB +3582001152,3582009343,DK +3582009344,3582017535,RU +3582017536,3582025727,GB +3582025728,3582033919,RU +3582033920,3582042111,CZ +3582042112,3582050303,ES +3582050304,3582058495,NL +3582058496,3582066687,AT +3582066688,3582074879,UA +3582074880,3582078631,GB +3582078632,3582078639,DE +3582078640,3582083071,GB +3582083072,3582091263,BG +3582091264,3582099455,QA +3582099456,3582107647,GB +3582107648,3582115839,NL +3582115840,3582132223,FI +3582132224,3582140415,RU +3582140416,3582148607,GE +3582156800,3582164991,GB +3582164992,3582173183,SE +3582173184,3582181375,GB +3582181376,3582190847,DE +3582190848,3582190879,CH +3582190880,3582190927,DE +3582190928,3582190931,FR +3582190932,3582191023,DE +3582191024,3582191031,BE +3582191032,3582192127,DE +3582192128,3582192143,NL +3582192144,3582192287,DE +3582192288,3582192303,CH +3582192304,3582192575,DE +3582192576,3582192591,NL +3582192592,3582194775,DE +3582194776,3582194783,CY +3582194784,3582194863,DE +3582194864,3582194879,CH +3582194880,3582195135,DE +3582195136,3582195143,CH +3582195144,3582196183,DE +3582196184,3582196191,BE +3582196192,3582197127,DE +3582197128,3582197135,BZ +3582197136,3582197759,DE +3582197760,3582205951,DK +3582205952,3582214143,AE +3582214144,3582222335,RU +3582222336,3582222511,SE +3582222512,3582222527,DK +3582222528,3582222863,SE +3582222864,3582222879,NO +3582222880,3582223967,SE +3582223968,3582223975,NO +3582223976,3582230527,SE +3582230528,3582238719,BE +3582238720,3582255103,NL +3582255104,3582263295,KW +3582263296,3582271487,ME +3582271488,3582279679,NL +3582279680,3582287871,GB +3582287872,3582296063,DE +3582296064,3582304255,GB +3582304256,3582312447,UA +3582312448,3582320639,GB +3582320640,3582328831,CH +3582328832,3582337023,HU +3582337024,3582341119,ES +3582341120,3582343167,PT +3582343168,3582345215,ES +3582345216,3582353407,IT +3582353408,3582361599,SE +3582361600,3582377983,PL +3582377984,3582386175,RU +3582386176,3582394367,NL +3582394368,3582402559,DE +3582402560,3582410751,PL +3582410752,3582435327,RU +3582435328,3582443519,MK +3582443520,3582451711,DE +3582451712,3582459903,LU +3582459904,3582468095,NL +3582468096,3582476287,SE +3582476288,3582484479,DE +3582492672,3582509055,IT +3582509056,3582517247,SA +3582517248,3582525439,PL +3582525440,3582533631,GB +3582533632,3582538183,BG +3582538184,3582538191,GB +3582538192,3582541823,BG +3582541824,3582550015,US +3582550016,3582550059,CS +3582550060,3582550063,RS +3582550064,3582550071,CS +3582550072,3582550075,RS +3582550076,3582550915,CS +3582550916,3582550919,RS +3582550920,3582551191,CS +3582551192,3582551215,RS +3582551216,3582551551,CS +3582551552,3582553471,RS +3582553472,3582554623,CS +3582554624,3582554879,RS +3582554880,3582555007,CS +3582555008,3582555391,RS +3582555392,3582555647,CS +3582555648,3582557183,RS +3582557184,3582557439,CS +3582557440,3582557951,RS +3582557952,3582558079,CS +3582558080,3582558207,RS +3582558208,3582566399,MC +3582566432,3582566479,BE +3582566480,3582566495,SA +3582566528,3582566591,BE +3582566736,3582566743,BE +3582566752,3582566767,BE +3582566784,3582566847,BE +3582566864,3582566879,BE +3582566912,3582567019,BE +3582567024,3582567039,BE +3582567136,3582567151,BE +3582567232,3582567295,BE +3582567392,3582567399,BE +3582567424,3582567807,US +3582567904,3582567935,US +3582567936,3582568191,GB +3582568208,3582568223,SE +3582568248,3582568263,SE +3582568336,3582568339,SE +3582568344,3582568351,SE +3582568440,3582568447,SE +3582568448,3582568703,US +3582568832,3582568959,US +3582568960,3582568967,HU +3582568992,3582569023,CZ +3582569032,3582569035,AT +3582569036,3582569039,DE +3582569040,3582569043,AT +3582569080,3582569087,HU +3582569096,3582569103,HU +3582569152,3582569167,HU +3582569208,3582569215,AT +3582569280,3582569303,AT +3582569984,3582570239,GB +3582570240,3582570367,DE +3582570400,3582570431,FR +3582570464,3582570479,FR +3582570752,3582570831,FR +3582570848,3582570863,FR +3582570880,3582570895,FR +3582570904,3582570975,FR +3582570984,3582570991,FR +3582571008,3582571039,FR +3582571136,3582571199,FR +3582571304,3582571307,CH +3582571308,3582571311,FR +3582571328,3582571343,FR +3582571376,3582571391,FR +3582571408,3582571423,FR +3582571456,3582571487,FR +3582571648,3582571671,IE +3582571680,3582571707,IE +3582571720,3582571839,IE +3582571856,3582571871,IE +3582571976,3582571991,IE +3582572000,3582572015,IE +3582572024,3582572031,IE +3582572032,3582572431,CH +3582572456,3582572463,CH +3582572480,3582572543,CH +3582572560,3582572567,DE +3582572624,3582572631,DE +3582572800,3582572863,DE +3582572944,3582572951,DE +3582572976,3582572983,DE +3582573024,3582573055,DE +3582573088,3582573095,DE +3582573104,3582573111,DE +3582573120,3582573135,DE +3582573184,3582573215,DE +3582573408,3582573423,DE +3582573432,3582573519,DE +3582573552,3582573567,DE +3582573608,3582573703,CH +3582573728,3582573759,CH +3582573824,3582573855,CH +3582573896,3582573903,CH +3582573912,3582574015,CH +3582574432,3582574435,CH +3582574456,3582574479,CH +3582574592,3582582783,DE +3582582784,3582590975,RU +3582590976,3582599167,FR +3582599168,3582607359,DE +3582607360,3582615551,RU +3582615552,3582619391,CY +3582619392,3582619647,UA +3582619648,3582622591,CY +3582622592,3582622719,LB +3582622720,3582623743,CY +3582623744,3582631935,FI +3582631936,3582640127,NO +3582640128,3582648319,RU +3582648320,3582656511,PT +3582656512,3582664047,ES +3582664048,3582664055,FR +3582664056,3582664703,ES +3582664704,3582672895,JO +3582672896,3582681087,DE +3582681088,3582689279,FR +3582689280,3582697471,DE +3582697472,3582705663,FI +3582705664,3582722047,TR +3582722048,3582730239,IT +3582730240,3582736383,ES +3582736384,3582737407,DZ +3582737408,3582737919,MA +3582737920,3582738431,ES +3582738432,3582746623,DK +3582746624,3582754815,RU +3582754816,3582763007,GR +3582763008,3582771199,FI +3582771200,3582779391,IT +3582779392,3582787583,RU +3582787584,3582795775,PT +3582795776,3582803967,ES +3582803968,3582812159,SE +3582812160,3582820351,FI +3582820352,3582828543,RU +3582828544,3582836735,KZ +3582836736,3582853119,RU +3582853120,3582861311,SE +3582861312,3582869503,RU +3582869504,3582877695,NO +3582877696,3582885887,AT +3582885888,3582894079,GR +3582894080,3582902271,CH +3582902272,3582910463,RU +3582910464,3582918655,SI +3582918656,3582926847,GB +3582926848,3582935039,ES +3582935040,3582943231,SI +3582943232,3582951423,AT +3582951424,3582959615,GB +3582959616,3582967807,FI +3582967808,3582975999,DE +3582976000,3582984191,TR +3582984192,3582992383,DE +3582992384,3583000575,ES +3583000576,3583008767,IT +3583008768,3583016959,TR +3583016960,3583017847,CH +3583017848,3583017855,US +3583017856,3583019367,CH +3583019368,3583019375,DE +3583019376,3583023215,CH +3583023216,3583023223,DE +3583023224,3583025151,CH +3583025152,3583028991,IT +3583028992,3583029247,US +3583029248,3583029375,SG +3583029376,3583029503,FR +3583029504,3583029759,IT +3583029760,3583030015,GR +3583030016,3583030847,IT +3583030848,3583031039,GR +3583031040,3583031295,FR +3583031296,3583031839,GR +3583031840,3583031847,IT +3583031848,3583031887,GR +3583031888,3583032095,IT +3583032096,3583032127,GR +3583032128,3583032159,IT +3583032160,3583032191,FR +3583032192,3583032319,IT +3583032320,3583032831,NL +3583032832,3583033087,GR +3583033088,3583033343,IT +3583033344,3583041535,FR +3583041536,3583049727,NL +3583049728,3583057919,IT +3583057920,3583066111,RU +3583066112,3583074303,DE +3583074304,3583082495,BG +3583082496,3583090687,KG +3583090688,3583098879,NO +3583098880,3583107071,FI +3583107072,3583115263,AT +3583115264,3583123455,CH +3583123456,3583131647,PL +3583131648,3583139839,SE +3583139840,3583141727,DE +3583141728,3583141735,AT +3583141736,3583148031,DE +3583148032,3583157247,GB +3583157248,3583157279,IE +3583157280,3583157439,GB +3583157440,3583157471,IE +3583157472,3583158271,GB +3583158272,3583159039,DE +3583159040,3583159295,GB +3583159296,3583159327,DE +3583159328,3583159359,GB +3583159360,3583159375,DE +3583159376,3583160063,GB +3583160064,3583161343,DE +3583161344,3583161855,GB +3583161856,3583162111,DE +3583162112,3583162367,GB +3583162368,3583162623,DE +3583162624,3583164415,GB +3583164416,3583172607,PT +3583172608,3583188991,DE +3583188992,3583197183,RU +3583205376,3583213567,HR +3583213568,3583221759,RU +3583221760,3583229951,AT +3583229952,3583238143,RU +3583238144,3583246335,GB +3583246336,3583254527,RU +3583254528,3583262719,GB +3583262720,3583270911,TR +3583270912,3583279103,NL +3583279104,3583287295,DE +3583287296,3583295487,RU +3583295488,3583303679,ES +3583303680,3583311871,NL +3583311872,3583320063,RU +3583320064,3583328255,HR +3583328256,3583336447,DE +3583336448,3583337727,ME +3583337728,3583337983,AL +3583337984,3583338015,ME +3583338016,3583338023,CS +3583338024,3583338031,ME +3583338032,3583338047,CS +3583338048,3583338143,ME +3583338144,3583338175,CS +3583338176,3583339519,ME +3583339520,3583339775,AL +3583339776,3583341039,ME +3583341040,3583341055,AL +3583341056,3583342335,ME +3583342336,3583342591,CS +3583342592,3583344639,ME +3583344640,3583352831,BG +3583352832,3583361023,CY +3583361024,3583369215,IT +3583369216,3583377407,ES +3583377408,3583385599,AT +3583385600,3583393791,DK +3583393792,3583401983,RU +3583410176,3583418367,SE +3583434752,3583442943,AT +3583442944,3583451135,UA +3583451136,3583459327,IL +3583459328,3583463891,CZ +3583463892,3583463895,PL +3583463896,3583467519,CZ +3583467520,3583475711,ES +3583475712,3583483903,NO +3583483904,3583492095,FR +3583492096,3583508479,SK +3583508480,3583516671,FR +3583516672,3583524863,GB +3583533056,3583541247,DE +3583541248,3583549439,RU +3583549440,3583558399,IT +3583558400,3583558527,SM +3583558528,3583565823,IT +3583565824,3583574015,GB +3583574016,3583582207,NO +3583582208,3583590399,AT +3583590400,3583598591,DE +3583598592,3583606783,SE +3583606784,3583639551,TR +3583639552,3583647743,GB +3583664128,3583680511,RO +3583680512,3583688703,RU +3583688704,3583696895,UA +3583696896,3583705087,NL +3583705088,3583705095,UA +3583705096,3583705103,NA +3583705104,3583705119,UA +3583705120,3583705127,NA +3583705128,3583705175,UA +3583705176,3583705223,NA +3583705224,3583705239,UA +3583705240,3583705247,NA +3583705248,3583705287,UA +3583705288,3583705295,NA +3583705296,3583705303,UA +3583705304,3583705319,NA +3583705320,3583705335,UA +3583705336,3583705343,NA +3583705344,3583705347,UA +3583705348,3583705351,NA +3583705352,3583705407,UA +3583705408,3583705535,NA +3583705536,3583705603,UA +3583705604,3583705607,NA +3583705608,3583705663,UA +3583705664,3583705791,NA +3583705792,3583705831,UA +3583705832,3583705839,NA +3583705840,3583705847,UA +3583705848,3583705855,NA +3583705856,3583705859,UA +3583705860,3583705863,NA +3583705864,3583705887,UA +3583705888,3583705895,NA +3583705896,3583705903,UA +3583705904,3583705911,NA +3583705912,3583706023,UA +3583706024,3583706031,NA +3583706032,3583706055,UA +3583706056,3583706063,RU +3583706064,3583706071,UA +3583706072,3583706079,NA +3583706080,3583706175,UA +3583706176,3583706183,NA +3583706184,3583706191,UA +3583706192,3583706199,NA +3583706200,3583706263,UA +3583706264,3583706271,NA +3583706272,3583706295,UA +3583706296,3583706311,NA +3583706312,3583706343,UA +3583706344,3583706351,NA +3583706352,3583706375,UA +3583706376,3583706383,NA +3583706384,3583706463,UA +3583706464,3583706471,NA +3583706472,3583706495,UA +3583706496,3583706511,NA +3583706512,3583706519,UA +3583706520,3583706527,NA +3583706528,3583706535,UA +3583706536,3583706543,NA +3583706544,3583706551,UA +3583706552,3583706559,NA +3583706560,3583706575,UA +3583706576,3583706583,NA +3583706584,3583706591,UA +3583706592,3583706607,NA +3583706608,3583706615,UA +3583706616,3583706623,NA +3583706624,3583706624,UA +3583706625,3583706631,NA +3583706632,3583706639,UA +3583706640,3583706655,NA +3583706656,3583706679,UA +3583706680,3583706687,NA +3583706688,3583706695,RU +3583706696,3583706719,NA +3583706720,3583706743,RU +3583706744,3583706831,NA +3583706832,3583706863,UA +3583706864,3583706879,NA +3583706880,3583706887,UA +3583706888,3583706903,NA +3583706904,3583706927,UA +3583706928,3583706935,NA +3583706936,3583706959,UA +3583706960,3583706967,NA +3583706968,3583706983,UA +3583706984,3583706999,NA +3583707000,3583707015,UA +3583707016,3583707023,NA +3583707024,3583707071,UA +3583707072,3583707103,NA +3583707104,3583707119,UA +3583707120,3583707135,NA +3583707136,3583707519,UA +3583707520,3583707527,NA +3583707528,3583707559,UA +3583707560,3583707567,NA +3583707568,3583707639,UA +3583707640,3583707647,NA +3583707648,3583707663,UA +3583707664,3583707671,NA +3583707672,3583707679,RU +3583707680,3583707703,UA +3583707704,3583707711,NA +3583707712,3583707735,UA +3583707736,3583707743,NA +3583707744,3583707775,UA +3583707776,3583707791,NA +3583707792,3583707807,UA +3583707808,3583707815,NA +3583707816,3583707839,UA +3583707840,3583707855,NA +3583707856,3583707919,UA +3583707920,3583707927,NA +3583707928,3583708031,UA +3583708032,3583708095,NA +3583708096,3583708167,UA +3583708168,3583708175,NA +3583708176,3583708231,UA +3583708232,3583708239,NA +3583708240,3583708327,UA +3583708328,3583708335,NA +3583708336,3583708423,UA +3583708424,3583708431,NA +3583708432,3583708479,UA +3583708480,3583708543,NA +3583708544,3583708575,UA +3583708576,3583708583,NA +3583708584,3583708607,UA +3583708608,3583708623,NA +3583708624,3583713071,UA +3583713072,3583713079,NA +3583713080,3583713103,UA +3583713104,3583713111,NA +3583713112,3583713127,UA +3583713128,3583713135,NA +3583713136,3583713159,UA +3583713160,3583713167,NA +3583713168,3583713183,UA +3583713184,3583713191,NA +3583713192,3583713199,BG +3583713200,3583713207,NA +3583713208,3583713271,UA +3583713272,3583713275,NA +3583713276,3583713279,UA +3583713280,3583721471,CZ +3583721472,3583729663,DE +3583729664,3583737855,TR +3583740672,3583740927,GB +3583741440,3583741695,GB +3583741696,3583741951,NL +3583742720,3583743487,DE +3583743976,3583743983,GB +3583744068,3583744071,GB +3583744128,3583744255,GB +3583744288,3583744303,GB +3583744512,3583744767,GB +3583744832,3583744847,GB +3583744960,3583744991,GB +3583745280,3583745535,GB +3583745536,3583745663,SE +3583745808,3583745823,GB +3583746048,3583754239,PL +3583754240,3583762431,IT +3583762432,3583770623,CZ +3583770624,3583772351,NL +3583772352,3583772367,IT +3583772368,3583778815,NL +3583778816,3583787007,IT +3583787008,3583795199,UA +3583795200,3583803391,PL +3583803392,3583806719,RU +3583806720,3583806975,BY +3583806976,3583811583,RU +3583811584,3583811839,GB +3583811840,3583819775,DE +3583819776,3583827967,RU +3583827968,3583836159,CH +3583836160,3583844351,DE +3583844352,3583852543,KZ +3583852544,3583854591,FI +3583854592,3583854863,GB +3583854864,3583854879,FI +3583854880,3583854995,GB +3583854996,3583855007,FI +3583855008,3583855041,GB +3583855042,3583855047,FI +3583855048,3583855103,GB +3583855104,3583855167,US +3583855168,3583855175,FI +3583855176,3583855183,US +3583855184,3583855191,FI +3583855192,3583855199,US +3583855200,3583855207,FI +3583855208,3583855247,US +3583855248,3583855311,FI +3583855312,3583855327,US +3583855328,3583856383,FI +3583856384,3583856447,SG +3583856448,3583856615,FI +3583856616,3583856639,SG +3583856640,3583860735,FI +3583860736,3583868927,HU +3583868928,3583877119,AT +3583877120,3583882239,RO +3583882240,3583882751,HU +3583882752,3583885311,RO +3583885312,3583893503,GE +3583893504,3583901695,SI +3583901696,3583909887,RU +3583909888,3583918079,SE +3583918080,3583926271,IT +3583926272,3583934463,DE +3583934464,3583942655,CH +3583950848,3583959039,PL +3583959040,3583967231,NO +3583967232,3583975423,NL +3583975424,3583983615,LT +3583983616,3583999999,RU +3584000000,3584008191,IE +3584008192,3584016383,DK +3584016384,3584024575,RU +3584024576,3584032767,UA +3584032768,3584040959,DE +3584040960,3584049151,CH +3584049152,3584055911,DE +3584055912,3584055919,TR +3584055920,3584057343,DE +3584057344,3584065535,GB +3584065536,3584073727,UA +3584073728,3584081919,SK +3584081920,3584081951,AT +3584081952,3584081959,NL +3584081960,3584082143,AT +3584082144,3584082175,NL +3584082176,3584082279,AT +3584082280,3584082287,NL +3584082288,3584082943,AT +3584082944,3584089087,NL +3584089088,3584089855,AT +3584089856,3584089871,NL +3584089872,3584089903,AT +3584089904,3584089919,NL +3584089920,3584090111,AT +3584090112,3584090623,NO +3584090624,3584090879,NL +3584090880,3584090887,NO +3584090888,3584090895,NL +3584090896,3584090943,NO +3584090944,3584090959,NL +3584090960,3584093783,NO +3584093784,3584093791,NL +3584093792,3584094893,NO +3584094894,3584094895,NL +3584094896,3584095935,NO +3584095936,3584095999,NL +3584096000,3584096255,NO +3584096256,3584098303,NL +3584098304,3584106495,SI +3584106496,3584114687,FI +3584114688,3584122879,GB +3584122880,3584131071,PL +3584131072,3584139263,TR +3584139264,3584147455,NO +3584147456,3584155647,FR +3584155648,3584163839,NO +3584163840,3584172031,CH +3584172032,3584180223,FR +3584180224,3584188415,AT +3584188416,3584196607,GB +3584196608,3584204799,DE +3584204800,3584212991,NL +3584212992,3584221183,ES +3584221184,3584229375,NO +3584229376,3584245759,HU +3584245760,3584253951,NL +3584253952,3584256383,CS +3584256384,3584256399,CS +3584256400,3584260135,CS +3584260136,3584260139,CS +3584260140,3584260151,CS +3584260152,3584260155,CS +3584260156,3584260231,CS +3584260232,3584260239,CS +3584260240,3584260247,CS +3584260248,3584260255,CS +3584260256,3584262143,CS +3584262144,3584270335,SE +3584270336,3584278527,FR +3584278528,3584286719,GB +3584286720,3584303103,AT +3584303104,3584311295,ES +3584311296,3584319487,DE +3584319488,3584327679,LT +3584327680,3584335871,DE +3584335872,3584344063,ES +3584344064,3584352255,SE +3584352256,3584360447,RO +3584360448,3584368639,GB +3584368640,3584376831,LB +3584376832,3584393215,DE +3584393216,3584401407,GB +3584401408,3584409599,MT +3584409600,3584413439,RU +3584413440,3584413695,DE +3584413696,3584414207,GB +3584414208,3584414719,RU +3584414720,3584414975,DE +3584414976,3584416255,RU +3584416256,3584416767,GB +3584416768,3584417791,RU +3584417792,3584434175,GB +3584434176,3584442367,LU +3584442368,3584450559,GB +3584458752,3584466943,SA +3584475136,3584483327,FR +3584483328,3584491519,DE +3584491520,3584499711,BG +3584499712,3584507903,RU +3584507904,3584508927,GB +3584508928,3584508943,CY +3584508944,3584508951,KY +3584508952,3584509031,GB +3584509032,3584509039,NL +3584509040,3584509231,GB +3584509232,3584509239,AW +3584509240,3584509359,GB +3584509360,3584509367,KY +3584509368,3584510623,GB +3584510624,3584510655,NL +3584510656,3584510999,GB +3584511000,3584511007,KY +3584511008,3584511023,GB +3584511024,3584511039,KY +3584511040,3584511055,GB +3584511056,3584511071,NL +3584511072,3584511807,GB +3584511808,3584511935,MT +3584511936,3584513535,GB +3584513536,3584513599,US +3584513600,3584516047,GB +3584516048,3584516063,KY +3584516064,3584516071,GB +3584516072,3584516079,BB +3584516080,3584516095,GB +3584516096,3584524287,NO +3584524288,3584532479,IS +3584532480,3584540671,DE +3584540672,3584548863,RU +3584548864,3584557055,ES +3584557056,3584565247,EE +3584565248,3584573439,RU +3584573440,3584589823,DE +3584589824,3584598015,RU +3584598016,3584606207,CZ +3584606208,3584614399,DE +3584614400,3584614495,GB +3584614496,3584622335,IE +3584622336,3584622591,GB +3584622592,3584630783,FI +3584630784,3584638975,BG +3584638976,3584647167,UA +3584647168,3584655359,LU +3584655360,3584663551,CY +3584663552,3584671743,FR +3584671744,3584688127,NL +3584688128,3584696319,GB +3584696320,3584701751,ES +3584701752,3584701823,NL +3584701824,3584701991,ES +3584701992,3584702007,CH +3584702008,3584703095,ES +3584703096,3584703103,BE +3584703104,3584704511,ES +3584704512,3584720895,RU +3584720896,3584729087,GB +3584729088,3584737279,DE +3584737280,3584745471,GR +3584745472,3584753663,DK +3584753664,3584770047,RU +3584770048,3584778239,NL +3584778240,3584786431,IT +3584786432,3584794623,NL +3584794624,3584802815,IT +3584802816,3584811007,GB +3584811008,3584819199,ES +3584819200,3584827391,RU +3584827392,3584835583,ES +3584835584,3584843775,AZ +3584843776,3584851967,DE +3584860160,3584868351,PL +3584868352,3584876543,NO +3584876544,3584884735,SI +3584884736,3584892927,DE +3584892928,3584901119,IL +3584901120,3584909311,AT +3584909312,3584917503,IT +3584917504,3584925695,FI +3584925696,3584928275,CH +3584928276,3584928279,IT +3584928280,3584929599,CH +3584929600,3584929727,DE +3584929728,3584931375,CH +3584931376,3584931391,ES +3584931392,3584931687,CH +3584931688,3584931695,ES +3584931696,3584932191,CH +3584932192,3584932199,GB +3584932200,3584933639,CH +3584933640,3584933647,GB +3584933648,3584933887,CH +3584933888,3584942079,PL +3584942080,3584950271,DK +3584950272,3584958463,BG +3584958464,3584966655,DE +3584966656,3584974847,DK +3584974848,3584983039,FR +3584983040,3584983295,US +3584983296,3584984063,NL +3584984064,3584984319,US +3584984320,3584984575,NL +3584984576,3584987391,US +3584987392,3584987647,NL +3584987648,3584988311,US +3584988312,3584988319,NL +3584988320,3584988335,US +3584988336,3584988415,NL +3584988416,3584988607,US +3584988608,3584988671,NL +3584988672,3584989695,US +3584989696,3584991231,NL +3584991232,3584999423,IT +3584999424,3585007615,GB +3585007616,3585015807,AT +3585015808,3585023999,IT +3585024000,3585032191,CZ +3585032192,3585048575,LV +3585048576,3585056767,GB +3585056768,3585064959,LB +3585064960,3585081343,GB +3585081344,3585114111,IR +3585114112,3585122303,IS +3585122304,3585130495,ES +3585130496,3585138687,DE +3585138688,3585146879,RU +3585146880,3585147327,GB +3585147328,3585155071,CH +3585155072,3585163263,GB +3585163264,3585171455,BE +3585171456,3585179647,RU +3585179648,3585189887,BE +3585189888,3585190399,DZ +3585190400,3585190463,IQ +3585190464,3585190527,BE +3585190528,3585190591,DZ +3585190592,3585196031,BE +3585196032,3585204223,ES +3585204224,3585212415,GB +3585212416,3585220607,DE +3585220608,3585228799,RU +3585228800,3585236991,DE +3585236992,3585245183,HU +3585245184,3585253375,GB +3585253376,3585261567,DE +3585261568,3585269759,IT +3585269760,3585277951,SY +3585277952,3585286143,SE +3585286144,3585294335,NO +3585294336,3585302527,DE +3585302528,3585310719,ES +3585310720,3585318911,DE +3585327104,3585335295,DE +3585335296,3585343487,UA +3585343488,3585351679,EE +3585351680,3585359871,CZ +3585359872,3585368063,SE +3585368064,3585376255,LV +3585376256,3585384447,PL +3585384448,3585392639,CH +3585392640,3585400831,RU +3585400832,3585409023,FR +3585409024,3585417215,RU +3585417216,3585425407,BE +3585433600,3585441791,IS +3585441792,3585449983,SK +3585449984,3585458175,SA +3585458176,3585466367,HU +3585474560,3585482751,DE +3585482752,3585490943,FR +3585490944,3585499135,IT +3585499136,3585515519,DE +3585515520,3585523711,RU +3585523712,3585531903,LV +3585531904,3585540095,AT +3585540096,3585548287,DE +3585548288,3585556479,RU +3585556480,3585564671,DE +3585564672,3585572863,RU +3585572864,3585581055,IT +3585581056,3585597439,DE +3585597440,3585605631,RU +3585605632,3585613823,PL +3585613824,3585622015,EE +3585622016,3585630207,RU +3585630208,3585630783,CS +3585630784,3585630975,CS +3585630976,3585630983,CS +3585630984,3585630999,RS +3585631000,3585631007,CS +3585631008,3585631023,CS +3585631024,3585631031,CS +3585631032,3585631103,CS +3585631104,3585631135,CS +3585631136,3585631167,CS +3585631168,3585631183,CS +3585631184,3585631199,CS +3585631200,3585631215,RS +3585631216,3585631223,CS +3585631224,3585631227,CS +3585631228,3585631231,RS +3585631232,3585631255,CS +3585631256,3585631263,RS +3585631264,3585631307,CS +3585631308,3585631311,RS +3585631312,3585631503,CS +3585631504,3585631519,RS +3585631520,3585632495,CS +3585632496,3585632511,RS +3585632512,3585638399,CS +3585638400,3585646591,RU +3585646592,3585654783,SA +3585654784,3585655631,NO +3585655632,3585655639,US +3585655640,3585662975,NO +3585662976,3585671167,BY +3585671168,3585672191,SE +3585672192,3585672447,DK +3585672448,3585672959,SE +3585672960,3585673983,DK +3585673984,3585674239,SE +3585674240,3585675775,DK +3585675776,3585676287,SE +3585676288,3585677055,DK +3585677056,3585677311,SE +3585677312,3585677567,DK +3585677568,3585679359,SE +3585679360,3585687551,FI +3585687552,3585695743,DE +3585695744,3585695999,CM +3585696000,3585696063,BD +3585696064,3585696511,GB +3585696512,3585696767,LB +3585696768,3585696799,NO +3585696800,3585696831,LR +3585696832,3585697279,GB +3585697280,3585697535,NO +3585697536,3585697791,GB +3585697792,3585698047,NG +3585698048,3585698303,GB +3585698304,3585698815,NG +3585698816,3585699583,GB +3585699584,3585699711,US +3585699712,3585699839,AU +3585699840,3585700159,US +3585700160,3585700191,GB +3585700192,3585700222,US +3585700223,3585700231,GB +3585700232,3585700239,US +3585700240,3585700255,ZA +3585700256,3585700271,GB +3585700272,3585700287,NG +3585700288,3585700303,GB +3585700304,3585700319,NG +3585700320,3585700343,AU +3585700344,3585700351,ZA +3585700352,3585700607,NG +3585700608,3585700863,TZ +3585700864,3585701119,IQ +3585701120,3585701375,US +3585701376,3585701439,MW +3585701440,3585701503,GB +3585701504,3585701519,NG +3585701520,3585701535,CA +3585701536,3585701631,NG +3585701632,3585701887,GB +3585701888,3585702143,FR +3585702144,3585702399,LR +3585702400,3585702463,US +3585702464,3585702527,GB +3585702528,3585702655,TZ +3585702656,3585702911,TG +3585702912,3585703167,NG +3585703168,3585703423,FR +3585703424,3585703679,TZ +3585703680,3585703935,GB +3585703936,3585712127,DE +3585712128,3585720319,AT +3585720320,3585728511,GB +3585728512,3585736703,SE +3585736704,3585744895,GB +3585744896,3585753087,FR +3585753088,3585761279,PL +3585761280,3585769471,UA +3585769472,3585777663,TR +3585777664,3585785855,JO +3585785856,3585794047,UA +3585794048,3585802239,FI +3585802240,3585810431,DE +3585810432,3585818623,GB +3585818624,3585826815,DE +3585826816,3585835007,RU +3585835008,3585835583,NL +3585835584,3585835647,IQ +3585835648,3585835791,NL +3585835792,3585835839,GQ +3585835840,3585835847,AO +3585835848,3585835871,NL +3585835872,3585835879,IQ +3585835880,3585835895,NL +3585835896,3585835903,IQ +3585835904,3585835911,NL +3585835912,3585835919,KE +3585835920,3585835927,SO +3585835928,3585835935,SC +3585835936,3585835943,SD +3585835944,3585835951,DJ +3585835952,3585835959,SO +3585835960,3585835967,TD +3585835968,3585835983,ER +3585835984,3585836007,NL +3585836008,3585836023,IQ +3585836024,3585836287,NL +3585836288,3585836543,SA +3585836544,3585837055,DZ +3585837056,3585837311,NG +3585837312,3585837439,IQ +3585837440,3585837567,NG +3585837568,3585838143,AO +3585838144,3585838207,NA +3585838208,3585838247,NL +3585838248,3585838255,AO +3585838256,3585838271,NL +3585838272,3585838279,AO +3585838280,3585838295,NL +3585838296,3585838303,AO +3585838304,3585838591,NL +3585838592,3585838879,NG +3585838880,3585838911,IQ +3585838912,3585838975,NG +3585838976,3585839103,DZ +3585839104,3585840127,NL +3585840128,3585841151,US +3585841152,3585841663,IQ +3585841664,3585841919,DZ +3585841920,3585842175,NG +3585842176,3585842199,IQ +3585842200,3585842207,NG +3585842208,3585842687,IQ +3585842688,3585842943,NG +3585842944,3585843199,SE +3585843200,3585851391,NO +3585851392,3585859583,SE +3585859584,3585860607,RU +3585860608,3585865727,DE +3585865728,3585867775,RU +3585867776,3585875967,NO +3585875968,3585884159,CH +3585884160,3585892351,IQ +3585892352,3585900543,DE +3585900544,3585902239,NO +3585902240,3585902271,GB +3585902272,3585902447,NO +3585902448,3585902463,GB +3585902464,3585908735,NO +3585908736,3585909759,FR +3585909760,3585910271,MQ +3585910272,3585910783,FR +3585910784,3585911039,MQ +3585911040,3585911551,FR +3585911552,3585911807,GP +3585911808,3585912063,FR +3585912064,3585912319,GP +3585912320,3585912575,FR +3585912576,3585912831,GP +3585912832,3585913855,FR +3585913856,3585914111,GP +3585914112,3585916671,FR +3585916672,3585916927,MQ +3585916928,3585925119,IT +3585925120,3585933311,CH +3585933312,3585936127,NL +3585936128,3585937407,US +3585937408,3585940479,NL +3585940480,3585940735,BE +3585940736,3585941503,NL +3585941504,3585949695,IL +3585949696,3585957887,KW +3585957888,3585966079,SE +3585966080,3585974271,CH +3585974272,3585982463,BE +3585982464,3585998847,RU +3585998848,3586007039,ES +3586007040,3586015231,LT +3586015232,3586023423,FR +3586023424,3586031615,IS +3586031616,3586039807,IE +3586039808,3586047999,GB +3586048000,3586056191,PT +3586056192,3586072575,RU +3586072576,3586088959,DE +3586088960,3586097151,CZ +3586097152,3586105343,HR +3586105600,3586105727,ER +3586113536,3586121727,BG +3586121728,3586129919,IE +3586129920,3586146303,CZ +3586146304,3586162687,PL +3586162688,3586179071,FI +3586179072,3586191871,ES +3586191872,3586191887,FR +3586191888,3586195455,ES +3586195456,3586197503,DE +3586197504,3586198015,FR +3586198016,3586199039,DE +3586199040,3586199295,FR +3586199296,3586203391,DE +3586203392,3586203647,SE +3586211840,3586220287,CH +3586220288,3586220303,FR +3586220304,3586225295,CH +3586225296,3586225311,FR +3586225312,3586228223,CH +3586228224,3586237695,BE +3586237696,3586237951,NL +3586237952,3586244607,BE +3586244608,3586244863,NL +3586244864,3586246655,GB +3586246656,3586248703,BE +3586248704,3586250449,NL +3586250450,3586250457,BE +3586250458,3586252799,NL +3586252800,3586254847,BE +3586254848,3586258943,NL +3586258944,3586259455,BE +3586259456,3586269343,NL +3586269344,3586269415,ES +3586269416,3586269423,NL +3586269424,3586269439,ES +3586269440,3586269471,NL +3586269472,3586269487,ES +3586269488,3586269503,NL +3586269504,3586269519,ES +3586269520,3586269535,NL +3586269536,3586269607,GB +3586269608,3586269695,ES +3586269696,3586269759,NL +3586269760,3586269823,ES +3586269824,3586269855,NL +3586269856,3586269887,ES +3586269888,3586269951,NL +3586269952,3586270079,ES +3586270080,3586270207,NL +3586270208,3586271231,ES +3586271232,3586271487,NL +3586271488,3586271999,ES +3586272000,3586272255,IT +3586272256,3586272383,NL +3586272384,3586272767,ES +3586272768,3586272799,NL +3586272800,3586272807,IT +3586272808,3586272815,ES +3586272816,3586272831,IT +3586272832,3586272895,NL +3586272896,3586272959,IT +3586272960,3586272991,ES +3586272992,3586273023,IT +3586273024,3586276351,NL +3586276352,3586276863,ES +3586276864,3586277375,NL +3586277376,3586293759,TR +3586293760,3586310143,ES +3586310144,3586326527,CZ +3586326528,3586342911,IR +3586342912,3586359295,ES +3586359296,3586375679,PL +3586375680,3586392063,CZ +3586392064,3586408447,NL +3586408448,3586424831,BA +3586424832,3586441215,CH +3586441216,3586457599,DE +3586457600,3586473983,NL +3586473984,3586490367,HU +3586490368,3586506751,LT +3586506752,3586523135,NL +3586523136,3586543519,DE +3586543520,3586543527,GB +3586543528,3586543759,DE +3586543760,3586543791,GB +3586543792,3586545679,DE +3586545680,3586545703,GB +3586545704,3586546375,DE +3586546376,3586546383,GB +3586546384,3586555903,DE +3586555904,3586572287,IT +3586572288,3586588671,CS +3586588672,3586596863,IT +3586596864,3586605055,GB +3586605056,3586621439,SE +3586621440,3586625535,IE +3586625536,3586629631,GB +3586629632,3586637823,IE +3586637824,3586654207,PL +3586654208,3586662399,GE +3586662400,3586670591,UA +3586670592,3586677759,DE +3586677760,3586678015,GR +3586678016,3586678335,DE +3586678336,3586678399,US +3586678400,3586678415,GB +3586678416,3586678439,IE +3586678440,3586678447,DE +3586678448,3586678527,IE +3586678528,3586678671,DE +3586678672,3586678679,GB +3586678680,3586678687,MU +3586678688,3586678783,GB +3586678784,3586679039,DE +3586679040,3586679103,US +3586679104,3586679167,DE +3586679168,3586679231,US +3586679232,3586679327,DE +3586679328,3586679343,DK +3586679344,3586679583,DE +3586679584,3586679599,IT +3586679600,3586679647,DE +3586679648,3586679711,IT +3586679712,3586679727,DE +3586679728,3586679743,IT +3586679744,3586679839,DE +3586679840,3586679871,FR +3586679872,3586680063,DE +3586680064,3586680319,IT +3586680320,3586680447,ES +3586680448,3586680463,DE +3586680464,3586680575,ES +3586680576,3586680607,DE +3586680608,3586680623,ES +3586680624,3586680703,DE +3586680704,3586680831,ES +3586680832,3586680959,FR +3586680960,3586681015,DE +3586681016,3586681087,FR +3586681088,3586681343,IT +3586681344,3586681599,DE +3586681600,3586681615,FR +3586681616,3586681695,DE +3586681696,3586682111,FR +3586682112,3586682175,US +3586682176,3586682367,DE +3586682368,3586682399,AT +3586682400,3586682431,DE +3586682432,3586682879,FR +3586682880,3586686975,US +3586686976,3586703359,SE +3586703360,3586719743,CH +3586719744,3586752511,ES +3586752512,3586785279,NL +3586785280,3586793471,RU +3586793472,3586801663,CH +3586801664,3586818047,HR +3586818048,3586834431,IE +3586834432,3586850495,DE +3586850496,3586850511,US +3586850512,3586850815,DE +3586850816,3586867199,NO +3586867200,3586883583,FR +3586883584,3586899967,IT +3586899968,3586902271,DE +3586902272,3586902335,CH +3586902336,3586902411,DE +3586902412,3586902415,CH +3586902416,3586903263,DE +3586903264,3586903295,CH +3586903296,3586904223,DE +3586904224,3586904255,CH +3586904256,3586904319,DE +3586904320,3586904415,CH +3586904416,3586905039,DE +3586905040,3586905055,CH +3586905056,3586905071,DE +3586905072,3586905079,CH +3586905080,3586905087,DE +3586905088,3586905119,CH +3586905120,3586905167,DE +3586905168,3586905199,CH +3586905200,3586905215,GB +3586905216,3586905247,DE +3586905248,3586905279,CH +3586905280,3586906391,DE +3586906392,3586906399,CH +3586906400,3586906423,DE +3586906424,3586906427,CH +3586906428,3586906719,DE +3586906720,3586906735,CH +3586906736,3586907903,DE +3586907904,3586908031,CH +3586908032,3586910559,DE +3586910560,3586910567,NL +3586910568,3586910575,CY +3586910576,3586910587,NL +3586910588,3586910591,DE +3586910592,3586910671,NL +3586910672,3586910687,DE +3586910688,3586910703,NL +3586910704,3586910711,DE +3586910712,3586910719,NL +3586910720,3586910991,DE +3586910992,3586911007,BE +3586911008,3586911039,DE +3586911040,3586911103,GB +3586911104,3586911167,NL +3586911168,3586911191,DE +3586911192,3586911195,BE +3586911196,3586912255,DE +3586912256,3586912575,FR +3586912576,3586912647,DE +3586912648,3586912671,FR +3586912672,3586912675,US +3586912676,3586912703,DE +3586912704,3586912719,FR +3586912720,3586912735,US +3586912736,3586912767,FR +3586912768,3586916351,DE +3586916352,3586924031,IT +3586924032,3586924047,US +3586924048,3586924543,IT +3586924544,3586924743,FI +3586924744,3586924751,AX +3586924752,3586924919,FI +3586924920,3586924927,AX +3586924928,3586924943,FI +3586924944,3586924959,AX +3586924960,3586924983,FI +3586924984,3586925055,AX +3586925056,3586925103,FI +3586925104,3586925135,AX +3586925136,3586925471,FI +3586925472,3586925503,AX +3586925504,3586925535,FI +3586925536,3586925567,AX +3586925568,3586925695,FI +3586925696,3586925759,AX +3586925760,3586925791,FI +3586925792,3586925823,AX +3586925824,3586925831,FI +3586925832,3586925839,AX +3586925840,3586925887,FI +3586925888,3586925919,AX +3586925920,3586925983,FI +3586925984,3586926003,AX +3586926004,3586926015,FI +3586926016,3586926047,AX +3586926048,3586926079,FI +3586926080,3586926591,AX +3586926592,3586926847,SE +3586926848,3586927103,FI +3586927104,3586927999,AX +3586928000,3586928159,FI +3586928160,3586928175,AX +3586928176,3586928303,FI +3586928304,3586928319,AX +3586928320,3586928639,FI +3586928640,3586932735,AX +3586932736,3586949119,LB +3586949120,3586965503,SE +3586965504,3586981887,NL +3586981888,3586998271,IT +3586998272,3587006463,PT +3587006464,3587014655,FR +3587014656,3587051007,GB +3587051008,3587051775,DE +3587051776,3587052031,GB +3587052032,3587052799,NL +3587052800,3587053055,GB +3587053056,3587053823,FR +3587053824,3587055615,GB +3587055616,3587063807,UZ +3587063808,3587071583,NL +3587071584,3587071599,BE +3587071600,3587071615,NL +3587071616,3587071631,DE +3587071632,3587072095,NL +3587072096,3587072127,DE +3587072128,3587074415,NL +3587074416,3587074431,BE +3587074432,3587080191,NL +3587080192,3587082367,GB +3587082368,3587082431,US +3587082432,3587088383,GB +3587088384,3587096575,DE +3587096576,3587121151,NL +3587121152,3587129343,AL +3587129344,3587134463,NL +3587134464,3587134591,ES +3587134592,3587145727,NL +3587145728,3587162111,CY +3587162112,3587178495,IR +3587178496,3587178795,AT +3587178796,3587178799,US +3587178800,3587179279,AT +3587179280,3587179287,AU +3587179288,3587179439,AT +3587179440,3587179455,GB +3587179456,3587179463,TR +3587179464,3587179471,CH +3587179472,3587186687,AT +3587186688,3587186943,DE +3587186944,3587187199,AM +3587187200,3587187455,DE +3587187456,3587188223,RU +3587188224,3587189503,DE +3587189504,3587189759,RU +3587189760,3587193343,DE +3587193344,3587193599,KG +3587193600,3587194367,DE +3587194368,3587194511,RU +3587194512,3587194623,DE +3587194624,3587194879,RU +3587194880,3587211263,GB +3587211264,3587211531,AT +3587211532,3587211535,DE +3587211536,3587213911,AT +3587213912,3587213919,UY +3587213920,3587213959,AT +3587213960,3587213967,RO +3587213968,3587219455,AT +3587219456,3587227647,RU +3587227648,3587227663,GB +3587227664,3587227711,NL +3587227712,3587227759,GB +3587227760,3587227791,NL +3587227792,3587227807,GB +3587227808,3587227823,NL +3587227824,3587227871,GB +3587227872,3587227887,NL +3587227888,3587227919,GB +3587227920,3587227935,NL +3587227936,3587227983,GB +3587227984,3587228015,NL +3587228016,3587228047,GB +3587228048,3587228095,NL +3587228096,3587228127,GB +3587228128,3587228207,NL +3587228208,3587228223,GB +3587228224,3587228271,NL +3587228272,3587228287,GB +3587228288,3587228319,NL +3587228320,3587228335,GB +3587228336,3587228351,NL +3587228352,3587228447,GB +3587228448,3587228463,NL +3587228464,3587228667,GB +3587228668,3587229183,NL +3587229184,3587229455,GB +3587229456,3587229487,NL +3587229488,3587229535,GB +3587229536,3587229615,NL +3587229616,3587229647,GB +3587229648,3587229663,NL +3587229664,3587229743,GB +3587229744,3587229759,NL +3587229760,3587229791,GB +3587229792,3587229807,NL +3587229808,3587229855,GB +3587229856,3587229903,NL +3587229904,3587229951,GB +3587229952,3587229967,NL +3587229968,3587230047,GB +3587230048,3587230079,NL +3587230080,3587230095,GB +3587230096,3587230111,NL +3587230112,3587230127,GB +3587230128,3587230143,NL +3587230144,3587230239,GB +3587230240,3587230271,NL +3587230272,3587230319,GB +3587230320,3587230351,NL +3587230352,3587230383,GB +3587230384,3587230399,NL +3587230400,3587230447,GB +3587230448,3587230463,NL +3587230464,3587230511,GB +3587230512,3587230519,NL +3587230520,3587230527,GB +3587230528,3587230543,NL +3587230544,3587230607,GB +3587230608,3587230623,NL +3587230624,3587230791,GB +3587230792,3587230815,NL +3587230816,3587230847,GB +3587230848,3587230911,NL +3587230912,3587230943,GB +3587230944,3587230959,NL +3587230960,3587230975,GB +3587230976,3587230991,NL +3587230992,3587231231,GB +3587231232,3587231263,NL +3587231264,3587231359,GB +3587231360,3587231743,NL +3587231744,3587231887,GB +3587231888,3587231903,NL +3587231904,3587232767,GB +3587232768,3587232831,NL +3587232832,3587232847,GB +3587232848,3587232895,NL +3587232896,3587232911,GB +3587232912,3587232927,NL +3587232928,3587232967,GB +3587232968,3587232975,NL +3587232976,3587232991,GB +3587232992,3587233007,NL +3587233008,3587233023,GB +3587233024,3587233087,NL +3587233088,3587233103,GB +3587233104,3587233119,NL +3587233120,3587233135,GB +3587233136,3587233143,BE +3587233144,3587233151,GB +3587233152,3587233183,NL +3587233184,3587233199,GB +3587233200,3587233215,NL +3587233216,3587233231,GB +3587233232,3587233295,NL +3587233296,3587233311,GB +3587233312,3587233343,NL +3587233344,3587233359,GB +3587233360,3587233407,NL +3587233408,3587233471,GB +3587233472,3587233519,NL +3587233520,3587233535,GB +3587233536,3587233543,NL +3587233544,3587233599,GB +3587233600,3587233663,NL +3587233664,3587233791,GB +3587233792,3587233807,NL +3587233808,3587233839,GB +3587233840,3587233855,NL +3587233856,3587233903,GB +3587233904,3587233935,NL +3587233936,3587233951,GB +3587233952,3587233967,NL +3587233968,3587233983,GB +3587233984,3587233999,NL +3587234000,3587234015,GB +3587234016,3587234047,NL +3587234048,3587234063,GB +3587234064,3587234079,NL +3587234080,3587234095,GB +3587234096,3587234175,NL +3587234176,3587234303,GB +3587234304,3587236094,NL +3587236095,3587236095,GB +3587236096,3587236471,NL +3587236472,3587236479,GB +3587236480,3587236503,NL +3587236504,3587236527,GB +3587236528,3587236535,NL +3587236536,3587236543,GB +3587236544,3587236607,NL +3587236608,3587236863,GB +3587236864,3587237375,NL +3587237376,3587237407,GB +3587237408,3587237439,NL +3587237440,3587237447,GB +3587237448,3587237471,NL +3587237472,3587237479,GB +3587237480,3587237487,NL +3587237488,3587237503,GB +3587237504,3587237551,NL +3587237552,3587237567,GB +3587237568,3587237887,NL +3587237888,3587238143,GB +3587238144,3587238399,NL +3587238400,3587238463,GB +3587238464,3587238479,NL +3587238480,3587238487,GB +3587238488,3587238559,NL +3587238560,3587239167,GB +3587239168,3587239199,NL +3587239200,3587239215,GB +3587239216,3587239231,NL +3587239232,3587239239,GB +3587239240,3587239247,NL +3587239248,3587239263,GB +3587239264,3587239295,NL +3587239296,3587239311,GB +3587239312,3587239439,NL +3587239440,3587239447,GB +3587239448,3587239487,NL +3587239488,3587239503,GB +3587239504,3587239511,NL +3587239512,3587239519,GB +3587239520,3587239535,NL +3587239536,3587239935,GB +3587239936,3587239959,NL +3587239960,3587239967,GB +3587239968,3587239991,NL +3587239992,3587239999,GB +3587240000,3587240055,NL +3587240056,3587240071,GB +3587240072,3587240111,NL +3587240112,3587240119,GB +3587240120,3587240271,NL +3587240272,3587240287,GB +3587240288,3587240295,NL +3587240296,3587240319,GB +3587240320,3587240375,NL +3587240376,3587240383,GB +3587240384,3587240575,NL +3587240576,3587240583,GB +3587240584,3587240639,NL +3587240640,3587241031,GB +3587241032,3587241119,NL +3587241120,3587241151,GB +3587241152,3587241167,NL +3587241168,3587241183,GB +3587241184,3587241287,NL +3587241288,3587241983,GB +3587241984,3587242047,NL +3587242048,3587242055,GB +3587242056,3587242071,NL +3587242072,3587242079,GB +3587242080,3587242111,NL +3587242112,3587242271,GB +3587242272,3587242287,NL +3587242288,3587242463,GB +3587242464,3587242471,NL +3587242472,3587242495,GB +3587242496,3587242623,NL +3587242624,3587242631,GB +3587242632,3587242639,NL +3587242640,3587242655,GB +3587242656,3587243279,NL +3587243280,3587243295,GB +3587243296,3587243431,NL +3587243432,3587243439,GB +3587243440,3587243471,NL +3587243472,3587243519,GB +3587243520,3587243647,NL +3587243648,3587244015,GB +3587244016,3587244023,NL +3587244024,3587244031,GB +3587244032,3587260415,IT +3587260416,3587284991,DE +3587284992,3587287043,IT +3587287044,3587287047,LY +3587287048,3587287055,IT +3587287056,3587287059,LY +3587287060,3587287295,IT +3587287296,3587287307,GE +3587287308,3587287311,DE +3587287312,3587287319,GE +3587287320,3587287327,FR +3587287328,3587287335,GB +3587287336,3587287339,DE +3587287340,3587287343,PL +3587287344,3587287351,GE +3587287352,3587287359,IS +3587287360,3587287363,NL +3587287364,3587287367,IT +3587287368,3587287387,NL +3587287388,3587287391,CZ +3587287392,3587287395,DE +3587287396,3587287403,IS +3587287404,3587287411,PL +3587287412,3587287415,DE +3587287416,3587287419,IQ +3587287420,3587287423,DE +3587287424,3587287427,SE +3587287428,3587287431,DE +3587287432,3587287435,IT +3587287436,3587287439,DE +3587287440,3587287447,TR +3587287448,3587287451,DE +3587287452,3587287455,IT +3587287456,3587287459,DE +3587287460,3587287463,IT +3587287464,3587287475,SE +3587287476,3587287479,PL +3587287480,3587287535,IT +3587287536,3587287543,DE +3587287544,3587287551,PL +3587287552,3587287559,GB +3587287560,3587287563,FR +3587287564,3587287571,PL +3587287572,3587287575,DE +3587287576,3587287579,FR +3587287580,3587287583,DE +3587287584,3587287591,FR +3587287592,3587287599,GB +3587287600,3587287679,IT +3587287680,3587287687,NL +3587287688,3587287711,IS +3587287712,3587287719,GE +3587287720,3587287723,IT +3587287724,3587287727,SE +3587287728,3587287807,IT +3587287808,3587287815,IS +3587287816,3587287823,GB +3587287824,3587287835,FR +3587287836,3587287847,GB +3587287848,3587287851,SE +3587287852,3587287879,IQ +3587287880,3587287887,FR +3587287888,3587287935,IT +3587287936,3587287943,FR +3587287944,3587287947,DE +3587287948,3587287959,IT +3587287960,3587287963,FR +3587287964,3587287967,GB +3587287968,3587287983,DE +3587287984,3587288575,IT +3587288576,3587288703,AE +3587288704,3587288707,DE +3587288708,3587288759,NL +3587288760,3587288959,IT +3587288960,3587289087,DE +3587289088,3587289343,FR +3587289344,3587289347,ES +3587289348,3587289351,FR +3587289352,3587289359,PT +3587289360,3587289367,ES +3587289368,3587289375,FR +3587289376,3587289383,IT +3587289384,3587289387,GB +3587289388,3587289391,ES +3587289392,3587289399,GB +3587289400,3587289407,ES +3587289408,3587289411,IT +3587289412,3587289415,FR +3587289416,3587289423,IT +3587289424,3587289467,GB +3587289468,3587289855,IT +3587289856,3587289859,FR +3587289860,3587289863,IT +3587289864,3587289871,GB +3587289872,3587289895,IT +3587289896,3587289907,GB +3587289908,3587289911,ES +3587289912,3587289915,IT +3587289916,3587289919,FR +3587289920,3587290367,IT +3587290368,3587290622,GB +3587290623,3587290623,IT +3587290624,3587291135,FR +3587291136,3587291139,NL +3587291140,3587291967,IT +3587291968,3587292031,AL +3587292032,3587292159,IT +3587292160,3587292223,DZ +3587292224,3587292415,IT +3587292416,3587292419,ES +3587292420,3587292799,IT +3587292800,3587292863,AT +3587292864,3587309567,IT +3587309568,3587325951,GB +3587325952,3587342335,RU +3587342336,3587358719,CZ +3587358720,3587375103,SA +3587375104,3587383295,TR +3587383296,3587391487,CZ +3587391488,3587407871,KZ +3587407872,3587424255,NL +3587424256,3587440639,DE +3587440640,3587457023,SE +3587457024,3587459263,GB +3587459264,3587459295,DE +3587459296,3587473407,GB +3587473408,3587489791,IT +3587506176,3587538943,IT +3587538944,3587547135,IS +3587547136,3587555327,CH +3587555328,3587571711,BE +3587571712,3587579903,DE +3587579904,3587588095,BE +3587588096,3587596287,BG +3587596288,3587604479,NL +3587604480,3587620863,FI +3587620864,3587637247,SE +3587637248,3587653631,FR +3587653632,3587670015,SK +3587670016,3587686031,IT +3587686032,3587686039,FR +3587686040,3587687591,IT +3587687592,3587687599,NL +3587687600,3587702783,IT +3587702784,3587710975,DE +3587710976,3587719167,CZ +3587719168,3587735551,PL +3587735552,3587751935,GB +3587751936,3587768319,FI +3587768320,3587776511,DE +3587776512,3587784703,IR +3587784704,3587801087,DE +3587801088,3587817471,IT +3587817472,3587833855,MT +3587833856,3587842047,DE +3587842048,3587850239,IT +3587850240,3587854335,NL +3587854336,3587866623,PL +3587866624,3587874815,FR +3587874816,3587877383,DE +3587877384,3587877391,US +3587877392,3587877407,DE +3587877408,3587877439,NL +3587877440,3587878527,DE +3587878528,3587878559,AT +3587878560,3587883007,DE +3587883008,3587915775,GB +3587915776,3587932159,EE +3587932160,3587932415,NL +3587932416,3587932671,DE +3587932672,3587932927,BE +3587932928,3587933183,GB +3587933184,3587944447,BE +3587944448,3587945471,NL +3587945472,3587948031,BE +3587948032,3587948543,NL +3587948544,3587964927,RU +3587964928,3587981311,ES +3587981312,3587997695,IS +3587997696,3588014079,DE +3588014080,3588030463,CZ +3588030464,3588046847,RU +3588046848,3588060351,DE +3588060352,3588060359,CH +3588060360,3588063231,DE +3588063232,3588071423,CH +3588071424,3588079615,GB +3588079616,3588095999,CH +3588096000,3588104191,NL +3588104192,3588112383,BG +3588112384,3588128767,FR +3588128768,3588145151,HU +3588145152,3588161535,PL +3588161536,3588227071,FR +3588227072,3588292607,BE +3588292608,3588308991,AT +3588308992,3588325375,NO +3588325376,3588333567,GB +3588333568,3588341759,FR +3588341760,3588358143,IT +3588358144,3588374527,BG +3588374528,3588390911,SE +3588390912,3588393983,LT +3588393984,3588394495,LV +3588394496,3588407295,LT +3588407296,3588423679,CZ +3588423680,3588440063,ES +3588440064,3588456447,PL +3588456448,3588464639,NL +3588464640,3588472831,AT +3588472832,3588489215,UA +3588489216,3588505599,FR +3588505600,3588521983,RU +3588521984,3588538367,PT +3588538368,3588538623,ES +3588538624,3588544383,GB +3588544384,3588544391,IE +3588544392,3588547327,GB +3588547328,3588547583,IE +3588547584,3588550447,GB +3588550448,3588550463,IE +3588550464,3588553983,GB +3588553984,3588554239,IE +3588554240,3588554687,GB +3588554688,3588554751,IE +3588554752,3588571135,AT +3588587520,3588603903,ES +3588603904,3588620287,SI +3588620288,3588628479,SA +3588628480,3588636671,CH +3588636672,3588653055,UZ +3588653056,3588661247,IT +3588661248,3588669439,NO +3588669440,3588685823,GB +3588685824,3588702207,UA +3588702208,3588718591,ES +3588718592,3588734975,BG +3588734976,3588751359,PL +3588751360,3588767743,TR +3588767744,3588773759,GB +3588773760,3588773887,SL +3588773888,3588775935,GB +3588775936,3588776191,NG +3588776192,3588784127,GB +3588784128,3588800511,CH +3588800512,3588816895,RU +3588816896,3588833279,IT +3588833280,3588848767,RO +3588848768,3588848775,FR +3588848776,3588849663,RO +3588849664,3588857855,IE +3588857856,3588866047,IR +3588866048,3588882431,NL +3588882432,3588890623,RU +3588890624,3588898815,GB +3588898816,3588915199,NO +3588915200,3588931583,IT +3588931584,3588947967,RU +3588947968,3588964351,GB +3588964352,3588997119,CZ +3588997120,3589013503,AT +3589013504,3589021695,ES +3589021696,3589029887,SA +3589029888,3589030015,NL +3589030016,3589030143,ES +3589030144,3589030175,NL +3589030176,3589030191,ES +3589030192,3589030207,NL +3589030208,3589030239,ES +3589030240,3589031423,NL +3589031424,3589031935,ES +3589031936,3589034015,NL +3589034016,3589034111,ES +3589034112,3589034143,NL +3589034144,3589034159,ES +3589034160,3589034167,GB +3589034168,3589034175,NL +3589034176,3589034183,ES +3589034184,3589034191,GB +3589034192,3589034207,DE +3589034208,3589034223,ES +3589034224,3589034271,NL +3589034272,3589034303,ES +3589034304,3589034335,DE +3589034336,3589034367,FR +3589034368,3589034431,NL +3589034432,3589034495,FR +3589034496,3589037311,ES +3589037312,3589037343,NL +3589037344,3589037375,SE +3589037376,3589037391,NL +3589037392,3589037407,ES +3589037408,3589037423,NL +3589037424,3589037439,ES +3589037440,3589037487,NL +3589037488,3589037495,ES +3589037496,3589037503,CH +3589037504,3589037535,NL +3589037536,3589037551,ES +3589037552,3589037559,BE +3589037560,3589037567,NL +3589037568,3589038079,ES +3589038080,3589040127,NL +3589040128,3589042207,ES +3589042208,3589042367,NL +3589042368,3589043231,ES +3589043232,3589043327,NL +3589043328,3589043455,ES +3589043456,3589043711,NL +3589043712,3589044223,ES +3589044224,3589044319,NL +3589044320,3589046271,ES +3589046272,3589051503,NO +3589051504,3589051511,SE +3589051512,3589079039,NO +3589079040,3589092223,DK +3589092224,3589092227,SE +3589092228,3589128191,DK +3589128192,3589144575,GB +3589144576,3589152767,UA +3589152768,3589152927,DE +3589152928,3589152935,CH +3589152936,3589153027,DE +3589153028,3589153031,ES +3589153032,3589156591,DE +3589156592,3589156607,CH +3589156608,3589160959,DE +3589160960,3589177343,PL +3589177344,3589193727,TR +3589193728,3589210111,SE +3589210112,3589226495,NL +3589226496,3589230415,NO +3589230416,3589230431,DK +3589230432,3589230759,NO +3589230760,3589230775,GB +3589230776,3589242879,NO +3589242880,3589248511,NL +3589248512,3589248767,GB +3589248768,3589256191,NL +3589256192,3589256447,GR +3589256448,3589258495,NL +3589258496,3589258751,GB +3589258752,3589259263,NL +3589259264,3589269455,DE +3589269456,3589269471,AT +3589269472,3589275647,DE +3589275648,3589283327,CS +3589283328,3589283343,RS +3589283344,3589283535,CS +3589283536,3589283543,RS +3589283544,3589284975,CS +3589284976,3589285007,RS +3589285008,3589285047,CS +3589285048,3589285055,RS +3589285056,3589285087,CS +3589285088,3589285279,RS +3589285280,3589288015,CS +3589288016,3589288023,RS +3589288024,3589288127,CS +3589288128,3589288159,RS +3589288160,3589289855,CS +3589289856,3589289871,RS +3589289872,3589289879,CS +3589289880,3589289887,RS +3589289888,3589292031,CS +3589292032,3589308415,AT +3589308416,3589317887,DE +3589317888,3589317951,GB +3589317952,3589324799,DE +3589324800,3589341183,BG +3589341184,3589373951,PL +3589373952,3589375495,DE +3589375496,3589375503,CI +3589375504,3589390335,DE +3589390336,3589423103,RU +3589423104,3589423615,IT +3589423616,3589424127,CH +3589424128,3589424639,SE +3589424640,3589425151,ES +3589425152,3589425663,CH +3589425664,3589426175,GB +3589426176,3589426239,FR +3589426240,3589427199,GB +3589427200,3589427247,FR +3589427248,3589429247,GB +3589429248,3589429503,FR +3589429504,3589430271,GB +3589430272,3589430527,FR +3589430528,3589430655,GB +3589430656,3589430719,FR +3589430720,3589431039,GB +3589431040,3589431343,FR +3589431344,3589432319,GB +3589432320,3589432575,CH +3589432576,3589432895,FR +3589432896,3589433343,GB +3589433344,3589433375,IT +3589433376,3589433407,CH +3589433408,3589433439,SE +3589433440,3589433471,ES +3589433472,3589433503,CH +3589433504,3589433535,IE +3589433536,3589433567,DK +3589433568,3589433599,GB +3589433600,3589434111,IE +3589434112,3589434623,DK +3589434624,3589434751,GB +3589434752,3589434879,ES +3589434880,3589435391,FR +3589435392,3589435519,PL +3589435520,3589435647,GB +3589435648,3589435775,ES +3589435776,3589435903,GB +3589435904,3589436159,ES +3589436160,3589439487,GB +3589439488,3589444631,SE +3589444632,3589444639,NO +3589444640,3589455871,SE +3589455872,3589472255,RU +3589472256,3589488639,TR +3589488640,3589491711,RU +3589491712,3589491743,TJ +3589491744,3589505023,RU +3589505024,3589521407,FI +3589521408,3589537791,IT +3589537792,3589545983,FR +3589545984,3589554175,DE +3589554176,3589570559,PS +3589570560,3589570655,NL +3589570656,3589571327,GB +3589571328,3589571455,NL +3589571456,3589578751,GB +3589578752,3589579263,NL +3589579264,3589579775,GB +3589579776,3589580031,NL +3589580032,3589580127,GB +3589580128,3589580159,NL +3589580160,3589580287,GB +3589580288,3589580799,NL +3589580800,3589580895,GB +3589580896,3589581055,NL +3589581056,3589581199,GB +3589581200,3589581215,NL +3589581216,3589581327,GB +3589581328,3589581439,NL +3589581440,3589581567,GB +3589581568,3589581791,NL +3589581792,3589581823,GB +3589581824,3589582591,NL +3589582592,3589582607,GB +3589582608,3589582639,NL +3589582640,3589582655,GB +3589582656,3589583615,NL +3589583616,3589583647,GB +3589583648,3589583663,NL +3589583664,3589583743,GB +3589583744,3589583871,NL +3589583872,3589584127,GB +3589584128,3589584271,NL +3589584272,3589584639,GB +3589584640,3589585279,NL +3589585280,3589585407,GB +3589585408,3589585983,NL +3589585984,3589586431,GB +3589586432,3589586687,NL +3589586688,3589586943,GB +3589586944,3589597559,CS +3589597560,3589597567,RS +3589597568,3589603327,CS +3589603328,3589668863,FR +3589668864,3589677055,RU +3589677056,3589680287,FR +3589680288,3589680303,MQ +3589680304,3589680751,FR +3589680752,3589680767,MQ +3589680768,3589685247,FR +3589685248,3589718079,GB +3589718080,3589718087,BE +3589718088,3589718095,GB +3589718096,3589718103,BE +3589718104,3589718111,GB +3589718112,3589718159,BE +3589718160,3589718167,GB +3589718168,3589718175,BE +3589718176,3589718191,GB +3589718192,3589718239,BE +3589718240,3589718255,GB +3589718256,3589718303,BE +3589718304,3589718327,GB +3589718328,3589718351,BE +3589718352,3589718359,GB +3589718360,3589718431,BE +3589718432,3589718439,GB +3589718440,3589718447,BE +3589718448,3589718455,GB +3589718456,3589718591,BE +3589718592,3589718631,GB +3589718632,3589718639,BE +3589718640,3589718647,GB +3589718648,3589718655,BE +3589718656,3589718783,GB +3589718784,3589719095,BE +3589719096,3589719103,GB +3589719104,3589719247,BE +3589719248,3589719263,GB +3589719264,3589719271,BE +3589719272,3589719279,GB +3589719280,3589719343,BE +3589719344,3589719359,GB +3589719360,3589719391,BE +3589719392,3589719395,GB +3589719396,3589719463,BE +3589719464,3589719471,GB +3589719472,3589719503,BE +3589719504,3589719519,GB +3589719520,3589719527,BE +3589719528,3589719551,GB +3589719552,3589719655,BE +3589719656,3589719679,GB +3589719680,3589719711,BE +3589719712,3589719735,GB +3589719736,3589719775,BE +3589719776,3589719783,GB +3589719784,3589719855,BE +3589719856,3589719863,GB +3589719864,3589719871,BE +3589719872,3589719903,GB +3589719904,3589719971,BE +3589719972,3589719975,GB +3589719976,3589720071,BE +3589720072,3589720075,GB +3589720076,3589720151,BE +3589720152,3589720159,GB +3589720160,3589720207,BE +3589720208,3589720223,GB +3589720224,3589720263,BE +3589720264,3589720271,GB +3589720272,3589720575,BE +3589720576,3589720607,GB +3589720608,3589720655,BE +3589720656,3589720671,GB +3589720672,3589720695,BE +3589720696,3589720703,GB +3589720704,3589720727,BE +3589720728,3589720767,GB +3589720768,3589720791,BE +3589720792,3589720799,GB +3589720800,3589720823,BE +3589720824,3589720831,GB +3589720832,3589720855,BE +3589720856,3589720863,GB +3589720864,3589720887,BE +3589720888,3589720895,GB +3589720896,3589720911,BE +3589720912,3589720935,GB +3589720936,3589720959,BE +3589720960,3589720975,GB +3589720976,3589721015,BE +3589721016,3589721031,GB +3589721032,3589721055,BE +3589721056,3589721071,GB +3589721072,3589721103,BE +3589721104,3589721111,GB +3589721112,3589721143,BE +3589721144,3589721151,GB +3589721152,3589721155,BE +3589721156,3589721167,GB +3589721168,3589721215,BE +3589721216,3589721223,GB +3589721224,3589721247,BE +3589721248,3589721279,GB +3589721280,3589721295,BE +3589721296,3589721311,GB +3589721312,3589721375,BE +3589721376,3589721391,GB +3589721392,3589721575,BE +3589721576,3589721583,GB +3589721584,3589721607,BE +3589721608,3589721615,GB +3589721616,3589721647,BE +3589721648,3589721655,GB +3589721656,3589721671,BE +3589721672,3589721695,GB +3589721696,3589721711,BE +3589721712,3589721791,GB +3589721792,3589721831,BE +3589721832,3589721847,GB +3589721848,3589721855,BE +3589721856,3589721863,GB +3589721864,3589721879,BE +3589721880,3589721887,GB +3589721888,3589721895,BE +3589721896,3589721899,GB +3589721900,3589721951,BE +3589721952,3589721955,GB +3589721956,3589721967,BE +3589721968,3589721983,GB +3589721984,3589722023,BE +3589722024,3589722031,GB +3589722032,3589722059,BE +3589722060,3589722063,GB +3589722064,3589722111,BE +3589722112,3589722143,GB +3589722144,3589722151,BE +3589722152,3589722167,GB +3589722168,3589722175,BE +3589722176,3589722207,GB +3589722208,3589722247,BE +3589722248,3589722255,GB +3589722256,3589722279,BE +3589722280,3589722287,GB +3589722288,3589722295,BE +3589722296,3589722299,GB +3589722300,3589722351,BE +3589722352,3589722359,GB +3589722360,3589722395,BE +3589722396,3589722399,GB +3589722400,3589722439,BE +3589722440,3589722447,GB +3589722448,3589722511,BE +3589722512,3589722527,GB +3589722528,3589722607,BE +3589722608,3589722615,GB +3589722616,3589722639,BE +3589722640,3589722647,GB +3589722648,3589722655,BE +3589722656,3589722663,GB +3589722664,3589722691,BE +3589722692,3589722703,GB +3589722704,3589722799,BE +3589722800,3589722803,GB +3589722804,3589722807,BE +3589722808,3589722815,GB +3589722816,3589722835,BE +3589722836,3589722843,GB +3589722844,3589722855,BE +3589722856,3589722863,GB +3589722864,3589722871,BE +3589722872,3589722875,GB +3589722876,3589722883,BE +3589722884,3589722887,GB +3589722888,3589722943,BE +3589722944,3589722999,GB +3589723000,3589723023,BE +3589723024,3589723095,GB +3589723096,3589723391,BE +3589723392,3589723647,GB +3589723648,3589723775,BE +3589723776,3589723783,GB +3589723784,3589723791,BE +3589723792,3589723807,GB +3589723808,3589724031,BE +3589724032,3589724039,GB +3589724040,3589724047,BE +3589724048,3589724059,GB +3589724060,3589724063,BE +3589724064,3589724159,GB +3589724160,3589724271,BE +3589724272,3589724287,NL +3589724288,3589724367,BE +3589724368,3589724375,GB +3589724376,3589724423,BE +3589724424,3589724431,GB +3589724432,3589724607,BE +3589724608,3589724631,GB +3589724632,3589724671,BE +3589724672,3589724735,GB +3589724736,3589724775,BE +3589724776,3589724783,GB +3589724784,3589724791,BE +3589724792,3589724807,GB +3589724808,3589724823,BE +3589724824,3589724831,GB +3589724832,3589724839,BE +3589724840,3589724847,GB +3589724848,3589724863,BE +3589724864,3589724883,GB +3589724884,3589724887,BE +3589724888,3589724927,GB +3589724928,3589725023,BE +3589725024,3589725039,GB +3589725040,3589725135,BE +3589725136,3589725279,GB +3589725280,3589725295,BE +3589725296,3589725375,GB +3589725376,3589725383,BE +3589725384,3589725391,GB +3589725392,3589725407,BE +3589725408,3589725463,GB +3589725464,3589725495,BE +3589725496,3589725503,GB +3589725504,3589725567,BE +3589725568,3589725583,GB +3589725584,3589725591,BE +3589725592,3589725607,GB +3589725608,3589725615,BE +3589725616,3589725695,GB +3589725696,3589725759,BE +3589725760,3589725767,GB +3589725768,3589725775,BE +3589725776,3589725783,GB +3589725784,3589725791,BE +3589725792,3589725807,GB +3589725808,3589725831,BE +3589725832,3589725863,GB +3589725864,3589725879,BE +3589725880,3589725895,GB +3589725896,3589725903,BE +3589725904,3589725943,GB +3589725944,3589725959,BE +3589725960,3589725983,GB +3589725984,3589725999,BE +3589726000,3589726007,GB +3589726008,3589726023,BE +3589726024,3589726031,GB +3589726032,3589726047,BE +3589726048,3589726063,GB +3589726064,3589726071,BE +3589726072,3589726095,GB +3589726096,3589726111,BE +3589726112,3589726143,GB +3589726144,3589726167,BE +3589726168,3589726183,GB +3589726184,3589726191,BE +3589726192,3589726351,GB +3589726352,3589726359,BE +3589726360,3589726367,GB +3589726368,3589726391,BE +3589726392,3589726407,GB +3589726408,3589726415,BE +3589726416,3589726439,GB +3589726440,3589726447,BE +3589726448,3589726519,GB +3589726520,3589726527,BE +3589726528,3589726551,GB +3589726552,3589726599,BE +3589726600,3589726631,GB +3589726632,3589726655,BE +3589726656,3589726663,GB +3589726664,3589726671,BE +3589726672,3589726783,GB +3589726784,3589726791,BE +3589726792,3589726847,GB +3589726848,3589726911,BE +3589726912,3589726975,GB +3589726976,3589726983,BE +3589726984,3589727007,GB +3589727008,3589727015,BE +3589727016,3589727055,GB +3589727056,3589727063,BE +3589727064,3589727071,GB +3589727072,3589727095,BE +3589727096,3589727127,GB +3589727128,3589727143,BE +3589727144,3589727159,GB +3589727160,3589727183,BE +3589727184,3589727215,GB +3589727216,3589727223,BE +3589727224,3589727295,GB +3589727296,3589727431,BE +3589727432,3589727439,GB +3589727440,3589727447,BE +3589727448,3589727455,GB +3589727456,3589727487,BE +3589727488,3589727743,GB +3589727744,3589727759,BE +3589727760,3589727999,GB +3589728000,3589728255,BE +3589728256,3589729111,GB +3589729112,3589729127,BE +3589729128,3589729183,GB +3589729184,3589729191,BE +3589729192,3589729215,GB +3589729216,3589729287,BE +3589729288,3589729295,GB +3589729296,3589729311,BE +3589729312,3589729343,GB +3589729344,3589729407,BE +3589729408,3589729559,GB +3589729560,3589729567,BE +3589729568,3589729583,GB +3589729584,3589729607,BE +3589729608,3589729631,GB +3589729632,3589729647,BE +3589729648,3589729679,GB +3589729680,3589729703,BE +3589729704,3589729751,GB +3589729752,3589729775,BE +3589729776,3589729799,GB +3589729800,3589729815,BE +3589729816,3589729823,GB +3589729824,3589729855,BE +3589729856,3589729895,GB +3589729896,3589729903,BE +3589729904,3589729919,GB +3589729920,3589729935,BE +3589729936,3589729951,GB +3589729952,3589729959,BE +3589729960,3589729975,GB +3589729976,3589729983,BE +3589729984,3589729991,GB +3589729992,3589730015,BE +3589730016,3589730031,GB +3589730032,3589730039,BE +3589730040,3589730047,GB +3589730048,3589730055,BE +3589730056,3589730063,GB +3589730064,3589730071,BE +3589730072,3589730079,GB +3589730080,3589730095,BE +3589730096,3589730103,GB +3589730104,3589730111,BE +3589730112,3589730119,GB +3589730120,3589730135,BE +3589730136,3589730143,GB +3589730144,3589730151,BE +3589730152,3589730159,GB +3589730160,3589730175,BE +3589730176,3589730279,GB +3589730280,3589730287,BE +3589730288,3589730295,GB +3589730296,3589730815,BE +3589730816,3589731455,GB +3589731456,3589731599,BE +3589731600,3589731607,GB +3589731608,3589731615,BE +3589731616,3589731623,GB +3589731624,3589731631,BE +3589731632,3589731679,GB +3589731680,3589731687,BE +3589731688,3589731695,GB +3589731696,3589731719,BE +3589731720,3589731735,GB +3589731736,3589731783,BE +3589731784,3589731791,GB +3589731792,3589731799,BE +3589731800,3589731831,GB +3589731832,3589731839,BE +3589731840,3589732111,GB +3589732112,3589732243,BE +3589732244,3589732255,GB +3589732256,3589732287,BE +3589732288,3589732295,GB +3589732296,3589732303,BE +3589732304,3589732319,GB +3589732320,3589732327,BE +3589732328,3589732607,GB +3589732608,3589732719,BE +3589732720,3589732743,GB +3589732744,3589732767,BE +3589732768,3589732783,GB +3589732784,3589732863,BE +3589732864,3589733183,GB +3589733184,3589733191,BE +3589733192,3589733439,GB +3589733440,3589733455,BE +3589733456,3589733695,GB +3589733696,3589733711,BE +3589733712,3589733719,GB +3589733720,3589733727,BE +3589733728,3589734015,GB +3589734016,3589734055,BE +3589734056,3589734063,GB +3589734064,3589734119,BE +3589734120,3589734159,GB +3589734160,3589734271,BE +3589734272,3589734287,GB +3589734288,3589734295,BE +3589734296,3589734319,GB +3589734320,3589734327,BE +3589734328,3589734335,GB +3589734336,3589734391,BE +3589734392,3589734399,GB +3589742592,3589744895,NL +3589744896,3589744959,BE +3589744960,3589745119,NL +3589745120,3589745151,BE +3589745152,3589747047,NL +3589747048,3589747055,BE +3589747056,3589747071,NL +3589747072,3589747103,ES +3589747104,3589747167,NL +3589747168,3589747199,IE +3589747200,3589747327,NL +3589747328,3589747455,US +3589747456,3589767167,NL +3589767168,3589816319,RU +3589827072,3589827327,SE +3589827328,3589827583,FR +3589827584,3589827687,HU +3589827712,3589828095,DE +3589828096,3589828111,FR +3589828160,3589828607,FR +3589828608,3589828639,SE +3589828640,3589828671,NL +3589828736,3589828863,NL +3589829120,3589829183,GB +3589829376,3589829887,GB +3589830144,3589830655,GB +3589830656,3589831167,DE +3589831168,3589831679,US +3589831680,3589832703,FR +3589832704,3589849087,TR +3589849088,3589865471,GB +3589865472,3589881855,GR +3589881856,3589890047,NL +3589890048,3589890175,BE +3589890176,3589890303,GB +3589890304,3589890367,BE +3589890368,3589890431,GB +3589890432,3589890559,BE +3589890560,3589890687,GB +3589890688,3589891327,BE +3589891328,3589891615,GB +3589891616,3589891631,BE +3589891632,3589931007,GB +3589931008,3589947391,SI +3589947392,3589963775,FI +3589963776,3589971231,ES +3589971232,3589971247,CA +3589971248,3589980159,ES +3589980160,3589996543,CZ +3589996544,3589996623,NL +3589996624,3589996639,GB +3589996640,3589996655,NL +3589996656,3589996703,GB +3589996704,3589996799,NL +3589996800,3589996863,GB +3589996864,3589996879,NL +3589996880,3589996911,GB +3589996912,3589996931,NL +3589996932,3589996959,GB +3589996960,3589996991,NL +3589996992,3589997055,GB +3589997056,3589997311,NL +3589997312,3589997439,GB +3589997440,3589997503,NL +3589997504,3589997535,GB +3589997536,3589997543,NL +3589997544,3589997559,GB +3589997560,3589997567,NL +3589997568,3590012927,GB +3590012928,3590029311,BE +3590029312,3590045695,FR +3590045696,3590053887,RU +3590053888,3590057983,UA +3590057984,3590062079,RU +3590062080,3590078463,DE +3590078464,3590094847,RU +3590094848,3590111231,DE +3590111232,3590113023,LT +3590113024,3590113279,LV +3590113280,3590127615,LT +3590127616,3590128127,GB +3590128128,3590128383,FR +3590128384,3590128639,GB +3590128640,3590128895,IT +3590128896,3590129151,NL +3590129152,3590135551,GB +3590135552,3590135807,ES +3590135808,3590137855,GB +3590137856,3590138111,PT +3590138112,3590143999,GB +3590144000,3590151143,SI +3590151144,3590151151,HR +3590151152,3590154047,SI +3590154048,3590154063,HR +3590154064,3590155799,SI +3590155800,3590155807,HR +3590155808,3590155815,SI +3590155816,3590155823,HR +3590155824,3590156287,SI +3590156288,3590156959,HR +3590156960,3590156991,AE +3590156992,3590157311,HR +3590157312,3590157335,CS +3590157336,3590157343,RS +3590157344,3590157439,SI +3590157440,3590157471,RS +3590157472,3590157567,CS +3590157568,3590157631,SI +3590157632,3590157647,RS +3590157648,3590157655,CS +3590157656,3590157663,RS +3590157664,3590157671,CS +3590157672,3590157679,RS +3590157680,3590157695,SI +3590157696,3590157727,CS +3590157728,3590157735,RS +3590157736,3590157743,SI +3590157744,3590157759,RS +3590157760,3590157775,SI +3590157776,3590157783,RS +3590157784,3590157823,SI +3590157824,3590157831,CS +3590157832,3590157839,RS +3590157840,3590158343,CS +3590158344,3590158399,SI +3590158400,3590158407,RS +3590158408,3590158439,CS +3590158440,3590158447,SI +3590158448,3590158455,RS +3590158456,3590158479,CS +3590158480,3590158495,SI +3590158496,3590158503,RS +3590158504,3590158527,SI +3590158528,3590158535,RS +3590158536,3590158591,SI +3590158592,3590159359,CS +3590159360,3590160383,SI +3590160384,3590176767,GB +3590176768,3590178615,HU +3590178616,3590178623,MK +3590178624,3590193151,HU +3590193152,3590201343,IT +3590201344,3590209535,DE +3590209536,3590225919,ES +3590225920,3590234111,TR +3590234112,3590242303,GB +3590242304,3590244351,US +3590244352,3590244863,DE +3590244864,3590245119,GR +3590245120,3590245183,BE +3590245184,3590245215,FR +3590245216,3590245279,DE +3590245280,3590245311,BE +3590245312,3590245439,DE +3590245440,3590245503,FR +3590245504,3590245567,GB +3590245568,3590245631,US +3590245632,3590245887,FR +3590245888,3590245983,US +3590245984,3590246175,FR +3590246176,3590246207,AU +3590246208,3590246271,FR +3590246272,3590246303,DE +3590246304,3590246399,FR +3590246400,3590247039,DE +3590247040,3590247055,IT +3590247056,3590247071,DE +3590247072,3590247087,IT +3590247088,3590247167,DE +3590247168,3590247231,US +3590247232,3590247295,IT +3590247296,3590247423,US +3590247424,3590247487,IT +3590247488,3590247551,US +3590247552,3590247679,IT +3590247680,3590247687,GB +3590247688,3590248447,DE +3590248448,3590248959,US +3590248960,3590249471,ES +3590249472,3590249983,IE +3590249984,3590250495,GR +3590250496,3590250751,IE +3590250752,3590251007,GR +3590251008,3590251263,IT +3590251264,3590251519,DE +3590251520,3590251551,ES +3590251552,3590251583,DE +3590251584,3590251647,US +3590251648,3590251775,DE +3590251776,3590251839,US +3590251840,3590251903,ES +3590251904,3590251967,US +3590251968,3590252543,ES +3590252544,3590253055,GB +3590253056,3590253375,DE +3590253376,3590253407,US +3590253408,3590254111,DE +3590254112,3590254127,IL +3590254128,3590254135,RU +3590254136,3590254143,DE +3590254144,3590254207,US +3590254208,3590254303,DE +3590254304,3590254335,US +3590254336,3590254591,DE +3590254592,3590254879,ES +3590254880,3590254911,DE +3590254912,3590254975,ES +3590254976,3590255047,DE +3590255048,3590255071,ES +3590255072,3590255103,DE +3590255104,3590255359,ES +3590255360,3590255935,DE +3590255936,3590255999,US +3590256000,3590256383,DE +3590256384,3590256639,IT +3590256640,3590256703,US +3590256704,3590256719,BE +3590256720,3590256735,DE +3590256736,3590256767,BE +3590256768,3590256895,DE +3590256896,3590257151,FR +3590257152,3590258431,DE +3590258432,3590258447,GB +3590258448,3590258463,DE +3590258464,3590258495,US +3590258496,3590258687,DE +3590258688,3590291455,IT +3590299648,3590307839,FI +3590307840,3590307903,CG +3590307904,3590307935,UA +3590307936,3590307951,GB +3590307952,3590307967,NG +3590307968,3590308031,GB +3590308032,3590308047,UG +3590308048,3590308055,KE +3590308056,3590308063,GB +3590308064,3590308071,ZW +3590308072,3590308079,GB +3590308080,3590308087,MW +3590308088,3590308095,AO +3590308096,3590308119,GB +3590308120,3590308127,IQ +3590308128,3590308151,GB +3590308152,3590308159,NG +3590308160,3590308167,ZM +3590308168,3590308175,GB +3590308176,3590308183,NG +3590308184,3590308231,IQ +3590308232,3590308247,GB +3590308248,3590308303,IQ +3590308304,3590308311,SO +3590308312,3590308319,IQ +3590308320,3590308327,GB +3590308328,3590308343,IQ +3590308344,3590308351,GB +3590308352,3590308607,CG +3590308608,3590308735,NG +3590308736,3590308767,GB +3590308768,3590308775,RW +3590308776,3590308783,ZA +3590308784,3590308799,ZW +3590308800,3590308807,GB +3590308808,3590308815,ZM +3590308816,3590308831,KE +3590308832,3590308839,ZW +3590308840,3590308847,ET +3590308848,3590308855,GB +3590308856,3590308911,NG +3590308912,3590308927,BI +3590308928,3590308951,GB +3590308952,3590308959,GH +3590308960,3590308991,GB +3590308992,3590308999,NG +3590309000,3590309007,UG +3590309008,3590309023,TZ +3590309024,3590309055,ZW +3590309056,3590309063,CD +3590309064,3590309071,TZ +3590309072,3590309079,MW +3590309080,3590309087,GH +3590309088,3590309103,NG +3590309104,3590309111,ZW +3590309112,3590309503,GB +3590309504,3590309511,NG +3590309512,3590309519,AO +3590309520,3590309527,NG +3590309528,3590309535,CM +3590309536,3590309543,SO +3590309544,3590309551,AM +3590309552,3590309559,UG +3590309560,3590309567,KE +3590309568,3590309575,GB +3590309576,3590309583,NG +3590309584,3590309591,ZW +3590309592,3590309599,SO +3590309600,3590309607,KE +3590309608,3590309615,GB +3590309616,3590309623,UG +3590309624,3590309631,ZW +3590309632,3590309655,IQ +3590309656,3590309671,GB +3590309672,3590309695,IQ +3590309696,3590309711,GB +3590309712,3590309719,IQ +3590309720,3590309727,GB +3590309728,3590309735,IQ +3590309736,3590309743,GB +3590309744,3590309751,IQ +3590309752,3590309887,GB +3590309888,3590310143,MW +3590310144,3590310159,MZ +3590310160,3590310175,GB +3590310176,3590310183,LR +3590310184,3590310191,IQ +3590310192,3590310199,CD +3590310200,3590310215,GB +3590310216,3590310287,IQ +3590310288,3590310288,GB +3590310289,3590310303,IQ +3590310304,3590310311,GH +3590310312,3590310319,IQ +3590310320,3590310327,ZW +3590310328,3590310335,GB +3590310336,3590310351,IQ +3590310352,3590310359,GB +3590310360,3590310399,IQ +3590310400,3590310655,UA +3590310656,3590311679,GB +3590311680,3590311935,YT +3590311936,3590312703,MW +3590312704,3590312799,GB +3590312800,3590312807,KE +3590312808,3590312815,GB +3590312816,3590312823,MW +3590312824,3590312831,GB +3590312832,3590312895,NG +3590312896,3590312903,ZA +3590312904,3590312911,AO +3590312912,3590312919,NG +3590312920,3590312927,GB +3590312928,3590312943,UG +3590312944,3590312951,NG +3590312952,3590312959,KE +3590312960,3590314623,GB +3590314624,3590314639,ET +3590314640,3590314655,GH +3590314656,3590314671,GB +3590314672,3590314679,UG +3590314680,3590314687,CG +3590314688,3590314703,NG +3590314704,3590314719,GB +3590314720,3590314727,TG +3590314728,3590314735,UG +3590314736,3590314743,NG +3590314744,3590314751,KE +3590314752,3590314767,GB +3590314768,3590314783,KE +3590314784,3590314799,GB +3590314800,3590314807,NG +3590314808,3590314815,GB +3590314816,3590314823,NG +3590314824,3590314831,ZW +3590314832,3590314879,GB +3590314880,3590314887,KE +3590314888,3590314895,NG +3590314896,3590314903,GB +3590314904,3590314911,KE +3590314912,3590314927,GH +3590314928,3590314943,NG +3590314944,3590314959,GB +3590314960,3590314967,NG +3590314968,3590314973,YT +3590314974,3590314975,GB +3590314976,3590314983,UG +3590314984,3590314991,MW +3590314992,3590316031,GB +3590316032,3590316039,TZ +3590316040,3590316047,GB +3590316048,3590316055,GH +3590316056,3590316071,IQ +3590316072,3590316079,GB +3590316080,3590316087,LB +3590316088,3590316127,IQ +3590316128,3590316151,NG +3590316152,3590316159,GR +3590316160,3590316183,IQ +3590316184,3590316191,GB +3590316192,3590316199,LY +3590316200,3590316215,IQ +3590316216,3590316223,ZM +3590316224,3590316231,IQ +3590316232,3590316255,GB +3590316256,3590316287,IQ +3590316288,3590316543,LB +3590316544,3590316559,GB +3590316560,3590316575,IQ +3590316576,3590316591,GB +3590316592,3590316599,IQ +3590316600,3590316607,GB +3590316608,3590316615,IQ +3590316616,3590316623,GR +3590316624,3590316632,IQ +3590316633,3590316647,GB +3590316648,3590316655,LY +3590316656,3590316663,IQ +3590316664,3590316671,LY +3590316672,3590316687,GB +3590316688,3590316695,IQ +3590316696,3590316719,GB +3590316720,3590316727,IQ +3590316728,3590316735,LB +3590316736,3590316751,GR +3590316752,3590316783,GB +3590316784,3590316791,IQ +3590316792,3590316799,GB +3590316800,3590317055,CS +3590317056,3590317311,NG +3590317312,3590317343,AO +3590317344,3590317407,GB +3590317408,3590317439,US +3590317440,3590317447,AM +3590317448,3590317455,LB +3590317456,3590317471,IQ +3590317472,3590317479,MW +3590317480,3590317487,US +3590317488,3590317495,IQ +3590317496,3590317503,LB +3590317504,3590317519,GB +3590317520,3590317527,LY +3590317528,3590317951,IQ +3590317952,3590318047,UA +3590318048,3590319167,GB +3590319168,3590319231,AE +3590319232,3590319335,GB +3590319336,3590319359,AE +3590319360,3590319423,GB +3590319424,3590319455,AE +3590319456,3590319967,GB +3590319968,3590319999,AE +3590320000,3590320127,GB +3590320128,3590320191,NG +3590320192,3590320199,LB +3590320200,3590320207,IQ +3590320208,3590320231,GB +3590320232,3590320239,IQ +3590320240,3590320247,GB +3590320248,3590320255,LB +3590320256,3590320263,LY +3590320264,3590320271,TZ +3590320272,3590320295,IQ +3590320296,3590320303,GB +3590320304,3590320335,IQ +3590320336,3590320343,UG +3590320344,3590320351,GB +3590320352,3590320367,IQ +3590320368,3590320375,GB +3590320376,3590320383,IQ +3590320384,3590321151,GB +3590321152,3590321663,IQ +3590321664,3590321679,GB +3590321680,3590321687,CM +3590321688,3590321695,IQ +3590321696,3590321711,ZW +3590321712,3590321727,IQ +3590321728,3590321791,GB +3590321792,3590321823,IQ +3590321824,3590321839,GB +3590321840,3590321855,US +3590321856,3590321887,IQ +3590321888,3590321919,CY +3590321920,3590321927,GB +3590321928,3590321935,IQ +3590321936,3590321943,LY +3590321944,3590321959,IQ +3590321960,3590321967,GB +3590321968,3590321983,TR +3590321984,3590321991,GB +3590321992,3590321999,LB +3590322000,3590322007,CY +3590322008,3590322015,IQ +3590322016,3590322023,GB +3590322024,3590322031,IQ +3590322032,3590322047,GB +3590322048,3590322055,NG +3590322056,3590322079,IQ +3590322080,3590322095,GB +3590322096,3590322103,IQ +3590322104,3590322111,GB +3590322112,3590322119,BJ +3590322120,3590322127,IQ +3590322128,3590322135,GH +3590322136,3590322151,GB +3590322152,3590322159,LY +3590322160,3590322167,GB +3590322168,3590322239,IQ +3590322240,3590322255,GB +3590322256,3590322271,RW +3590322272,3590322335,GB +3590322336,3590322351,MG +3590322352,3590322367,GB +3590322368,3590322375,LB +3590322376,3590322383,LY +3590322384,3590322391,LB +3590322392,3590322399,IQ +3590322400,3590322415,AO +3590322416,3590322423,LR +3590322424,3590322431,GB +3590322432,3590322559,LB +3590322560,3590322575,GB +3590322576,3590322687,LB +3590322688,3590323199,IQ +3590323200,3590323711,MW +3590323712,3590323903,GB +3590323904,3590323911,CD +3590323912,3590324223,GB +3590324224,3623890943,US +3623890944,3623891199,ZA +3623891200,3623891455,US +3623891456,3623891711,ZA +3623891712,3623891967,US +3623891968,3623892479,ZA +3623892480,3624054783,US +3624054784,3624056831,ZA +3624056832,3624181759,US +3624181760,3624182783,ZA +3624182784,3624206335,US +3624206336,3624208383,ZA +3624208384,3624255487,US +3624255488,3624257535,ZA +3624257536,3624271871,US +3624271872,3624272383,SY +3624272384,3624279039,CA +3624279040,3624279087,BD +3624279088,3624288255,CA +3624288256,3624290303,IN +3624290304,3624292351,CA +3624292352,3624292607,MF +3624292608,3624297471,CA +3624297472,3624298495,CO +3624298496,3624299519,PH +3624299520,3624303743,CA +3624303744,3624303759,ZA +3624303760,3624304639,CA +3624304640,3624321023,US +3624321024,3624325119,CA +3624325120,3624359679,US +3624359680,3624360703,AN +3624360704,3624384767,US +3624384768,3624385023,CA +3624385024,3624386559,US +3624386560,3624394751,CA +3624394752,3624435711,US +3624435712,3624452095,CA +3624452096,3624480767,US +3624480768,3624484863,CA +3624484864,3624529919,US +3624529920,3624534015,CA +3624534016,3624534271,PA +3624534272,3624536063,CA +3624536064,3624587263,US +3624587264,3624591359,JM +3624591360,3624730623,US +3624730624,3624796159,CA +3624796160,3624798207,US +3624798208,3624798975,CA +3624798976,3624799743,US +3624799744,3624799999,CA +3624800000,3624800767,US +3624800768,3624801023,CA +3624801024,3624803071,US +3624803072,3624803583,CA +3624803584,3624804607,US +3624804608,3624804863,CA +3624804864,3624807935,US +3624807936,3624808447,CA +3624808448,3624811519,US +3624811520,3624812287,CA +3624812288,3624820735,US +3624820736,3624820799,CY +3624820800,3624821695,US +3624821696,3624821703,GB +3624821704,3624828927,US +3624828928,3624833023,CA +3624833024,3624845311,US +3624845312,3624849407,AU +3624849408,3624903167,US +3624903168,3624903423,CA +3624903424,3624903679,US +3624903680,3624904703,CA +3624904704,3624905471,US +3624905472,3624905727,CA +3624905728,3624964095,US +3624976384,3624984575,US +3624984576,3624992767,CA +3624992768,3625019135,US +3625019136,3625019391,ES +3625019392,3625058303,US +3625058304,3625091071,CA +3625091072,3625099263,US +3625115648,3625116671,US +3625116672,3625116767,CA +3625116768,3625116775,US +3625116776,3625116927,CA +3625116928,3625117775,US +3625117776,3625117783,CA +3625117784,3625117791,US +3625117792,3625117799,CA +3625117800,3625117807,US +3625117808,3625117839,CA +3625117840,3625118233,US +3625118234,3625118241,CA +3625118242,3625118271,US +3625118272,3625118287,CA +3625118288,3625118975,US +3625118976,3625119056,PL +3625119057,3625140223,US +3625140224,3625148415,CA +3625148416,3625168895,US +3625168896,3625172991,CA +3625172992,3625254911,US +3625255168,3625255935,US +3625256448,3625257983,US +3625258752,3625259007,US +3625259264,3625259519,US +3625260032,3625287679,US +3625287680,3625295871,CA +3625295872,3625346047,US +3625346048,3625346303,AR +3625346304,3625418751,US +3625418752,3625420031,CA +3625420032,3625420543,US +3625420544,3625422591,CA +3625422592,3625423103,US +3625423104,3625426943,CA +3625426944,3625508863,US +3625508864,3625512959,CA +3625512960,3625517055,PR +3625517056,3625631743,US +3625631744,3625639935,CA +3625639936,3626025919,US +3626025920,3626025951,LT +3626025952,3626060735,US +3626060736,3626060743,BM +3626060744,3626061903,US +3626061904,3626061911,BM +3626061912,3626069279,US +3626069280,3626069311,NL +3626069312,3626072959,US +3626072960,3626072991,AE +3626072992,3626073439,US +3626073440,3626073455,AE +3626073456,3626108895,US +3626108896,3626108927,AU +3626108928,3626130415,US +3626130416,3626130431,CA +3626130432,3626140479,US +3626140480,3626140671,AU +3626140672,3626142623,US +3626142624,3626142639,AU +3626142640,3626184191,US +3626184192,3626184223,LT +3626184224,3626189359,US +3626189360,3626189367,NO +3626189368,3626189375,US +3626189376,3626189383,IL +3626189384,3626189431,US +3626189432,3626189439,IL +3626189440,3626191119,US +3626191120,3626191135,GB +3626191136,3626192639,US +3626192640,3626192703,CY +3626192704,3626192767,US +3626192768,3626192799,CH +3626192800,3626213439,US +3626213440,3626213471,GB +3626213472,3626227167,US +3626227168,3626227199,AR +3626227200,3626228463,US +3626228464,3626228479,AE +3626228480,3626270719,US +3626270720,3626287103,CA +3626287104,3626332159,US +3626336256,3626369023,US +3626377216,3626508287,US +3626508288,3626512383,CA +3626512384,3626524671,US +3626524672,3626532863,CA +3626532864,3626852351,US +3626852352,3626860543,CA +3626860544,3626893311,US +3626893312,3626905599,CA +3626909696,3626926079,US +3626926080,3626934271,CA +3626934272,3626967039,US +3626971136,3627044863,US +3627044864,3627048959,CA +3627048960,3627065343,US +3627065344,3627069439,CA +3627069440,3627387903,US +3627387904,3627388415,BR +3627388416,3627400319,US +3627400320,3627400351,BR +3627400352,3627401151,US +3627401152,3627401215,BR +3627401216,3627507711,US +3627507712,3627511807,CA +3627511808,3627532287,US +3627532288,3627544575,CA +3627544576,3627659263,US +3627659264,3627663359,CA +3627663360,3627665407,US +3627665408,3627665439,CA +3627665440,3627666719,US +3627666720,3627666751,CA +3627666752,3627679743,US +3627679744,3627712511,CA +3627712512,3627761663,US +3627778048,3627802623,US +3627802624,3627810815,CA +3627810816,3628123615,US +3628123616,3628123647,CA +3628123648,3628123711,BM +3628123712,3628123903,US +3628123904,3628123935,GB +3628123936,3628128703,US +3628128704,3628128719,CA +3628128720,3628129087,US +3628129088,3628129103,CA +3628129104,3628138751,US +3628138752,3628139007,GB +3628139008,3628139311,US +3628139312,3628139327,SG +3628139328,3628143615,US +3628143616,3628143871,GB +3628143872,3628153087,US +3628153088,3628153343,KW +3628153344,3628154239,US +3628154240,3628154303,PH +3628154304,3628154463,US +3628154464,3628154495,GB +3628154496,3628155647,US +3628155648,3628155903,CA +3628155904,3628156159,US +3628156160,3628156415,GB +3628156416,3628164479,US +3628164480,3628164607,GB +3628164608,3628179455,US +3628179456,3628187647,CA +3628187648,3628208127,US +3628208128,3628208383,IT +3628208384,3628236799,US +3628236800,3628257279,CA +3628257280,3628598271,US +3628598272,3628599295,CO +3628599296,3628603391,CL +3628603392,3628604415,US +3628604416,3628605439,GT +3628605440,3628608511,IL +3628608512,3628609023,VE +3628609024,3628616191,US +3628616192,3628617215,PR +3628617216,3628617471,HN +3628617472,3628617727,US +3628617728,3628618239,CO +3628618240,3628618495,US +3628618496,3628619775,HN +3628619776,3628622847,US +3628622848,3628623871,PR +3628623872,3628625919,NG +3628625920,3628626175,US +3628626176,3628626943,HN +3628626944,3628627199,CO +3628627200,3628627455,IL +3628627456,3628627711,HN +3628627712,3628627967,US +3628627968,3628628991,SV +3628628992,3628629247,GT +3628629248,3628629759,US +3628629760,3628631807,VE +3628631808,3628634111,US +3628634112,3628636159,AR +3628636160,3628636671,VE +3628636672,3628638207,US +3628638208,3628646399,CL +3628646400,3628646911,US +3628646912,3628647423,HN +3628647424,3628647679,US +3628647680,3628649727,CO +3628649728,3628655103,US +3628655104,3628655359,VE +3628655360,3628657407,CO +3628657408,3628657663,US +3628657664,3628657919,VE +3628657920,3628679167,US +3628679168,3628683263,CA +3628683264,3628762335,US +3628762336,3628762367,IL +3628762368,3628762519,US +3628762520,3628762527,CY +3628762528,3628766143,US +3628766144,3628766151,GB +3628766152,3628767039,US +3628767040,3628767055,IE +3628767056,3628767135,US +3628767136,3628767167,GB +3628767168,3628767695,US +3628767696,3628767703,NO +3628767704,3628768223,US +3628768224,3628768239,NO +3628768240,3628770207,US +3628770208,3628770215,NO +3628770216,3628770367,US +3628770368,3628770383,CY +3628770384,3628771455,US +3628771456,3628771647,GB +3628771648,3628771839,US +3628771840,3628772095,NO +3628772096,3628772415,US +3628772416,3628772431,CA +3628772432,3628772447,GB +3628772448,3628834815,US +3628834816,3628843007,CA +3628843008,3629187071,US +3629187072,3629195263,CA +3629195264,3629199359,US +3629199360,3629203455,CA +3629203456,3629318143,US +3629318144,3629326335,CA +3629326336,3629331967,US +3629331968,3629332479,CA +3629332480,3629539327,US +3629539328,3629547519,CA +3629547520,3629662207,US +3629662208,3629662463,GB +3629662464,3629735943,US +3629735944,3629735951,CA +3629735952,3629736119,US +3629736120,3629736127,CA +3629736128,3629737215,US +3629737216,3629737471,CA +3629737472,3629761551,US +3629761552,3629761567,CA +3629761568,3629767935,US +3629767936,3629768191,CA +3629768192,3629789439,US +3629789440,3629789695,CA +3629789696,3629789951,US +3629789952,3629790207,CA +3629790208,3629808095,US +3629808096,3629808127,CA +3629808128,3629838551,US +3629838552,3629838559,CA +3629838560,3629838583,US +3629838584,3629838591,CA +3629838592,3629841951,US +3629841952,3629841983,CA +3629841984,3629859551,US +3629859552,3629859583,CA +3629859584,3629875775,US +3629875776,3629875807,CA +3629875808,3629876255,US +3629876256,3629876263,CA +3629876264,3630039039,US +3630039040,3630039295,CA +3630039296,3630040063,US +3630040064,3630040319,CA +3630040320,3630040575,US +3630040576,3630040831,CA +3630040832,3630041343,US +3630041344,3630041599,CA +3630041600,3630041863,US +3630041864,3630041871,CA +3630041872,3630041911,US +3630041912,3630041919,CA +3630041920,3630042095,US +3630042096,3630042103,CA +3630042104,3630042391,US +3630042392,3630042399,CA +3630042400,3630042463,US +3630042464,3630042471,CA +3630042472,3630042479,US +3630042480,3630042487,CA +3630042488,3630042599,US +3630042600,3630042607,CA +3630042608,3630044927,US +3630044928,3630045183,CA +3630045184,3630045695,US +3630045696,3630046207,CA +3630046208,3630046591,US +3630046592,3630047231,CA +3630047232,3630048767,US +3630048768,3630049023,CA +3630049024,3630049279,US +3630049280,3630049535,CA +3630049536,3630050479,US +3630050480,3630050487,CA +3630050488,3630050527,US +3630050528,3630050535,CA +3630050536,3630050559,US +3630050560,3630050815,CA +3630050816,3630051839,US +3630051840,3630052351,CA +3630052352,3630054655,US +3630054656,3630055167,CA +3630055168,3630055615,US +3630055616,3630055647,CA +3630055648,3630055935,US +3630055936,3630056959,CA +3630056960,3630060223,US +3630060224,3630060287,CA +3630060288,3630062847,US +3630062848,3630063103,CA +3630063104,3630066175,US +3630066176,3630066431,CA +3630066432,3630066687,US +3630066688,3630067967,CA +3630067968,3630069503,US +3630069504,3630069759,CA +3630069760,3630070783,US +3630070784,3630071039,CA +3630071040,3630073087,US +3630073088,3630073343,CA +3630073344,3630073599,US +3630073600,3630073855,CA +3630073856,3630074543,US +3630074544,3630074551,CA +3630074552,3630074607,US +3630074608,3630074615,CA +3630074616,3630074815,US +3630074816,3630074879,CA +3630074880,3630075391,US +3630075392,3630075647,CA +3630075648,3630077183,US +3630077184,3630077439,CA +3630077440,3630077951,US +3630077952,3630078015,CA +3630078016,3630078463,US +3630078464,3630078719,CA +3630078720,3630080511,US +3630080512,3630080575,CA +3630080576,3630081279,US +3630081280,3630081535,CA +3630081536,3630082047,US +3630082048,3630082303,CA +3630082304,3630085119,US +3630085120,3630085375,CA +3630085376,3630088703,US +3630088704,3630088959,CA +3630088960,3630089471,US +3630089472,3630090239,CA +3630090240,3630091263,US +3630091264,3630091519,CA +3630091520,3630092031,US +3630092032,3630092287,CA +3630092288,3630093439,US +3630093440,3630093447,CA +3630093448,3630093527,US +3630093528,3630093535,CA +3630093536,3630094591,US +3630094592,3630094847,CA +3630094848,3630095015,US +3630095016,3630095023,CA +3630095024,3630095039,US +3630095040,3630095047,CA +3630095048,3630097663,US +3630097664,3630098175,KW +3630098176,3630098687,US +3630098688,3630100223,CA +3630100224,3630100479,KW +3630100480,3630102783,US +3630102784,3630103807,CA +3630103808,3630141503,US +3630141504,3630141567,CA +3630141568,3630142463,US +3630142464,3630143231,CA +3630143232,3630143615,US +3630143616,3630143647,CA +3630143648,3630143711,US +3630143712,3630143743,CA +3630143744,3630144511,US +3630144512,3630145023,CA +3630145024,3630145535,US +3630145536,3630145791,CA +3630145792,3630146047,US +3630146048,3630146815,CA +3630146816,3630147327,US +3630147328,3630147583,CA +3630147584,3630149535,US +3630149536,3630149567,CA +3630149568,3630149631,US +3630149632,3630149887,CA +3630149888,3630150911,US +3630150912,3630151167,CA +3630151168,3630151455,US +3630151456,3630151487,CA +3630151488,3630151615,US +3630151616,3630151647,CA +3630151648,3630151679,US +3630151680,3630152191,CA +3630152192,3630152447,US +3630152448,3630152703,CA +3630152704,3630156031,US +3630156032,3630156287,CA +3630156288,3630156543,US +3630156544,3630156799,CA +3630156800,3630157055,US +3630157056,3630157311,CA +3630157312,3630157567,US +3630157568,3630158087,CA +3630158088,3630158231,US +3630158232,3630158239,CA +3630158240,3630158303,US +3630158304,3630158311,CA +3630158312,3630159007,US +3630159008,3630159071,CA +3630159072,3630159103,US +3630159104,3630159359,CA +3630159360,3630160487,US +3630160488,3630160495,CA +3630160496,3630160591,US +3630160592,3630160599,CA +3630160600,3630160607,US +3630160608,3630160895,CA +3630160896,3630161151,US +3630161152,3630161919,CA +3630161920,3630162687,US +3630162688,3630162943,CA +3630162944,3630163887,US +3630163888,3630163895,CA +3630163896,3630164223,US +3630164224,3630164735,CA +3630164736,3630164783,US +3630164784,3630164799,CA +3630164800,3630164815,US +3630164816,3630164831,CA +3630164832,3630165247,US +3630165248,3630165759,CA +3630165760,3630166015,US +3630166016,3630166527,CA +3630166528,3630166687,US +3630166688,3630166719,CA +3630166720,3630167583,US +3630167584,3630167615,CA +3630167616,3630167711,US +3630167712,3630167743,CA +3630167744,3630167807,US +3630167808,3630167823,CA +3630167824,3630167903,US +3630167904,3630167911,CA +3630167912,3630168319,US +3630168320,3630169087,CA +3630169088,3630309375,US +3630309376,3630317567,CA +3630317568,3630370815,US +3630372864,3630374911,US +3630374912,3630383103,CA +3630383104,3630391295,US +3630391296,3630395391,CA +3630395392,3630718975,US +3630718976,3630727167,CA +3630727168,3630746879,US +3630746880,3630747391,TZ +3630747392,3630772223,US +3630776320,3630780415,US +3630780416,3630784511,CA +3630784512,3630850047,US +3630850048,3630854143,CA +3630854144,3630956543,US +3630956544,3631005695,CA +3631005696,3631039439,US +3631039440,3631039455,CA +3631039456,3631039487,US +3631039488,3631039743,CA +3631039744,3631043663,US +3631043664,3631043679,CA +3631043680,3631043759,US +3631043760,3631043767,CA +3631043768,3631045631,US +3631045632,3631045759,CA +3631045760,3631045983,US +3631045984,3631045991,CA +3631045992,3631112191,US +3631112192,3631112703,VC +3631112704,3631116543,BB +3631116544,3631117567,GD +3631117568,3631117823,BB +3631117824,3631118079,GD +3631118080,3631119103,VC +3631119104,3631119615,BB +3631119616,3631120383,GD +3631120384,3631144959,US +3631144960,3631153151,CA +3631153152,3631284223,US +3631284224,3631316991,CA +3631316992,3631333375,US +3631333376,3631333679,CA +3631333680,3631333695,US +3631333696,3631341567,CA +3631341568,3631357951,US +3631366144,3631480831,US +3631480832,3631484927,CA +3631484928,3631644671,US +3631644672,3631652863,CA +3631652864,3631663151,US +3631663152,3631663159,CA +3631663160,3631665151,US +3631665152,3631669247,CA +3631669248,3631714303,US +3631718400,3631841279,US +3631841280,3631874047,CA +3631874048,3631939583,US +3631939584,3632005119,CA +3632005120,3632136191,US +3632136192,3632144383,CA +3632144384,3632152575,US +3632152576,3632168959,CA +3632168960,3632197631,US +3632197632,3632201727,CA +3632201728,3632230399,US +3632234496,3632332799,US +3632332800,3632357375,CA +3632357376,3632370559,US +3632370560,3632370575,NG +3632370576,3632373503,US +3632373504,3632373759,NG +3632373760,3632381951,US +3632381952,3632390143,CA +3632390144,3632414719,US +3632414720,3632422911,CA +3632422912,3632447487,US +3632455680,3632467967,US +3632470016,3632826495,US +3632826496,3632826511,CN +3632826512,3632833231,US +3632833232,3632833247,CN +3632833248,3632837135,US +3632837136,3632837151,IN +3632837152,3632838399,US +3632838400,3632838431,TW +3632838432,3632838583,US +3632838584,3632838591,CN +3632838592,3632847279,US +3632847280,3632847295,CN +3632847296,3632857087,US +3632857088,3632861183,BS +3632861184,3632881663,US +3632881664,3632889855,CA +3632889856,3632898047,US +3632898048,3632902143,CA +3632902144,3632971775,US +3632971776,3632988159,CA +3632988160,3633030159,US +3633030160,3633030167,ZA +3633030168,3633030175,US +3633030176,3633030183,ZA +3633030184,3633030191,US +3633030192,3633030199,ZA +3633030200,3633030207,US +3633030208,3633030215,ZA +3633030216,3633030223,NG +3633030224,3633030231,ZA +3633030232,3633030287,US +3633030288,3633030303,ZA +3633030304,3633030335,US +3633030336,3633030359,ZA +3633030360,3633030655,US +3633030656,3633030911,SN +3633030912,3633031615,US +3633031616,3633031623,ZA +3633031624,3633031647,US +3633031648,3633031655,NG +3633031656,3633031959,US +3633031960,3633031967,NL +3633031968,3633031983,US +3633031984,3633031991,PG +3633031992,3633032087,US +3633032088,3633032095,NL +3633032096,3633032167,US +3633032168,3633032175,NL +3633032176,3633032223,US +3633032224,3633032231,NG +3633032232,3633032239,US +3633032240,3633032247,ZA +3633032248,3633032271,US +3633032272,3633032279,ZA +3633032280,3633032287,US +3633032288,3633032319,GQ +3633032320,3633032415,US +3633032416,3633032431,NG +3633032432,3633032439,US +3633032440,3633032447,ZA +3633032448,3633032591,US +3633032592,3633032607,ZA +3633032608,3633033247,US +3633033248,3633033255,ZA +3633033256,3633033263,US +3633033264,3633033271,ZA +3633033272,3633033287,US +3633033288,3633033295,GH +3633033296,3633033303,NG +3633033304,3633033319,ZA +3633033320,3633033327,NG +3633033328,3633033335,US +3633033336,3633033359,ZA +3633033360,3633033367,NG +3633033368,3633033375,ZA +3633033376,3633033391,NG +3633033392,3633033399,ZA +3633033400,3633034047,US +3633034048,3633034079,ZA +3633034080,3633034519,US +3633034520,3633034527,NG +3633034528,3633034559,US +3633034560,3633034751,NG +3633034752,3633035015,US +3633035016,3633035023,NL +3633035024,3633035071,US +3633035072,3633035087,NR +3633035088,3633035095,CN +3633035096,3633035135,US +3633035136,3633035151,NR +3633035152,3633035199,US +3633035200,3633035207,ID +3633035208,3633035311,US +3633035312,3633035319,ID +3633035320,3633035439,US +3633035440,3633035447,ID +3633035448,3633035455,US +3633035456,3633035487,ID +3633035488,3633035527,US +3633035528,3633035535,NG +3633035536,3633035551,US +3633035552,3633035599,ZA +3633035600,3633036031,US +3633036032,3633036287,HT +3633036288,3633036479,US +3633036480,3633036511,TT +3633036512,3633036607,US +3633036608,3633036671,GB +3633036672,3633039503,US +3633039504,3633039519,CA +3633039520,3633336319,US +3633336320,3633340415,KY +3633340416,3633344511,US +3633344512,3633348607,CA +3633348608,3633379327,US +3633381376,3633405951,US +3633405952,3633410047,CA +3633410048,3633479679,US +3633479680,3633483775,CA +3633483776,3633504255,US +3633508352,3633545215,US +3633545216,3633545727,GA +3633545728,3633546495,US +3633546496,3633546751,GA +3633546752,3633547263,US +3633547264,3633548287,GA +3633548288,3633548543,US +3633548544,3633548799,GA +3633548800,3633548927,US +3633548928,3633549055,GA +3633549056,3633552911,US +3633552912,3633552927,GA +3633552928,3633553151,US +3633553152,3633553279,GW +3633553280,3633783295,US +3633783552,3633783807,US +3633784064,3633784319,US +3633784576,3633785087,US +3633785600,3633786367,US +3633786880,3633815551,US +3633815552,3633819647,CA +3633819648,3633823743,US +3633831936,3633852415,US +3633856512,3633881087,US +3633881088,3633885183,AN +3633885184,3633889279,US +3633889280,3633893375,CA +3633893376,3633971199,US +3633971200,3634020351,CA +3634020352,3634053119,US +3634053120,3634061311,CL +3634061312,3634511871,US +3634511872,3634515967,CA +3634515968,3634524159,US +3634528256,3634552831,US +3634552832,3634556927,CA +3634556928,3634880511,US +3634880512,3634888703,CA +3634888704,3634913279,US +3634913280,3634921471,CA +3634921472,3634925567,US +3634925568,3634929663,CA +3634929664,3635109887,US +3635109888,3635110295,CA +3635110296,3635110303,US +3635110304,3635113983,CA +3635113984,3635142655,US +3635142656,3635146751,CA +3635146752,3635150847,US +3635216384,3635253247,US +3635257344,3635314687,US +3635314688,3635322879,CA +3635322880,3635412991,US +3635425280,3635429375,CA +3635429376,3635458527,US +3635458528,3635458543,CH +3635458544,3635460031,US +3635460032,3635460095,CH +3635460096,3635460543,US +3635460544,3635460575,CH +3635460576,3635460799,US +3635460800,3635460831,CH +3635460832,3635466239,US +3635466240,3635470335,CA +3635470336,3635515391,US +3635519488,3635658751,US +3635658752,3635660799,CN +3635660800,3635847791,US +3635847792,3635847807,CA +3635847808,3635856511,US +3635856512,3635856543,CA +3635856544,3635871743,US +3635871744,3635879935,CA +3635879936,3635892223,US +3635892224,3635896319,CA +3635896320,3635904511,US +3635904512,3635912703,CA +3635912704,3635924991,US +3635929088,3635961855,US +3635961856,3635963903,SV +3635963904,3635964159,US +3635964160,3635964415,BO +3635964416,3635965951,SV +3635965952,3635966975,BO +3635966976,3635967999,PY +3635968000,3635970047,SV +3635970048,3636019199,US +3636019200,3636027391,CA +3636027392,3636064255,US +3636064256,3636068351,CA +3636068352,3636152287,US +3636152288,3636152575,CA +3636152576,3636154367,US +3636154368,3636154879,CA +3636154880,3636157055,US +3636157056,3636157063,CA +3636157064,3636158111,US +3636158112,3636158143,CA +3636158144,3636158463,US +3636158464,3636158719,CA +3636158720,3636158783,US +3636158784,3636158815,CA +3636158816,3636160511,US +3636160512,3636160767,CA +3636160768,3636161791,US +3636161792,3636161855,CA +3636161856,3636164095,US +3636164096,3636164111,VG +3636164112,3636164159,US +3636164160,3636164223,CA +3636164224,3636166143,US +3636166144,3636166655,CA +3636166656,3636206079,US +3636206080,3636206335,AU +3636206336,3636396031,US +3636396032,3636461567,CA +3636461568,3636609023,US +3636609024,3636610559,CA +3636610560,3636610815,US +3636610816,3636621311,CA +3636621312,3636822015,US +3636822016,3636854783,CA +3636854784,3636887551,US +3636887552,3636895743,CA +3636895744,3637071935,US +3637071936,3637071943,SK +3637071944,3637071951,US +3637071952,3637071967,CY +3637071968,3637072095,US +3637072096,3637072127,GB +3637072128,3637072143,US +3637072144,3637072159,CY +3637072160,3637072895,US +3637072896,3637073151,CY +3637073152,3637073215,US +3637073216,3637073231,CY +3637073232,3637074239,US +3637074240,3637074303,PA +3637074304,3637074687,US +3637074688,3637074703,CA +3637074704,3637074751,US +3637074752,3637074815,PA +3637074816,3637074943,US +3637074944,3637074959,CA +3637074960,3637074975,US +3637074976,3637075007,PA +3637075008,3637075231,US +3637075232,3637075263,PA +3637075264,3637075487,US +3637075488,3637075519,PA +3637075520,3637075743,US +3637075744,3637075775,PA +3637075776,3637075967,US +3637075968,3637080063,CA +3637080064,3637389335,US +3637389336,3637389343,CA +3637389344,3637510143,US +3637510144,3637641215,CA +3637641216,3637661695,US +3637665792,3637667439,CA +3637667440,3637667518,US +3637667519,3637669887,CA +3637669888,3637706751,US +3637706752,3637739519,CA +3637739520,3638165503,US +3638165504,3638181887,CA +3638181888,3638231039,US +3638247424,3638247439,US +3638247440,3638247455,GB +3638247456,3638247487,US +3638247488,3638247551,GB +3638247552,3638247679,DE +3638247680,3638247855,US +3638247856,3638247871,DE +3638247872,3638247903,US +3638247904,3638248703,GB +3638248704,3638249215,US +3638249216,3638249471,GB +3638249472,3638249751,US +3638249752,3638249791,GB +3638249792,3638250535,US +3638250536,3638250543,GB +3638250544,3638250559,US +3638250560,3638250623,GB +3638250624,3638250687,US +3638250688,3638250703,GB +3638250704,3638250719,US +3638250720,3638250815,GB +3638250816,3638250831,US +3638250832,3638250847,GB +3638250848,3638250863,US +3638250864,3638250871,GB +3638250872,3638250895,US +3638250896,3638250911,GB +3638250912,3638250919,CH +3638250920,3638250983,US +3638250984,3638250991,GB +3638250992,3638304767,US +3638304768,3638312959,CA +3638312960,3638370303,US +3638370304,3638386687,CA +3638386688,3638509567,US +3638509568,3638534143,CA +3638534144,3638697983,US +3638697984,3638706175,CA +3638706176,3638796287,US +3638804480,3638874111,US +3638874112,3638878207,CA +3638878208,3638898687,US +3638902784,3638915071,US +3638919168,3638960383,US +3638960384,3638960639,BR +3638960640,3638984703,US +3638984704,3638992895,GT +3638992896,3639083007,US +3639083008,3639148543,CA +3639148544,3639222271,US +3639222272,3639230463,CA +3639230464,3639255039,US +3639255040,3639258677,CA +3639258678,3639258678,IL +3639258679,3639263231,CA +3639263232,3639279615,US +3639279616,3639283711,CA +3639283712,3639390207,US +3639394304,3639396351,US +3639396352,3639396383,NE +3639396384,3639396415,US +3639396416,3639396431,PK +3639396432,3639396447,US +3639396448,3639396463,NG +3639396464,3639396471,TZ +3639396472,3639396543,US +3639396544,3639396551,TZ +3639396552,3639396671,US +3639396672,3639396735,NE +3639396736,3639396863,US +3639396864,3639396879,NE +3639396880,3639396927,US +3639396928,3639396959,FR +3639396960,3639396975,NG +3639396976,3639396991,US +3639396992,3639397023,CD +3639397024,3639397119,US +3639397120,3639397375,IN +3639397376,3639397631,US +3639397632,3639397887,NG +3639397888,3639398527,US +3639398528,3639398591,SA +3639398592,3639400447,US +3639400448,3639401471,RS +3639401472,3639401495,PK +3639401496,3639401511,US +3639401512,3639401519,ID +3639401520,3639401535,US +3639401536,3639401551,TZ +3639401552,3639401559,LK +3639401560,3639401623,US +3639401624,3639401631,TZ +3639401632,3639401647,US +3639401648,3639401655,PK +3639401656,3639401687,US +3639401688,3639401727,PK +3639401728,3639402015,US +3639402016,3639402039,PK +3639402040,3639402055,US +3639402056,3639402071,PK +3639402072,3639402079,US +3639402080,3639402095,PK +3639402096,3639402111,US +3639402112,3639402175,NG +3639402176,3639402191,PK +3639402192,3639402199,US +3639402200,3639402207,PK +3639402208,3639402239,US +3639402240,3639402495,GH +3639402496,3639558143,US +3639558144,3639566335,CA +3639566336,3639582719,US +3639590912,3639607295,US +3639607296,3639611391,CA +3639611392,3639656447,US +3639656448,3639660543,CA +3639660544,3639664639,US +3639664640,3639668735,CA +3639672832,3639675391,CL +3639675392,3639676159,CO +3639676160,3639676447,CL +3639676448,3639676479,CO +3639676480,3639676575,CL +3639676576,3639676607,CO +3639676608,3639676655,CL +3639676656,3639676679,CO +3639676680,3639676687,CL +3639676688,3639676695,CO +3639676696,3639676703,CL +3639676704,3639676799,CO +3639676800,3639676807,CL +3639676808,3639676815,CO +3639676816,3639676831,CL +3639676832,3639676943,CO +3639676944,3639677023,CL +3639677024,3639677031,CO +3639677032,3639677103,CL +3639677104,3639677111,CO +3639677112,3639677423,CL +3639677424,3639677431,CO +3639677432,3639677455,CL +3639677456,3639677487,CO +3639677488,3639677711,CL +3639677712,3639677719,CO +3639677720,3639677791,CL +3639677792,3639677823,CO +3639677824,3639677871,CL +3639677872,3639677879,CO +3639677880,3639677959,CL +3639677960,3639677967,CO +3639677968,3639677983,CL +3639677984,3639677991,CO +3639677992,3639678007,CL +3639678008,3639678023,CO +3639678024,3639678055,CL +3639678056,3639678063,CO +3639678064,3639678071,CL +3639678072,3639678087,CO +3639678088,3639678119,CL +3639678120,3639678127,CO +3639678128,3639678143,CL +3639678144,3639678159,CO +3639678160,3639678167,CL +3639678168,3639678175,CO +3639678176,3639678191,CL +3639678192,3639678199,CO +3639678200,3639678527,CL +3639678528,3639678535,CO +3639678536,3639678583,CL +3639678584,3639678591,CO +3639678592,3639678639,CL +3639678640,3639678647,CO +3639678648,3639678663,CL +3639678664,3639678671,CO +3639678672,3639678783,CL +3639678784,3639678791,CO +3639678792,3639678799,CL +3639678800,3639678815,CO +3639678816,3639678823,CL +3639678824,3639678831,CO +3639678832,3639678839,CL +3639678840,3639678855,CO +3639678856,3639678887,CL +3639678888,3639678895,CO +3639678896,3639678911,CL +3639678912,3639678919,CO +3639678920,3639678935,CL +3639678936,3639678951,CO +3639678952,3639678975,CL +3639678976,3639679231,CO +3639679232,3639679247,CL +3639679248,3639679263,CO +3639679264,3639679383,CL +3639679384,3639679391,CO +3639679392,3639679415,CL +3639679416,3639679423,CO +3639679424,3639679447,CL +3639679448,3639679455,CO +3639679456,3639679487,CL +3639679488,3639679743,CO +3639679744,3639680271,CL +3639680272,3639680311,CO +3639680312,3639680319,CL +3639680320,3639680335,CO +3639680336,3639680383,CL +3639680384,3639680415,CO +3639680416,3639680431,CL +3639680432,3639680447,CO +3639680448,3639680767,CL +3639680768,3639680799,CO +3639680800,3639680831,CL +3639680832,3639680847,CO +3639680848,3639680871,CL +3639680872,3639680879,CO +3639680880,3639680887,CL +3639680888,3639680895,CO +3639680896,3639680967,CL +3639680968,3639680991,CO +3639680992,3639681023,CL +3639681024,3639730175,US +3639730176,3639734271,CA +3639734272,3639886095,US +3639886096,3639886103,CN +3639886104,3639902207,US +3639902208,3639903755,PE +3639903756,3639903759,PA +3639903760,3639904031,PE +3639904032,3639904035,CL +3639904036,3639912127,PE +3639912128,3639912143,CL +3639912144,3639914767,PE +3639914768,3639914775,PA +3639914776,3639918591,PE +3639918592,3639934975,AR +3639934976,3640057855,US +3640057856,3640066047,CA +3640066048,3640197119,US +3640197120,3640201215,CA +3640201216,3640205311,US +3640205312,3640209407,BM +3640209408,3640213503,CA +3640213504,3640287231,US +3640287232,3640291327,CA +3640291328,3640312079,US +3640312080,3640312095,ID +3640312096,3640312103,GB +3640312104,3640312159,US +3640312160,3640312191,ID +3640312192,3640312575,US +3640312576,3640312607,NG +3640312608,3640314879,US +3640314880,3640315135,ZA +3640315136,3640317327,US +3640317328,3640317343,ZA +3640317344,3640317407,US +3640317408,3640317423,ZA +3640317424,3640317559,US +3640317560,3640317567,NL +3640317568,3640318975,US +3640318976,3640319103,GQ +3640319104,3640360959,US +3640360960,3640369151,CA +3640369152,3640377343,US +3640381440,3640410111,US +3640410112,3640418303,CA +3640418304,3640557567,US +3640557568,3640582143,CA +3640582144,3640647679,US +3640647680,3640651775,JP +3640651776,3640655871,US +3640655872,3641056319,DE +3641056320,3641056327,HU +3641056328,3641056359,DE +3641056360,3641056367,AT +3641056368,3641056375,PL +3641056376,3641057655,DE +3641057656,3641057663,CZ +3641057664,3641078559,DE +3641078560,3641078567,BE +3641078568,3641085687,DE +3641085688,3641085695,CZ +3641085696,3641087695,DE +3641087696,3641087703,GB +3641087704,3641098191,DE +3641098192,3641098207,ES +3641098208,3641102607,DE +3641102608,3641102615,FR +3641102616,3641103719,DE +3641103720,3641103727,HU +3641103728,3641106951,DE +3641106952,3641106959,CH +3641106960,3641114031,DE +3641114032,3641114039,SK +3641114040,3641134367,DE +3641134368,3641134375,BE +3641134376,3641140671,DE +3641140672,3641140679,US +3641140680,3641147519,DE +3641147520,3641147527,AT +3641147528,3641150303,DE +3641150304,3641150311,US +3641150312,3641157951,DE +3641157952,3641157959,AT +3641157960,3641158031,DE +3641158032,3641158055,FR +3641158056,3641158103,DE +3641158104,3641158111,FR +3641158112,3641158127,DE +3641158128,3641158135,ES +3641158136,3641158199,DE +3641158200,3641158207,NL +3641158208,3641158335,DE +3641158336,3641158343,ES +3641158344,3641158423,DE +3641158424,3641158431,IT +3641158432,3641158519,DE +3641158520,3641158527,ES +3641158528,3641159679,DE +3641159680,3641159687,ES +3641159688,3641159727,DE +3641159728,3641159743,ES +3641159744,3641159767,DE +3641159768,3641159775,ES +3641159776,3641180159,DE +3641180160,3641188351,GB +3641188352,3641192447,TJ +3641192448,3641196543,DE +3641196544,3641200639,SA +3641200640,3641204735,RU +3641204736,3641206015,NL +3641206016,3641206271,CN +3641206272,3641208831,NL +3641208832,3641212927,JO +3641212928,3641221119,NO +3641221120,3641229311,PL +3641229312,3641237503,CH +3641237504,3641241599,RU +3641241600,3641245695,GB +3641245696,3641249791,UA +3641249792,3641262079,DE +3641262080,3641266175,IT +3641266176,3641270271,RU +3641270272,3641278463,DE +3641278464,3641282559,IS +3641282560,3641286655,RU +3641286656,3641294847,PL +3641294848,3641298943,GB +3641298944,3641303039,SE +3641303040,3641307135,BG +3641307136,3641311231,LT +3641311232,3641315327,DE +3641315328,3641319423,DK +3641319424,3641323519,RU +3641323520,3641323775,US +3641323776,3641331711,DE +3641331712,3641335807,ES +3641335808,3641343999,SE +3641344000,3641345199,GB +3641345200,3641345215,IE +3641345216,3641349383,GB +3641349384,3641349391,DE +3641349392,3641349399,FR +3641349400,3641349407,CH +3641349408,3641349415,DK +3641349416,3641349423,NO +3641349424,3641349431,SE +3641349432,3641349439,NL +3641349440,3641349511,GB +3641349512,3641349519,DE +3641349520,3641349527,IT +3641349528,3641353151,GB +3641353152,3641353183,BD +3641353184,3641353215,NG +3641353216,3641353231,GB +3641353232,3641353247,IQ +3641353248,3641353343,GB +3641353344,3641353727,BD +3641353728,3641353759,NG +3641353760,3641353775,GB +3641353776,3641353807,NG +3641353808,3641353983,GB +3641353984,3641354239,AF +3641354240,3641354383,GB +3641354384,3641354479,IT +3641354480,3641354751,GB +3641354752,3641355263,NG +3641355264,3641355519,AO +3641355520,3641355775,GB +3641355776,3641356031,LB +3641356032,3641356111,GB +3641356112,3641356119,NG +3641356120,3641356191,GB +3641356192,3641356207,NG +3641356208,3641359359,GB +3641359360,3641359615,IQ +3641359616,3641360383,GB +3641360384,3641368575,RO +3641368576,3641372671,GB +3641372672,3641376767,BG +3641376768,3641380863,IT +3641380864,3641384959,IR +3641384960,3641389055,CH +3641389056,3641391807,DE +3641391808,3641391823,AT +3641391824,3641393151,DE +3641393152,3641397247,KZ +3641397248,3641401343,IT +3641401344,3641409535,ES +3641409536,3641417727,PL +3641417728,3641421823,GE +3641421824,3641425919,TJ +3641425920,3641430015,DE +3641430016,3641434111,CH +3641434112,3641442303,CZ +3641442304,3641446399,GB +3641446400,3641450495,ES +3641450496,3641454591,RU +3641454592,3641458687,SK +3641458688,3641462783,RU +3641462784,3641466879,UZ +3641466880,3641470975,RU +3641470976,3641475071,MD +3641475072,3641479167,IT +3641479168,3641483263,GB +3641483264,3641491455,IT +3641491456,3641493503,UA +3641493504,3641494015,RU +3641494016,3641495551,UA +3641495552,3641496063,RU +3641496064,3641499647,UA +3641499648,3641503743,SA +3641503744,3641507839,RU +3641507840,3641516031,NO +3641516032,3641520127,HU +3641520128,3641524223,FR +3641524224,3641528319,DE +3641528320,3641532415,ES +3641532416,3641536511,RO +3641536512,3641540607,ES +3641540608,3641548799,GB +3641548800,3641552895,DE +3641552896,3641556991,AT +3641556992,3641559103,DE +3641559104,3641559135,NL +3641559136,3641560959,DE +3641560960,3641561087,NL +3641561088,3641565183,RU +3641565184,3641573375,SE +3641573376,3641577471,NO +3641577472,3641581567,RU +3641581568,3641585663,ES +3641585664,3641589759,RU +3641589760,3641593855,CH +3641597952,3641602047,AZ +3641602048,3641606143,DE +3641606144,3641607695,GB +3641607696,3641607711,FR +3641607712,3641610239,GB +3641610240,3641618431,DE +3641618432,3641622527,GB +3641622528,3641626623,RU +3641626624,3641630719,HR +3641630720,3641634815,AT +3641634816,3641638911,RU +3641638912,3641643007,AT +3641643008,3641647103,RU +3641647104,3641651199,ES +3641651200,3641655295,RU +3641655296,3641659391,GB +3641659392,3641663487,FR +3641663488,3641667583,MT +3641667584,3641668863,GB +3641668864,3641670655,ZW +3641670656,3641670783,SO +3641670784,3641670791,NG +3641670792,3641670911,GB +3641670912,3641671679,LS +3641671680,3641679871,RU +3641679872,3641683967,GB +3641683968,3641688063,KZ +3641688064,3641692159,RU +3641692160,3641696255,IT +3641696256,3641700351,DE +3641700352,3641704447,SE +3641704448,3641708543,FR +3641708544,3641712639,RU +3641712640,3641713447,NL +3641713448,3641713639,BE +3641713640,3641716735,NL +3641716736,3641720831,GB +3641720832,3641729023,MK +3641729024,3641733119,DK +3641733120,3641737215,AT +3641737216,3641741311,RS +3641741312,3641745407,ES +3641745408,3641749503,DE +3641749504,3641753599,RU +3641753600,3641757695,SE +3641757696,3641761791,GB +3641761792,3641761795,CY +3641761796,3641761803,GR +3641761804,3641761807,CY +3641761808,3641761851,GR +3641761852,3641761855,CY +3641761856,3641761863,GR +3641761864,3641761867,CY +3641761868,3641761895,GR +3641761896,3641761899,CY +3641761900,3641761923,GR +3641761924,3641761927,CY +3641761928,3641761935,GR +3641761936,3641761939,CY +3641761940,3641761967,GR +3641761968,3641761971,CY +3641761972,3641762007,GR +3641762008,3641762011,CY +3641762012,3641762047,GR +3641762048,3641762571,CY +3641762572,3641762575,GR +3641762576,3641762591,CY +3641762592,3641762595,GR +3641762596,3641762607,CY +3641762608,3641762611,GR +3641762612,3641762647,CY +3641762648,3641762655,GR +3641762656,3641762703,CY +3641762704,3641762711,GR +3641762712,3641762755,CY +3641762756,3641762759,GR +3641762760,3641762907,CY +3641762908,3641762947,GR +3641762948,3641762951,CY +3641762952,3641762999,GR +3641763000,3641763003,CY +3641763004,3641763023,GR +3641763024,3641763035,CY +3641763036,3641763063,GR +3641763064,3641763335,CY +3641763336,3641763339,GR +3641763340,3641763427,CY +3641763428,3641763431,GR +3641763432,3641763439,CY +3641763440,3641763443,GR +3641763444,3641763451,CY +3641763452,3641763455,GR +3641763456,3641763475,CY +3641763476,3641763479,GR +3641763480,3641763511,CY +3641763512,3641763519,GR +3641763520,3641763582,CY +3641763583,3641763583,GR +3641763584,3641764231,CY +3641764232,3641764239,GR +3641764240,3641764279,CY +3641764280,3641764283,GR +3641764284,3641764287,CY +3641764288,3641764291,GR +3641764292,3641764303,CY +3641764304,3641764307,GR +3641764308,3641764319,CY +3641764320,3641764327,GR +3641764328,3641764607,CY +3641764608,3641764631,GR +3641764632,3641764635,CY +3641764636,3641764647,GR +3641764648,3641764651,CY +3641764652,3641764679,GR +3641764680,3641764683,CY +3641764684,3641764699,GR +3641764700,3641764703,CY +3641764704,3641764711,GR +3641764712,3641764715,CY +3641764716,3641764775,GR +3641764776,3641764783,CY +3641764784,3641764847,GR +3641764848,3641764856,CY +3641764857,3641764863,GR +3641764864,3641764875,CY +3641764876,3641764899,GR +3641764900,3641764903,CY +3641764904,3641764927,GR +3641764928,3641764931,CY +3641764932,3641764943,GR +3641764944,3641764951,CY +3641764952,3641764963,GR +3641764964,3641764967,CY +3641764968,3641764975,GR +3641764976,3641764979,CY +3641764980,3641765023,GR +3641765024,3641765031,CY +3641765032,3641765083,GR +3641765084,3641765091,CY +3641765092,3641765119,GR +3641765120,3641765631,CY +3641765632,3641765887,GR +3641765888,3641769983,ES +3641769984,3641774079,NO +3641774080,3641778175,DE +3641778176,3641782271,PL +3641782272,3641784079,GB +3641784080,3641786367,BG +3641786368,3641790463,SE +3641790464,3641794559,LT +3641794560,3641796607,CS +3641796608,3641798655,RS +3641802752,3641806847,NL +3641806848,3641807871,TR +3641807872,3641808895,NL +3641808896,3641809663,TR +3641809664,3641809919,NL +3641809920,3641810315,TR +3641810316,3641810431,CY +3641810432,3641810439,NL +3641810440,3641810447,US +3641810448,3641810463,NL +3641810464,3641810479,US +3641810480,3641810559,TR +3641810560,3641810623,US +3641810624,3641810631,TR +3641810632,3641810642,US +3641810643,3641810687,TR +3641810688,3641810943,CY +3641810944,3641819135,RU +3641819136,3641823231,DE +3641823232,3641827327,NO +3641827328,3641835519,BH +3641835520,3641839615,IT +3641839616,3641843711,GB +3641843712,3641847807,ES +3641847808,3641851903,RU +3641851904,3641855999,NL +3641856000,3641860095,GB +3641860096,3641868287,IT +3641868288,3641876479,RU +3641876480,3641880575,ES +3641880576,3641881343,DE +3641881344,3641881359,US +3641881360,3641881391,DE +3641881392,3641881395,CH +3641881396,3641881399,DE +3641881400,3641881407,CH +3641881408,3641881423,DE +3641881424,3641881439,US +3641881440,3641881447,DE +3641881448,3641881455,CH +3641881456,3641881567,DE +3641881568,3641881583,CH +3641881584,3641882727,DE +3641882728,3641882735,CH +3641882736,3641884671,DE +3641884672,3641888767,NO +3641888768,3641892863,IT +3641892864,3641896959,ES +3641896960,3641901055,BG +3641901056,3641905151,RO +3641905152,3641909247,NL +3641909248,3641913343,AT +3641913344,3641917439,FR +3641917440,3641925631,GR +3641925632,3641933823,RU +3641933824,3641937919,GB +3641937920,3641942015,IT +3641942016,3641950207,DE +3641950208,3641954303,FR +3641954304,3641957887,MD +3641957888,3641957951,GB +3641957952,3641958143,MD +3641958144,3641958207,GB +3641958208,3641958399,MD +3641958400,3641960699,BE +3641960700,3641960703,NL +3641960704,3641961727,BE +3641961728,3641961743,NL +3641961744,3641961791,BE +3641961792,3641961799,US +3641961800,3641962495,BE +3641962496,3641966591,GB +3641966592,3641970687,IT +3641970688,3641971759,GB +3641971760,3641971775,BG +3641971776,3641978879,GB +3641978880,3641982975,DK +3641982976,3641991167,RU +3641991168,3641995263,SE +3641995264,3641999359,DE +3641999360,3642003455,HU +3642003456,3642007551,DE +3642007552,3642015743,UA +3642015744,3642019839,CH +3642019840,3642023935,RU +3642028032,3642028287,GB +3642028288,3642028543,NG +3642028544,3642028544,GB +3642028545,3642028799,NG +3642028800,3642028800,GB +3642028801,3642028863,SO +3642028864,3642028928,GB +3642028929,3642029055,NG +3642029056,3642029056,GB +3642029057,3642029311,NG +3642029312,3642029567,GB +3642029568,3642031359,NG +3642031360,3642031616,GB +3642031617,3642031871,NG +3642031872,3642032127,GB +3642032128,3642036223,PS +3642036224,3642040319,RU +3642040320,3642048511,BY +3642048512,3642053439,IL +3642053440,3642053631,TZ +3642053632,3642055935,IL +3642055936,3642056703,KE +3642056704,3642060799,RU +3642064896,3642068991,SE +3642068992,3642073087,NL +3642073088,3642077183,LV +3642077184,3642081279,BE +3642081280,3642085375,NL +3642085376,3642089471,RU +3642089472,3642093567,SE +3642093568,3642097663,NL +3642097664,3642101759,GB +3642101760,3642109951,NO +3642109952,3642114047,BE +3642114048,3642118143,NL +3642118144,3642122239,GB +3642122240,3642126335,ES +3642126336,3642130431,IL +3642130432,3642134527,DE +3642134528,3642138623,GB +3642138624,3642142719,RU +3642142720,3642146815,MT +3642146816,3642150911,DE +3642150912,3642163199,IT +3642163200,3642167295,NL +3642167296,3642171391,RU +3642171392,3642175487,JO +3642175488,3642179583,DE +3642179584,3642187775,RU +3642187776,3642190591,DK +3642190592,3642190623,NO +3642190624,3642191423,DK +3642191424,3642191455,ES +3642191456,3642191487,TR +3642191488,3642191519,CH +3642191520,3642191551,CY +3642191552,3642191583,ES +3642191584,3642191615,US +3642191616,3642191647,ZA +3642191648,3642191679,AU +3642191680,3642191711,TH +3642191712,3642191743,BR +3642191744,3642191871,DK +3642191872,3642195967,BY +3642195968,3642204159,RU +3642204160,3642208255,GB +3642208256,3642212351,RU +3642212352,3642216447,BA +3642216448,3642220543,HU +3642220544,3642224639,GB +3642224640,3642228735,SK +3642228736,3642232831,DE +3642232832,3642233855,CS +3642233856,3642234879,RS +3642234880,3642234943,CS +3642234944,3642234999,RS +3642235000,3642235007,CS +3642235008,3642235903,RS +3642235904,3642236927,CS +3642236928,3642241023,CH +3642241024,3642245119,DE +3642245120,3642249215,LV +3642249216,3642253311,FR +3642253312,3642257407,FI +3642257408,3642261503,RU +3642261504,3642265599,GB +3642265600,3642265855,IR +3642265856,3642266111,AE +3642266112,3642269695,IR +3642269696,3642273791,UA +3642273792,3642277887,RU +3642277888,3642290175,DE +3642290176,3642294271,AL +3642294272,3642298367,GB +3642298368,3642302463,AZ +3642302464,3642306559,SE +3642306560,3642310655,IR +3642310656,3642314751,DE +3642314752,3642318847,RU +3642318848,3642322943,FI +3642322944,3642327039,AT +3642327040,3642331135,DE +3642331136,3642335231,RU +3642339328,3642343423,FR +3642343424,3642347519,UA +3642347520,3642355711,RU +3642355712,3642359807,SE +3642359808,3642367999,RU +3642368000,3642376191,CH +3642376192,3642379519,CS +3642379520,3642379711,CS +3642379712,3642380031,CS +3642380032,3642380063,CS +3642380064,3642380095,RS +3642380096,3642380287,CS +3642380288,3642384383,IT +3642384384,3642388479,NO +3642388480,3642392575,NL +3642392576,3642396671,AM +3642396672,3642404863,MD +3642404864,3642408959,RU +3642408960,3642413055,FR +3642413056,3642414591,CS +3642414592,3642415627,GB +3642415628,3642415635,MT +3642415636,3642415651,GB +3642415652,3642415655,MT +3642415656,3642417151,GB +3642417152,3642421247,IT +3642421248,3642429439,DE +3642429440,3642433535,GB +3642433536,3642435583,CY +3642435584,3642436607,RU +3642436608,3642437119,GR +3642437120,3642437631,GB +3642437632,3642439423,CY +3642439424,3642439459,RU +3642439460,3642439463,CY +3642439464,3642439471,RU +3642439472,3642439483,CY +3642439484,3642439495,RU +3642439496,3642439551,CY +3642439552,3642439567,RU +3642439568,3642440447,CY +3642440448,3642440451,RU +3642440452,3642441727,CY +3642441728,3642449919,IT +3642449920,3642454015,CH +3642454016,3642458111,IT +3642458112,3642462207,RU +3642462208,3642466303,UA +3642466304,3642474495,SE +3642474496,3642478591,DE +3642478592,3642482687,HU +3642482688,3642486783,NL +3642486784,3642499071,GB +3642499072,3642503167,SE +3642503168,3642507263,LV +3642507264,3642511359,FR +3642511360,3642515455,RU +3642515456,3642519551,DE +3642519552,3642523647,IT +3642523648,3642527743,GB +3642527744,3642531839,PL +3642531840,3642532351,DK +3642532352,3642532607,GB +3642532608,3642532863,US +3642532864,3642535935,DK +3642535936,3642540031,IS +3642540032,3642544127,SE +3642544128,3642552319,RU +3642552320,3642552639,NL +3642552640,3642552655,EE +3642552656,3642552663,HU +3642552664,3642552671,NL +3642552672,3642552687,SE +3642552688,3642553103,NL +3642553104,3642553119,LV +3642553120,3642553151,NL +3642553152,3642553326,LV +3642553327,3642553343,NL +3642553344,3642553363,RU +3642553364,3642553375,NL +3642553376,3642553377,RU +3642553378,3642553379,NL +3642553380,3642553383,RU +3642553384,3642553387,NL +3642553388,3642553411,RU +3642553412,3642553415,NL +3642553416,3642553427,RU +3642553428,3642553431,NL +3642553432,3642553455,RU +3642553456,3642553467,NL +3642553468,3642553519,RU +3642553520,3642553523,NL +3642553524,3642553535,RU +3642553536,3642553543,DE +3642553544,3642553587,RU +3642553588,3642554111,NL +3642554112,3642554151,RU +3642554152,3642554175,NL +3642554176,3642554197,RU +3642554198,3642554199,NL +3642554200,3642554203,RU +3642554204,3642554205,NL +3642554206,3642554223,RU +3642554224,3642554239,NL +3642554240,3642554271,RU +3642554272,3642554367,NL +3642554368,3642554623,LT +3642554624,3642554631,NL +3642554632,3642554675,LV +3642554676,3642554679,EE +3642554680,3642554783,LV +3642554784,3642554799,NL +3642554800,3642554807,EE +3642554808,3642554879,LV +3642554880,3642554911,DE +3642554912,3642554919,NL +3642554920,3642554927,DE +3642554928,3642554931,NL +3642554932,3642554951,UA +3642554952,3642554955,NL +3642554956,3642554959,GE +3642554960,3642554963,DE +3642554964,3642554967,UA +3642554968,3642554971,LV +3642554972,3642554975,DE +3642554976,3642554977,CZ +3642554978,3642554979,FR +3642554980,3642554983,BE +3642554984,3642554987,DE +3642554988,3642554989,FR +3642554990,3642554991,UA +3642554992,3642555011,DE +3642555012,3642555017,NL +3642555018,3642555023,DE +3642555024,3642555039,NL +3642555040,3642555045,DE +3642555046,3642555047,NL +3642555048,3642555051,DE +3642555052,3642555055,UA +3642555056,3642555135,NL +3642555136,3642555223,LT +3642555224,3642555227,LV +3642555228,3642555391,LT +3642555392,3642555479,PL +3642555480,3642555647,NL +3642555648,3642555683,SE +3642555684,3642555687,NL +3642555688,3642555695,SE +3642555696,3642555703,LV +3642555704,3642555707,FI +3642555708,3642555711,SE +3642555712,3642555727,RU +3642555728,3642555735,SE +3642555736,3642555743,GB +3642555744,3642555759,SE +3642555760,3642555771,GB +3642555772,3642555935,NL +3642555936,3642555983,UA +3642555984,3642556159,NL +3642556160,3642556415,LV +3642556416,3642560511,CZ +3642560512,3642564607,KG +3642564608,3642568703,DE +3642568704,3642572799,RU +3642572800,3642576895,IT +3642576896,3642580991,RU +3642580992,3642585087,ES +3642585088,3642585855,RU +3642585856,3642586111,US +3642586112,3642589183,UZ +3642593280,3642597375,AT +3642597376,3642601471,IT +3642601472,3642605567,RU +3642605568,3642609663,GB +3642613760,3642615583,FI +3642615584,3642615615,AX +3642615616,3642617855,FI +3642617856,3642621951,JO +3642621952,3642626047,IT +3642626048,3642630143,BE +3642630144,3642634239,DK +3642634240,3642638335,DE +3642638336,3642642431,CZ +3642642432,3642646527,DK +3642646528,3642650623,MT +3642650624,3642654719,GB +3642654720,3642662911,PL +3642662912,3642667007,GR +3642667008,3642671103,FI +3642671104,3642675199,UA +3642675200,3642679295,BG +3642679296,3642683391,DE +3642683392,3642687487,RU +3642687488,3642691583,GB +3642691584,3642695679,DE +3642695680,3642699775,SK +3642699776,3642703871,CZ +3642703872,3642707967,LU +3642707968,3642712063,DE +3642712064,3642716159,NO +3642716160,3642720255,IT +3642720256,3642728447,GB +3642728448,3642736639,SE +3642736640,3642740735,CZ +3642740736,3642744831,DE +3642744832,3642753023,TR +3642753024,3643801599,GB +3643801600,3644063743,DE +3644325888,3644588031,IT +3644588032,3644719103,DK +3644719104,3644809215,NL +3644809216,3644817407,AM +3644817408,3644850175,NL +3644850176,3644854271,CZ +3644854272,3644858367,AZ +3644858368,3644862463,GB +3644862464,3644866559,FR +3644866560,3644871167,DE +3644871168,3644871423,AT +3644871424,3644874751,DE +3644878848,3644882943,GB +3644882944,3644887039,RU +3644887040,3644891135,IR +3644891136,3644895231,DE +3644895232,3644899327,FI +3644899328,3644903423,IT +3644903424,3644907519,TR +3644907520,3644908983,GB +3644908984,3644908991,IT +3644908992,3644909855,GB +3644909856,3644909859,IS +3644909860,3644911615,GB +3644911616,3644915711,BE +3644915712,3644919807,RU +3644919808,3644923903,DE +3644923904,3644924927,IL +3644924928,3644925055,US +3644925056,3644925119,CI +3644925120,3644926207,US +3644926208,3644926223,IL +3644926224,3644927999,US +3644928000,3644932095,GI +3644932096,3644936191,IT +3644936192,3644940287,RU +3644940288,3644948479,HU +3644948480,3644952575,DE +3644952576,3644960767,GB +3644960768,3644961311,DE +3644961312,3644961343,TR +3644961344,3644961791,DE +3644961792,3644964351,TR +3644964352,3644964383,DE +3644964384,3644964863,TR +3644964864,3644966911,RS +3644966912,3644966927,CS +3644966928,3644968959,RS +3644968960,3644973055,RU +3644973056,3644977151,NO +3644977152,3644981247,UA +3644981248,3644985343,BE +3644985344,3644989439,RU +3644989440,3644997631,DE +3644997632,3645005823,RU +3645005824,3645009919,UA +3645009920,3645014015,FR +3645014016,3645018111,DE +3645018112,3645022207,RU +3645022208,3645030143,CZ +3645030144,3645030399,SK +3645030400,3645038591,IR +3645038592,3645046783,PS +3645046784,3645050879,RU +3645050880,3645054975,SK +3645054976,3645059071,DE +3645059072,3645063167,GB +3645063168,3645067263,UA +3645067264,3645071359,SE +3645071360,3645075455,DE +3645075456,3645079551,RU +3645079552,3645083647,IE +3645083648,3645087743,FR +3645087744,3645091839,ES +3645091840,3645095935,RU +3645095936,3645104127,PL +3645104128,3645112319,NL +3645112320,3645116415,DE +3645116416,3645120511,GB +3645120512,3645124607,SE +3645124608,3645128703,NL +3645128704,3645132799,GB +3645132800,3645136895,HR +3645136896,3645145087,NO +3645145088,3645149183,GB +3645149184,3645149887,DE +3645149888,3645149951,HK +3645149952,3645150559,DE +3645150560,3645150591,HK +3645150592,3645150615,DE +3645150616,3645150623,US +3645150624,3645150975,DE +3645150976,3645151231,US +3645151232,3645151487,DE +3645151488,3645151615,MT +3645151616,3645152767,DE +3645152768,3645152799,HK +3645152800,3645161471,DE +3645161472,3645165567,AT +3645165568,3645169663,TR +3645169664,3645173759,CH +3645173760,3645177855,GB +3645177856,3645181951,GR +3645181952,3645183327,FR +3645183328,3645183359,GB +3645183360,3645183615,FR +3645183616,3645183679,SA +3645183680,3645183743,FR +3645183744,3645183871,GB +3645183872,3645183999,FR +3645184000,3645184255,US +3645184256,3645184256,FR +3645184257,3645184383,GB +3645184384,3645186047,FR +3645186048,3645190143,GB +3645190144,3645194239,FI +3645194240,3645202431,DE +3645202432,3645206527,CZ +3645206528,3645210623,LV +3645210624,3645214719,RU +3645214720,3645218815,NL +3645218816,3645222911,DE +3645222912,3645227007,KW +3645227008,3645235199,RU +3645235200,3645243391,DE +3645243392,3645247487,ES +3645247488,3645251583,RU +3645251584,3645255679,SE +3645255680,3645259775,PL +3645259776,3645263871,PT +3645263872,3645267967,FR +3645267968,3645276159,RU +3645276160,3645280255,DE +3645280256,3645281279,IT +3645281280,3645281535,DE +3645281536,3645281791,IT +3645281792,3645281919,HU +3645281920,3645284351,IT +3645284352,3645288447,DE +3645288448,3645292543,FR +3645292544,3645295103,DE +3645295104,3645295359,NL +3645295360,3645296639,DE +3645296640,3645300735,NL +3645300736,3645304831,BE +3645304832,3645308927,ES +3645308928,3645313023,DK +3645313024,3645317119,ES +3645317120,3645321215,EE +3645321216,3645325311,BA +3645325312,3645329407,IT +3645329408,3645333503,CH +3645333504,3645334031,DE +3645334272,3645336927,DE +3645336936,3645336991,DE +3645337008,3645337023,DE +3645337088,3645337599,DE +3645337600,3645337631,FR +3645337632,3645337663,BE +3645337664,3645338399,FR +3645338400,3645338431,BE +3645338432,3645339295,FR +3645339296,3645339359,BE +3645339360,3645339391,FR +3645339392,3645339647,NL +3645339648,3645339903,FR +3645339904,3645339967,BE +3645339968,3645340415,FR +3645340416,3645340447,NL +3645340448,3645340543,FR +3645340544,3645340927,BE +3645340928,3645341183,FR +3645341184,3645341439,BE +3645341440,3645341695,FR +3645341696,3645345791,RU +3645345792,3645349887,FI +3645349888,3645353983,RU +3645353984,3645358079,MT +3645358080,3645362175,ES +3645362176,3645366271,FR +3645366272,3645370367,RU +3645370368,3645374463,CH +3645374464,3645378559,RU +3645378560,3645382655,SE +3645382656,3645386751,IT +3645386752,3645390847,SE +3645390848,3645399039,SI +3645399040,3645403135,IT +3645403136,3645408255,DE +3645408256,3645408319,CH +3645408320,3645411327,DE +3645411328,3645415423,RU +3645415424,3645423615,GB +3645423616,3645431807,DE +3645431808,3645435903,BE +3645435904,3645439999,GB +3645440000,3645444095,SE +3645444096,3645448191,SK +3645448192,3645456383,DE +3645456384,3645456639,GB +3645456640,3645456895,DE +3645456896,3645457407,GB +3645457408,3645460479,DE +3645460480,3645464575,UA +3645464576,3645468671,SE +3645468672,3645472767,RU +3645472768,3645476607,UA +3645476608,3645476863,US +3645476864,3645480959,DE +3645480960,3645485055,RO +3645485056,3645489151,MT +3645489152,3645493247,RU +3645493248,3645501439,IT +3645505536,3645506559,DE +3645506560,3645506815,AT +3645506816,3645507583,DE +3645507584,3645507587,AT +3645507588,3645507591,DE +3645507592,3645507595,AT +3645507596,3645507599,DE +3645507600,3645507607,AT +3645507608,3645509631,DE +3645509632,3645513727,GB +3645513728,3645517823,RU +3645517824,3645521919,IE +3645521920,3645526015,PL +3645526016,3645530111,SE +3645530112,3645534207,FR +3645534208,3645544959,RU +3645544960,3645544991,KZ +3645544992,3645545087,RU +3645545088,3645545215,TJ +3645545216,3645550591,RU +3645550592,3645558783,DE +3645558784,3645562879,DK +3645562880,3645563135,BW +3645563136,3645564671,LS +3645564672,3645564927,PK +3645564928,3645565055,SO +3645565056,3645565695,GB +3645565696,3645566975,ZW +3645566976,3645571071,RU +3645571072,3645575167,IE +3645575168,3645579263,CH +3645579264,3645583359,NL +3645583360,3645587455,PL +3645587456,3645595647,SK +3645595648,3645597751,SE +3645597752,3645597759,GB +3645597760,3645601471,SE +3645601472,3645601487,NO +3645601488,3645601759,SE +3645601760,3645601775,FR +3645601776,3645603839,SE +3645603840,3645612031,BG +3645612032,3645616127,GB +3645616128,3645620223,AT +3645620224,3645624319,BA +3645624320,3645628415,CZ +3645628416,3645636607,ES +3645636608,3645640703,AM +3645640704,3645644799,NL +3645644800,3645648895,RU +3645648896,3645652991,SE +3645652992,3645657087,KZ +3645657088,3645661183,SE +3645661184,3645665279,DE +3645665280,3645669375,PL +3645669376,3645669631,ES +3645669632,3645669855,FR +3645669856,3645670399,ES +3645670400,3645670911,FR +3645670912,3645673471,ES +3645673472,3645673535,FR +3645673536,3645675263,ES +3645675264,3645675519,PT +3645675520,3645675759,ES +3645675760,3645675775,FR +3645675776,3645676015,ES +3645676016,3645676031,FR +3645676032,3645677567,ES +3645677568,3645681663,AT +3645681664,3645685759,RU +3645685760,3645689855,UA +3645689856,3645693951,IT +3645693952,3645698047,BE +3645698048,3645702143,ES +3645702144,3645706239,GB +3645706240,3645710335,LT +3645710336,3645714431,NO +3645714432,3645718527,RU +3645722624,3645726719,IT +3645726720,3645734911,RU +3645734912,3645743103,NL +3645743104,3645747199,CZ +3645747200,3645751295,GB +3645751296,3645755391,FI +3645755392,3645759487,UA +3645759488,3645763583,FR +3645763584,3645763585,DE +3645763586,3645763587,IT +3645763588,3645763588,DE +3645763589,3645763589,IE +3645763590,3645763590,ES +3645763591,3645763591,IT +3645763592,3645763593,DE +3645763594,3645763594,CH +3645763595,3645763595,IT +3645763596,3645763597,DE +3645763598,3645763598,NL +3645763599,3645763600,DE +3645763601,3645763601,GR +3645763602,3645763603,FR +3645763604,3645763609,DE +3645763610,3645763610,PL +3645763611,3645763612,DE +3645763613,3645763613,HU +3645763614,3645763614,CH +3645763615,3645763615,ES +3645763616,3645763616,FR +3645763617,3645763617,DE +3645763618,3645763618,ES +3645763619,3645763619,DE +3645763620,3645763620,FR +3645763621,3645763621,CH +3645763622,3645763622,GB +3645763623,3645763623,FR +3645763624,3645763624,DE +3645763625,3645763625,FR +3645763626,3645763626,NL +3645763627,3645763627,AT +3645763628,3645763629,DE +3645763630,3645763631,NL +3645763632,3645763633,GB +3645763634,3645763634,NL +3645763635,3645763635,DE +3645763636,3645763636,AT +3645763637,3645763637,FR +3645763638,3645763638,NL +3645763639,3645763639,DE +3645763640,3645763640,HU +3645763641,3645763641,IT +3645763642,3645763642,GB +3645763643,3645763644,DE +3645763645,3645763645,NL +3645763646,3645763647,ES +3645763648,3645763648,DE +3645763649,3645763649,IL +3645763650,3645763650,DE +3645763651,3645763651,NL +3645763652,3645763653,DE +3645763654,3645763654,ES +3645763655,3645763660,DE +3645763661,3645763662,FR +3645763663,3645763663,HU +3645763664,3645763665,DE +3645763666,3645763666,NL +3645763667,3645763667,DE +3645763668,3645763668,IT +3645763669,3645763669,DK +3645763670,3645763670,DE +3645763671,3645763671,FR +3645763672,3645763672,DE +3645763673,3645763673,BE +3645763674,3645763674,DE +3645763675,3645763675,NL +3645763676,3645763676,DE +3645763677,3645763678,HU +3645763679,3645763679,IT +3645763680,3645763680,DE +3645763681,3645763681,CH +3645763682,3645763682,DE +3645763683,3645763683,NO +3645763684,3645763684,CH +3645763685,3645763685,NL +3645763686,3645763686,DE +3645763687,3645763687,ES +3645763688,3645763690,NL +3645763691,3645763691,CH +3645763692,3645763692,DE +3645763693,3645763693,NL +3645763694,3645763694,IE +3645763695,3645763696,DE +3645763697,3645763697,NL +3645763698,3645763698,LU +3645763699,3645763699,BE +3645763700,3645763700,NL +3645763701,3645763701,DE +3645763702,3645763702,IT +3645763703,3645763703,CH +3645763704,3645763705,DE +3645763706,3645763706,GB +3645763707,3645763707,NL +3645763708,3645763708,GR +3645763709,3645763709,NL +3645763710,3645763710,GB +3645763711,3645763715,NL +3645763716,3645763716,DE +3645763717,3645763717,NL +3645763718,3645763718,DE +3645763719,3645763719,NL +3645763720,3645763720,IT +3645763721,3645763721,DE +3645763722,3645763722,GR +3645763723,3645763723,NL +3645763724,3645763726,IT +3645763727,3645763727,NL +3645763728,3645763728,GR +3645763729,3645763730,IT +3645763731,3645763732,DE +3645763733,3645763733,FR +3645763734,3645763734,DE +3645763735,3645763735,GB +3645763736,3645763736,FR +3645763737,3645763737,DE +3645763738,3645763738,CH +3645763739,3645763741,ES +3645763742,3645763742,DE +3645763743,3645763743,IT +3645763744,3645763744,DE +3645763745,3645763745,FR +3645763746,3645763746,DE +3645763747,3645763752,NL +3645763753,3645763753,ES +3645763754,3645763755,NL +3645763756,3645763756,DE +3645763757,3645763757,BE +3645763758,3645763758,FR +3645763759,3645763760,NL +3645763761,3645763761,SE +3645763762,3645763762,ES +3645763763,3645763764,NL +3645763765,3645763765,DE +3645763766,3645763766,IL +3645763767,3645763768,NL +3645763769,3645763769,FR +3645763770,3645763770,NL +3645763771,3645763771,GB +3645763772,3645763772,CH +3645763773,3645763773,DE +3645763774,3645763774,NL +3645763775,3645763775,DE +3645763776,3645763776,NL +3645763777,3645763777,BE +3645763778,3645763779,DE +3645763780,3645763780,CH +3645763781,3645763781,DE +3645763782,3645763782,NL +3645763783,3645763783,DE +3645763784,3645763784,NL +3645763785,3645763785,DE +3645763786,3645763786,CH +3645763787,3645763787,NL +3645763788,3645763788,IE +3645763789,3645763789,AT +3645763790,3645763790,ES +3645763791,3645763791,IT +3645763792,3645763792,FR +3645763793,3645763793,ES +3645763794,3645763794,DE +3645763795,3645763795,IT +3645763796,3645763796,GB +3645763797,3645763797,DE +3645763798,3645763798,FR +3645763799,3645763801,DE +3645763802,3645763802,ES +3645763803,3645763803,NL +3645763804,3645763806,DE +3645763807,3645763807,IT +3645763808,3645763808,DE +3645763809,3645763809,IT +3645763810,3645763810,NL +3645763811,3645763813,DE +3645763814,3645763814,IT +3645763815,3645763816,DE +3645763817,3645763817,GR +3645763818,3645763818,ES +3645763819,3645763822,DE +3645763823,3645763823,ES +3645763824,3645763825,DE +3645763826,3645763826,IT +3645763827,3645763827,ZA +3645763828,3645763841,DE +3645763842,3645763842,CH +3645763843,3645763845,DE +3645763846,3645763846,FR +3645763847,3645763847,IT +3645763848,3645763849,DE +3645763850,3645763850,IT +3645763851,3645763851,GB +3645763852,3645763852,DE +3645763853,3645763853,CH +3645763854,3645763855,NL +3645763856,3645763858,DE +3645763859,3645763859,DK +3645763860,3645763860,IT +3645763861,3645763861,DE +3645763862,3645763862,FR +3645763863,3645763864,ES +3645763865,3645763865,CH +3645763866,3645763866,DE +3645763867,3645763868,GB +3645763869,3645763869,DE +3645763870,3645763870,HU +3645763871,3645763874,DE +3645763875,3645763875,GB +3645763876,3645763876,PL +3645763877,3645763877,FR +3645763878,3645763879,DE +3645763880,3645763881,FR +3645763882,3645763882,DE +3645763883,3645763883,NL +3645763884,3645763884,IT +3645763885,3645763886,DE +3645763887,3645763887,FR +3645763888,3645763888,DE +3645763889,3645763889,GR +3645763890,3645763890,ES +3645763891,3645763894,DE +3645763895,3645763895,ES +3645763896,3645763896,DE +3645763897,3645763897,BE +3645763898,3645763898,NL +3645763899,3645763899,ES +3645763900,3645763900,NL +3645763901,3645763902,LU +3645763903,3645763903,DE +3645763904,3645763904,BE +3645763905,3645763905,CS +3645763906,3645763906,DE +3645763907,3645763908,IT +3645763909,3645763909,DE +3645763910,3645763910,ES +3645763911,3645763911,DE +3645763912,3645763912,IE +3645763913,3645763913,PT +3645763914,3645763914,DE +3645763915,3645763915,IL +3645763916,3645763916,BE +3645763917,3645763918,IT +3645763919,3645763919,GB +3645763920,3645763920,DE +3645763921,3645763921,CH +3645763922,3645763922,ES +3645763923,3645763923,GB +3645763924,3645763924,PL +3645763925,3645763926,DE +3645763927,3645763927,HU +3645763928,3645763928,FR +3645763929,3645763929,NL +3645763930,3645763930,ES +3645763931,3645763931,FR +3645763932,3645763932,DE +3645763933,3645763933,FR +3645763934,3645763934,IT +3645763935,3645763935,FR +3645763936,3645763936,DE +3645763937,3645763937,NL +3645763938,3645763938,ES +3645763939,3645763939,NL +3645763940,3645763941,DE +3645763942,3645763942,CH +3645763943,3645763943,ES +3645763944,3645763944,CH +3645763945,3645763945,DE +3645763946,3645763947,HU +3645763948,3645763949,DE +3645763950,3645763950,ES +3645763951,3645763951,CH +3645763952,3645763952,IT +3645763953,3645763953,TR +3645763954,3645763954,IT +3645763955,3645763955,FR +3645763956,3645763956,DE +3645763957,3645763957,GB +3645763958,3645763958,AT +3645763959,3645763959,DE +3645763960,3645763960,IT +3645763961,3645763961,DE +3645763962,3645763962,ES +3645763963,3645763964,DE +3645763965,3645763965,AT +3645763966,3645763966,DE +3645763967,3645763967,IT +3645763968,3645763968,DE +3645763969,3645763969,ES +3645763970,3645763970,IT +3645763971,3645763971,ES +3645763972,3645763972,IT +3645763973,3645763973,BE +3645763974,3645763974,GB +3645763975,3645763975,AT +3645763976,3645763976,IT +3645763977,3645763977,DE +3645763978,3645763978,NL +3645763979,3645763979,IT +3645763980,3645763981,DE +3645763982,3645763982,IT +3645763983,3645763984,FR +3645763985,3645763985,NL +3645763986,3645763986,DE +3645763987,3645763987,PL +3645763988,3645763988,CH +3645763989,3645763989,FR +3645763990,3645763991,DE +3645763992,3645763993,NL +3645763994,3645763994,IT +3645763995,3645763995,ES +3645763996,3645764000,DE +3645764001,3645764001,IT +3645764002,3645764007,DE +3645764008,3645764008,PL +3645764009,3645764010,FR +3645764011,3645764012,DE +3645764013,3645764013,HU +3645764014,3645764015,GB +3645764016,3645764016,IT +3645764017,3645764017,GB +3645764018,3645764018,ES +3645764019,3645764019,NL +3645764020,3645764020,IT +3645764021,3645764021,DE +3645764022,3645764022,ES +3645764023,3645764023,FR +3645764024,3645764026,ES +3645764027,3645764027,HU +3645764028,3645764028,DE +3645764029,3645764029,ES +3645764030,3645764030,DE +3645764031,3645764031,NL +3645764032,3645764032,FR +3645764033,3645764033,ES +3645764034,3645764034,DE +3645764035,3645764035,IT +3645764036,3645764037,ES +3645764038,3645764038,IT +3645764039,3645764039,HU +3645764040,3645764040,ES +3645764041,3645764041,DE +3645764042,3645764042,CH +3645764043,3645764043,DE +3645764044,3645764044,ES +3645764045,3645764045,AE +3645764046,3645764046,ES +3645764047,3645764047,DE +3645764048,3645764048,BE +3645764049,3645764049,ES +3645764050,3645764051,DE +3645764052,3645764052,FR +3645764053,3645764055,DE +3645764056,3645764056,BE +3645764057,3645764057,DE +3645764058,3645764058,TR +3645764059,3645764059,DE +3645764060,3645764060,FR +3645764061,3645764061,IT +3645764062,3645764062,SE +3645764063,3645764063,AT +3645764064,3645764064,SI +3645764065,3645764065,DE +3645764066,3645764066,IT +3645764067,3645764067,DE +3645764068,3645764068,IT +3645764069,3645764069,CH +3645764070,3645764070,GB +3645764071,3645764074,DE +3645764075,3645764075,SE +3645764076,3645764076,GR +3645764077,3645764078,DE +3645764079,3645764079,ES +3645764080,3645764080,DE +3645764081,3645764081,GB +3645764082,3645764084,DE +3645764085,3645764085,IE +3645764086,3645764086,IT +3645764087,3645764087,CH +3645764088,3645764093,DE +3645764094,3645764094,IT +3645764095,3645764097,DE +3645764098,3645764098,IT +3645764099,3645764099,DE +3645764100,3645764100,BE +3645764101,3645764101,DE +3645764102,3645764102,PL +3645764103,3645764103,SK +3645764104,3645764105,IT +3645764106,3645764106,NL +3645764107,3645764107,GR +3645764108,3645764108,PL +3645764109,3645764109,CH +3645764110,3645764110,DK +3645764111,3645764111,DE +3645764112,3645764112,IT +3645764113,3645764114,ES +3645764115,3645764115,GB +3645764116,3645764116,GR +3645764117,3645764117,DE +3645764118,3645764118,GB +3645764119,3645764119,CH +3645764120,3645764120,FR +3645764121,3645764121,IT +3645764122,3645764122,DE +3645764123,3645764123,PL +3645764124,3645764124,DE +3645764125,3645764125,NO +3645764126,3645764126,LU +3645764127,3645764127,GB +3645764128,3645764128,GR +3645764129,3645764129,HR +3645764130,3645764130,FR +3645764131,3645764131,DE +3645764132,3645764132,ES +3645764133,3645764133,CY +3645764134,3645764134,DE +3645764135,3645764135,IT +3645764136,3645764136,BE +3645764137,3645764137,DE +3645764138,3645764138,CH +3645764139,3645764139,PL +3645764140,3645764140,NL +3645764141,3645764141,ES +3645764142,3645764142,HU +3645764143,3645764145,DE +3645764146,3645764147,NL +3645764148,3645764148,DK +3645764149,3645764149,DE +3645764150,3645764150,ES +3645764151,3645764154,DE +3645764155,3645764155,ES +3645764156,3645764156,AT +3645764157,3645764158,DE +3645764159,3645764159,IT +3645764160,3645764160,BE +3645764161,3645764161,ES +3645764162,3645764162,DE +3645764163,3645764163,NL +3645764164,3645764164,DE +3645764165,3645764165,CH +3645764166,3645764166,HU +3645764167,3645764167,DE +3645764168,3645764168,ES +3645764169,3645764169,GR +3645764170,3645764170,IT +3645764171,3645764172,DE +3645764173,3645764173,IT +3645764174,3645764174,DE +3645764175,3645764175,PL +3645764176,3645764176,DE +3645764177,3645764177,GB +3645764178,3645764178,ES +3645764179,3645764179,GR +3645764180,3645764181,DE +3645764182,3645764182,FR +3645764183,3645764184,DE +3645764185,3645764185,IT +3645764186,3645764186,FR +3645764187,3645764187,BE +3645764188,3645764188,GB +3645764189,3645764189,FR +3645764190,3645764190,IT +3645764191,3645764191,GB +3645764192,3645764192,DE +3645764193,3645764194,ES +3645764195,3645764195,DE +3645764196,3645764196,IT +3645764197,3645764197,DE +3645764198,3645764198,GR +3645764199,3645764199,DE +3645764200,3645764200,IT +3645764201,3645764201,BE +3645764202,3645764202,IT +3645764203,3645764203,DE +3645764204,3645764204,ES +3645764205,3645764205,FR +3645764206,3645764206,DE +3645764207,3645764207,IT +3645764208,3645764208,NO +3645764209,3645764210,DE +3645764211,3645764211,FR +3645764212,3645764212,NL +3645764213,3645764213,GB +3645764214,3645764214,NL +3645764215,3645764216,DE +3645764217,3645764217,IT +3645764218,3645764218,CH +3645764219,3645764219,FR +3645764220,3645764220,NL +3645764221,3645764221,IT +3645764222,3645764222,BE +3645764223,3645764224,ES +3645764225,3645764226,GB +3645764227,3645764227,CH +3645764228,3645764228,FR +3645764229,3645764229,PL +3645764230,3645764230,NL +3645764231,3645764231,CH +3645764232,3645764232,DE +3645764233,3645764233,IT +3645764234,3645764234,DE +3645764235,3645764235,FR +3645764236,3645764236,IT +3645764237,3645764238,DE +3645764239,3645764240,ES +3645764241,3645764241,DE +3645764242,3645764242,AT +3645764243,3645764243,GR +3645764244,3645764244,FR +3645764245,3645764246,NL +3645764247,3645764247,IT +3645764248,3645764249,DE +3645764250,3645764250,GB +3645764251,3645764251,FR +3645764252,3645764253,ES +3645764254,3645764254,DE +3645764255,3645764255,CH +3645764256,3645764257,DE +3645764258,3645764258,NL +3645764259,3645764259,IT +3645764260,3645764260,DE +3645764261,3645764261,GB +3645764262,3645764262,BE +3645764263,3645764264,IT +3645764265,3645764265,TR +3645764266,3645764266,NL +3645764267,3645764268,DE +3645764269,3645764270,ES +3645764271,3645764271,IT +3645764272,3645764272,DE +3645764273,3645764273,IT +3645764274,3645764274,DE +3645764275,3645764275,FR +3645764276,3645764277,DE +3645764278,3645764278,NL +3645764279,3645764279,ES +3645764280,3645764280,IT +3645764281,3645764281,DE +3645764282,3645764282,NL +3645764283,3645764284,FR +3645764285,3645764285,IT +3645764286,3645764286,NL +3645764287,3645764287,BE +3645764288,3645764288,FR +3645764289,3645764289,NL +3645764290,3645764290,DE +3645764291,3645764291,NL +3645764292,3645764292,FR +3645764293,3645764294,IT +3645764295,3645764295,ES +3645764296,3645764297,DE +3645764298,3645764298,GR +3645764299,3645764299,NL +3645764300,3645764300,PL +3645764301,3645764301,GR +3645764302,3645764302,IT +3645764303,3645764303,DE +3645764304,3645764304,ES +3645764305,3645764305,GB +3645764306,3645764306,BM +3645764307,3645764307,NL +3645764308,3645764308,DE +3645764309,3645764309,CH +3645764310,3645764310,ZA +3645764311,3645764313,ES +3645764314,3645764315,DE +3645764316,3645764316,IT +3645764317,3645764317,ES +3645764318,3645764318,HU +3645764319,3645764319,FR +3645764320,3645764320,IT +3645764321,3645764321,DE +3645764322,3645764322,CH +3645764323,3645764323,DE +3645764324,3645764324,FR +3645764325,3645764325,DE +3645764326,3645764326,ES +3645764327,3645764327,DK +3645764328,3645764328,CH +3645764329,3645764329,ES +3645764330,3645764330,DE +3645764331,3645764331,RU +3645764332,3645764332,NL +3645764333,3645764333,GR +3645764334,3645764334,ES +3645764335,3645764335,DE +3645764336,3645764336,MY +3645764337,3645764337,HU +3645764338,3645764338,NL +3645764339,3645764340,DE +3645764341,3645764341,IE +3645764342,3645764342,IT +3645764343,3645764343,ES +3645764344,3645764345,DE +3645764346,3645764346,IT +3645764347,3645764347,IE +3645764348,3645764348,NL +3645764349,3645764349,BE +3645764350,3645764350,IT +3645764351,3645764356,DE +3645764357,3645764357,RU +3645764358,3645764358,FR +3645764359,3645764359,IT +3645764360,3645764360,DE +3645764361,3645764361,CH +3645764362,3645764362,GB +3645764363,3645764364,NL +3645764365,3645764365,BE +3645764366,3645764367,DE +3645764368,3645764368,IT +3645764369,3645764369,DE +3645764370,3645764370,GB +3645764371,3645764371,ES +3645764372,3645764373,FR +3645764374,3645764375,DE +3645764376,3645764377,NL +3645764378,3645764378,DE +3645764379,3645764380,GB +3645764381,3645764381,DE +3645764382,3645764382,NL +3645764383,3645764383,FR +3645764384,3645764384,AT +3645764385,3645764388,DE +3645764389,3645764389,NL +3645764390,3645764390,DE +3645764391,3645764391,NL +3645764392,3645764392,GR +3645764393,3645764393,DE +3645764394,3645764394,FR +3645764395,3645764396,NL +3645764397,3645764397,DE +3645764398,3645764398,NL +3645764399,3645764399,DE +3645764400,3645764401,NL +3645764402,3645764403,FR +3645764404,3645764406,NL +3645764407,3645764408,DE +3645764409,3645764409,FR +3645764410,3645764410,DE +3645764411,3645764411,FR +3645764412,3645764412,NL +3645764413,3645764413,FR +3645764414,3645764417,NL +3645764418,3645764418,DE +3645764419,3645764419,NL +3645764420,3645764420,GB +3645764421,3645764421,DE +3645764422,3645764422,IT +3645764423,3645764423,HU +3645764424,3645764424,DE +3645764425,3645764425,GB +3645764426,3645764433,DE +3645764434,3645764434,NL +3645764435,3645764435,AT +3645764436,3645764436,NL +3645764437,3645764437,FR +3645764438,3645764439,DE +3645764440,3645764440,CH +3645764441,3645764441,DE +3645764442,3645764442,IT +3645764443,3645764444,DE +3645764445,3645764445,GB +3645764446,3645764446,NL +3645764447,3645764456,DE +3645764457,3645764457,IT +3645764458,3645764458,AT +3645764459,3645764459,IT +3645764460,3645764462,DE +3645764463,3645764463,NL +3645764464,3645764464,BE +3645764465,3645764465,DE +3645764466,3645764466,GR +3645764467,3645764467,DE +3645764468,3645764468,IT +3645764469,3645764470,DE +3645764471,3645764471,IT +3645764472,3645764472,GR +3645764473,3645764473,NL +3645764474,3645764474,DE +3645764475,3645764475,GR +3645764476,3645764476,DE +3645764477,3645764477,NL +3645764478,3645764478,GB +3645764479,3645764479,DE +3645764480,3645764481,NL +3645764482,3645764482,DE +3645764483,3645764483,NL +3645764484,3645764484,FR +3645764485,3645764485,NL +3645764486,3645764486,IE +3645764487,3645764487,DE +3645764488,3645764490,NL +3645764491,3645764491,DE +3645764492,3645764492,NL +3645764493,3645764493,ES +3645764494,3645764494,FR +3645764495,3645764495,NL +3645764496,3645764496,DE +3645764497,3645764497,NL +3645764498,3645764498,FR +3645764499,3645764500,NL +3645764501,3645764501,DE +3645764502,3645764505,NL +3645764506,3645764506,DE +3645764507,3645764507,ES +3645764508,3645764508,IT +3645764509,3645764511,NL +3645764512,3645764512,DE +3645764513,3645764513,NL +3645764514,3645764514,ES +3645764515,3645764515,DE +3645764516,3645764516,NL +3645764517,3645764518,DE +3645764519,3645764522,NL +3645764523,3645764523,DE +3645764524,3645764531,NL +3645764532,3645764532,DE +3645764533,3645764535,NL +3645764536,3645764536,IT +3645764537,3645764539,NL +3645764540,3645764540,DE +3645764541,3645764541,IT +3645764542,3645764549,NL +3645764550,3645764550,DE +3645764551,3645764551,GR +3645764552,3645764553,DE +3645764554,3645764554,NL +3645764555,3645764555,DE +3645764556,3645764556,CH +3645764557,3645764557,NL +3645764558,3645764561,DE +3645764562,3645764562,FR +3645764563,3645764563,ES +3645764564,3645764565,NL +3645764566,3645764566,DE +3645764567,3645764568,NL +3645764569,3645764569,DE +3645764570,3645764570,MA +3645764571,3645765127,DE +3645765128,3645765131,GR +3645765132,3645765135,DE +3645765136,3645765139,BE +3645765140,3645765143,IT +3645765144,3645765147,DE +3645765148,3645765151,IT +3645765152,3645765155,BE +3645765156,3645765171,IT +3645765172,3645765175,NO +3645765176,3645765179,DE +3645765180,3645765183,FR +3645765184,3645765187,GR +3645765188,3645765195,DE +3645765196,3645765199,CH +3645765200,3645765207,GB +3645765208,3645765211,FR +3645765212,3645765219,ES +3645765220,3645765223,PL +3645765224,3645765227,BE +3645765228,3645765231,GB +3645765232,3645765235,IT +3645765236,3645765239,FR +3645765240,3645765243,GB +3645765244,3645765247,IT +3645765248,3645765251,ES +3645765252,3645765255,DE +3645765256,3645765259,GR +3645765260,3645765263,PL +3645765264,3645765267,IT +3645765268,3645765271,PL +3645765272,3645765275,IT +3645765276,3645765279,FR +3645765280,3645765283,GB +3645765284,3645765287,ES +3645765288,3645765291,IT +3645765292,3645765295,DE +3645765296,3645765299,ES +3645765300,3645765303,FR +3645765304,3645765311,IT +3645765312,3645765315,TR +3645765316,3645765319,IT +3645765320,3645765323,FR +3645765324,3645765331,ES +3645765332,3645765335,FR +3645765336,3645765339,IT +3645765340,3645765343,FR +3645765344,3645765347,PL +3645765348,3645765351,GR +3645765352,3645765355,IT +3645765356,3645765359,ES +3645765360,3645765363,FR +3645765364,3645765367,ES +3645765368,3645765371,IT +3645765372,3645765375,CH +3645765376,3645765379,DE +3645765380,3645765383,BM +3645765384,3645765387,NL +3645765388,3645765391,DE +3645765392,3645765403,ES +3645765404,3645765407,GR +3645765408,3645765411,DK +3645765412,3645765415,IT +3645765416,3645765419,FR +3645765420,3645765423,DE +3645765424,3645765427,IT +3645765428,3645765443,DE +3645765444,3645765447,FR +3645765448,3645765451,ES +3645765452,3645765455,FR +3645765456,3645765459,AT +3645765460,3645765463,FR +3645765464,3645765467,GB +3645765468,3645765471,DE +3645765472,3645765475,NL +3645765476,3645765487,DE +3645765488,3645765491,HU +3645765492,3645765495,DE +3645765496,3645765499,GB +3645765500,3645765503,NL +3645765504,3645765507,CH +3645765508,3645765511,IT +3645765512,3645765519,GB +3645765520,3645765523,FR +3645765524,3645765527,IT +3645765528,3645765535,FR +3645765536,3645765539,SE +3645765540,3645765543,IL +3645765544,3645765547,BE +3645765548,3645765555,DE +3645765556,3645765559,IT +3645765560,3645765563,IE +3645765564,3645765567,ES +3645765568,3645765571,FR +3645765572,3645765575,DE +3645765576,3645765579,IT +3645765580,3645765583,GB +3645765584,3645765591,DE +3645765592,3645765595,IE +3645765596,3645765611,DE +3645765612,3645765615,IT +3645765616,3645765619,GB +3645765620,3645765623,CH +3645765624,3645765627,FR +3645765628,3645765639,DE +3645765640,3645765643,DK +3645765644,3645765647,GB +3645765648,3645765651,NL +3645765652,3645765667,DE +3645765668,3645765675,FR +3645765676,3645765679,DE +3645765680,3645765683,FR +3645765684,3645765687,NL +3645765688,3645765691,FR +3645765692,3645765695,CH +3645765696,3645765703,IT +3645765704,3645765707,DE +3645765708,3645765711,FR +3645765712,3645765715,DE +3645765716,3645765719,FR +3645765720,3645766401,DE +3645766402,3645766407,US +3645766408,3645767187,DE +3645767188,3645767188,US +3645767189,3645767193,DE +3645767194,3645767194,US +3645767195,3645767195,DE +3645767196,3645767196,US +3645767197,3645767197,DE +3645767198,3645767198,US +3645767199,3645767208,DE +3645767209,3645767209,US +3645767210,3645767222,DE +3645767223,3645767223,US +3645767224,3645767240,DE +3645767241,3645767241,US +3645767242,3645767426,DE +3645767427,3645767427,US +3645767428,3645767428,DE +3645767429,3645767429,US +3645767430,3645767431,DE +3645767432,3645767433,US +3645767434,3645767434,CA +3645767435,3645767448,US +3645767449,3645767449,DE +3645767450,3645767455,US +3645767456,3645767502,DE +3645767503,3645767503,US +3645767504,3645767679,DE +3645767680,3645771775,IE +3645771776,3645779967,SE +3645779968,3645784063,PS +3645788160,3645792255,GB +3645792256,3645796351,NO +3645796352,3645800447,CH +3645800448,3645804543,DE +3645804544,3645808639,GB +3645808640,3645812735,DE +3645812736,3645816831,RU +3645816832,3645825023,FI +3645825024,3645829119,GR +3645829120,3645833215,NL +3645833216,3645841407,RU +3645841408,3645845503,BG +3645845504,3645849599,RU +3645849600,3645857791,BG +3645857792,3645865983,GB +3645865984,3645870079,HU +3645870080,3645874175,PL +3645874176,3645878271,GB +3645878272,3645882367,DE +3645882368,3645886463,CH +3645886464,3645886991,DE +3645886992,3645886995,GB +3645886996,3645888127,DE +3645888128,3645888143,AT +3645888144,3645888159,DE +3645888160,3645888191,AT +3645888192,3645890559,DE +3645890560,3645894655,RU +3645894656,3645898751,NL +3645898752,3646501711,DE +3646501712,3646501719,US +3646501720,3646513103,DE +3646513104,3646513111,CA +3646513112,3646947327,DE +3646947328,3647209471,PL +3647209472,3647602687,NL +3647602688,3647658751,RU +3647658752,3647659007,GE +3647659008,3647665151,RU +3647665152,3647665407,GE +3647665408,3647722751,RU +3647722752,3647722879,BY +3647722880,3647733759,RU +3647733760,3647864831,FR +3647864832,3647864863,GB +3647864864,3647864879,DE +3647864880,3647864887,GB +3647864888,3647864935,DE +3647864936,3647864943,GB +3647864944,3647865071,DE +3647865072,3647865087,GB +3647865088,3647865127,DE +3647865128,3647865135,GB +3647865136,3647865143,DE +3647865144,3647865167,GB +3647865168,3647865175,DE +3647865176,3647865183,GB +3647865184,3647865191,DE +3647865192,3647865199,GB +3647865200,3647865223,DE +3647865224,3647865231,GB +3647865232,3647865271,DE +3647865272,3647865279,GB +3647865280,3647865295,DE +3647865296,3647865303,GB +3647865304,3647865311,DE +3647865312,3647865343,GB +3647865344,3647865351,DE +3647865352,3647865359,GB +3647865360,3647865391,DE +3647865392,3647865399,GB +3647865400,3647865551,DE +3647865552,3647865559,GB +3647865560,3647865567,DE +3647865568,3647865575,GB +3647865576,3647865631,DE +3647865632,3647865639,GB +3647865640,3647865687,DE +3647865688,3647865703,GB +3647865704,3647865735,DE +3647865736,3647865743,GB +3647865744,3647865783,DE +3647865784,3647865791,GB +3647865792,3647865895,DE +3647865896,3647865903,GB +3647865904,3647865935,DE +3647865936,3647865951,GB +3647865952,3647865959,DE +3647865960,3647865967,GB +3647865968,3647866039,DE +3647866040,3647866047,GB +3647866048,3647866079,DE +3647866080,3647866111,GB +3647866112,3647866151,DE +3647866152,3647866159,GB +3647866160,3647866175,DE +3647866176,3647866191,GB +3647866192,3647866279,DE +3647866280,3647866287,GB +3647866288,3647866311,DE +3647866312,3647866319,GB +3647866320,3647866327,DE +3647866328,3647866367,GB +3647866368,3647866391,DE +3647866392,3647866399,GB +3647866400,3647866463,DE +3647866464,3647866479,GB +3647866480,3647866535,DE +3647866536,3647866551,GB +3647866552,3647866559,DE +3647866560,3647866567,GB +3647866568,3647866591,DE +3647866592,3647866599,GB +3647866600,3647866663,DE +3647866664,3647866679,GB +3647866680,3647866727,DE +3647866728,3647866735,GB +3647866736,3647866743,DE +3647866744,3647866751,GB +3647866752,3647866759,DE +3647866760,3647866775,GB +3647866776,3647866815,DE +3647866816,3647866823,GB +3647866824,3647866863,DE +3647866864,3647866871,GB +3647866872,3647866975,DE +3647866976,3647866983,GB +3647866984,3647867127,DE +3647867128,3647867135,GB +3647867136,3647867167,DE +3647867168,3647867175,GB +3647867176,3647867199,DE +3647867200,3647867207,GB +3647867208,3647867255,DE +3647867256,3647867263,GB +3647867264,3647867343,DE +3647867344,3647867351,GB +3647867352,3647867383,DE +3647867384,3647867423,GB +3647867424,3647867463,DE +3647867464,3647867471,GB +3647867472,3647867599,DE +3647867600,3647867607,GB +3647867608,3647867679,DE +3647867680,3647867687,GB +3647867688,3647867695,DE +3647867696,3647867703,GB +3647867704,3647867727,DE +3647867728,3647867735,GB +3647867736,3647868063,DE +3647868064,3647868071,GB +3647868072,3647868135,DE +3647868136,3647868159,GB +3647868160,3647868231,DE +3647868232,3647868239,GB +3647868240,3647868263,DE +3647868264,3647868271,GB +3647868272,3647868287,DE +3647868288,3647868295,GB +3647868296,3647868367,DE +3647868368,3647868375,GB +3647868376,3647868383,DE +3647868384,3647868391,GB +3647868392,3647868399,DE +3647868400,3647868415,GB +3647868416,3647868431,DE +3647868432,3647868447,GB +3647868448,3647868479,DE +3647868480,3647868487,GB +3647868488,3647868639,DE +3647868640,3647868647,GB +3647868648,3647868663,DE +3647868664,3647868703,GB +3647868704,3647868711,DE +3647868712,3647868719,GB +3647868720,3647868727,DE +3647868728,3647868735,GB +3647868736,3647868831,DE +3647868832,3647868839,GB +3647868840,3647868887,DE +3647868888,3647868895,GB +3647868896,3647868959,DE +3647868960,3647868967,GB +3647868968,3647869071,DE +3647869072,3647869087,GB +3647869088,3647869279,DE +3647869280,3647869287,GB +3647869288,3647869375,DE +3647869376,3647869383,GB +3647869384,3647869407,DE +3647869408,3647869415,GB +3647869416,3647869423,DE +3647869424,3647869439,GB +3647869440,3647869455,DE +3647869456,3647869463,GB +3647869464,3647869567,DE +3647869568,3647869575,GB +3647869576,3647869583,DE +3647869584,3647869591,GB +3647869592,3647869775,DE +3647869776,3647869783,GB +3647869784,3647869791,DE +3647869792,3647869799,GB +3647869800,3647869863,DE +3647869864,3647869871,GB +3647869872,3647869991,DE +3647869992,3647869999,GB +3647870000,3647870127,DE +3647870128,3647870135,GB +3647870136,3647870191,DE +3647870192,3647870207,GB +3647870208,3647870447,DE +3647870448,3647870463,GB +3647870464,3647870503,DE +3647870504,3647870519,GB +3647870520,3647870535,DE +3647870536,3647870543,GB +3647870544,3647870583,DE +3647870584,3647870591,GB +3647870592,3647870639,DE +3647870640,3647870647,GB +3647870648,3647870719,DE +3647870720,3647870751,GB +3647870752,3647870815,DE +3647870816,3647870831,GB +3647870832,3647871039,DE +3647871040,3647871047,GB +3647871048,3647871055,DE +3647871056,3647871071,GB +3647871072,3647871103,DE +3647871104,3647871119,GB +3647871120,3647871127,DE +3647871128,3647871135,GB +3647871136,3647871151,DE +3647871152,3647871167,GB +3647871168,3647871191,DE +3647871192,3647871199,GB +3647871200,3647871215,DE +3647871216,3647871231,GB +3647871232,3647871287,DE +3647871288,3647871295,GB +3647871296,3647871303,DE +3647871304,3647871311,GB +3647871312,3647871351,DE +3647871352,3647871367,GB +3647871368,3647871407,DE +3647871408,3647871431,GB +3647871432,3647871447,DE +3647871448,3647871455,GB +3647871456,3647871471,DE +3647871472,3647871487,GB +3647871488,3647871631,DE +3647871632,3647871999,GB +3647872000,3647872239,DE +3647872240,3647872247,GB +3647872248,3647872311,DE +3647872312,3647872335,GB +3647872336,3647872359,DE +3647872360,3647872367,GB +3647872368,3647872407,DE +3647872408,3647872415,GB +3647872416,3647872471,DE +3647872472,3647872479,GB +3647872480,3647872495,DE +3647872496,3647872511,GB +3647872512,3647872679,DE +3647872680,3647872687,GB +3647872688,3647872759,DE +3647872760,3647872767,GB +3647872768,3647872783,DE +3647872784,3647872927,GB +3647872928,3647872959,DE +3647872960,3647872967,GB +3647872968,3647872975,DE +3647872976,3647872983,GB +3647872984,3647873071,DE +3647873072,3647873079,GB +3647873080,3647873087,DE +3647873088,3647873103,GB +3647873104,3647873279,DE +3647873280,3647873319,GB +3647873320,3647873375,DE +3647873376,3647873407,GB +3647873408,3647873535,DE +3647873536,3647873567,GB +3647873568,3647873599,DE +3647873600,3647873647,GB +3647873648,3647874958,DE +3647874959,3647874959,GB +3647874960,3647875039,DE +3647875040,3647875055,GB +3647875056,3647875095,DE +3647875096,3647875103,GB +3647875104,3647875111,DE +3647875112,3647875119,GB +3647875120,3647875127,DE +3647875128,3647875151,GB +3647875152,3647875175,DE +3647875176,3647875231,GB +3647875232,3647875239,DE +3647875240,3647875255,GB +3647875256,3647875327,DE +3647875328,3647875343,GB +3647875344,3647875367,DE +3647875368,3647875383,GB +3647875384,3647875455,DE +3647875456,3647875487,GB +3647875488,3647875527,DE +3647875528,3647875839,GB +3647875840,3647876095,DE +3647876096,3647876359,GB +3647876360,3647876375,DE +3647876376,3647876383,GB +3647876384,3647876415,DE +3647876416,3647876431,GB +3647876432,3647876439,DE +3647876440,3647876447,GB +3647876448,3647876455,DE +3647876456,3647876471,GB +3647876472,3647876639,DE +3647876640,3647876655,GB +3647876656,3647876663,DE +3647876664,3647876671,GB +3647876672,3647876703,DE +3647876704,3647876711,GB +3647876712,3647876759,DE +3647876760,3647876783,GB +3647876784,3647876839,DE +3647876840,3647876863,GB +3647876864,3647877447,DE +3647877448,3647877455,GB +3647877456,3647877495,DE +3647877496,3647877503,GB +3647877504,3647877567,DE +3647877568,3647877599,GB +3647877600,3647877615,DE +3647877616,3647877631,GB +3647877632,3647877635,DE +3647877636,3647877639,GB +3647877640,3647877643,DE +3647877644,3647877671,GB +3647877672,3647877675,DE +3647877676,3647877771,GB +3647877772,3647877775,DE +3647877776,3647877875,GB +3647877876,3647877879,DE +3647877880,3647877895,GB +3647877896,3647877927,DE +3647877928,3647877951,GB +3647877952,3647878103,DE +3647878104,3647878111,GB +3647878112,3647878447,DE +3647878448,3647878479,GB +3647878480,3647878487,DE +3647878488,3647878495,GB +3647878496,3647878503,DE +3647878504,3647878527,GB +3647878528,3647878591,DE +3647878592,3647878607,GB +3647878608,3647879231,DE +3647879232,3647879263,GB +3647879264,3647879695,DE +3647879696,3647879703,GB +3647879704,3647879735,DE +3647879736,3647879743,GB +3647879744,3647879775,DE +3647879776,3647879807,GB +3647879808,3647879839,DE +3647879840,3647879867,GB +3647879868,3647879879,DE +3647879880,3647879887,GB +3647879888,3647879895,DE +3647879896,3647879903,GB +3647879904,3647879935,DE +3647879936,3647879999,GB +3647880000,3647880047,DE +3647880048,3647880127,GB +3647880128,3647880183,DE +3647880184,3647880447,GB +3647880448,3647880959,DE +3647880960,3647880991,GB +3647880992,3647881015,DE +3647881016,3647881023,GB +3647881024,3647881135,DE +3647881136,3647881183,GB +3647881184,3647881199,DE +3647881200,3647881215,GB +3647881216,3647881231,DE +3647881232,3647881239,GB +3647881240,3647881243,DE +3647881244,3647881247,GB +3647881248,3647881271,DE +3647881272,3647881279,GB +3647881280,3647881375,DE +3647881376,3647881383,GB +3647881384,3647881471,DE +3647881472,3647881727,GB +3647881728,3647881991,DE +3647881992,3647881999,GB +3647882000,3647882271,DE +3647882272,3647882303,GB +3647882304,3647882343,DE +3647882344,3647882351,GB +3647882352,3647882359,DE +3647882360,3647882367,GB +3647882368,3647882415,DE +3647882416,3647882423,GB +3647882424,3647882431,DE +3647882432,3647882503,GB +3647882504,3647882511,DE +3647882512,3647882575,GB +3647882576,3647882623,DE +3647882624,3647882687,GB +3647882688,3647883071,DE +3647883072,3647883095,GB +3647883096,3647883135,DE +3647883136,3647883151,GB +3647883152,3647883207,DE +3647883208,3647883215,GB +3647883216,3647883231,DE +3647883232,3647883239,GB +3647883240,3647883551,DE +3647883552,3647883559,GB +3647883560,3647883575,DE +3647883576,3647883583,GB +3647883584,3647884287,DE +3647884288,3647884351,GB +3647884352,3647884367,DE +3647884368,3647884383,GB +3647884384,3647884415,DE +3647884416,3647884543,GB +3647884544,3647884847,DE +3647884848,3647884863,GB +3647884864,3647884895,DE +3647884896,3647884907,GB +3647884908,3647884915,DE +3647884916,3647884919,GB +3647884920,3647885199,DE +3647885200,3647885215,GB +3647885216,3647885247,DE +3647885248,3647885567,GB +3647885568,3647885575,DE +3647885576,3647885583,GB +3647885584,3647885599,DE +3647885600,3647885607,GB +3647885608,3647885759,DE +3647885760,3647886079,GB +3647886080,3647886111,DE +3647886112,3647886119,GB +3647886120,3647886175,DE +3647886176,3647886183,GB +3647886184,3647886187,DE +3647886188,3647886199,GB +3647886200,3647886271,DE +3647886272,3647886303,GB +3647886304,3647886335,DE +3647886336,3647886591,GB +3647886592,3647886727,DE +3647886728,3647886847,GB +3647886848,3647887427,DE +3647887428,3647887447,GB +3647887448,3647887471,DE +3647887472,3647887483,GB +3647887484,3647887487,DE +3647887488,3647887527,GB +3647887528,3647887599,DE +3647887600,3647887615,GB +3647887616,3647887679,DE +3647887680,3647887743,GB +3647887744,3647887871,DE +3647887872,3647887903,GB +3647887904,3647887911,DE +3647887912,3647887951,GB +3647887952,3647887959,DE +3647887960,3647887967,GB +3647887968,3647888135,DE +3647888136,3647888143,GB +3647888144,3647888199,DE +3647888200,3647888207,GB +3647888208,3647888215,DE +3647888216,3647888223,GB +3647888224,3647888255,DE +3647888256,3647888383,GB +3647888384,3647888895,DE +3647888896,3647888959,GB +3647888960,3647889023,DE +3647889024,3647889055,GB +3647889056,3647889215,DE +3647889216,3647889231,GB +3647889232,3647889375,DE +3647889376,3647889383,GB +3647889384,3647889407,DE +3647889408,3647889471,GB +3647889472,3647889535,DE +3647889536,3647889671,GB +3647889672,3647889687,DE +3647889688,3647889695,GB +3647889696,3647889727,DE +3647889728,3647889735,GB +3647889736,3647890175,DE +3647890176,3647890239,GB +3647890240,3647890247,DE +3647890248,3647890255,GB +3647890256,3647890279,DE +3647890280,3647890295,GB +3647890296,3647890375,DE +3647890376,3647890447,GB +3647890448,3647890471,DE +3647890472,3647890479,GB +3647890480,3647890487,DE +3647890488,3647890527,GB +3647890528,3647890559,DE +3647890560,3647890847,GB +3647890848,3647890879,DE +3647890880,3647891199,GB +3647891200,3647891463,DE +3647891464,3647891471,GB +3647891472,3647891487,DE +3647891488,3647891503,GB +3647891504,3647891791,DE +3647891792,3647891807,GB +3647891808,3647892239,DE +3647892240,3647892247,GB +3647892248,3647892799,DE +3647892800,3647892815,GB +3647892816,3647892991,DE +3647892992,3647893135,GB +3647893136,3647893183,DE +3647893184,3647893199,GB +3647893200,3647893503,DE +3647893504,3647893511,GB +3647893512,3647893519,DE +3647893520,3647893527,GB +3647893528,3647893535,DE +3647893536,3647893551,GB +3647893552,3647894335,DE +3647894336,3647894351,GB +3647894352,3647894719,DE +3647894720,3647894783,GB +3647894784,3647894911,DE +3647894912,3647894975,GB +3647894976,3647894991,DE +3647894992,3647895007,GB +3647895008,3647895023,DE +3647895024,3647895039,GB +3647895040,3647895311,DE +3647895312,3647895327,GB +3647895328,3647895359,DE +3647895360,3647895399,GB +3647895400,3647895687,DE +3647895688,3647895711,GB +3647895712,3647895799,DE +3647895800,3647895807,GB +3647895808,3647896095,DE +3647896096,3647896127,GB +3647896128,3647896159,DE +3647896160,3647896223,GB +3647896224,3647896255,DE +3647896256,3647896295,GB +3647896296,3647896303,DE +3647896304,3647896311,GB +3647896312,3647896319,DE +3647896320,3647896351,GB +3647896352,3647896463,DE +3647896464,3647896471,GB +3647896472,3647896511,DE +3647896512,3647896519,GB +3647896520,3647896527,DE +3647896528,3647896559,GB +3647896560,3647896575,DE +3647896576,3647896607,GB +3647896608,3647896623,DE +3647896624,3647896631,GB +3647896632,3647896671,DE +3647896672,3647896679,GB +3647896680,3647896687,DE +3647896688,3647896695,GB +3647896696,3647897047,DE +3647897048,3647897055,GB +3647897056,3647897087,DE +3647897088,3647897103,GB +3647897104,3647897111,DE +3647897112,3647897135,GB +3647897136,3647897295,DE +3647897296,3647897343,GB +3647897344,3647897359,DE +3647897360,3647897375,GB +3647897376,3647897415,DE +3647897416,3647897423,GB +3647897424,3647901247,DE +3647901248,3647901255,GB +3647901256,3647901259,DE +3647901260,3647901263,GB +3647901264,3647901439,DE +3647901440,3647901519,GB +3647901520,3647901535,DE +3647901536,3647901567,GB +3647901568,3647901583,DE +3647901584,3647901695,GB +3647901696,3647901735,DE +3647901736,3647901743,GB +3647901744,3647901751,DE +3647901752,3647901759,GB +3647901760,3647901863,DE +3647901864,3647901871,GB +3647901872,3647901895,DE +3647901896,3647901911,GB +3647901912,3647901935,DE +3647901936,3647901951,GB +3647901952,3647902063,DE +3647902064,3647902071,GB +3647902072,3647902079,DE +3647902080,3647902087,GB +3647902088,3647902095,DE +3647902096,3647902111,GB +3647902112,3647902159,DE +3647902160,3647902167,GB +3647902168,3647902183,DE +3647902184,3647902207,GB +3647902208,3647902263,DE +3647902264,3647902463,GB +3647902464,3647902495,DE +3647902496,3647902511,GB +3647902512,3647902559,DE +3647902560,3647902719,GB +3647902720,3647902807,DE +3647902808,3647903007,GB +3647903008,3647903039,DE +3647903040,3647903047,GB +3647903048,3647903055,DE +3647903056,3647903063,GB +3647903064,3647903119,DE +3647903120,3647903743,GB +3647903744,3647903919,DE +3647903920,3647903927,GB +3647903928,3647903935,DE +3647903936,3647903943,GB +3647903944,3647903967,DE +3647903968,3647903975,GB +3647903976,3647904023,DE +3647904024,3647904031,GB +3647904032,3647904103,DE +3647904104,3647904111,GB +3647904112,3647904119,DE +3647904120,3647904127,GB +3647904128,3647904207,DE +3647904208,3647904215,GB +3647904216,3647904391,DE +3647904392,3647904398,GB +3647904399,3647904399,DE +3647904400,3647904447,GB +3647904448,3647904735,DE +3647904736,3647904751,GB +3647904752,3647904799,DE +3647904800,3647904807,GB +3647904808,3647904967,DE +3647904968,3647904999,GB +3647905000,3647905007,DE +3647905008,3647905023,GB +3647905024,3647905055,DE +3647905056,3647905063,GB +3647905064,3647905071,DE +3647905072,3647905079,GB +3647905080,3647905191,DE +3647905192,3647905279,GB +3647905280,3647905311,DE +3647905312,3647905535,GB +3647905536,3647905567,DE +3647905568,3647905791,GB +3647905792,3647905839,DE +3647905840,3647905847,GB +3647905848,3647905863,DE +3647905864,3647906047,GB +3647906048,3647906079,DE +3647906080,3647906087,GB +3647906088,3647906095,DE +3647906096,3647906103,GB +3647906104,3647906119,DE +3647906120,3647906127,GB +3647906128,3647906151,DE +3647906152,3647906159,GB +3647906160,3647906175,DE +3647906176,3647906303,GB +3647906304,3647906335,DE +3647906336,3647906559,GB +3647906560,3647906591,DE +3647906592,3647907839,GB +3647907840,3647907879,DE +3647907880,3647907887,GB +3647907888,3647907967,DE +3647907968,3647907975,GB +3647907976,3647908007,DE +3647908008,3647908015,GB +3647908016,3647908071,DE +3647908072,3647908079,GB +3647908080,3647908127,DE +3647908128,3647908135,GB +3647908136,3647908151,DE +3647908152,3647908159,GB +3647908160,3647908207,DE +3647908208,3647908215,GB +3647908216,3647908255,DE +3647908256,3647908263,GB +3647908264,3647908271,DE +3647908272,3647908279,GB +3647908280,3647908343,DE +3647908344,3647908351,GB +3647908352,3647908479,DE +3647908480,3647908487,GB +3647908488,3647908495,DE +3647908496,3647908503,GB +3647908504,3647908687,DE +3647908688,3647908695,GB +3647908696,3647908735,DE +3647908736,3647908751,GB +3647908752,3647908775,DE +3647908776,3647908783,GB +3647908784,3647908815,DE +3647908816,3647908831,GB +3647908832,3647908847,DE +3647908848,3647908855,GB +3647908856,3647908967,DE +3647908968,3647908975,GB +3647908976,3647909095,DE +3647909096,3647909111,GB +3647909112,3647909119,DE +3647909120,3647909151,GB +3647909152,3647909159,DE +3647909160,3647909175,GB +3647909176,3647909207,DE +3647909208,3647909215,GB +3647909216,3647909303,DE +3647909304,3647909311,GB +3647909312,3647909327,DE +3647909328,3647909335,GB +3647909336,3647909631,DE +3647909632,3647909671,GB +3647909672,3647909695,DE +3647909696,3647909703,GB +3647909704,3647909711,DE +3647909712,3647909727,GB +3647909728,3647909735,DE +3647909736,3647909743,GB +3647909744,3647909775,DE +3647909776,3647909791,GB +3647909792,3647909815,DE +3647909816,3647909839,GB +3647909840,3647909879,DE +3647909880,3647911423,GB +3647911424,3647911439,DE +3647911440,3647911455,GB +3647911456,3647911519,DE +3647911520,3647911535,GB +3647911536,3647911551,DE +3647911552,3647911583,GB +3647911584,3647911631,DE +3647911632,3647911647,GB +3647911648,3647912615,DE +3647912616,3647912623,GB +3647912624,3647912671,DE +3647912672,3647912679,GB +3647912680,3647912687,DE +3647912688,3647912695,GB +3647912696,3647912959,DE +3647912960,3647913471,GB +3647913472,3647913727,DE +3647913728,3647913983,GB +3647913984,3647914039,DE +3647914040,3647914055,GB +3647914056,3647914223,DE +3647914224,3647914231,GB +3647914232,3647914239,DE +3647914240,3647914271,GB +3647914272,3647914319,DE +3647914320,3647914327,GB +3647914328,3647914399,DE +3647914400,3647914415,GB +3647914416,3647914463,DE +3647914464,3647914471,GB +3647914472,3647914487,DE +3647914488,3647914751,GB +3647914752,3647915055,DE +3647915056,3647915063,GB +3647915064,3647915111,DE +3647915112,3647915135,GB +3647915136,3647915175,DE +3647915176,3647915183,GB +3647915184,3647915223,DE +3647915224,3647915231,GB +3647915232,3647915295,DE +3647915296,3647915311,GB +3647915312,3647915327,DE +3647915328,3647915335,GB +3647915336,3647915359,DE +3647915360,3647915367,GB +3647915368,3647915495,DE +3647915496,3647915519,GB +3647915520,3647915527,DE +3647915528,3647915535,GB +3647915536,3647915583,DE +3647915584,3647915591,GB +3647915592,3647915671,DE +3647915672,3647915687,GB +3647915688,3647915775,DE +3647915776,3647915807,GB +3647915808,3647915823,DE +3647915824,3647915831,GB +3647915832,3647915855,DE +3647915856,3647915871,GB +3647915872,3647915911,DE +3647915912,3647915919,GB +3647915920,3647915927,DE +3647915928,3647915935,GB +3647915936,3647915943,DE +3647915944,3647915951,GB +3647915952,3647915967,DE +3647915968,3647915975,GB +3647915976,3647916023,DE +3647916024,3647916095,GB +3647916096,3647916223,DE +3647916224,3647916303,GB +3647916304,3647916351,DE +3647916352,3647916367,GB +3647916368,3647916415,DE +3647916416,3647916543,GB +3647916544,3647916575,DE +3647916576,3647916607,GB +3647916608,3647916623,DE +3647916624,3647916663,GB +3647916664,3647916767,DE +3647916768,3647916783,GB +3647916784,3647916799,DE +3647916800,3647917055,SE +3647917056,3647917599,DE +3647917600,3647917615,US +3647917616,3647917647,DE +3647917648,3647917663,GB +3647917664,3647917791,DE +3647917792,3647917823,GB +3647917824,3647917839,DE +3647917840,3647917871,GB +3647917872,3647918151,DE +3647918152,3647918159,GB +3647918160,3647918367,DE +3647918368,3647918383,GB +3647918384,3647918423,DE +3647918424,3647918431,GB +3647918432,3647918463,DE +3647918464,3647918479,GB +3647918480,3647918487,DE +3647918488,3647918495,GB +3647918496,3647918503,DE +3647918504,3647918527,GB +3647918528,3647918543,DE +3647918544,3647918559,GB +3647918560,3647918615,DE +3647918616,3647918623,GB +3647918624,3647918671,DE +3647918672,3647918679,GB +3647918680,3647918703,DE +3647918704,3647918711,GB +3647918712,3647918751,DE +3647918752,3647918759,GB +3647918760,3647918927,DE +3647918928,3647918935,GB +3647918936,3647918959,DE +3647918960,3647918967,GB +3647918968,3647919015,DE +3647919016,3647919023,GB +3647919024,3647919031,DE +3647919032,3647919039,GB +3647919040,3647919055,DE +3647919056,3647919063,GB +3647919064,3647919079,DE +3647919080,3647919135,GB +3647919136,3647919175,DE +3647919176,3647919391,GB +3647919392,3647919431,DE +3647919432,3647919439,GB +3647919440,3647919447,DE +3647919448,3647920159,GB +3647920160,3647920223,DE +3647920224,3647920415,GB +3647920416,3647920439,DE +3647920440,3647920479,GB +3647920480,3647920495,DE +3647920496,3647920503,GB +3647920504,3647920519,DE +3647920520,3647920527,GB +3647920528,3647920535,DE +3647920536,3647920679,GB +3647920680,3647920695,DE +3647920696,3647921151,GB +3647921152,3647921391,DE +3647921392,3647921407,GB +3647921408,3647921559,DE +3647921560,3647921567,GB +3647921568,3647921615,DE +3647921616,3647921631,GB +3647921632,3647921647,DE +3647921648,3647921663,GB +3647921664,3647921911,DE +3647921912,3647921919,GB +3647921920,3647921967,DE +3647921968,3647921983,GB +3647921984,3647922095,DE +3647922096,3647922103,GB +3647922104,3647922167,DE +3647922168,3647922215,GB +3647922216,3647922219,DE +3647922220,3647922223,GB +3647922224,3647922239,DE +3647922240,3647922271,GB +3647922272,3647922335,DE +3647922336,3647922367,GB +3647922368,3647922415,DE +3647922416,3647922423,GB +3647922424,3647922455,DE +3647922456,3647922463,GB +3647922464,3647922647,DE +3647922648,3647922655,GB +3647922656,3647922687,DE +3647922688,3647922811,GB +3647922812,3647922815,DE +3647922816,3647922831,GB +3647922832,3647922835,DE +3647922836,3647922843,GB +3647922844,3647922847,DE +3647922848,3647922951,GB +3647922952,3647922959,FR +3647922960,3647922967,DE +3647922968,3647922983,GB +3647922984,3647923327,DE +3647923328,3647923331,GB +3647923332,3647923343,DE +3647923344,3647923351,GB +3647923352,3647923391,DE +3647923392,3647923407,GB +3647923408,3647923455,DE +3647923456,3647923711,GB +3647923712,3647923775,DE +3647923776,3647923967,GB +3647923968,3647924183,DE +3647924184,3647924191,GB +3647924192,3647924199,DE +3647924200,3647924207,GB +3647924208,3647924287,DE +3647924288,3647924383,GB +3647924384,3647924399,DE +3647924400,3647924415,GB +3647924416,3647924447,DE +3647924448,3647924463,GB +3647924464,3647924479,DE +3647924480,3647925247,GB +3647925248,3647925255,DE +3647925256,3647925263,GB +3647925264,3647925335,DE +3647925336,3647925343,GB +3647925344,3647925543,DE +3647925544,3647925559,GB +3647925560,3647925575,DE +3647925576,3647925583,GB +3647925584,3647925591,DE +3647925592,3647925599,GB +3647925600,3647925639,DE +3647925640,3647925655,GB +3647925656,3647925671,DE +3647925672,3647925679,GB +3647925680,3647925751,DE +3647925752,3647925759,GB +3647925760,3647925911,DE +3647925912,3647925919,GB +3647925920,3647926055,DE +3647926056,3647926063,GB +3647926064,3647926095,DE +3647926096,3647926103,GB +3647926104,3647926159,DE +3647926160,3647926175,GB +3647926176,3647926183,DE +3647926184,3647926191,GB +3647926192,3647926223,DE +3647926224,3647926239,GB +3647926240,3647926255,DE +3647926256,3647926271,GB +3647926272,3647926351,DE +3647926352,3647926375,GB +3647926376,3647926407,DE +3647926408,3647926423,GB +3647926424,3647926463,DE +3647926464,3647926471,GB +3647926472,3647926591,DE +3647926592,3647926615,GB +3647926616,3647926623,DE +3647926624,3647926631,GB +3647926632,3647926655,DE +3647926656,3647926663,GB +3647926664,3647926679,DE +3647926680,3647926687,GB +3647926688,3647926695,DE +3647926696,3647926703,GB +3647926704,3647926711,DE +3647926712,3647926719,GB +3647926720,3647926759,DE +3647926760,3647926767,GB +3647926768,3647926775,DE +3647926776,3647926791,GB +3647926792,3647926807,DE +3647926808,3647926815,GB +3647926816,3647926823,DE +3647926824,3647926831,GB +3647926832,3647926839,DE +3647926840,3647926847,GB +3647926848,3647926863,DE +3647926864,3647926871,GB +3647926872,3647926879,DE +3647926880,3647926895,GB +3647926896,3647926903,DE +3647926904,3647927047,GB +3647927048,3647927055,DE +3647927056,3647927079,GB +3647927080,3647927087,DE +3647927088,3647927095,GB +3647927096,3647927119,DE +3647927120,3647927127,GB +3647927128,3647927135,DE +3647927136,3647927159,GB +3647927160,3647927167,DE +3647927168,3647927175,GB +3647927176,3647927191,DE +3647927192,3647927215,GB +3647927216,3647927239,DE +3647927240,3647927279,GB +3647927280,3647927295,DE +3647927296,3647927551,GB +3647927552,3647927591,DE +3647927592,3647927599,GB +3647927600,3647927615,DE +3647927616,3647927623,GB +3647927624,3647927647,DE +3647927648,3647927695,GB +3647927696,3647927703,DE +3647927704,3647927735,GB +3647927736,3647927759,DE +3647927760,3647927783,GB +3647927784,3647927791,DE +3647927792,3647928063,GB +3647928064,3647928119,DE +3647928120,3647928151,GB +3647928152,3647928175,DE +3647928176,3647928183,GB +3647928184,3647928199,DE +3647928200,3647928215,GB +3647928216,3647928223,DE +3647928224,3647928231,GB +3647928232,3647928247,DE +3647928248,3647928319,GB +3647928320,3647928639,DE +3647928640,3647928655,GB +3647928656,3647928671,DE +3647928672,3647929343,GB +3647929344,3647929599,DE +3647929600,3647929727,GB +3647929728,3647929791,DE +3647929792,3647929855,GB +3647929856,3647930383,DE +3647930384,3647930399,GB +3647930400,3647930471,DE +3647930472,3647930479,GB +3647930480,3647930623,DE +3647930624,3647930879,GB +3647930880,3647931159,DE +3647931160,3647931199,GB +3647931200,3647931279,DE +3647931280,3647931295,GB +3647931296,3647931391,DE +3647931392,3647931611,GB +3647931612,3647931615,DE +3647931616,3647931647,GB +3647931648,3647931775,DE +3647931776,3647931783,GB +3647931784,3647931787,DE +3647931788,3647931791,GB +3647931792,3647931799,DE +3647931800,3647931807,GB +3647931808,3647931855,DE +3647931856,3647931863,GB +3647931864,3647931871,DE +3647931872,3647931879,GB +3647931880,3647932199,DE +3647932200,3647932223,GB +3647932224,3647932287,DE +3647932288,3647932351,GB +3647932352,3647932383,DE +3647932384,3647932671,GB +3647932672,3647932975,DE +3647932976,3647932991,GB +3647932992,3647933063,DE +3647933064,3647933071,GB +3647933072,3647933103,DE +3647933104,3647933119,GB +3647933120,3647933375,DE +3647933376,3647933695,GB +3647933696,3647933791,DE +3647933792,3647933951,GB +3647933952,3647934463,DE +3647934464,3647934719,GB +3647934720,3647934783,DE +3647934784,3647934815,GB +3647934816,3647934847,DE +3647934848,3647935103,GB +3647935104,3647935199,DE +3647935200,3647935359,GB +3647935360,3647935423,DE +3647935424,3647935487,GB +3647935488,3647935743,DE +3647935744,3647936511,GB +3647936512,3647936539,DE +3647936540,3647936543,GB +3647936544,3647936555,DE +3647936556,3647936559,GB +3647936560,3647936563,DE +3647936564,3647936567,GB +3647936568,3647936575,DE +3647936576,3647936579,GB +3647936580,3647936603,DE +3647936604,3647936607,GB +3647936608,3647936623,DE +3647936624,3647936635,GB +3647936636,3647936639,DE +3647936640,3647936655,GB +3647936656,3647936659,DE +3647936660,3647936767,GB +3647936768,3647936775,DE +3647936776,3647936783,GB +3647936784,3647936823,DE +3647936824,3647936839,GB +3647936840,3647936943,DE +3647936944,3647936959,GB +3647936960,3647937535,DE +3647937536,3647937595,GB +3647937596,3647937599,DE +3647937600,3647937611,GB +3647937612,3647937615,DE +3647937616,3647938047,GB +3647938048,3647938207,DE +3647938208,3647938215,GB +3647938216,3647938231,DE +3647938232,3647938239,GB +3647938240,3647938303,DE +3647938304,3647938463,GB +3647938464,3647938471,DE +3647938472,3647938479,GB +3647938480,3647938495,DE +3647938496,3647938575,GB +3647938576,3647938583,DE +3647938584,3647938591,GB +3647938592,3647938615,DE +3647938616,3647938623,GB +3647938624,3647938639,DE +3647938640,3647938655,GB +3647938656,3647938671,DE +3647938672,3647938727,GB +3647938728,3647938767,DE +3647938768,3647938783,GB +3647938784,3647938807,DE +3647938808,3647938879,GB +3647938880,3647938887,DE +3647938888,3647938911,GB +3647938912,3647938927,DE +3647938928,3647938935,GB +3647938936,3647938943,DE +3647938944,3647938975,GB +3647938976,3647938983,DE +3647938984,3647938999,GB +3647939000,3647939007,DE +3647939008,3647939031,GB +3647939032,3647939047,DE +3647939048,3647939103,GB +3647939104,3647939143,DE +3647939144,3647939151,GB +3647939152,3647939167,DE +3647939168,3647939175,GB +3647939176,3647939239,DE +3647939240,3647939247,GB +3647939248,3647939583,DE +3647939584,3647939591,GB +3647939592,3647939615,DE +3647939616,3647939623,GB +3647939624,3647939639,DE +3647939640,3647939647,GB +3647939648,3647939703,DE +3647939704,3647939711,GB +3647939712,3647939751,DE +3647939752,3647939759,GB +3647939760,3647939807,DE +3647939808,3647939839,GB +3647939840,3647939927,DE +3647939928,3647939935,GB +3647939936,3647940047,DE +3647940048,3647940055,GB +3647940056,3647940447,DE +3647940448,3647940607,GB +3647940608,3647941119,DE +3647941120,3647941127,GB +3647941128,3647941135,DE +3647941136,3647941151,GB +3647941152,3647941215,DE +3647941216,3647941375,GB +3647941376,3647941559,DE +3647941560,3647941567,GB +3647941568,3647941575,DE +3647941576,3647941583,GB +3647941584,3647941887,DE +3647941888,3647941935,GB +3647941936,3647941939,DE +3647941940,3647941943,GB +3647941944,3647941955,DE +3647941956,3647941959,GB +3647941960,3647941967,DE +3647941968,3647941971,GB +3647941972,3647941983,DE +3647941984,3647941987,GB +3647941988,3647941991,DE +3647941992,3647941999,GB +3647942000,3647942007,DE +3647942008,3647942015,GB +3647942016,3647942023,DE +3647942024,3647942031,GB +3647942032,3647942047,DE +3647942048,3647942399,GB +3647942400,3647942687,DE +3647942688,3647942695,GB +3647942696,3647942711,DE +3647942712,3647942719,GB +3647942720,3647942783,DE +3647942784,3647942815,GB +3647942816,3647942839,DE +3647942840,3647942847,GB +3647942848,3647942903,DE +3647942904,3647943167,GB +3647943168,3647943207,DE +3647943208,3647943231,GB +3647943232,3647943295,DE +3647943296,3647943327,GB +3647943328,3647943423,DE +3647943424,3647943431,GB +3647943432,3647943435,DE +3647943436,3647943499,GB +3647943500,3647943503,DE +3647943504,3647943527,GB +3647943528,3647943543,DE +3647943544,3647943547,GB +3647943548,3647943559,DE +3647943560,3647943935,GB +3647943936,3647944087,DE +3647944088,3647944095,GB +3647944096,3647944575,DE +3647944576,3647944583,GB +3647944584,3647944591,DE +3647944592,3647944615,GB +3647944616,3647944623,DE +3647944624,3647944671,GB +3647944672,3647944687,DE +3647944688,3647944703,GB +3647944704,3647945215,DE +3647945216,3647945471,GB +3647945472,3647945475,DE +3647945476,3647945531,GB +3647945532,3647945535,DE +3647945536,3647945635,GB +3647945636,3647945643,DE +3647945644,3647945727,GB +3647945728,3647945983,DE +3647945984,3647946063,GB +3647946064,3647946071,DE +3647946072,3647946111,GB +3647946112,3647946127,DE +3647946128,3647946143,GB +3647946144,3647946175,DE +3647946176,3647946495,GB +3647946496,3647946499,DE +3647946500,3647946503,GB +3647946504,3647946527,DE +3647946528,3647946559,GB +3647946560,3647946687,DE +3647946688,3647946719,GB +3647946720,3647947391,DE +3647947392,3647947399,GB +3647947400,3647947407,DE +3647947408,3647947415,GB +3647947416,3647947423,DE +3647947424,3647947439,GB +3647947440,3647947447,DE +3647947448,3647947455,GB +3647947456,3647947487,DE +3647947488,3647947519,GB +3647947520,3647947647,DE +3647947648,3647947711,GB +3647947712,3647947735,DE +3647947736,3647947775,GB +3647947776,3647947919,DE +3647947920,3647947935,GB +3647947936,3647948191,DE +3647948192,3647948287,GB +3647948288,3647948543,DE +3647948544,3647948807,GB +3647948808,3647948815,DE +3647948816,3647949063,GB +3647949064,3647949079,DE +3647949080,3647949087,GB +3647949088,3647949095,DE +3647949096,3647949119,GB +3647949120,3647949151,DE +3647949152,3647949183,GB +3647949184,3647949439,DE +3647949440,3647949567,GB +3647949568,3647949887,DE +3647949888,3647949951,GB +3647949952,3647950047,DE +3647950048,3647950847,GB +3647950848,3647953023,DE +3647953024,3647953039,GB +3647953040,3647953055,DE +3647953056,3647953079,GB +3647953080,3647953407,DE +3647953408,3647953503,GB +3647953504,3647953511,DE +3647953512,3647953663,GB +3647953664,3647953791,DE +3647953792,3647953823,GB +3647953824,3647953919,DE +3647953920,3647954175,GB +3647954176,3647954207,DE +3647954208,3647954215,GB +3647954216,3647954231,DE +3647954232,3647954239,GB +3647954240,3647954719,DE +3647954720,3647954815,GB +3647954816,3647954911,DE +3647954912,3647955199,GB +3647955200,3647955207,DE +3647955208,3647955215,GB +3647955216,3647955287,DE +3647955288,3647955295,GB +3647955296,3647955311,DE +3647955312,3647955327,GB +3647955328,3647955383,DE +3647955384,3647955399,GB +3647955400,3647955415,DE +3647955416,3647955431,GB +3647955432,3647956479,DE +3647956480,3647956607,GB +3647956608,3647956615,DE +3647956616,3647956671,GB +3647956672,3647956991,DE +3647956992,3647957503,GB +3647957504,3647957543,DE +3647957544,3647957551,GB +3647957552,3647957559,DE +3647957560,3647957599,GB +3647957600,3647957623,DE +3647957624,3647957727,GB +3647957728,3647957759,DE +3647957760,3647957887,GB +3647957888,3647958015,DE +3647958016,3647958527,GB +3647958528,3647958655,DE +3647958656,3647958687,GB +3647958688,3647958911,DE +3647958912,3647959559,GB +3647959560,3647959567,DE +3647959568,3647959575,ES +3647959576,3647959607,GB +3647959608,3647959615,DE +3647959616,3647959655,GB +3647959656,3647959671,DE +3647959672,3647959679,GB +3647959680,3647959687,DE +3647959688,3647959711,GB +3647959712,3647959775,DE +3647959776,3647960831,GB +3647960832,3647960839,DE +3647960840,3647960847,GB +3647960848,3647961087,DE +3647961088,3647961151,GB +3647961152,3647961215,DE +3647961216,3647961279,GB +3647961280,3647961311,DE +3647961312,3647961343,GB +3647961344,3647961471,DE +3647961472,3647962111,GB +3647962112,3647962151,DE +3647962152,3647962159,GB +3647962160,3647962191,DE +3647962192,3647963167,GB +3647963168,3647963183,BE +3647963184,3647963231,GB +3647963232,3647963263,BE +3647963264,3647963647,GB +3647963648,3647963711,BE +3647963712,3647995903,GB +3647995904,3648004095,RU +3648004096,3648004607,GB +3648004608,3648004863,RU +3648004864,3648005119,GB +3648005120,3648006271,RU +3648006272,3648006399,GB +3648006400,3648007167,RU +3648007168,3648008191,GB +3648008192,3648016383,FR +3648016384,3648020479,GB +3648020480,3648024575,IT +3648024576,3648028671,NL +3648028672,3648032767,HU +3648032768,3648033023,IE +3648033024,3648033039,DE +3648033040,3648033087,IE +3648033088,3648033103,DE +3648033104,3648033119,IE +3648033120,3648033535,DE +3648033536,3648033791,IE +3648033792,3648034063,DE +3648034064,3648034079,IE +3648034080,3648036863,DE +3648036864,3648040959,CZ +3648040960,3648041020,BE +3648041021,3648041021,FR +3648041022,3648045055,BE +3648045056,3648049151,FI +3648049152,3648053247,UA +3648053248,3648057343,FR +3648057344,3648061439,FI +3648061440,3648069631,AM +3648069632,3648073727,DE +3648073728,3648077823,HU +3648077824,3648078079,BE +3648078080,3648078335,CG +3648078336,3648078463,BE +3648078464,3648078495,BF +3648078496,3648078527,BE +3648078528,3648078591,BF +3648078592,3648078847,CG +3648078848,3648079103,BE +3648079104,3648080383,UG +3648080384,3648080511,TZ +3648080512,3648080543,BF +3648080544,3648080639,TZ +3648080640,3648080895,BE +3648080896,3648080903,NE +3648080904,3648080919,CD +3648080920,3648080927,GA +3648080928,3648080959,CD +3648080960,3648080991,TD +3648080992,3648081007,SL +3648081008,3648081023,BE +3648081024,3648081055,GB +3648081056,3648081407,BE +3648081408,3648082175,MW +3648082176,3648082239,BE +3648082240,3648082687,LR +3648082688,3648085759,BE +3648085760,3648086015,LR +3648086016,3648090111,AT +3648090112,3648094207,RU +3648094208,3648102399,PL +3648102400,3648106495,GB +3648106496,3648110591,DE +3648110592,3648114687,FR +3648114688,3648118783,IT +3648118784,3648122879,PL +3648122880,3648126975,ES +3648126976,3648139263,RU +3648139264,3648143359,GB +3648143360,3648147455,DE +3648147456,3648149503,SE +3648149504,3648150015,GB +3648150016,3648150271,SE +3648150272,3648150527,FI +3648150528,3648150783,DK +3648150784,3648151039,NO +3648151040,3648151551,SE +3648151552,3648155647,NL +3648155648,3648159743,CH +3648159744,3648163839,ES +3648163840,3648167935,RU +3648167936,3648172031,IE +3648172032,3648176127,RU +3648176128,3648180223,FR +3648180224,3648180767,DE +3648180768,3648180799,AT +3648180800,3648180863,DE +3648180864,3648180991,IE +3648180992,3648181023,DE +3648181024,3648181055,AT +3648181056,3648181119,DE +3648181120,3648181247,IE +3648181248,3648181311,DE +3648181312,3648181343,AT +3648181344,3648181631,DE +3648181632,3648181647,AT +3648181648,3648181887,DE +3648181888,3648181903,AT +3648181904,3648181951,DE +3648181952,3648181967,RU +3648181968,3648182143,DE +3648182144,3648182159,NL +3648182160,3648182175,DE +3648182176,3648182207,RU +3648182208,3648182271,GB +3648182272,3648182783,DE +3648182784,3648182799,IT +3648182800,3648182815,AT +3648182816,3648182823,DE +3648182824,3648182831,RU +3648182832,3648182847,DE +3648182848,3648182911,IT +3648182912,3648183871,DE +3648183872,3648183935,GB +3648183936,3648184319,DE +3648184320,3648192511,RU +3648196608,3648200703,IT +3648200704,3648208895,SE +3648208896,3648212991,DE +3648212992,3648217087,RU +3648217088,3648221183,GB +3648221184,3648225279,IE +3648225280,3648231263,DE +3648231264,3648231295,NL +3648231296,3648233471,DE +3648233472,3648237567,FR +3648237568,3648241663,RU +3648241664,3648245759,NL +3648245760,3648249855,RO +3648249856,3648253951,NL +3648253952,3648258047,CZ +3648258048,3648266239,ES +3648266240,3648270335,HU +3648270336,3648274431,RU +3648274432,3648278527,AT +3648278528,3648282623,NO +3648282624,3648286719,PL +3648286720,3648290815,DE +3648290816,3648299007,RU +3648299008,3648303103,FI +3648303104,3648307199,AT +3648307200,3648311295,GB +3648311296,3648315615,DK +3648315616,3648315631,CA +3648315632,3648316079,DK +3648316080,3648316087,SE +3648316088,3648316127,DK +3648316128,3648316143,CA +3648316144,3648316415,DK +3648316416,3648316671,NL +3648316672,3648316927,AT +3648316928,3648317247,DK +3648317248,3648317263,CA +3648317264,3648319527,DK +3648319528,3648319535,CH +3648319536,3648321631,DK +3648321632,3648321639,CA +3648321640,3648321823,DK +3648321824,3648321839,GB +3648321840,3648323583,DK +3648327680,3648331775,LT +3648331776,3648339967,BE +3648339968,3648344063,UA +3648344064,3648348159,RU +3648348160,3648352255,DE +3648352256,3648356351,RU +3648356352,3648360447,PL +3648360448,3648364543,FR +3648364544,3648368639,CH +3648368640,3648372735,RU +3648372736,3648376831,LU +3648376832,3648380927,CZ +3648380928,3648385023,NL +3648385024,3648389119,GR +3648389120,3648393215,IT +3648393216,3648397311,DE +3648397312,3648405503,NO +3648405504,3648413695,RU +3648413696,3648417791,SK +3648417792,3648417807,AT +3648417808,3648417815,GB +3648417816,3648417879,AT +3648417880,3648417919,GB +3648417920,3648418047,AT +3648418048,3648418079,GB +3648418080,3648418135,ES +3648418136,3648418143,GB +3648418144,3648418247,ES +3648418248,3648418255,CH +3648418256,3648418303,ES +3648418304,3648419327,GB +3648419328,3648419455,FR +3648419456,3648419519,IT +3648419520,3648419583,ES +3648419584,3648420095,GB +3648420096,3648420351,NL +3648420352,3648420863,GB +3648420864,3648421119,US +3648421120,3648421375,GB +3648421376,3648421631,DE +3648421632,3648421887,CH +3648421888,3648425983,GB +3648425984,3648430079,IT +3648430080,3648434175,NL +3648434176,3648438271,RU +3648438272,3648442367,CH +3648442368,3648443743,SE +3648443744,3648443759,PA +3648443760,3648446463,SE +3648446464,3648447055,FR +3648447056,3648447063,ES +3648447064,3648449119,FR +3648449120,3648449135,ES +3648449136,3648450559,FR +3648450560,3648454655,IT +3648454656,3648458751,NL +3648458752,3648462847,RU +3648462848,3648466943,FI +3648466944,3648469263,DE +3648469264,3648469271,NL +3648469272,3648469295,DE +3648469296,3648469311,AT +3648469312,3648471039,DE +3648471040,3648475135,PL +3648475136,3648479231,RU +3648479232,3648483327,CH +3648483328,3648487423,SK +3648487424,3648491519,FR +3648491520,3648495615,CH +3648495616,3648499711,SE +3648499712,3648503807,FR +3648503808,3648511999,DE +3648512000,3648516095,NL +3648516096,3648520191,CS +3648520192,3648782335,NL +3648782336,3649044479,ES +3649044480,3649110015,FR +3649110016,3649175551,PT +3649175552,3649241087,ES +3649241088,3649306623,TR +3649306624,3649372159,IL +3649372160,3649437695,IT +3649437696,3649568767,GB +3649568768,3649634303,BE +3649634304,3649700159,GB +3649700160,3649700247,US +3649700248,3649700251,BB +3649700252,3649700287,US +3649700288,3649700863,GB +3649700864,3649701119,US +3649701120,3649708791,GB +3649708792,3649709055,GD +3649709056,3649709287,GB +3649709288,3649709295,BB +3649709296,3649709311,AG +3649709312,3649709815,GB +3649709816,3649709823,TT +3649709824,3649765375,GB +3649830912,3649835007,NL +3649835008,3649839103,ES +3649839104,3649847295,GB +3649847296,3649855487,DE +3649855488,3649856511,GB +3649856512,3649857023,US +3649857024,3649857535,GB +3649857536,3649858047,JP +3649858048,3649859071,GB +3649859072,3649859583,US +3649859584,3649863679,SE +3649863680,3649896447,FI +3649896448,3649961983,IT +3649961984,3650093055,SE +3650093056,3650097151,JO +3650097152,3650101247,SK +3650101248,3650105343,DE +3650105344,3650109439,CH +3650109440,3650113535,UA +3650113536,3650117631,GB +3650117632,3650121727,RU +3650121728,3650125823,FR +3650125824,3650129919,DE +3650129920,3650134015,GB +3650134016,3650142207,RU +3650142208,3650150399,PL +3650150400,3650158591,NO +3650158592,3650159135,MT +3650159136,3650159151,SC +3650159152,3650162687,MT +3650162688,3650166783,RU +3650166784,3650167807,BE +3650167808,3650168063,LU +3650168064,3650170879,BE +3650170880,3650174975,DK +3650174976,3650179071,GB +3650179072,3650183167,BG +3650183168,3650187263,DE +3650187264,3650195455,GB +3650195456,3650199551,RU +3650199552,3650203647,BG +3650203648,3650207743,ES +3650207744,3650211839,SK +3650211840,3650215935,LV +3650215936,3650220031,GB +3650220032,3650224127,SA +3650224128,3650225027,US +3650225028,3650228223,GB +3650228224,3650232319,US +3650232320,3650236415,RU +3650236416,3650236671,GB +3650236672,3650236692,CH +3650236693,3650236911,GB +3650236912,3650236926,CH +3650236927,3650240511,GB +3650240512,3650244607,EE +3650244608,3650256895,GB +3650256896,3650265087,DE +3650265088,3650269183,CH +3650269184,3650273279,GB +3650273280,3650277375,IT +3650277376,3650281471,IR +3650281472,3650285567,FR +3650285568,3650289663,UA +3650289664,3650297855,RU +3650297856,3650301951,LT +3650306048,3650306623,DE +3650306624,3650306639,GE +3650306640,3650306775,DE +3650306776,3650306779,GE +3650306780,3650306783,DE +3650306784,3650306791,AT +3650306792,3650306799,DE +3650306800,3650306807,AT +3650306808,3650306943,DE +3650306944,3650306959,GB +3650306960,3650307007,DE +3650307008,3650307010,GB +3650307011,3650310143,DE +3650310144,3650314239,GB +3650314240,3650315271,DE +3650315272,3650315272,BE +3650315273,3650316711,DE +3650316712,3650316715,FR +3650316716,3650318335,DE +3650318336,3650322431,GI +3650322432,3650330623,IT +3650330624,3650334719,UA +3650334720,3650338815,GB +3650338816,3650342911,FR +3650342912,3650344879,CH +3650344880,3650344911,PT +3650344912,3650345879,CH +3650345880,3650345887,IM +3650345888,3650345903,AT +3650345904,3650345935,CH +3650345936,3650345951,PT +3650345952,3650346207,CH +3650346208,3650346239,IM +3650346240,3650347007,CH +3650347008,3650351103,GE +3650351104,3650351871,GB +3650351872,3650351879,NL +3650351880,3650351887,IT +3650351888,3650351903,GB +3650351904,3650351911,FR +3650351912,3650351919,SE +3650351920,3650351927,DK +3650351928,3650351935,DE +3650351936,3650351943,PL +3650351944,3650351951,ES +3650351952,3650351959,BE +3650351960,3650351967,ZA +3650351968,3650351975,PT +3650351976,3650351983,FI +3650351984,3650351991,NO +3650351992,3650352007,GB +3650352008,3650352015,IE +3650352016,3650355199,GB +3650355200,3650359295,CH +3650359296,3650363391,NL +3650363392,3650367487,GB +3650367488,3650371583,RU +3650371584,3650375679,ES +3650375680,3650379775,NL +3650379776,3650387967,IT +3650387968,3650392063,DE +3650392064,3650396159,NO +3650396160,3650404351,NL +3650404352,3650412543,RU +3650412544,3650416639,DE +3650416640,3650420735,BE +3650420736,3650424831,ES +3650424832,3650428927,RU +3650428928,3650433023,NL +3650433024,3650437119,FI +3650437120,3650441215,NL +3650441216,3650445311,IT +3650445312,3650449407,GB +3650449408,3650453503,NO +3650457600,3650461695,ES +3650461696,3650465791,AT +3650465792,3650469887,RU +3650469888,3650478079,NL +3650478080,3650482175,AT +3650482176,3650486271,PL +3650486272,3650502655,RU +3650502656,3650510847,SE +3650510848,3650519039,GB +3650519040,3650523135,HU +3650523136,3650527231,DE +3650527232,3650535423,SE +3650535424,3650539519,RU +3650539520,3650543615,ES +3650543616,3650551807,CH +3650551808,3650555903,FR +3650555904,3650559999,RU +3650560000,3650564095,GB +3650564096,3650568191,SE +3650568192,3650572287,RU +3650572288,3650576383,DE +3650576384,3650580479,GB +3650580480,3650584575,CH +3650584576,3650588671,RU +3650588672,3650592767,DE +3650592768,3650600959,IS +3650600960,3650605055,SE +3650605056,3650609279,DE +3650609280,3650609311,CY +3650609312,3650609407,DE +3650609408,3650609439,IQ +3650609440,3650609447,KZ +3650609448,3650609455,RU +3650609456,3650609663,DE +3650609664,3650609919,KZ +3650609920,3650610175,RU +3650610176,3650610687,KZ +3650610688,3650610943,RU +3650610944,3650611711,DE +3650611712,3650612735,KZ +3650612736,3650617343,DE +3650617344,3650682879,FI +3650682880,3650748415,PL +3650748416,3650789375,GB +3650789376,3650790143,NL +3650790144,3650879487,GB +3650879488,3650912255,RO +3650912256,3650945023,GB +3650945024,3651010559,DK +3651010560,3651076095,GB +3651076096,3651077375,DE +3651077376,3651077887,GB +3651077888,3651078143,IE +3651078144,3651078399,ES +3651078400,3651078655,IE +3651078656,3651078783,ES +3651078784,3651078911,DE +3651078912,3651079807,GB +3651079808,3651079935,ES +3651079936,3651080191,DE +3651080192,3651080831,GB +3651080832,3651081215,DE +3651081216,3651081727,GB +3651081728,3651081983,AT +3651081984,3651082751,GB +3651082752,3651083007,IE +3651083008,3651083519,GB +3651083520,3651083775,DE +3651083776,3651084031,IE +3651084032,3651084543,FR +3651084544,3651084799,IE +3651084800,3651085311,ES +3651085312,3651085567,FR +3651085568,3651086079,DE +3651086080,3651086335,IE +3651086336,3651086463,DE +3651086464,3651086591,IE +3651086592,3651086719,GR +3651086720,3651086847,DE +3651086848,3651087103,FR +3651087104,3651087615,ES +3651087616,3651087871,GB +3651087872,3651088127,DE +3651088128,3651088383,IE +3651088384,3651088639,GR +3651088640,3651088895,SG +3651088896,3651098111,DE +3651098112,3651098367,IE +3651098368,3651098623,FR +3651098624,3651101439,DE +3651101440,3651101695,FR +3651101696,3651101951,CH +3651101952,3651102207,FR +3651102208,3651102719,DE +3651102720,3651102975,GB +3651102976,3651103231,SL +3651103232,3651103487,IT +3651103488,3651103743,FR +3651103744,3651103999,IT +3651104000,3651104511,DE +3651104512,3651104767,PL +3651104768,3651105535,DE +3651105536,3651105791,IT +3651105792,3651106047,ES +3651106048,3651106559,GB +3651106560,3651106815,IE +3651106816,3651107327,DE +3651107328,3651107583,GB +3651107584,3651107839,NL +3651107840,3651107967,GB +3651107968,3651108351,IE +3651108352,3651108479,NL +3651108480,3651108543,ES +3651108544,3651108863,DE +3651108864,3651141631,EE +3651141632,3651202815,DE +3651202816,3651203071,GB +3651203072,3651207167,US +3651207168,3651207199,GB +3651207224,3651207295,GB +3651207424,3651207615,GB +3651207648,3651208959,GB +3651209216,3651209231,US +3651209232,3651209239,GB +3651209240,3651209243,DE +3651209472,3651210751,GB +3651211264,3651211775,IR +3651213824,3651214207,US +3651215360,3651215395,GB +3651215616,3651215871,GB +3651217408,3651217535,GI +3651219456,3651219967,US +3651220384,3651220479,GB +3651221504,3651221695,GB +3651223552,3651223567,GB +3651223584,3651223607,GB +3651223648,3651223663,ES +3651227136,3651227391,GB +3651230720,3651231743,MU +3651232256,3651232287,GB +3651232320,3651232383,GB +3651232448,3651232511,GB +3651233792,3651233855,GB +3651236032,3651236063,GB +3651236864,3651237631,SC +3651237888,3651238399,SC +3651239936,3651272703,GB +3651272704,3651338239,CH +3651338240,3651403775,GB +3651403776,3651534847,AE +3651534848,3651600383,NL +3651600384,3651636696,FR +3651636697,3651636697,GB +3651636698,3651665919,FR +3651665920,3651670015,ES +3651670016,3651674111,GB +3651674112,3651682303,CH +3651682304,3651686399,RU +3651686400,3651690495,NO +3651690496,3651694591,FR +3651694592,3651694719,GH +3651694720,3651694847,PT +3651694848,3651694975,NG +3651694976,3651695103,PT +3651695104,3651695359,CV +3651695360,3651695615,AO +3651695616,3651696639,PT +3651696640,3651698687,AO +3651698688,3651702783,PL +3651702784,3651706879,GB +3651706880,3651710975,MT +3651710976,3651715071,AZ +3651715072,3651719167,PL +3651719168,3651723263,CZ +3651723264,3651727359,IT +3651727360,3651731455,RU +3651731456,3651747839,GB +3651747840,3651751935,FI +3651751936,3651756031,RU +3651756032,3651764223,IT +3651764224,3651772415,CH +3651772416,3651776511,GB +3651776512,3651780607,CZ +3651780608,3651784703,TR +3651784704,3651785215,RS +3651785216,3651785227,CS +3651785228,3651785231,RS +3651785232,3651785271,CS +3651785272,3651785279,RS +3651785280,3651785295,CS +3651785296,3651785303,RS +3651785304,3651785311,CS +3651785312,3651785319,RS +3651785320,3651785327,CS +3651785328,3651785335,RS +3651785336,3651785351,CS +3651785352,3651785359,RS +3651785360,3651785391,CS +3651785392,3651785395,RS +3651785396,3651785415,CS +3651785416,3651785419,RS +3651785420,3651785455,CS +3651785456,3651785483,RS +3651785484,3651785487,CS +3651785488,3651785499,RS +3651785500,3651785503,CS +3651785504,3651785527,RS +3651785528,3651785539,CS +3651785540,3651785547,RS +3651785548,3651785559,CS +3651785560,3651785563,RS +3651785564,3651785591,CS +3651785592,3651785603,RS +3651785604,3651785611,CS +3651785612,3651785615,RS +3651785616,3651785631,CS +3651785632,3651785635,RS +3651785636,3651785647,CS +3651785648,3651785655,RS +3651785656,3651785659,CS +3651785660,3651785663,RS +3651785664,3651785699,CS +3651785700,3651785703,RS +3651785704,3651785727,CS +3651785728,3651787519,RS +3651787520,3651787591,CS +3651787592,3651787615,RS +3651787616,3651787759,CS +3651787760,3651787791,RS +3651787792,3651787799,CS +3651787800,3651787839,RS +3651787840,3651787863,CS +3651787864,3651787875,RS +3651787876,3651787883,CS +3651787884,3651787887,RS +3651787888,3651787891,CS +3651787892,3651787895,RS +3651787896,3651787903,CS +3651787904,3651787911,RS +3651787912,3651787939,CS +3651787940,3651787943,RS +3651787944,3651788039,CS +3651788040,3651788043,RS +3651788044,3651788059,CS +3651788060,3651788063,RS +3651788064,3651788159,CS +3651788160,3651788175,RS +3651788176,3651788183,CS +3651788184,3651788207,RS +3651788208,3651788239,CS +3651788240,3651788251,RS +3651788252,3651788255,CS +3651788256,3651788263,RS +3651788264,3651788279,CS +3651788280,3651788287,RS +3651788288,3651788799,CS +3651788800,3651792895,NL +3651792896,3651796991,FR +3651796992,3651813375,NL +3651813376,3651821567,RU +3651821568,3651825663,CZ +3651825664,3651829759,RU +3651829760,3651833855,NO +3651837952,3651842047,PL +3651842048,3651846143,DE +3651846144,3651850239,NO +3651850240,3651854335,RU +3651854336,3651858431,IT +3651858432,3651858687,CS +3651858688,3651858943,SC +3651858944,3651862527,CS +3651862528,3651866623,RU +3651866624,3651870719,FR +3651870720,3651874815,IT +3651874816,3651878911,PL +3651878912,3651883007,RU +3651883008,3651887103,BE +3651887104,3651891199,GB +3651891200,3651895295,DE +3651895296,3651899391,GB +3651899392,3651903487,RU +3651903488,3651907583,IT +3651907584,3651908991,IQ +3651908992,3651909311,DE +3651909312,3651909375,IQ +3651909376,3651909631,DE +3651909632,3651910655,IQ +3651910656,3651910783,DE +3651910784,3651911167,IQ +3651911168,3651911623,DE +3651911624,3651911631,IQ +3651911632,3651911643,DE +3651911644,3651911647,IR +3651911648,3651915775,DE +3651915776,3651919871,IS +3651919872,3651923967,RU +3651923968,3651928063,GB +3651928064,3651932159,IT +3651932160,3651936255,RU +3651936256,3651938175,DE +3651938176,3651938207,GB +3651938208,3651938255,DE +3651938256,3651938271,PL +3651938272,3651938943,DE +3651938944,3651938959,NL +3651938960,3651938975,DE +3651938976,3651939007,TR +3651939008,3651939071,DE +3651939072,3651939087,SE +3651939088,3651939135,DE +3651939136,3651939151,PL +3651939152,3651939167,DE +3651939168,3651939231,GB +3651939232,3651939263,DE +3651939264,3651939295,IT +3651939296,3651939327,PL +3651939328,3651939391,IT +3651939392,3651939503,DE +3651939504,3651939511,GB +3651939512,3651939519,DE +3651939520,3651939527,RU +3651939528,3651939583,PL +3651939584,3651939647,DE +3651939648,3651939711,ES +3651939712,3651939727,DE +3651939728,3651939743,PL +3651939744,3651939791,DE +3651939792,3651939799,RU +3651939800,3651940351,DE +3651940352,3651940383,TR +3651940384,3651940415,US +3651940416,3651940479,IT +3651940480,3651940543,GB +3651940544,3651940639,DE +3651940640,3651940671,BS +3651940672,3651940735,DE +3651940736,3651940743,AU +3651940744,3651940751,RU +3651940752,3651940799,DE +3651940800,3651940863,ES +3651940864,3651940927,GB +3651940928,3651940991,IT +3651940992,3651941027,DE +3651941028,3651941055,TR +3651941056,3651941087,DE +3651941088,3651941119,GB +3651941120,3651941183,DE +3651941184,3651941215,IT +3651941216,3651941249,TR +3651941250,3651941695,DE +3651941696,3651941759,IT +3651941760,3651942655,DE +3651942656,3651942719,GB +3651942720,3651942735,SE +3651942736,3651942751,US +3651942752,3651942783,DE +3651942784,3651942815,GB +3651942816,3651944447,DE +3651944448,3651948543,ES +3651948544,3651952639,FO +3651952640,3651954175,IR +3651954176,3651954431,AE +3651954432,3651958271,IR +3651958272,3651958783,UA +3651958784,3651960831,IR +3651960832,3651964927,GB +3651964928,3651969023,SK +3651969024,3651977215,DE +3651977216,3651985407,IT +3651985408,3651993599,PL +3651993600,3652001791,RU +3652001792,3652005887,HU +3652005888,3652009983,GB +3652009984,3652014079,RU +3652014080,3652018175,SA +3652018176,3652018239,IE +3652018240,3652018943,GB +3652018944,3652019167,IE +3652019168,3652019199,GB +3652019200,3652019423,IE +3652019424,3652019583,GB +3652019584,3652019599,IE +3652019600,3652019615,GB +3652019616,3652019663,IE +3652019664,3652019775,GB +3652019776,3652019791,IE +3652019792,3652019807,GB +3652019808,3652019815,IE +3652019816,3652019887,GB +3652019888,3652019935,IE +3652019936,3652019951,GB +3652019952,3652019967,IE +3652019968,3652020479,GB +3652020480,3652020735,IE +3652020736,3652020767,GB +3652020768,3652020799,IE +3652020800,3652020863,DE +3652020864,3652020991,IE +3652020992,3652021791,GB +3652021792,3652021887,IE +3652021888,3652022271,GB +3652022272,3652026367,ES +3652026368,3652028031,DE +3652028032,3652028063,US +3652028064,3652028095,CH +3652028096,3652028223,DE +3652028224,3652028255,ES +3652028256,3652031743,DE +3652031744,3652031999,US +3652032000,3652032767,DE +3652032768,3652033791,NL +3652033792,3652033855,GD +3652033856,3652033887,NL +3652033888,3652033919,VG +3652033920,3652033935,TR +3652033936,3652033951,DE +3652033952,3652033967,CH +3652033968,3652033983,NL +3652033984,3652034015,TR +3652034016,3652034047,NL +3652034048,3652034111,GD +3652034112,3652034143,TR +3652034144,3652034175,CH +3652034176,3652034207,NL +3652034208,3652034239,ES +3652034240,3652034271,VG +3652034272,3652034367,GD +3652034368,3652034383,ES +3652034384,3652034399,VG +3652034400,3652034559,GD +3652034560,3652046847,PL +3652046848,3652050499,IE +3652050500,3652050503,GB +3652050504,3652050527,IE +3652050528,3652050535,GB +3652050536,3652050567,IE +3652050568,3652050615,GB +3652050616,3652050619,IE +3652050620,3652050671,GB +3652050672,3652050679,IE +3652050680,3652050687,GB +3652050688,3652050787,IE +3652050788,3652050791,GB +3652050792,3652050943,IE +3652050944,3652055039,LI +3652055040,3652059135,NO +3652059136,3652063231,RU +3652063232,3652067327,IR +3652067328,3652071423,TR +3652071424,3652075519,BG +3652075520,3652083711,SE +3652083712,3652087807,RU +3652087808,3652095999,IT +3652096000,3652100095,BG +3652100096,3652105471,RU +3652105472,3652105535,US +3652105536,3652108287,RU +3652108288,3652116479,FR +3652116480,3652120575,TM +3652120576,3652124671,GB +3652124672,3652128767,UA +3652128768,3652136959,RU +3652136960,3652141055,IT +3652141056,3652145151,GB +3652145152,3652149247,UA +3652149248,3652153343,DE +3652153344,3652157439,SE +3652157440,3652165631,RU +3652165632,3652173823,FR +3652173824,3652177919,AT +3652177920,3652182015,CY +3652182016,3652182527,DE +3652182528,3652182783,AT +3652182784,3652186591,DE +3652186592,3652186623,CH +3652186624,3652186879,DE +3652186880,3652187007,AT +3652187008,3652190207,DE +3652190208,3652714495,GB +3652714496,3652984927,DE +3652984928,3652984935,NL +3652984936,3652985039,DE +3652985040,3652985047,FR +3652985048,3653039103,DE +3653039104,3653039359,IT +3653039360,3653238783,DE +3653238784,3653369855,CH +3653369856,3653373951,IT +3653373952,3653378047,NL +3653378048,3653382143,DE +3653382144,3653386239,CH +3653386240,3653390335,DE +3653390336,3653394431,FR +3653394432,3653402623,NL +3653402624,3653403135,AT +3653403136,3653403647,CD +3653403648,3653403903,ZW +3653403904,3653403911,UA +3653403912,3653403919,IQ +3653403920,3653403931,UA +3653403932,3653403935,GB +3653403936,3653403943,IQ +3653403944,3653403951,LB +3653403952,3653403959,IQ +3653403960,3653403967,MW +3653403968,3653403983,NG +3653403984,3653403999,UA +3653404000,3653404008,LB +3653404009,3653404015,GB +3653404016,3653404023,LB +3653404024,3653404031,GB +3653404032,3653404039,NA +3653404040,3653404055,IQ +3653404056,3653404063,GB +3653404064,3653404071,LB +3653404072,3653404079,AO +3653404080,3653404087,UA +3653404088,3653404095,LB +3653404096,3653404103,IQ +3653404104,3653404111,GB +3653404112,3653404119,MD +3653404120,3653404127,GB +3653404128,3653404135,CS +3653404136,3653404143,LY +3653404144,3653404159,GB +3653404160,3653404415,AT +3653404416,3653404543,IQ +3653404544,3653404559,NG +3653404560,3653404567,IQ +3653404568,3653404575,LY +3653404576,3653404591,TR +3653404592,3653404599,GH +3653404600,3653404607,GB +3653404608,3653404655,UA +3653404656,3653404671,GB +3653404672,3653404679,TR +3653404680,3653404687,IQ +3653404688,3653404707,GB +3653404708,3653404713,IQ +3653404714,3653404719,GB +3653404720,3653404735,LB +3653404736,3653404751,GB +3653404752,3653404759,AM +3653404760,3653404783,GB +3653404784,3653404791,IQ +3653404792,3653404799,GB +3653404800,3653404807,IQ +3653404808,3653404815,GB +3653404816,3653404831,LB +3653404832,3653404847,NG +3653404848,3653404855,GB +3653404856,3653404863,SL +3653404864,3653404871,LY +3653404872,3653404879,GB +3653404880,3653404887,UA +3653404888,3653404903,GB +3653404904,3653404911,IQ +3653404912,3653404919,LY +3653404920,3653404951,GB +3653404952,3653404959,IQ +3653404960,3653404975,UA +3653404976,3653404983,GB +3653404984,3653404991,AM +3653404992,3653405007,IQ +3653405008,3653405031,LB +3653405032,3653405039,GB +3653405040,3653405047,LB +3653405048,3653405071,IQ +3653405072,3653405087,GB +3653405088,3653405095,LY +3653405096,3653405103,NG +3653405104,3653405119,CY +3653405120,3653405135,AM +3653405136,3653405151,UA +3653405152,3653405167,GB +3653405168,3653405183,UA +3653405184,3653405439,AT +3653405440,3653405695,IQ +3653405696,3653407007,NG +3653407008,3653407015,GB +3653407016,3653407023,UG +3653407024,3653407031,KE +3653407032,3653407071,NG +3653407072,3653407087,GB +3653407088,3653407095,NG +3653407096,3653407103,GB +3653407104,3653407111,UG +3653407112,3653407119,ZM +3653407120,3653407127,ZW +3653407128,3653407151,GB +3653407152,3653407159,KE +3653407160,3653407167,GB +3653407168,3653407231,NG +3653407232,3653407359,GB +3653407360,3653407375,NG +3653407376,3653407383,UG +3653407384,3653407391,GB +3653407392,3653407399,NG +3653407400,3653407423,GB +3653407424,3653407487,ZW +3653407488,3653407615,GB +3653407616,3653407639,NG +3653407640,3653407647,ZM +3653407648,3653407679,GB +3653407680,3653407695,UG +3653407696,3653407703,CD +3653407704,3653407711,NG +3653407712,3653407727,GB +3653407728,3653407743,ZW +3653407744,3653407999,AT +3653408000,3653408023,GB +3653408024,3653408031,UG +3653408032,3653408047,ZW +3653408048,3653408055,GB +3653408056,3653408063,TZ +3653408064,3653408071,ZM +3653408072,3653408079,NG +3653408080,3653408087,MW +3653408088,3653408143,GB +3653408144,3653408151,NG +3653408152,3653408159,ZM +3653408160,3653408167,NG +3653408168,3653408175,ZW +3653408176,3653408183,KE +3653408184,3653408191,MW +3653408192,3653408215,GB +3653408216,3653408223,MW +3653408224,3653408231,GB +3653408232,3653408239,KE +3653408240,3653408247,ZM +3653408248,3653408767,GB +3653408768,3653409023,CD +3653409024,3653409279,GB +3653409280,3653409535,TZ +3653409536,3653409559,UA +3653409560,3653409567,CM +3653409568,3653409575,UA +3653409576,3653409615,GB +3653409616,3653409623,IQ +3653409624,3653409639,NG +3653409640,3653409647,GB +3653409648,3653409663,NG +3653409664,3653409791,CM +3653409792,3653409855,ZW +3653409856,3653409919,GB +3653409920,3653410047,NG +3653410048,3653410063,YT +3653410064,3653410079,UG +3653410080,3653410087,GB +3653410088,3653410095,NG +3653410096,3653410111,ZW +3653410112,3653410119,KE +3653410120,3653410127,NG +3653410128,3653410143,GB +3653410144,3653410151,ET +3653410152,3653410159,KE +3653410160,3653410175,NG +3653410176,3653410183,KE +3653410184,3653410191,MZ +3653410192,3653410199,ZW +3653410200,3653410215,GB +3653410216,3653410223,ZW +3653410224,3653410239,GB +3653410240,3653410247,SO +3653410248,3653410255,ZM +3653410256,3653410263,MW +3653410264,3653410271,NG +3653410272,3653410279,KE +3653410280,3653410295,GB +3653410296,3653410303,MW +3653410304,3653410815,GB +3653410816,3653414911,CZ +3653414912,3653419007,IT +3653419008,3653423103,IL +3653423104,3653427199,GB +3653427200,3653431295,DE +3653431296,3653435391,RU +3653435392,3653439487,DE +3653439488,3653443583,FR +3653443584,3653444351,DE +3653444352,3653444383,IT +3653444384,3653447679,DE +3653447680,3653451775,LV +3653451776,3653464063,RU +3653464064,3653468159,NL +3653468160,3653472255,GR +3653472256,3653472279,NL +3653472280,3653472291,AF +3653472292,3653474303,NL +3653474304,3653474367,US +3653474368,3653476351,NL +3653476352,3653480447,CZ +3653480448,3653484543,DK +3653484544,3653488639,TR +3653488640,3653492735,RU +3653492736,3653500927,NL +3653500928,3653505023,GB +3653505024,3653509119,KZ +3653509120,3653513215,NL +3653513216,3653517311,NO +3653517312,3653518367,AT +3653518368,3653518399,SK +3653518400,3653518479,AT +3653518480,3653518495,SK +3653518496,3653519815,AT +3653519816,3653519871,SK +3653519872,3653520191,AT +3653520192,3653520255,SK +3653520256,3653522975,AT +3653522976,3653522991,SK +3653522992,3653523199,AT +3653523200,3653523455,SK +3653523456,3653523615,AT +3653523616,3653523647,SK +3653523648,3653524551,AT +3653524552,3653524559,GR +3653524560,3653524735,AT +3653524736,3653524863,SK +3653524864,3653524959,AT +3653524960,3653525151,SK +3653525152,3653525183,AT +3653525184,3653525215,SK +3653525216,3653525503,AT +3653525504,3653533695,RU +3653533696,3653537791,HU +3653537792,3653541887,AT +3653541888,3653544959,UA +3653544960,3653545215,AT +3653545216,3653545343,UA +3653545344,3653545471,SE +3653545472,3653545727,UA +3653545728,3653545791,SE +3653545792,3653545855,UA +3653545856,3653545983,SE +3653545984,3653550079,CH +3653550080,3653554175,GB +3653554176,3653558271,CZ +3653558272,3653566463,GB +3653566464,3653570559,RU +3653570560,3653574655,NO +3653574656,3653578751,CZ +3653578752,3653582847,SE +3653582848,3653586943,PL +3653586944,3653591039,DE +3653591040,3653595135,LU +3653595136,3653599231,RU +3653599232,3653603327,BG +3653603328,3653607423,CZ +3653607424,3653611519,PL +3653611520,3653615615,HU +3653615616,3653619711,GB +3653619712,3653623295,CH +3653623296,3653623551,JP +3653623552,3653623807,US +3653623808,3653636095,RU +3653636096,3653640191,NL +3653640192,3653644031,GB +3653644032,3653644047,BE +3653644048,3653644271,GB +3653644272,3653644275,BE +3653644276,3653648383,GB +3653648384,3653652479,SE +3653652480,3653656575,RU +3653656576,3653660671,HR +3653660672,3653664767,CZ +3653664768,3653668863,UA +3653668864,3653672959,SE +3653672960,3653681151,RU +3653681152,3653685247,NL +3653685248,3653689343,DK +3653689344,3653693439,LV +3653693440,3653697535,DE +3653697536,3653705727,IT +3653705728,3653705735,SE +3653705736,3653705863,NO +3653705864,3653705871,SE +3653705872,3653705895,NO +3653705896,3653705903,BS +3653705904,3653706175,NO +3653706176,3653706191,SE +3653706192,3653706271,NO +3653706272,3653706303,SE +3653706304,3653706495,NO +3653706496,3653706751,SE +3653706752,3653710847,NO +3653710848,3653710911,SE +3653710912,3653713919,NO +3653713920,3653718015,DE +3653718016,3653722111,AT +3653722112,3653730303,LV +3653730304,3653734399,BA +3653738496,3653740295,GB +3653740296,3653740303,US +3653740304,3653744895,GB +3653744896,3653744959,AE +3653744960,3653746687,GB +3653746688,3653750783,DE +3653750784,3653754879,RU +3653754880,3653758975,UA +3653758976,3653763071,RU +3653763072,3654025215,IT +3654025216,3654034783,GB +3654034784,3654034799,LU +3654034800,3654035583,GB +3654035584,3654035591,US +3654035592,3654035607,GB +3654035608,3654035615,SE +3654035616,3654061035,GB +3654061036,3654061039,US +3654061040,3654061951,GB +3654061952,3654062079,DE +3654062080,3654066027,GB +3654066028,3654066031,MC +3654066032,3654287359,GB +3654287360,3654607871,SE +3654607872,3654608127,NO +3654608128,3654608895,SE +3654608896,3654609919,NO +3654609920,3654609927,DK +3654609928,3654612991,SE +3654612992,3654612999,RU +3654613000,3654613007,SE +3654613008,3654613015,RU +3654613016,3654613055,SE +3654613056,3654613071,RU +3654613072,3654613087,SE +3654613088,3654613151,RU +3654613152,3654613247,SE +3654613248,3654614015,NO +3654614016,3654614031,SE +3654614032,3654614047,US +3654614048,3654614079,SE +3654614080,3654614143,FI +3654614144,3654614527,SE +3654614528,3654614783,RU +3654614784,3654615039,NO +3654615040,3654811647,SE +3654811648,3654942719,ES +3654942720,3655073791,IR +3655073792,3655335935,IT +3655335936,3656229703,DE +3656229704,3656229711,ES +3656229712,3656233999,DE +3656234000,3656234007,NL +3656234008,3656234263,DE +3656234264,3656234271,US +3656234272,3656236527,DE +3656236528,3656236535,GB +3656236536,3656236543,US +3656236544,3656633487,DE +3656633488,3656633495,GB +3656633496,3656633503,US +3656633504,3656650583,DE +3656650584,3656650591,US +3656650592,3656661183,DE +3656661184,3656661199,AT +3656661200,3656661583,DE +3656661584,3656661599,AT +3656661600,3656661647,DE +3656661648,3656661679,AT +3656661680,3656662271,DE +3656662272,3656662367,AT +3656662368,3656662431,DE +3656662432,3656662463,AT +3656662464,3657433087,DE +3657433088,3659530239,CN +3659530240,3659595775,TW +3659595776,3659628543,ID +3659628544,3659661311,JP +3659661312,3659792383,TW +3659792384,3660054527,KR +3660054528,3660578815,JP +3660578816,3661103103,KR +3661103104,3663986687,CN +3663986688,3663987711,AU +3663987712,3663987967,ID +3663987968,3663989247,JP +3663989248,3663989503,VN +3663989504,3663989759,ID +3663989760,3663990271,AU +3663990272,3663990527,VN +3663990528,3663990783,JP +3663990784,3663991295,HK +3663991296,3663991551,MY +3663991552,3663991807,AU +3663991808,3663992063,JP +3663992064,3663992319,NZ +3663992320,3663992575,MY +3663992576,3663993599,NZ +3663993600,3663996159,ID +3663996160,3663996415,BD +3663996416,3663996671,TH +3663996672,3663997183,AU +3663997184,3663997439,ID +3663997440,3663997695,JP +3663997696,3663997951,AU +3663997952,3663998207,MY +3663998208,3663998463,JP +3663998464,3663998975,TH +3663998976,3663999487,IN +3663999488,3663999743,AU +3663999744,3663999999,KH +3664000000,3664000767,AU +3664000768,3664001023,ID +3664001024,3664001279,NZ +3664001280,3664001535,LK +3664001536,3664001791,MY +3664001792,3664002047,AU +3664002048,3664002303,VN +3664002304,3664002559,LK +3664002560,3664003327,ID +3664003328,3664003583,NZ +3664003584,3664003839,TH +3664003840,3664052223,AU +3664052224,3664084991,NZ +3664084992,3664117759,KR +3664117760,3664248831,HK +3664248832,3664642047,CN +3664642048,3664707583,JP +3664707584,3664773119,MY +3664773120,3666870271,JP +3666870272,3667918847,KR +3667918848,3668967423,TW +3668967424,3669491711,JP +3669491712,3669557247,TW +3669557248,3669590015,AU +3669590016,3669606399,JP +3669606400,3669614591,CN +3669614592,3669616639,NZ +3669616640,3669618687,AU +3669618688,3669620735,BD +3669620736,3669622783,JP +3669622784,3669688319,SG +3669688320,3669753855,TW +3669753856,3669822719,HK +3669822720,3669822735,US +3669822736,3670015999,HK +3670016000,3671064575,CN +3671064576,3671130111,MY +3671130112,3671195647,KR +3671195648,3671326719,TW +3671326720,3671392255,SG +3671392256,3671457791,HK +3671457792,3671588863,AU +3671588864,3672637439,JP +3672637440,3673161727,KR +3673161728,3673686015,CN +3673686016,3673751551,IN +3673751552,3673817087,CN +3673817088,3673882623,HK +3673882624,3673948159,JP +3673948160,3674210303,HK +3674210304,3674431743,JP +3674431744,3674431999,UA +3674432000,3678404607,JP +3678404608,3678535679,IN +3678535680,3678666751,JP +3678666752,3678928895,TW +3678928896,3678994431,CN +3678994432,3679027199,HK +3679027200,3679059967,JP +3679059968,3679158271,SG +3679158272,3679191039,JP +3679191040,3679453183,HK +3679453184,3679584255,TW +3679584256,3679649791,CN +3679649792,3679682559,ID +3679682560,3679715327,IN +3679715328,3679977471,TW +3679977472,3680108543,NZ +3680108544,3680124927,TW +3680124928,3680133119,PH +3680133120,3680137215,IN +3680137216,3680141311,HK +3680141312,3680174079,AU +3680174080,3680206847,TW +3680206848,3680239615,IN +3680239616,3680403455,MY +3680403456,3680436223,JP +3680436224,3680501759,MY +3680501760,3682598911,JP +3682598912,3684696063,CN +3684696064,3688366079,JP +3688366080,3689938943,CN +3689938944,3690070015,KR +3690070016,3690463231,CN +3690463232,3690987519,KR +3690987520,3695181823,JP +3695181824,3697278975,KR +3697278976,3697606655,JP +3697606656,3697655807,AU +3697655808,3697672191,CN +3697672192,3697737727,JP +3697737728,3697803263,KR +3697803264,3698327551,JP +3698327552,3698589695,CN +3698589696,3699376127,KR +3699376128,3700424703,TW +3700424704,3700752383,JP +3700752384,3700817919,KR +3700817920,3700977663,JP +3700977664,3700979711,AU +3700979712,3700981759,JP +3700981760,3701014527,CN +3701014528,3701080063,JP +3701080064,3701211135,CN +3701211136,3701252095,JP +3701252096,3701256191,AU +3701256192,3701258239,SG +3701258240,3701260287,IN +3701260288,3701293055,JP +3701293056,3701301247,AU +3701301248,3701305343,ID +3701305344,3701309439,TW +3701309440,3701473279,JP +3701473280,3704619007,CN +3704619008,3705667583,JP +3705667584,3705929727,IN +3705929728,3706060799,TW +3706060800,3706126335,KR +3706126336,3706142719,CN +3706142720,3706159103,VN +3706159104,3706191871,CN +3706191872,3706208255,SG +3706208256,3706224639,CN +3706224640,3706257407,HK +3706257408,3706322943,AU +3706322944,3706388479,CN +3706388480,3706781695,AU +3706781696,3706847231,HK +3706847232,3706978303,CN +3706978304,3707109375,AU +3707109376,3707174911,HK +3707174912,3707207679,JP +3707207680,3707208703,TW +3707208704,3707215871,AU +3707215872,3707217919,BD +3707217920,3707219967,ID +3707219968,3707222015,AU +3707222016,3707224063,JP +3707224064,3707240447,LK +3707240448,3707568127,CN +3707568128,3707633663,AU +3707633664,3707699199,JP +3707699200,3707764735,SG +3707764736,3708600319,CN +3708600320,3708616703,JP +3708616704,3708813311,CN +3708813312,3715629055,JP +3715629056,3715653631,TW +3715653632,3715655679,BD +3715655680,3715657727,IN +3715657728,3715659775,AU +3715659776,3715661823,SG +3715661824,3715674111,AU +3715674112,3715678207,HK +3715678208,3715694591,PK +3715694592,3715710975,VN +3715710976,3715719167,AU +3715719168,3715727359,PH +3715727360,3715735551,AU +3715735552,3715741695,JP +3715741696,3715743743,PH +3715743744,3715760127,JP +3715760128,3715891199,CN +3715891200,3716153343,HK +3716153344,3716169727,SG +3716169728,3716186111,TH +3716186112,3716218879,IN +3716218880,3716415487,CN +3716415488,3716431871,VN +3716431872,3716440063,KR +3716440064,3716444159,JP +3716444160,3716446207,PK +3716446208,3716448255,AU +3716448256,3716464639,JP +3716464640,3716481023,ID +3716481024,3716489215,VN +3716489216,3716493311,MY +3716493312,3716497407,KR +3716497408,3716513791,JP +3716513792,3716530175,KR +3716530176,3716536372,AU +3716536373,3716536373,AS +3716536374,3716537111,AU +3716537112,3716537119,AS +3716537120,3716537151,AU +3716537152,3716537183,AS +3716537184,3716537199,AU +3716537200,3716537215,AS +3716537216,3716537279,AU +3716537280,3716537343,AS +3716537344,3716537407,AU +3716537408,3716537471,AS +3716537472,3716537535,AU +3716537536,3716537567,HK +3716537568,3716537599,JP +3716537600,3716538367,AU +3716538368,3716546559,CN +3716546560,3716677631,IN +3716677632,3716808703,CN +3716808704,3718840319,KR +3718840320,3718905855,TW +3718905856,3719036927,JP +3719036928,3719823359,CN +3719823360,3720347647,JP +3720347648,3720859647,CN +3720859648,3720863743,AU +3720863744,3723493375,CN +3723493376,3725590527,JP +3725590528,3730833407,CN +3730833408,3732602879,KR +3732602880,3732668415,TH +3732668416,3732733951,ID +3732733952,3732799487,CN +3732799488,3732832255,PH +3732832256,3732865023,CN +3732865024,3732930559,PH +3732930560,3733979135,CN +3733979136,3734503423,JP +3734503424,3734765567,NZ +3734765568,3734896639,TW +3734896640,3735027711,JP +3735027712,3735289855,CN +3735289856,3735388159,SG +3735388160,3735404543,LK +3735404544,3735420927,ID +3735420928,3735551999,HK +3735552000,3739222015,CN +3739222016,3739570175,JP +3739570176,3739572223,ID +3739572224,3739574271,TH +3739574272,3739680767,JP +3739680768,3739697151,KR +3739697152,3739746303,JP +3739746304,3740270591,KR +3740270592,3740925951,CN +3740925952,3741024255,TW +3741024256,3741057023,KR +3741057024,3741319167,VN +3758096384,4294967295,US diff --git a/installer/resources/i2prouter b/installer/resources/i2prouter index 0705905fe..2b0edd420 100644 --- a/installer/resources/i2prouter +++ b/installer/resources/i2prouter @@ -12,20 +12,30 @@ #----------------------------------------------------------------------------- # These settings can be modified to fit the needs of your application +# Paths +# Note that (percent)INSTALL_PATH and (percent)SYSTEM_java_io_tmpdir +# should have been replaced by the izpack installer. +# If you did not run the installer, replace them with the appropriate path. +I2P="%INSTALL_PATH" +I2PTEMP="%SYSTEM_java_io_tmpdir" +# PORTABLE installation: +# Use the following instead. +#I2PTEMP="%INSTALL_PATH" + # Application APP_NAME="i2p" APP_LONG_NAME="I2P Service" # Wrapper -WRAPPER_CMD="./i2psvc" -WRAPPER_CONF="wrapper.config" +WRAPPER_CMD="$I2P/i2psvc" +WRAPPER_CONF="$I2P/wrapper.config" # Priority at which to run the wrapper. See "man nice" for valid priorities. # nice is only used if a priority is specified. PRIORITY= # Location of the pid file. -PIDDIR="." +PIDDIR="$I2PTEMP" # If uncommented, causes the Wrapper to be shutdown using an anchor file. # When launched with the 'start' command, it will also ignore all INT and @@ -47,40 +57,6 @@ PIDDIR="." # Do not modify anything beyond this point #----------------------------------------------------------------------------- -# Get the fully qualified path to the script -case $0 in - /*) - SCRIPT="$0" - ;; - *) - PWD=`pwd` - SCRIPT="$PWD/$0" - ;; -esac - -# Change spaces to ":" so the tokens can be parsed. -SCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'` -# Get the real path to this script, resolving any symbolic links -TOKENS=`echo $SCRIPT | sed -e 's;/; ;g'` -REALPATH= -for C in $TOKENS; do - REALPATH="$REALPATH/$C" - while [ -h "$REALPATH" ] ; do - LS="`ls -ld "$REALPATH"`" - LINK="`expr "$LS" : '.*-> \(.*\)$'`" - if expr "$LINK" : '/.*' > /dev/null; then - REALPATH="$LINK" - else - REALPATH="`dirname "$REALPATH"`""/$LINK" - fi - done -done -# Change ":" chars back to spaces. -REALPATH=`echo $REALPATH | sed -e 's;:; ;g'` - -# Change the current directory to the location of the script -cd "`dirname "$REALPATH"`" - # Process ID ANCHORFILE="$PIDDIR/$APP_NAME.anchor" PIDFILE="$PIDDIR/$APP_NAME.pid" diff --git a/installer/resources/i2ptunnel.config b/installer/resources/i2ptunnel.config index 48d18b95e..f1fe7cda2 100644 --- a/installer/resources/i2ptunnel.config +++ b/installer/resources/i2ptunnel.config @@ -10,6 +10,9 @@ tunnel.0.i2cpHost=127.0.0.1 tunnel.0.i2cpPort=7654 tunnel.0.option.inbound.nickname=shared clients tunnel.0.option.outbound.nickname=shared clients +tunnel.0.option.i2cp.reduceIdleTime=900000 +tunnel.0.option.i2cp.reduceOnIdle=true +tunnel.0.option.i2cp.reduceQuantity=1 tunnel.0.option.i2p.streaming.connectDelay=1000 tunnel.0.startOnLoad=true @@ -25,6 +28,9 @@ tunnel.1.i2cpHost=127.0.0.1 tunnel.1.i2cpPort=7654 tunnel.1.option.inbound.nickname=shared clients tunnel.1.option.outbound.nickname=shared clients +tunnel.1.option.i2cp.reduceIdleTime=900000 +tunnel.1.option.i2cp.reduceOnIdle=true +tunnel.1.option.i2cp.reduceQuantity=1 tunnel.1.option.i2p.streaming.connectDelay=1000 tunnel.1.option.i2p.streaming.maxWindowSize=16 tunnel.1.startOnLoad=true @@ -41,6 +47,9 @@ tunnel.2.i2cpHost=127.0.0.1 tunnel.2.i2cpPort=7654 tunnel.2.option.inbound.nickname=shared clients tunnel.2.option.outbound.nickname=shared clients +tunnel.2.option.i2cp.reduceIdleTime=900000 +tunnel.2.option.i2cp.reduceOnIdle=true +tunnel.2.option.i2cp.reduceQuantity=1 tunnel.2.startOnLoad=false # local eepserver @@ -55,6 +64,10 @@ tunnel.3.i2cpHost=127.0.0.1 tunnel.3.i2cpPort=7654 tunnel.3.option.inbound.nickname=eepsite tunnel.3.option.outbound.nickname=eepsite +tunnel.3.option.inbound.length=3 +tunnel.3.option.inbound.lengthVariance=0 +tunnel.3.option.outbound.length=3 +tunnel.3.option.outbound.lengthVariance=0 tunnel.3.startOnLoad=false # postman's SMTP server - see www.postman.i2p @@ -66,6 +79,9 @@ tunnel.4.listenPort=7659 tunnel.4.name=smtp.postman.i2p tunnel.4.option.inbound.nickname=shared clients tunnel.4.option.outbound.nickname=shared clients +tunnel.4.option.i2cp.reduceIdleTime=900000 +tunnel.4.option.i2cp.reduceOnIdle=true +tunnel.4.option.i2cp.reduceQuantity=1 tunnel.4.option.i2p.streaming.connectDelay=1000 tunnel.4.startOnLoad=true tunnel.4.targetDestination=smtp.postman.i2p @@ -81,6 +97,9 @@ tunnel.5.interface=127.0.0.1 tunnel.5.listenPort=7660 tunnel.5.option.inbound.nickname=shared clients tunnel.5.option.outbound.nickname=shared clients +tunnel.5.option.i2cp.reduceIdleTime=900000 +tunnel.5.option.i2cp.reduceOnIdle=true +tunnel.5.option.i2cp.reduceQuantity=1 tunnel.5.option.i2p.streaming.connectDelay=1000 tunnel.5.startOnLoad=true tunnel.5.targetDestination=pop.postman.i2p diff --git a/installer/resources/icons/flags/ad.png b/installer/resources/icons/flags/ad.png new file mode 100644 index 000000000..625ca84f9 Binary files /dev/null and b/installer/resources/icons/flags/ad.png differ diff --git a/installer/resources/icons/flags/ae.png b/installer/resources/icons/flags/ae.png new file mode 100644 index 000000000..ef3a1ecfc Binary files /dev/null and b/installer/resources/icons/flags/ae.png differ diff --git a/installer/resources/icons/flags/af.png b/installer/resources/icons/flags/af.png new file mode 100644 index 000000000..a4742e299 Binary files /dev/null and b/installer/resources/icons/flags/af.png differ diff --git a/installer/resources/icons/flags/ag.png b/installer/resources/icons/flags/ag.png new file mode 100644 index 000000000..556d5504d Binary files /dev/null and b/installer/resources/icons/flags/ag.png differ diff --git a/installer/resources/icons/flags/ai.png b/installer/resources/icons/flags/ai.png new file mode 100644 index 000000000..74ed29d92 Binary files /dev/null and b/installer/resources/icons/flags/ai.png differ diff --git a/installer/resources/icons/flags/al.png b/installer/resources/icons/flags/al.png new file mode 100644 index 000000000..92354cb6e Binary files /dev/null and b/installer/resources/icons/flags/al.png differ diff --git a/installer/resources/icons/flags/am.png b/installer/resources/icons/flags/am.png new file mode 100644 index 000000000..344a2a86c Binary files /dev/null and b/installer/resources/icons/flags/am.png differ diff --git a/installer/resources/icons/flags/an.png b/installer/resources/icons/flags/an.png new file mode 100644 index 000000000..633e4b89f Binary files /dev/null and b/installer/resources/icons/flags/an.png differ diff --git a/installer/resources/icons/flags/ao.png b/installer/resources/icons/flags/ao.png new file mode 100644 index 000000000..bcbd1d6d4 Binary files /dev/null and b/installer/resources/icons/flags/ao.png differ diff --git a/installer/resources/icons/flags/ar.png b/installer/resources/icons/flags/ar.png new file mode 100644 index 000000000..e5ef8f1fc Binary files /dev/null and b/installer/resources/icons/flags/ar.png differ diff --git a/installer/resources/icons/flags/as.png b/installer/resources/icons/flags/as.png new file mode 100644 index 000000000..32f30e4ce Binary files /dev/null and b/installer/resources/icons/flags/as.png differ diff --git a/installer/resources/icons/flags/at.png b/installer/resources/icons/flags/at.png new file mode 100644 index 000000000..0f15f34f2 Binary files /dev/null and b/installer/resources/icons/flags/at.png differ diff --git a/installer/resources/icons/flags/au.png b/installer/resources/icons/flags/au.png new file mode 100644 index 000000000..a01389a74 Binary files /dev/null and b/installer/resources/icons/flags/au.png differ diff --git a/installer/resources/icons/flags/aw.png b/installer/resources/icons/flags/aw.png new file mode 100644 index 000000000..a3579c2d6 Binary files /dev/null and b/installer/resources/icons/flags/aw.png differ diff --git a/installer/resources/icons/flags/ax.png b/installer/resources/icons/flags/ax.png new file mode 100644 index 000000000..1eea80a7b Binary files /dev/null and b/installer/resources/icons/flags/ax.png differ diff --git a/installer/resources/icons/flags/az.png b/installer/resources/icons/flags/az.png new file mode 100644 index 000000000..4ee9fe5ce Binary files /dev/null and b/installer/resources/icons/flags/az.png differ diff --git a/installer/resources/icons/flags/ba.png b/installer/resources/icons/flags/ba.png new file mode 100644 index 000000000..c77499249 Binary files /dev/null and b/installer/resources/icons/flags/ba.png differ diff --git a/installer/resources/icons/flags/bb.png b/installer/resources/icons/flags/bb.png new file mode 100644 index 000000000..0df19c71d Binary files /dev/null and b/installer/resources/icons/flags/bb.png differ diff --git a/installer/resources/icons/flags/bd.png b/installer/resources/icons/flags/bd.png new file mode 100644 index 000000000..076a8bf87 Binary files /dev/null and b/installer/resources/icons/flags/bd.png differ diff --git a/installer/resources/icons/flags/be.png b/installer/resources/icons/flags/be.png new file mode 100644 index 000000000..d86ebc800 Binary files /dev/null and b/installer/resources/icons/flags/be.png differ diff --git a/installer/resources/icons/flags/bf.png b/installer/resources/icons/flags/bf.png new file mode 100644 index 000000000..ab5ce8fe1 Binary files /dev/null and b/installer/resources/icons/flags/bf.png differ diff --git a/installer/resources/icons/flags/bg.png b/installer/resources/icons/flags/bg.png new file mode 100644 index 000000000..0469f0607 Binary files /dev/null and b/installer/resources/icons/flags/bg.png differ diff --git a/installer/resources/icons/flags/bh.png b/installer/resources/icons/flags/bh.png new file mode 100644 index 000000000..ea8ce6876 Binary files /dev/null and b/installer/resources/icons/flags/bh.png differ diff --git a/installer/resources/icons/flags/bi.png b/installer/resources/icons/flags/bi.png new file mode 100644 index 000000000..5cc2e30cf Binary files /dev/null and b/installer/resources/icons/flags/bi.png differ diff --git a/installer/resources/icons/flags/bj.png b/installer/resources/icons/flags/bj.png new file mode 100644 index 000000000..1cc8b458a Binary files /dev/null and b/installer/resources/icons/flags/bj.png differ diff --git a/installer/resources/icons/flags/bm.png b/installer/resources/icons/flags/bm.png new file mode 100644 index 000000000..c0c7aead8 Binary files /dev/null and b/installer/resources/icons/flags/bm.png differ diff --git a/installer/resources/icons/flags/bn.png b/installer/resources/icons/flags/bn.png new file mode 100644 index 000000000..8fb09849e Binary files /dev/null and b/installer/resources/icons/flags/bn.png differ diff --git a/installer/resources/icons/flags/bo.png b/installer/resources/icons/flags/bo.png new file mode 100644 index 000000000..ce7ba522a Binary files /dev/null and b/installer/resources/icons/flags/bo.png differ diff --git a/installer/resources/icons/flags/br.png b/installer/resources/icons/flags/br.png new file mode 100644 index 000000000..9b1a5538b Binary files /dev/null and b/installer/resources/icons/flags/br.png differ diff --git a/installer/resources/icons/flags/bs.png b/installer/resources/icons/flags/bs.png new file mode 100644 index 000000000..639fa6cfa Binary files /dev/null and b/installer/resources/icons/flags/bs.png differ diff --git a/installer/resources/icons/flags/bt.png b/installer/resources/icons/flags/bt.png new file mode 100644 index 000000000..1d512dfff Binary files /dev/null and b/installer/resources/icons/flags/bt.png differ diff --git a/installer/resources/icons/flags/bv.png b/installer/resources/icons/flags/bv.png new file mode 100644 index 000000000..160b6b5b7 Binary files /dev/null and b/installer/resources/icons/flags/bv.png differ diff --git a/installer/resources/icons/flags/bw.png b/installer/resources/icons/flags/bw.png new file mode 100644 index 000000000..fcb103941 Binary files /dev/null and b/installer/resources/icons/flags/bw.png differ diff --git a/installer/resources/icons/flags/by.png b/installer/resources/icons/flags/by.png new file mode 100644 index 000000000..504774ec1 Binary files /dev/null and b/installer/resources/icons/flags/by.png differ diff --git a/installer/resources/icons/flags/bz.png b/installer/resources/icons/flags/bz.png new file mode 100644 index 000000000..be63ee1c6 Binary files /dev/null and b/installer/resources/icons/flags/bz.png differ diff --git a/installer/resources/icons/flags/ca.png b/installer/resources/icons/flags/ca.png new file mode 100644 index 000000000..1f204193a Binary files /dev/null and b/installer/resources/icons/flags/ca.png differ diff --git a/installer/resources/icons/flags/catalonia.png b/installer/resources/icons/flags/catalonia.png new file mode 100644 index 000000000..5041e308e Binary files /dev/null and b/installer/resources/icons/flags/catalonia.png differ diff --git a/installer/resources/icons/flags/cc.png b/installer/resources/icons/flags/cc.png new file mode 100644 index 000000000..aed3d3b4e Binary files /dev/null and b/installer/resources/icons/flags/cc.png differ diff --git a/installer/resources/icons/flags/cd.png b/installer/resources/icons/flags/cd.png new file mode 100644 index 000000000..5e4894248 Binary files /dev/null and b/installer/resources/icons/flags/cd.png differ diff --git a/installer/resources/icons/flags/cf.png b/installer/resources/icons/flags/cf.png new file mode 100644 index 000000000..da687bdce Binary files /dev/null and b/installer/resources/icons/flags/cf.png differ diff --git a/installer/resources/icons/flags/cg.png b/installer/resources/icons/flags/cg.png new file mode 100644 index 000000000..a859792ef Binary files /dev/null and b/installer/resources/icons/flags/cg.png differ diff --git a/installer/resources/icons/flags/ch.png b/installer/resources/icons/flags/ch.png new file mode 100644 index 000000000..4e6fa9641 Binary files /dev/null and b/installer/resources/icons/flags/ch.png differ diff --git a/installer/resources/icons/flags/ci.png b/installer/resources/icons/flags/ci.png new file mode 100644 index 000000000..3f2c62eb4 Binary files /dev/null and b/installer/resources/icons/flags/ci.png differ diff --git a/installer/resources/icons/flags/ck.png b/installer/resources/icons/flags/ck.png new file mode 100644 index 000000000..746d3d6f7 Binary files /dev/null and b/installer/resources/icons/flags/ck.png differ diff --git a/installer/resources/icons/flags/cl.png b/installer/resources/icons/flags/cl.png new file mode 100644 index 000000000..29c6d61bd Binary files /dev/null and b/installer/resources/icons/flags/cl.png differ diff --git a/installer/resources/icons/flags/cm.png b/installer/resources/icons/flags/cm.png new file mode 100644 index 000000000..f65c5bd5a Binary files /dev/null and b/installer/resources/icons/flags/cm.png differ diff --git a/installer/resources/icons/flags/cn.png b/installer/resources/icons/flags/cn.png new file mode 100644 index 000000000..891441462 Binary files /dev/null and b/installer/resources/icons/flags/cn.png differ diff --git a/installer/resources/icons/flags/co.png b/installer/resources/icons/flags/co.png new file mode 100644 index 000000000..a118ff4a1 Binary files /dev/null and b/installer/resources/icons/flags/co.png differ diff --git a/installer/resources/icons/flags/cr.png b/installer/resources/icons/flags/cr.png new file mode 100644 index 000000000..c7a373179 Binary files /dev/null and b/installer/resources/icons/flags/cr.png differ diff --git a/installer/resources/icons/flags/cs.png b/installer/resources/icons/flags/cs.png new file mode 100644 index 000000000..8254790ca Binary files /dev/null and b/installer/resources/icons/flags/cs.png differ diff --git a/installer/resources/icons/flags/cu.png b/installer/resources/icons/flags/cu.png new file mode 100644 index 000000000..083f1d611 Binary files /dev/null and b/installer/resources/icons/flags/cu.png differ diff --git a/installer/resources/icons/flags/cv.png b/installer/resources/icons/flags/cv.png new file mode 100644 index 000000000..a63f7eaf6 Binary files /dev/null and b/installer/resources/icons/flags/cv.png differ diff --git a/installer/resources/icons/flags/cx.png b/installer/resources/icons/flags/cx.png new file mode 100644 index 000000000..48e31adbf Binary files /dev/null and b/installer/resources/icons/flags/cx.png differ diff --git a/installer/resources/icons/flags/cy.png b/installer/resources/icons/flags/cy.png new file mode 100644 index 000000000..5b1ad6c07 Binary files /dev/null and b/installer/resources/icons/flags/cy.png differ diff --git a/installer/resources/icons/flags/cz.png b/installer/resources/icons/flags/cz.png new file mode 100644 index 000000000..c8403dd21 Binary files /dev/null and b/installer/resources/icons/flags/cz.png differ diff --git a/installer/resources/icons/flags/de.png b/installer/resources/icons/flags/de.png new file mode 100644 index 000000000..ac4a97736 Binary files /dev/null and b/installer/resources/icons/flags/de.png differ diff --git a/installer/resources/icons/flags/dj.png b/installer/resources/icons/flags/dj.png new file mode 100644 index 000000000..582af364f Binary files /dev/null and b/installer/resources/icons/flags/dj.png differ diff --git a/installer/resources/icons/flags/dk.png b/installer/resources/icons/flags/dk.png new file mode 100644 index 000000000..e2993d3c5 Binary files /dev/null and b/installer/resources/icons/flags/dk.png differ diff --git a/installer/resources/icons/flags/dm.png b/installer/resources/icons/flags/dm.png new file mode 100644 index 000000000..5fbffcba3 Binary files /dev/null and b/installer/resources/icons/flags/dm.png differ diff --git a/installer/resources/icons/flags/do.png b/installer/resources/icons/flags/do.png new file mode 100644 index 000000000..5a04932d8 Binary files /dev/null and b/installer/resources/icons/flags/do.png differ diff --git a/installer/resources/icons/flags/dz.png b/installer/resources/icons/flags/dz.png new file mode 100644 index 000000000..335c2391d Binary files /dev/null and b/installer/resources/icons/flags/dz.png differ diff --git a/installer/resources/icons/flags/ec.png b/installer/resources/icons/flags/ec.png new file mode 100644 index 000000000..0caa0b1e7 Binary files /dev/null and b/installer/resources/icons/flags/ec.png differ diff --git a/installer/resources/icons/flags/ee.png b/installer/resources/icons/flags/ee.png new file mode 100644 index 000000000..0c82efb7d Binary files /dev/null and b/installer/resources/icons/flags/ee.png differ diff --git a/installer/resources/icons/flags/eg.png b/installer/resources/icons/flags/eg.png new file mode 100644 index 000000000..8a3f7a10b Binary files /dev/null and b/installer/resources/icons/flags/eg.png differ diff --git a/installer/resources/icons/flags/eh.png b/installer/resources/icons/flags/eh.png new file mode 100644 index 000000000..90a1195b4 Binary files /dev/null and b/installer/resources/icons/flags/eh.png differ diff --git a/installer/resources/icons/flags/england.png b/installer/resources/icons/flags/england.png new file mode 100644 index 000000000..3a7311d56 Binary files /dev/null and b/installer/resources/icons/flags/england.png differ diff --git a/installer/resources/icons/flags/er.png b/installer/resources/icons/flags/er.png new file mode 100644 index 000000000..13065ae99 Binary files /dev/null and b/installer/resources/icons/flags/er.png differ diff --git a/installer/resources/icons/flags/es.png b/installer/resources/icons/flags/es.png new file mode 100644 index 000000000..c2de2d711 Binary files /dev/null and b/installer/resources/icons/flags/es.png differ diff --git a/installer/resources/icons/flags/et.png b/installer/resources/icons/flags/et.png new file mode 100644 index 000000000..2e893fa05 Binary files /dev/null and b/installer/resources/icons/flags/et.png differ diff --git a/installer/resources/icons/flags/europeanunion.png b/installer/resources/icons/flags/europeanunion.png new file mode 100644 index 000000000..d6d871158 Binary files /dev/null and b/installer/resources/icons/flags/europeanunion.png differ diff --git a/installer/resources/icons/flags/fam.png b/installer/resources/icons/flags/fam.png new file mode 100644 index 000000000..cf50c759e Binary files /dev/null and b/installer/resources/icons/flags/fam.png differ diff --git a/installer/resources/icons/flags/fi.png b/installer/resources/icons/flags/fi.png new file mode 100644 index 000000000..14ec091b8 Binary files /dev/null and b/installer/resources/icons/flags/fi.png differ diff --git a/installer/resources/icons/flags/fj.png b/installer/resources/icons/flags/fj.png new file mode 100644 index 000000000..cee998892 Binary files /dev/null and b/installer/resources/icons/flags/fj.png differ diff --git a/installer/resources/icons/flags/fk.png b/installer/resources/icons/flags/fk.png new file mode 100644 index 000000000..ceaeb27de Binary files /dev/null and b/installer/resources/icons/flags/fk.png differ diff --git a/installer/resources/icons/flags/fm.png b/installer/resources/icons/flags/fm.png new file mode 100644 index 000000000..066bb2473 Binary files /dev/null and b/installer/resources/icons/flags/fm.png differ diff --git a/installer/resources/icons/flags/fo.png b/installer/resources/icons/flags/fo.png new file mode 100644 index 000000000..cbceb809e Binary files /dev/null and b/installer/resources/icons/flags/fo.png differ diff --git a/installer/resources/icons/flags/fr.png b/installer/resources/icons/flags/fr.png new file mode 100644 index 000000000..8332c4ec2 Binary files /dev/null and b/installer/resources/icons/flags/fr.png differ diff --git a/installer/resources/icons/flags/ga.png b/installer/resources/icons/flags/ga.png new file mode 100644 index 000000000..0e0d43436 Binary files /dev/null and b/installer/resources/icons/flags/ga.png differ diff --git a/installer/resources/icons/flags/gb.png b/installer/resources/icons/flags/gb.png new file mode 100644 index 000000000..ff701e19f Binary files /dev/null and b/installer/resources/icons/flags/gb.png differ diff --git a/installer/resources/icons/flags/gd.png b/installer/resources/icons/flags/gd.png new file mode 100644 index 000000000..9ab57f548 Binary files /dev/null and b/installer/resources/icons/flags/gd.png differ diff --git a/installer/resources/icons/flags/ge.png b/installer/resources/icons/flags/ge.png new file mode 100644 index 000000000..728d97078 Binary files /dev/null and b/installer/resources/icons/flags/ge.png differ diff --git a/installer/resources/icons/flags/gf.png b/installer/resources/icons/flags/gf.png new file mode 100644 index 000000000..8332c4ec2 Binary files /dev/null and b/installer/resources/icons/flags/gf.png differ diff --git a/installer/resources/icons/flags/gh.png b/installer/resources/icons/flags/gh.png new file mode 100644 index 000000000..4e2f89659 Binary files /dev/null and b/installer/resources/icons/flags/gh.png differ diff --git a/installer/resources/icons/flags/gi.png b/installer/resources/icons/flags/gi.png new file mode 100644 index 000000000..e76797f62 Binary files /dev/null and b/installer/resources/icons/flags/gi.png differ diff --git a/installer/resources/icons/flags/gl.png b/installer/resources/icons/flags/gl.png new file mode 100644 index 000000000..ef12a73bf Binary files /dev/null and b/installer/resources/icons/flags/gl.png differ diff --git a/installer/resources/icons/flags/gm.png b/installer/resources/icons/flags/gm.png new file mode 100644 index 000000000..0720b667a Binary files /dev/null and b/installer/resources/icons/flags/gm.png differ diff --git a/installer/resources/icons/flags/gn.png b/installer/resources/icons/flags/gn.png new file mode 100644 index 000000000..ea660b01f Binary files /dev/null and b/installer/resources/icons/flags/gn.png differ diff --git a/installer/resources/icons/flags/gp.png b/installer/resources/icons/flags/gp.png new file mode 100644 index 000000000..dbb086d00 Binary files /dev/null and b/installer/resources/icons/flags/gp.png differ diff --git a/installer/resources/icons/flags/gq.png b/installer/resources/icons/flags/gq.png new file mode 100644 index 000000000..ebe20a28d Binary files /dev/null and b/installer/resources/icons/flags/gq.png differ diff --git a/installer/resources/icons/flags/gr.png b/installer/resources/icons/flags/gr.png new file mode 100644 index 000000000..8651ade7c Binary files /dev/null and b/installer/resources/icons/flags/gr.png differ diff --git a/installer/resources/icons/flags/gs.png b/installer/resources/icons/flags/gs.png new file mode 100644 index 000000000..7ef0bf598 Binary files /dev/null and b/installer/resources/icons/flags/gs.png differ diff --git a/installer/resources/icons/flags/gt.png b/installer/resources/icons/flags/gt.png new file mode 100644 index 000000000..c43a70d36 Binary files /dev/null and b/installer/resources/icons/flags/gt.png differ diff --git a/installer/resources/icons/flags/gu.png b/installer/resources/icons/flags/gu.png new file mode 100644 index 000000000..92f37c053 Binary files /dev/null and b/installer/resources/icons/flags/gu.png differ diff --git a/installer/resources/icons/flags/gw.png b/installer/resources/icons/flags/gw.png new file mode 100644 index 000000000..b37bcf06b Binary files /dev/null and b/installer/resources/icons/flags/gw.png differ diff --git a/installer/resources/icons/flags/gy.png b/installer/resources/icons/flags/gy.png new file mode 100644 index 000000000..22cbe2f59 Binary files /dev/null and b/installer/resources/icons/flags/gy.png differ diff --git a/installer/resources/icons/flags/hk.png b/installer/resources/icons/flags/hk.png new file mode 100644 index 000000000..d5c380ca9 Binary files /dev/null and b/installer/resources/icons/flags/hk.png differ diff --git a/installer/resources/icons/flags/hm.png b/installer/resources/icons/flags/hm.png new file mode 100644 index 000000000..a01389a74 Binary files /dev/null and b/installer/resources/icons/flags/hm.png differ diff --git a/installer/resources/icons/flags/hn.png b/installer/resources/icons/flags/hn.png new file mode 100644 index 000000000..96f838859 Binary files /dev/null and b/installer/resources/icons/flags/hn.png differ diff --git a/installer/resources/icons/flags/hr.png b/installer/resources/icons/flags/hr.png new file mode 100644 index 000000000..696b51546 Binary files /dev/null and b/installer/resources/icons/flags/hr.png differ diff --git a/installer/resources/icons/flags/ht.png b/installer/resources/icons/flags/ht.png new file mode 100644 index 000000000..416052af7 Binary files /dev/null and b/installer/resources/icons/flags/ht.png differ diff --git a/installer/resources/icons/flags/hu.png b/installer/resources/icons/flags/hu.png new file mode 100644 index 000000000..7baafe44d Binary files /dev/null and b/installer/resources/icons/flags/hu.png differ diff --git a/installer/resources/icons/flags/id.png b/installer/resources/icons/flags/id.png new file mode 100644 index 000000000..c6bc0fafa Binary files /dev/null and b/installer/resources/icons/flags/id.png differ diff --git a/installer/resources/icons/flags/ie.png b/installer/resources/icons/flags/ie.png new file mode 100644 index 000000000..26baa31e1 Binary files /dev/null and b/installer/resources/icons/flags/ie.png differ diff --git a/installer/resources/icons/flags/il.png b/installer/resources/icons/flags/il.png new file mode 100644 index 000000000..2ca772d0b Binary files /dev/null and b/installer/resources/icons/flags/il.png differ diff --git a/installer/resources/icons/flags/in.png b/installer/resources/icons/flags/in.png new file mode 100644 index 000000000..e4d7e81a9 Binary files /dev/null and b/installer/resources/icons/flags/in.png differ diff --git a/installer/resources/icons/flags/io.png b/installer/resources/icons/flags/io.png new file mode 100644 index 000000000..3e74b6a31 Binary files /dev/null and b/installer/resources/icons/flags/io.png differ diff --git a/installer/resources/icons/flags/iq.png b/installer/resources/icons/flags/iq.png new file mode 100644 index 000000000..878a35140 Binary files /dev/null and b/installer/resources/icons/flags/iq.png differ diff --git a/installer/resources/icons/flags/ir.png b/installer/resources/icons/flags/ir.png new file mode 100644 index 000000000..c5fd136ae Binary files /dev/null and b/installer/resources/icons/flags/ir.png differ diff --git a/installer/resources/icons/flags/is.png b/installer/resources/icons/flags/is.png new file mode 100644 index 000000000..b8f6d0f06 Binary files /dev/null and b/installer/resources/icons/flags/is.png differ diff --git a/installer/resources/icons/flags/it.png b/installer/resources/icons/flags/it.png new file mode 100644 index 000000000..89692f74f Binary files /dev/null and b/installer/resources/icons/flags/it.png differ diff --git a/installer/resources/icons/flags/jm.png b/installer/resources/icons/flags/jm.png new file mode 100644 index 000000000..7be119e03 Binary files /dev/null and b/installer/resources/icons/flags/jm.png differ diff --git a/installer/resources/icons/flags/jo.png b/installer/resources/icons/flags/jo.png new file mode 100644 index 000000000..11bd4972b Binary files /dev/null and b/installer/resources/icons/flags/jo.png differ diff --git a/installer/resources/icons/flags/jp.png b/installer/resources/icons/flags/jp.png new file mode 100644 index 000000000..325fbad3f Binary files /dev/null and b/installer/resources/icons/flags/jp.png differ diff --git a/installer/resources/icons/flags/ke.png b/installer/resources/icons/flags/ke.png new file mode 100644 index 000000000..51879adf1 Binary files /dev/null and b/installer/resources/icons/flags/ke.png differ diff --git a/installer/resources/icons/flags/kg.png b/installer/resources/icons/flags/kg.png new file mode 100644 index 000000000..0a818f67e Binary files /dev/null and b/installer/resources/icons/flags/kg.png differ diff --git a/installer/resources/icons/flags/kh.png b/installer/resources/icons/flags/kh.png new file mode 100644 index 000000000..30f6bb1b9 Binary files /dev/null and b/installer/resources/icons/flags/kh.png differ diff --git a/installer/resources/icons/flags/ki.png b/installer/resources/icons/flags/ki.png new file mode 100644 index 000000000..2dcce4b33 Binary files /dev/null and b/installer/resources/icons/flags/ki.png differ diff --git a/installer/resources/icons/flags/km.png b/installer/resources/icons/flags/km.png new file mode 100644 index 000000000..812b2f56c Binary files /dev/null and b/installer/resources/icons/flags/km.png differ diff --git a/installer/resources/icons/flags/kn.png b/installer/resources/icons/flags/kn.png new file mode 100644 index 000000000..febd5b486 Binary files /dev/null and b/installer/resources/icons/flags/kn.png differ diff --git a/installer/resources/icons/flags/kp.png b/installer/resources/icons/flags/kp.png new file mode 100644 index 000000000..d3d509aa8 Binary files /dev/null and b/installer/resources/icons/flags/kp.png differ diff --git a/installer/resources/icons/flags/kr.png b/installer/resources/icons/flags/kr.png new file mode 100644 index 000000000..9c0a78eb9 Binary files /dev/null and b/installer/resources/icons/flags/kr.png differ diff --git a/installer/resources/icons/flags/kw.png b/installer/resources/icons/flags/kw.png new file mode 100644 index 000000000..96546da32 Binary files /dev/null and b/installer/resources/icons/flags/kw.png differ diff --git a/installer/resources/icons/flags/ky.png b/installer/resources/icons/flags/ky.png new file mode 100644 index 000000000..15c5f8e47 Binary files /dev/null and b/installer/resources/icons/flags/ky.png differ diff --git a/installer/resources/icons/flags/kz.png b/installer/resources/icons/flags/kz.png new file mode 100644 index 000000000..45a8c8874 Binary files /dev/null and b/installer/resources/icons/flags/kz.png differ diff --git a/installer/resources/icons/flags/la.png b/installer/resources/icons/flags/la.png new file mode 100644 index 000000000..e28acd018 Binary files /dev/null and b/installer/resources/icons/flags/la.png differ diff --git a/installer/resources/icons/flags/lb.png b/installer/resources/icons/flags/lb.png new file mode 100644 index 000000000..d0d452bf8 Binary files /dev/null and b/installer/resources/icons/flags/lb.png differ diff --git a/installer/resources/icons/flags/lc.png b/installer/resources/icons/flags/lc.png new file mode 100644 index 000000000..a47d06554 Binary files /dev/null and b/installer/resources/icons/flags/lc.png differ diff --git a/installer/resources/icons/flags/li.png b/installer/resources/icons/flags/li.png new file mode 100644 index 000000000..6469909c0 Binary files /dev/null and b/installer/resources/icons/flags/li.png differ diff --git a/installer/resources/icons/flags/lk.png b/installer/resources/icons/flags/lk.png new file mode 100644 index 000000000..088aad6db Binary files /dev/null and b/installer/resources/icons/flags/lk.png differ diff --git a/installer/resources/icons/flags/lr.png b/installer/resources/icons/flags/lr.png new file mode 100644 index 000000000..89a5bc7e7 Binary files /dev/null and b/installer/resources/icons/flags/lr.png differ diff --git a/installer/resources/icons/flags/ls.png b/installer/resources/icons/flags/ls.png new file mode 100644 index 000000000..33fdef101 Binary files /dev/null and b/installer/resources/icons/flags/ls.png differ diff --git a/installer/resources/icons/flags/lt.png b/installer/resources/icons/flags/lt.png new file mode 100644 index 000000000..c8ef0da09 Binary files /dev/null and b/installer/resources/icons/flags/lt.png differ diff --git a/installer/resources/icons/flags/lu.png b/installer/resources/icons/flags/lu.png new file mode 100644 index 000000000..4cabba98a Binary files /dev/null and b/installer/resources/icons/flags/lu.png differ diff --git a/installer/resources/icons/flags/lv.png b/installer/resources/icons/flags/lv.png new file mode 100644 index 000000000..49b699810 Binary files /dev/null and b/installer/resources/icons/flags/lv.png differ diff --git a/installer/resources/icons/flags/ly.png b/installer/resources/icons/flags/ly.png new file mode 100644 index 000000000..b163a9f8a Binary files /dev/null and b/installer/resources/icons/flags/ly.png differ diff --git a/installer/resources/icons/flags/ma.png b/installer/resources/icons/flags/ma.png new file mode 100644 index 000000000..f38677028 Binary files /dev/null and b/installer/resources/icons/flags/ma.png differ diff --git a/installer/resources/icons/flags/mc.png b/installer/resources/icons/flags/mc.png new file mode 100644 index 000000000..1aa830f12 Binary files /dev/null and b/installer/resources/icons/flags/mc.png differ diff --git a/installer/resources/icons/flags/md.png b/installer/resources/icons/flags/md.png new file mode 100644 index 000000000..4e92c1890 Binary files /dev/null and b/installer/resources/icons/flags/md.png differ diff --git a/installer/resources/icons/flags/me.png b/installer/resources/icons/flags/me.png new file mode 100644 index 000000000..ac7253558 Binary files /dev/null and b/installer/resources/icons/flags/me.png differ diff --git a/installer/resources/icons/flags/mg.png b/installer/resources/icons/flags/mg.png new file mode 100644 index 000000000..d2715b3d0 Binary files /dev/null and b/installer/resources/icons/flags/mg.png differ diff --git a/installer/resources/icons/flags/mh.png b/installer/resources/icons/flags/mh.png new file mode 100644 index 000000000..fb523a8c3 Binary files /dev/null and b/installer/resources/icons/flags/mh.png differ diff --git a/installer/resources/icons/flags/mk.png b/installer/resources/icons/flags/mk.png new file mode 100644 index 000000000..db173aaff Binary files /dev/null and b/installer/resources/icons/flags/mk.png differ diff --git a/installer/resources/icons/flags/ml.png b/installer/resources/icons/flags/ml.png new file mode 100644 index 000000000..2cec8ba44 Binary files /dev/null and b/installer/resources/icons/flags/ml.png differ diff --git a/installer/resources/icons/flags/mm.png b/installer/resources/icons/flags/mm.png new file mode 100644 index 000000000..f464f67ff Binary files /dev/null and b/installer/resources/icons/flags/mm.png differ diff --git a/installer/resources/icons/flags/mn.png b/installer/resources/icons/flags/mn.png new file mode 100644 index 000000000..9396355db Binary files /dev/null and b/installer/resources/icons/flags/mn.png differ diff --git a/installer/resources/icons/flags/mo.png b/installer/resources/icons/flags/mo.png new file mode 100644 index 000000000..deb801dda Binary files /dev/null and b/installer/resources/icons/flags/mo.png differ diff --git a/installer/resources/icons/flags/mp.png b/installer/resources/icons/flags/mp.png new file mode 100644 index 000000000..298d588b1 Binary files /dev/null and b/installer/resources/icons/flags/mp.png differ diff --git a/installer/resources/icons/flags/mq.png b/installer/resources/icons/flags/mq.png new file mode 100644 index 000000000..010143b38 Binary files /dev/null and b/installer/resources/icons/flags/mq.png differ diff --git a/installer/resources/icons/flags/mr.png b/installer/resources/icons/flags/mr.png new file mode 100644 index 000000000..319546b10 Binary files /dev/null and b/installer/resources/icons/flags/mr.png differ diff --git a/installer/resources/icons/flags/ms.png b/installer/resources/icons/flags/ms.png new file mode 100644 index 000000000..d4cbb433d Binary files /dev/null and b/installer/resources/icons/flags/ms.png differ diff --git a/installer/resources/icons/flags/mt.png b/installer/resources/icons/flags/mt.png new file mode 100644 index 000000000..00af94871 Binary files /dev/null and b/installer/resources/icons/flags/mt.png differ diff --git a/installer/resources/icons/flags/mu.png b/installer/resources/icons/flags/mu.png new file mode 100644 index 000000000..b7fdce1bd Binary files /dev/null and b/installer/resources/icons/flags/mu.png differ diff --git a/installer/resources/icons/flags/mv.png b/installer/resources/icons/flags/mv.png new file mode 100644 index 000000000..5073d9ec4 Binary files /dev/null and b/installer/resources/icons/flags/mv.png differ diff --git a/installer/resources/icons/flags/mw.png b/installer/resources/icons/flags/mw.png new file mode 100644 index 000000000..13886e9f8 Binary files /dev/null and b/installer/resources/icons/flags/mw.png differ diff --git a/installer/resources/icons/flags/mx.png b/installer/resources/icons/flags/mx.png new file mode 100644 index 000000000..5bc58ab3e Binary files /dev/null and b/installer/resources/icons/flags/mx.png differ diff --git a/installer/resources/icons/flags/my.png b/installer/resources/icons/flags/my.png new file mode 100644 index 000000000..9034cbab2 Binary files /dev/null and b/installer/resources/icons/flags/my.png differ diff --git a/installer/resources/icons/flags/mz.png b/installer/resources/icons/flags/mz.png new file mode 100644 index 000000000..76405e063 Binary files /dev/null and b/installer/resources/icons/flags/mz.png differ diff --git a/installer/resources/icons/flags/na.png b/installer/resources/icons/flags/na.png new file mode 100644 index 000000000..63358c67d Binary files /dev/null and b/installer/resources/icons/flags/na.png differ diff --git a/installer/resources/icons/flags/nc.png b/installer/resources/icons/flags/nc.png new file mode 100644 index 000000000..2cad28378 Binary files /dev/null and b/installer/resources/icons/flags/nc.png differ diff --git a/installer/resources/icons/flags/ne.png b/installer/resources/icons/flags/ne.png new file mode 100644 index 000000000..d85f424f3 Binary files /dev/null and b/installer/resources/icons/flags/ne.png differ diff --git a/installer/resources/icons/flags/nf.png b/installer/resources/icons/flags/nf.png new file mode 100644 index 000000000..f9bcdda12 Binary files /dev/null and b/installer/resources/icons/flags/nf.png differ diff --git a/installer/resources/icons/flags/ng.png b/installer/resources/icons/flags/ng.png new file mode 100644 index 000000000..3eea2e020 Binary files /dev/null and b/installer/resources/icons/flags/ng.png differ diff --git a/installer/resources/icons/flags/ni.png b/installer/resources/icons/flags/ni.png new file mode 100644 index 000000000..3969aaaae Binary files /dev/null and b/installer/resources/icons/flags/ni.png differ diff --git a/installer/resources/icons/flags/nl.png b/installer/resources/icons/flags/nl.png new file mode 100644 index 000000000..fe44791e3 Binary files /dev/null and b/installer/resources/icons/flags/nl.png differ diff --git a/installer/resources/icons/flags/no.png b/installer/resources/icons/flags/no.png new file mode 100644 index 000000000..160b6b5b7 Binary files /dev/null and b/installer/resources/icons/flags/no.png differ diff --git a/installer/resources/icons/flags/np.png b/installer/resources/icons/flags/np.png new file mode 100644 index 000000000..2100b1aea Binary files /dev/null and b/installer/resources/icons/flags/np.png differ diff --git a/installer/resources/icons/flags/nr.png b/installer/resources/icons/flags/nr.png new file mode 100644 index 000000000..705fc337c Binary files /dev/null and b/installer/resources/icons/flags/nr.png differ diff --git a/installer/resources/icons/flags/nu.png b/installer/resources/icons/flags/nu.png new file mode 100644 index 000000000..c3ce4aedd Binary files /dev/null and b/installer/resources/icons/flags/nu.png differ diff --git a/installer/resources/icons/flags/nz.png b/installer/resources/icons/flags/nz.png new file mode 100644 index 000000000..10d6306d1 Binary files /dev/null and b/installer/resources/icons/flags/nz.png differ diff --git a/installer/resources/icons/flags/om.png b/installer/resources/icons/flags/om.png new file mode 100644 index 000000000..2ffba7e8c Binary files /dev/null and b/installer/resources/icons/flags/om.png differ diff --git a/installer/resources/icons/flags/pa.png b/installer/resources/icons/flags/pa.png new file mode 100644 index 000000000..9b2ee9a78 Binary files /dev/null and b/installer/resources/icons/flags/pa.png differ diff --git a/installer/resources/icons/flags/pe.png b/installer/resources/icons/flags/pe.png new file mode 100644 index 000000000..62a04977f Binary files /dev/null and b/installer/resources/icons/flags/pe.png differ diff --git a/installer/resources/icons/flags/pf.png b/installer/resources/icons/flags/pf.png new file mode 100644 index 000000000..771a0f652 Binary files /dev/null and b/installer/resources/icons/flags/pf.png differ diff --git a/installer/resources/icons/flags/pg.png b/installer/resources/icons/flags/pg.png new file mode 100644 index 000000000..10d623349 Binary files /dev/null and b/installer/resources/icons/flags/pg.png differ diff --git a/installer/resources/icons/flags/ph.png b/installer/resources/icons/flags/ph.png new file mode 100644 index 000000000..b89e15935 Binary files /dev/null and b/installer/resources/icons/flags/ph.png differ diff --git a/installer/resources/icons/flags/pk.png b/installer/resources/icons/flags/pk.png new file mode 100644 index 000000000..e9df70ca4 Binary files /dev/null and b/installer/resources/icons/flags/pk.png differ diff --git a/installer/resources/icons/flags/pl.png b/installer/resources/icons/flags/pl.png new file mode 100644 index 000000000..d413d010b Binary files /dev/null and b/installer/resources/icons/flags/pl.png differ diff --git a/installer/resources/icons/flags/pm.png b/installer/resources/icons/flags/pm.png new file mode 100644 index 000000000..ba91d2c7a Binary files /dev/null and b/installer/resources/icons/flags/pm.png differ diff --git a/installer/resources/icons/flags/pn.png b/installer/resources/icons/flags/pn.png new file mode 100644 index 000000000..aa9344f57 Binary files /dev/null and b/installer/resources/icons/flags/pn.png differ diff --git a/installer/resources/icons/flags/pr.png b/installer/resources/icons/flags/pr.png new file mode 100644 index 000000000..82d9130da Binary files /dev/null and b/installer/resources/icons/flags/pr.png differ diff --git a/installer/resources/icons/flags/ps.png b/installer/resources/icons/flags/ps.png new file mode 100644 index 000000000..f5f547762 Binary files /dev/null and b/installer/resources/icons/flags/ps.png differ diff --git a/installer/resources/icons/flags/pt.png b/installer/resources/icons/flags/pt.png new file mode 100644 index 000000000..ece798015 Binary files /dev/null and b/installer/resources/icons/flags/pt.png differ diff --git a/installer/resources/icons/flags/pw.png b/installer/resources/icons/flags/pw.png new file mode 100644 index 000000000..6178b254a Binary files /dev/null and b/installer/resources/icons/flags/pw.png differ diff --git a/installer/resources/icons/flags/py.png b/installer/resources/icons/flags/py.png new file mode 100644 index 000000000..cb8723c06 Binary files /dev/null and b/installer/resources/icons/flags/py.png differ diff --git a/installer/resources/icons/flags/qa.png b/installer/resources/icons/flags/qa.png new file mode 100644 index 000000000..ed4c621fa Binary files /dev/null and b/installer/resources/icons/flags/qa.png differ diff --git a/installer/resources/icons/flags/re.png b/installer/resources/icons/flags/re.png new file mode 100644 index 000000000..8332c4ec2 Binary files /dev/null and b/installer/resources/icons/flags/re.png differ diff --git a/installer/resources/icons/flags/ro.png b/installer/resources/icons/flags/ro.png new file mode 100644 index 000000000..57e74a651 Binary files /dev/null and b/installer/resources/icons/flags/ro.png differ diff --git a/installer/resources/icons/flags/rs.png b/installer/resources/icons/flags/rs.png new file mode 100644 index 000000000..9439a5b60 Binary files /dev/null and b/installer/resources/icons/flags/rs.png differ diff --git a/installer/resources/icons/flags/ru.png b/installer/resources/icons/flags/ru.png new file mode 100644 index 000000000..47da4214f Binary files /dev/null and b/installer/resources/icons/flags/ru.png differ diff --git a/installer/resources/icons/flags/rw.png b/installer/resources/icons/flags/rw.png new file mode 100644 index 000000000..535649178 Binary files /dev/null and b/installer/resources/icons/flags/rw.png differ diff --git a/installer/resources/icons/flags/sa.png b/installer/resources/icons/flags/sa.png new file mode 100644 index 000000000..b4641c7e8 Binary files /dev/null and b/installer/resources/icons/flags/sa.png differ diff --git a/installer/resources/icons/flags/sb.png b/installer/resources/icons/flags/sb.png new file mode 100644 index 000000000..a9937ccf0 Binary files /dev/null and b/installer/resources/icons/flags/sb.png differ diff --git a/installer/resources/icons/flags/sc.png b/installer/resources/icons/flags/sc.png new file mode 100644 index 000000000..39ee37184 Binary files /dev/null and b/installer/resources/icons/flags/sc.png differ diff --git a/installer/resources/icons/flags/scotland.png b/installer/resources/icons/flags/scotland.png new file mode 100644 index 000000000..a0e57b412 Binary files /dev/null and b/installer/resources/icons/flags/scotland.png differ diff --git a/installer/resources/icons/flags/sd.png b/installer/resources/icons/flags/sd.png new file mode 100644 index 000000000..eaab69eb7 Binary files /dev/null and b/installer/resources/icons/flags/sd.png differ diff --git a/installer/resources/icons/flags/se.png b/installer/resources/icons/flags/se.png new file mode 100644 index 000000000..1994653da Binary files /dev/null and b/installer/resources/icons/flags/se.png differ diff --git a/installer/resources/icons/flags/sg.png b/installer/resources/icons/flags/sg.png new file mode 100644 index 000000000..dd34d6121 Binary files /dev/null and b/installer/resources/icons/flags/sg.png differ diff --git a/installer/resources/icons/flags/sh.png b/installer/resources/icons/flags/sh.png new file mode 100644 index 000000000..4b1d2a291 Binary files /dev/null and b/installer/resources/icons/flags/sh.png differ diff --git a/installer/resources/icons/flags/si.png b/installer/resources/icons/flags/si.png new file mode 100644 index 000000000..bb1476ff5 Binary files /dev/null and b/installer/resources/icons/flags/si.png differ diff --git a/installer/resources/icons/flags/sj.png b/installer/resources/icons/flags/sj.png new file mode 100644 index 000000000..160b6b5b7 Binary files /dev/null and b/installer/resources/icons/flags/sj.png differ diff --git a/installer/resources/icons/flags/sk.png b/installer/resources/icons/flags/sk.png new file mode 100644 index 000000000..7ccbc8274 Binary files /dev/null and b/installer/resources/icons/flags/sk.png differ diff --git a/installer/resources/icons/flags/sl.png b/installer/resources/icons/flags/sl.png new file mode 100644 index 000000000..12d812d29 Binary files /dev/null and b/installer/resources/icons/flags/sl.png differ diff --git a/installer/resources/icons/flags/sm.png b/installer/resources/icons/flags/sm.png new file mode 100644 index 000000000..3df2fdcf8 Binary files /dev/null and b/installer/resources/icons/flags/sm.png differ diff --git a/installer/resources/icons/flags/sn.png b/installer/resources/icons/flags/sn.png new file mode 100644 index 000000000..eabb71db4 Binary files /dev/null and b/installer/resources/icons/flags/sn.png differ diff --git a/installer/resources/icons/flags/so.png b/installer/resources/icons/flags/so.png new file mode 100644 index 000000000..4a1ea4b29 Binary files /dev/null and b/installer/resources/icons/flags/so.png differ diff --git a/installer/resources/icons/flags/sr.png b/installer/resources/icons/flags/sr.png new file mode 100644 index 000000000..5eff9271d Binary files /dev/null and b/installer/resources/icons/flags/sr.png differ diff --git a/installer/resources/icons/flags/st.png b/installer/resources/icons/flags/st.png new file mode 100644 index 000000000..2978557b1 Binary files /dev/null and b/installer/resources/icons/flags/st.png differ diff --git a/installer/resources/icons/flags/sv.png b/installer/resources/icons/flags/sv.png new file mode 100644 index 000000000..24987990b Binary files /dev/null and b/installer/resources/icons/flags/sv.png differ diff --git a/installer/resources/icons/flags/sy.png b/installer/resources/icons/flags/sy.png new file mode 100644 index 000000000..f5ce30dcb Binary files /dev/null and b/installer/resources/icons/flags/sy.png differ diff --git a/installer/resources/icons/flags/sz.png b/installer/resources/icons/flags/sz.png new file mode 100644 index 000000000..914ee861d Binary files /dev/null and b/installer/resources/icons/flags/sz.png differ diff --git a/installer/resources/icons/flags/tc.png b/installer/resources/icons/flags/tc.png new file mode 100644 index 000000000..8fc1156be Binary files /dev/null and b/installer/resources/icons/flags/tc.png differ diff --git a/installer/resources/icons/flags/td.png b/installer/resources/icons/flags/td.png new file mode 100644 index 000000000..667f21fd9 Binary files /dev/null and b/installer/resources/icons/flags/td.png differ diff --git a/installer/resources/icons/flags/tf.png b/installer/resources/icons/flags/tf.png new file mode 100644 index 000000000..80529a436 Binary files /dev/null and b/installer/resources/icons/flags/tf.png differ diff --git a/installer/resources/icons/flags/tg.png b/installer/resources/icons/flags/tg.png new file mode 100644 index 000000000..3aa00ad4d Binary files /dev/null and b/installer/resources/icons/flags/tg.png differ diff --git a/installer/resources/icons/flags/th.png b/installer/resources/icons/flags/th.png new file mode 100644 index 000000000..dd8ba9171 Binary files /dev/null and b/installer/resources/icons/flags/th.png differ diff --git a/installer/resources/icons/flags/tj.png b/installer/resources/icons/flags/tj.png new file mode 100644 index 000000000..617bf6455 Binary files /dev/null and b/installer/resources/icons/flags/tj.png differ diff --git a/installer/resources/icons/flags/tk.png b/installer/resources/icons/flags/tk.png new file mode 100644 index 000000000..67b8c8cb5 Binary files /dev/null and b/installer/resources/icons/flags/tk.png differ diff --git a/installer/resources/icons/flags/tl.png b/installer/resources/icons/flags/tl.png new file mode 100644 index 000000000..77da181e9 Binary files /dev/null and b/installer/resources/icons/flags/tl.png differ diff --git a/installer/resources/icons/flags/tm.png b/installer/resources/icons/flags/tm.png new file mode 100644 index 000000000..828020ecd Binary files /dev/null and b/installer/resources/icons/flags/tm.png differ diff --git a/installer/resources/icons/flags/tn.png b/installer/resources/icons/flags/tn.png new file mode 100644 index 000000000..183cdd3dc Binary files /dev/null and b/installer/resources/icons/flags/tn.png differ diff --git a/installer/resources/icons/flags/to.png b/installer/resources/icons/flags/to.png new file mode 100644 index 000000000..f89b8ba75 Binary files /dev/null and b/installer/resources/icons/flags/to.png differ diff --git a/installer/resources/icons/flags/tr.png b/installer/resources/icons/flags/tr.png new file mode 100644 index 000000000..be32f77e9 Binary files /dev/null and b/installer/resources/icons/flags/tr.png differ diff --git a/installer/resources/icons/flags/tt.png b/installer/resources/icons/flags/tt.png new file mode 100644 index 000000000..2a11c1e20 Binary files /dev/null and b/installer/resources/icons/flags/tt.png differ diff --git a/installer/resources/icons/flags/tv.png b/installer/resources/icons/flags/tv.png new file mode 100644 index 000000000..28274c5fb Binary files /dev/null and b/installer/resources/icons/flags/tv.png differ diff --git a/installer/resources/icons/flags/tw.png b/installer/resources/icons/flags/tw.png new file mode 100644 index 000000000..f31c654c9 Binary files /dev/null and b/installer/resources/icons/flags/tw.png differ diff --git a/installer/resources/icons/flags/tz.png b/installer/resources/icons/flags/tz.png new file mode 100644 index 000000000..c00ff7961 Binary files /dev/null and b/installer/resources/icons/flags/tz.png differ diff --git a/installer/resources/icons/flags/ua.png b/installer/resources/icons/flags/ua.png new file mode 100644 index 000000000..09563a219 Binary files /dev/null and b/installer/resources/icons/flags/ua.png differ diff --git a/installer/resources/icons/flags/ug.png b/installer/resources/icons/flags/ug.png new file mode 100644 index 000000000..33f4affad Binary files /dev/null and b/installer/resources/icons/flags/ug.png differ diff --git a/installer/resources/icons/flags/um.png b/installer/resources/icons/flags/um.png new file mode 100644 index 000000000..c1dd9654b Binary files /dev/null and b/installer/resources/icons/flags/um.png differ diff --git a/installer/resources/icons/flags/us.png b/installer/resources/icons/flags/us.png new file mode 100644 index 000000000..10f451fe8 Binary files /dev/null and b/installer/resources/icons/flags/us.png differ diff --git a/installer/resources/icons/flags/uy.png b/installer/resources/icons/flags/uy.png new file mode 100644 index 000000000..31d948a06 Binary files /dev/null and b/installer/resources/icons/flags/uy.png differ diff --git a/installer/resources/icons/flags/uz.png b/installer/resources/icons/flags/uz.png new file mode 100644 index 000000000..fef5dc170 Binary files /dev/null and b/installer/resources/icons/flags/uz.png differ diff --git a/installer/resources/icons/flags/va.png b/installer/resources/icons/flags/va.png new file mode 100644 index 000000000..b31eaf225 Binary files /dev/null and b/installer/resources/icons/flags/va.png differ diff --git a/installer/resources/icons/flags/vc.png b/installer/resources/icons/flags/vc.png new file mode 100644 index 000000000..8fa17b061 Binary files /dev/null and b/installer/resources/icons/flags/vc.png differ diff --git a/installer/resources/icons/flags/ve.png b/installer/resources/icons/flags/ve.png new file mode 100644 index 000000000..00c90f9af Binary files /dev/null and b/installer/resources/icons/flags/ve.png differ diff --git a/installer/resources/icons/flags/vg.png b/installer/resources/icons/flags/vg.png new file mode 100644 index 000000000..415690798 Binary files /dev/null and b/installer/resources/icons/flags/vg.png differ diff --git a/installer/resources/icons/flags/vi.png b/installer/resources/icons/flags/vi.png new file mode 100644 index 000000000..ed26915a3 Binary files /dev/null and b/installer/resources/icons/flags/vi.png differ diff --git a/installer/resources/icons/flags/vn.png b/installer/resources/icons/flags/vn.png new file mode 100644 index 000000000..ec7cd48a3 Binary files /dev/null and b/installer/resources/icons/flags/vn.png differ diff --git a/installer/resources/icons/flags/vu.png b/installer/resources/icons/flags/vu.png new file mode 100644 index 000000000..b3397bc63 Binary files /dev/null and b/installer/resources/icons/flags/vu.png differ diff --git a/installer/resources/icons/flags/wales.png b/installer/resources/icons/flags/wales.png new file mode 100644 index 000000000..e0d7cee11 Binary files /dev/null and b/installer/resources/icons/flags/wales.png differ diff --git a/installer/resources/icons/flags/wf.png b/installer/resources/icons/flags/wf.png new file mode 100644 index 000000000..9f9558734 Binary files /dev/null and b/installer/resources/icons/flags/wf.png differ diff --git a/installer/resources/icons/flags/ws.png b/installer/resources/icons/flags/ws.png new file mode 100644 index 000000000..c16950802 Binary files /dev/null and b/installer/resources/icons/flags/ws.png differ diff --git a/installer/resources/icons/flags/ye.png b/installer/resources/icons/flags/ye.png new file mode 100644 index 000000000..468dfad03 Binary files /dev/null and b/installer/resources/icons/flags/ye.png differ diff --git a/installer/resources/icons/flags/yt.png b/installer/resources/icons/flags/yt.png new file mode 100644 index 000000000..c298f378b Binary files /dev/null and b/installer/resources/icons/flags/yt.png differ diff --git a/installer/resources/icons/flags/za.png b/installer/resources/icons/flags/za.png new file mode 100644 index 000000000..57c58e211 Binary files /dev/null and b/installer/resources/icons/flags/za.png differ diff --git a/installer/resources/icons/flags/zm.png b/installer/resources/icons/flags/zm.png new file mode 100644 index 000000000..c25b07bee Binary files /dev/null and b/installer/resources/icons/flags/zm.png differ diff --git a/installer/resources/icons/flags/zw.png b/installer/resources/icons/flags/zw.png new file mode 100644 index 000000000..53c97259b Binary files /dev/null and b/installer/resources/icons/flags/zw.png differ diff --git a/installer/resources/jetty.xml b/installer/resources/jetty.xml index b55831e74..a9c04d964 100644 --- a/installer/resources/jetty.xml +++ b/installer/resources/jetty.xml @@ -1,6 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/resources/postinstall.sh b/installer/resources/postinstall.sh index 900e1d72a..72daee17f 100644 --- a/installer/resources/postinstall.sh +++ b/installer/resources/postinstall.sh @@ -73,6 +73,8 @@ rm -rf ./lib/wrapper rm -f ./lib/*.dll rm -f ./*.bat rm -f ./*.exe -./i2prouter start +rm -rf ./installer +# no, let's not start the router from the install script any more +# ./i2prouter start exit 0 diff --git a/installer/resources/readme.license.txt b/installer/resources/readme.license.txt index d707e557c..9e40f595c 100644 --- a/installer/resources/readme.license.txt +++ b/installer/resources/readme.license.txt @@ -16,12 +16,13 @@ following non-public domain code: * Bouncycastle's hash routines (MIT license) * Cryptix's AES routines (Cryptix license) * Adam Buckley's SNTP routines (BSD) +* FSF's PRNG and GMP (LGPL) Also included in this distribution are a bunch of third party client applications, all with their own dependencies. Please see our license policy page for details: - http://www.i2p.net/licenses + http://www.i2p2.de/licenses One of the bundled client apps (routerconsole) requires us to say: @@ -29,8 +30,11 @@ requires us to say: the Apache Software Foundation (http://www.apache.org/) -Another (I2PTunnel) is GPL licensed. +I2PTunnel, I2PSnark, SusiDNS, and SusiMail +are GPL licensed. + +For more information see LICENSE.txt +in the install directory. For source, please see: - http://www.i2p.net/download -or http://www.i2p.net/cvs \ No newline at end of file + http://www.i2p2.de/monotone diff --git a/installer/resources/robots.txt b/installer/resources/robots.txt new file mode 100644 index 000000000..2bc97ddb1 --- /dev/null +++ b/installer/resources/robots.txt @@ -0,0 +1,78 @@ +# +# robots.txt for your eepsite +# +# You can use this file to control how web crawling robots (for example search +# engine robots like the Googlebot) index your site. Only well-behaving robots +# will abide the rules you set in this file, thankfully those are a majority. + +# Robots that do not abide the robots.txt rules will be able to index anything +# they find. So be aware that this file does not allow you to actually lock +# anyone out. It is voluntary. + +# Keep this file in the root of your site, ie: myeepsite.i2p/robots.txt + +# Remove the # in front of lines you want to use (uncomment). By default robots +# are allowed to index your whole site. + +##### Syntax: + +# User-agent: Botname +# Disallow: /directory/to/disallow/ + +# You can use a * in the User-agent field to select all robots: +# User-agent: * + +# You can not use * as a wildcard in the Disallow string. + +# To allow indexing your whole site you leave the Disallow field empty: +# Disallow: + +##### Examples: + +# At the time of writing there are only two active search engines in the +# I2P network: http://eepsites.i2p and http://yacysearch.i2p +# Because eepsites.i2p does abide robots.txt but not the User-agent string, the +# Yacybot is used in these examples. + +# To control the eepsites.i2p robot you can use the HTML tag instead. +# Example: +# If the robot sees above line it will neither index that url not will it +# follow links on it to further pages. +# Options for the content attribut are: INDEX or NOINDEX and FOLLOW or NOFOLLOW. +# You can also use to disable caching. + +# To allow Yacy to access anything but disallow all other robots: +# User-agent: yacybot +# Disallow: +# User-agent: * +# Disallow: / + +# To disallow Yacy from accessing anything: +# User-agent: yacybot +# Disallow: / + +# To disallow Yacy from accessing the /stuff/ directory, eg me.i2p/stuff/ : +# User-agent: yacybot +# Disallow: /stuff/ + +# If Google was crawling I2P and you would not want them to index your site +# User-agent: Googlebot +# Disallow: / + +# To disallow any well-behaving robots from accessing your /secret/ and +# /private/ directories: +# Keep in mind that this is NOT blocking anyone else. Use proper authentication +# if you want your private and secret things to stay private and secret. Also +# everyone can read the robots.txt file and see what things you want to hide. +# User-agent: * +# Disallow: /secret/ +# Disallow: /private/ + +# Disallow robots to index a specific file: +# User-agent: * +# Disallow: /not/thisfile.html + +# Allow everyone to access everything. This rule is active by default. +# Comment it with # at the start of the line to disable it. +User-agent: * +Disallow: \ No newline at end of file diff --git a/installer/resources/runplain.sh b/installer/resources/runplain.sh index 25221f513..644bdadcf 100644 --- a/installer/resources/runplain.sh +++ b/installer/resources/runplain.sh @@ -5,9 +5,17 @@ # probably not enough for i2p. # You should really use the i2prouter script instead. # -export CP=. ; for j in lib/* ; do export CP=$CP:$j ; done; + +# Paths +# Note that (percent)INSTALL_PATH and (percent)SYSTEM_java_io_tmpdir +# should have been replaced by the izpack installer. +# If you did not run the installer, replace them with the appropriate path. +I2P="%INSTALL_PATH" +I2PTEMP="%SYSTEM_java_io_tmpdir" + +export CP="$I2P" ; for j in "$I2P/lib/*" ; do export CP="$CP:$j" ; done; JAVA=java -JAVAOPTS="-Djava.library.path=.:lib -DloggerFilenameOverride=logs/log-router-@.txt" -nohup $JAVA -cp $CP $JAVAOPTS net.i2p.router.RouterLaunch > /dev/null 2>&1 & -echo $! > router.pid +JAVAOPTS="-Djava.library.path=$I2P:$I2P/lib -Di2p.dir.base=$I2P -DloggerFilenameOverride=logs/log-router-@.txt" +nohup $JAVA -cp "$CP" $JAVAOPTS net.i2p.router.RouterLaunch > /dev/null 2>&1 & +echo $! > "$I2PTEMP/router.pid" diff --git a/installer/resources/start-i2p.txt b/installer/resources/start-i2p.txt new file mode 100644 index 000000000..e20ed1e73 --- /dev/null +++ b/installer/resources/start-i2p.txt @@ -0,0 +1,3 @@ +To start I2P, run: + +$INSTALL_PATH/i2prouter start diff --git a/installer/resources/startconsole.html b/installer/resources/startconsole.html index bd60c4673..adaf4d8d5 100644 --- a/installer/resources/startconsole.html +++ b/installer/resources/startconsole.html @@ -1,6 +1,6 @@ - -Continue to your I2P Router console. + +Continue to your I2P Router console. If that page does not load, please make sure I2P is running, or review the file wrapper.log for critical errors. diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css new file mode 100644 index 000000000..62296c191 --- /dev/null +++ b/installer/resources/themes/console/classic/console.css @@ -0,0 +1,598 @@ +/* Optimised for less capable browers and system specifications */ + +body { + margin: 2px 0 0 2px; + padding: 0; + text-align: left; + background: #bbf; + color: #000; + font: 9pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; +} + +.hide { + display: none; +} + +img { + border: none; +} + +pre { + overflow: auto; + font-size: 8pt !important; + width: 100%; +} + +div.logo { + float: left; + position-relative: top 20px ; + width: 200px; + margin: 0 0 0 20px; + padding: 10px 5px; + text-align: center; + border: 5px solid #ddf; + background-color: #eef; + -moz-border-radius: 15px; + -moz-box-shadow: inset 0px 0px 0px 2px #99f; + -khtml-border-radius: 15px; + -khtml-box-shadow: inset 0px 0px 0px 2px #99f; +} + +div.logo hr { + color: #ddf; + background: #ddf; + height: 5px; + border: 0px solid #ddf; + margin: 8px -3px; +} + +div.logo a:link, div.logo a:visited { + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.5); +} + +div.logo a:active { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.logo a:hover { + text-shadow: 0px 0px 1px rgba(128, 0, 0, 0.7); + color: #900; +} + +div.warning { + margin: 20px 20px 10px 260px; + padding: 0px 20px 20px 75px; + background: #ffd; + border: 5px solid #fb7; + text-align: left; + color: inherit; + background-image:url("../images/errortriangle.png"); + background-position: 17px center; + background-repeat:no-repeat; + -moz-border-radius: 15px; + -moz-box-shadow: inset 0px 0px 0px 2px #f60; + -kthml-border-radius: 15px; + -khtml-box-shadow: inset 0px 0px 0px 2px #f60; +} + +div.warning a:link { + color: #f60; + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.5); +} + +div.warning a:visited{ + color: #f90; +} + +div.warning a:hover{ + color: #d30; + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); +} + +div.warning a:active{ + color: #900; +} + +div.warning hr { + color: #fb7; + background: #fb7; + height: 5px; + border: 0px solid #fb7; + margin: 5px 0; +} + +div.toolbar { + margin: 0em 0em 2em 0em; + font-weight: bold; + display: none !important; +} + +div.routersummaryouter { + float: left; + width: 205px; + margin: 0; + padding: 0; + border: 0; + clear: left; /* fixes a bug in Opera */ +} + +div.routersummary { + background: #ddf; + width: 190px; + color: inherit; + margin: 0; + padding: 7px 1px; + text-align: center !important; + border: 5px solid #bbf; + font-size: 9pt; + word-wrap: break-word; + font: 9pt/125%; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; +} + +div.routersummary input[type=text] { + text-align: right !important; +} + +div.routersummary hr { + color: #eef; + background: #eef; + height: 2px; + border-bottom: 1px solid #eef; + margin: 8px 1px 7px 1px; + -moz-box-shadow: inset 0px 1px 1px 1px #99f; +} + +div.routersummary h3 { + border: 0px solid #f00; +/* border-bottom: 1px solid #99f !important;*/ + font-size: 10pt; + letter-spacing: 0.05em; + margin: -7px 1px -7px 1px; + padding: 5px 0px 5px 0px; + background: #c5d5fb; + text-transform: uppercase; +} + +div.routersummary h4 { + border: 0px solid #f00; + border-bottom: 0 !important; + font-size: 9pt; + letter-spacing: 0.05em; + margin: -7px 1px -7px 1px !important; + padding: 2px 3px 3px 3px; + background: #c1d1f7; + text-transform: capitalize; + text-decoration: none !important; + color: #2b2; +} + +div.routersummary table { + border: 0; + text-align: center !important; + margin: -5px 5px; + width: 180px !important; + overflow: hidden; + font-size: 8pt; + padding: 0px -10px; + background-image: none !important; + background-color: transparent !important; +} + +div.routersummary tr { + background-image: none !important; + background-color: transparent !important; + border: 0 !important; +} + +div.routersummary form { + margin-top: 8px; +} + +div.routersummary p { + padding: 0; +} + +div.routersummary a:link, div.routersummary a:visited { + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.3); +} + +div.routersummary a:hover { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.routersummary td { + padding: 2px 4px; + background-image: none !important; + border: 0 !important; +} + +div.routersummary tr:nth-child(even) { + background-color: #f60; + background-image: none !important; +} + +div.routersummarytr:nth-child(odd) { + background-color: #f00; + background-image: none !important; +} + +div.warning h3 { + border-bottom: 5px solid #fb7; + padding-bottom: 10px; +} + +div.main { + margin: 0px 0px 0px 196px; + padding: 15px 15px 15px 15px; + background: #eef; + border: 5px solid #bbf; + border-top: 0; + text-align: left; + color: #001; + min-width: 570px; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; +} + +div.main li { + padding-bottom: 10px; + list-style: square; +} + +div.main li:first-child { + padding-top: 20px; +} + +div.main textarea { + width: 98% !important; + margin: 2px 0 2px 5px; +} + +div.news { + margin: -5px 0px 0 196px; + padding: -10px 15px 8px 15px; + background: #ffffc0; + border: 5px solid #bbf; + text-align: justify; + color: inherit; + min-width: 600px; + padding-bottom: 8px; + padding-left: 10px; + padding-right: 10px; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; +} + +/* convert the list entry to our title */ + +div.news li { + text-align: justify; + list-style: none; + margin: -15px 15px -20px -20px; + padding: 0px 0 15px 0; + border-bottom: 2px solid #cc7; + border-top: 0px solid #cc7; + padding: 3px 5px 5px 5px; + font-size: 12pt; + color: #540; +} + +div.news p { + color: #330; +} +div.news a:link { + color: #773; + text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3); +} + +div.news a:visited { + color: #f00 !important; + text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3); +} + +div.news hr { + color: #cc7; + background: #cc7; + height: 2px; + border: 0px solid #cc7; + margin: 5px 0; +} + +div.confignav { + padding: 12px 0 15px 0; + background: #cfc; + margin: -20px -20px 0 -20px; + border: 5px solid #bbf; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; +} + +div.configure { + margin: 1px -20px 0 -20px; + padding: 0px 20px 0px 20px; +} + +div.configure table { + font-size: 9pt; + font-weight: bold; + -moz-box-shadow: inset 0px 0px 1px 1px #001; +} + +div.configure tr, div.configure td { + padding: 10px 2px; +} + +div.configure tr { + -moz-box-shadow: inset 0px 0px 1px 0px #bbf; +} + +div.messages { + padding: 0px 10px; + background: #fff; + border: 5px solid #bbf; + border-right: 0; + margin: -5px -15px 10px -20px; + text-align: center; + font-size: 9pt; + font-weight: bold; + color: #474; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; +} + +div.messages li, div.messages ul { + padding: 15px 0 5px 5px; + margin: -15px 0 0 0; +} + +div.messages span.error { + color: #d00000; +} + +div.messages span.notice { + font-style: italic; +} + +h1 { + font-size: 18pt; + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7); + text-align: center; + border: 5px solid #bbf; + padding: 13px 10px 12px 10px; + margin: 0 0px 0 196px; + line-height: 93%; + text-transform: uppercase; + letter-spacing: 0.3em; + background: #fff; + min-width: 600px; + -moz-box-shadow: inset 0px 0px 0px 1px #99f; +} + +h2 { + font-size: 14pt; + padding: 10px; + border-bottom: 5px solid #bbf; + border-top: 0px solid #bbf; + letter-spacing: 0.04em; +} + +h3 { + font-size: 12pt; + padding: 0 10px 10px 10px; + border-bottom: 5px solid #bbf; + border-top: 0px solid #bbf; + letter-spacing: 0.04em; +} + +.proxyfooter{ + font-size: 7pt; + display: none !important; +} + +table { + border-collapse: collapse; + border: 5px solid #bbf; + margin: 5px 0px; + cell-padding: 1px; + font-size: 7pt; + background: #fff; + width: 100%; +} + +table hr { + padding: 0px 0; + color: #bbf; + background: #bbf; + border: 0px solid #bbf; + margin: 0px -5px; + height: 1px; +} + +table tt { + font-size: 7.5pt; +} + +th { + background-color: #fff; + padding: 8px 2px; + text-align: center; + border-bottom: 1px solid #88f; +} + +tt { + font-size: 8pt; +} + +tt, pre { + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + +td { + padding: 4px; +} + +tr:nth-child(even) { + background-color: #eef; +} + +tr:nth-child(odd) { + background-color: #ddf; +} + +hr { + color: #bbf; + background: #bbf; + height: 5px; + border: 0px solid #bbf; + margin: 5px 0; +} + +.statusnotes { + font-style: italic; + font-size: 8pt; + color: #001; + text-align: center; + margin: -7px 0 7px 0; + background: #bbf; + border: 5px solid #bbf; + border-top: 0; + padding: 4px 0 2px 0; +} + +input { + margin: 3px 5px 3px 0; + vertical-align: middle; +} + +input[type=text] { + margin: 3px 5px 3px 5px; + vertical-align: middle; +} +select { + margin: 3px 5px 3px 5px; + vertical-align: middle; +} + +submit { + margin: 3px 5px 3px 5px; + padding 2px 0; + font: 8pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; +} + +p { + padding: 5px 20px 0px 20px; + text-align: justify; +} + +.formaction { + text-align: right; +} + +.langbox { + margin: 29px -15px 0px 5px; + color: #001; + font-size: 7pt; + width: 180px; + text-align: center; + float: right; + valign: middle; +} + +.langbox img { + padding: 0 2px; /* Ignored by IE8 */ +} + +a:link{ + color: #006; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #448; + text-decoration: none; + font-weight: bold; +} + +a:hover{ + color: #f60; + text-decoration: underline; + font-weight: bold; +} + +a:active{ + color: #f93; + text-decoration: underline; + font-weight: bold; +} + +pre { + font-size: 9pt; + margin: 0px 20px; +} + +tt { + font-size: 9pt; + font-weight: bold; + color: darkgreen; +} + +.tablefooter { + border: 1px solid #88f; +} + +.tablefooter tr, .tablefooter td { + background: #bbf; + font-size: 8pt; + font-weight: bold; + line-height: 150%; + word-wrap: nowrap; + padding: 8px 1px; +} + +.tidylist { + text-align: justify; + padding-right: 30px; +} + +div.graphspanel { + padding: 20px 10px; + margin: -20px; + background: #ddf url('images/lightbluetile.png'); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 5px solid #bbf; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + text-align: center !important; +} + +div.graphspanel img { + border: 1px solid #99f; + padding: 2px; + margin: 6px; + background: #ddf; + -moz-box-shadow: inset 0px 0px 1px 1px #99f; +} + +div.graphspanel img:hover { + border: 1px solid #003; + padding: 2px; + margin: 6px; + text-align: center !important; + background: #001; + -moz-box-shadow: inset 0px 0px 2px 1px #f60; +} + +div.graphspanel hr { + margin: 20px 0; +} + +div.graphspanel form { + text-align: left; + margin: 0 20px; +} + +div.graphspanel h3 { + text-align: left; +} \ No newline at end of file diff --git a/installer/resources/themes/console/default.css b/installer/resources/themes/console/classic/default.css similarity index 100% rename from installer/resources/themes/console/default.css rename to installer/resources/themes/console/classic/default.css diff --git a/installer/resources/themes/console/i2ptunnel.css b/installer/resources/themes/console/classic/i2ptunnel.css similarity index 100% rename from installer/resources/themes/console/i2ptunnel.css rename to installer/resources/themes/console/classic/i2ptunnel.css diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css new file mode 100644 index 000000000..065127429 --- /dev/null +++ b/installer/resources/themes/console/classic/ieshim.css @@ -0,0 +1,250 @@ +/* Welcome to the wonderful world of kludgey IE fixes */ + +.wideload { + overflow: auto; + width: 100%; +} + +.formaction { + text-align: left !important; + margin: -10px 0 10px 0; +} + +div.configure { + text-align: center; +} + +div.configure p, div.configure table { + text-align: justify; +} + +div.main ul { + margin-right: 20px; +} + +div.configure textarea { + width: 450px !important; +} + +div.configure input { + margin-left: 5px; +} + +div.configure table { + width: 550px !important; + text-align: center; +} + +h1 { + padding: 15px 10px 16px 10px !important; + margin: 0 0px 0 17 5px !important; + background-color: #bbf !important; /* background page color to fix overflow issue */ + color: #001; +} + +h2 { + padding-top: 0; + text-align: left !important; +} + +h3 { + margin-top: 10px; + text-align: left !important +} + +div.confignav { + padding: 15px 0 15px 0; + border-left: 0px; + margin-left: -15px; + border-top: 5px solid #bbf; + margin-bottom: 10px !important; +} + +div.messages { + border-left: 0; + border-right: 0; + margin: -10px -15px 0px -15px; +} + +div.main, div.news { + margin: -5px 0px 10px 185px; + border: 5px solid #bbf; +} + +div.main hr, div.news hr { + margin: 0; +} + +div.main { + border-top: 5px solid #bbf; +} + +div.news { + border-left: 5px solid #bbf; + margin: -5px 0px 0 185px; + padding-bottom: 8px; +} + +div.news hr { + color: #bbf; + background: #bbf; + height: 3px; + border: 0px; + margin: 0 -10px 0 -13px !important; +} + +div.routersummary { + color: #001; + padding-left: 0px; + border-left: 5px solid #bbf; + text-align: center !important; + overflow: hidden; /* prevents IE from borking the sidepanel */ +} + +div.routersummary submit { + padding: 0; + margin-bottom: 5px; +} + +div.routersummary input[type=text] { + text-align: right !important; +} + +div.routersummary hr { + color: #eef; + background: #eef; + height: 2px; + border-bottom: 1px solid #eef; + margin: 8px 1px 7px 1px; + -moz-box-shadow: inset 0px 1px 1px 1px #99f; +} + +div.routersummary h3 { + border: 0px solid #f00; + text-align: center !important; + font-size: 10pt; + letter-spacing: 0.05em; + margin: -14px 0px -15px 1px; + padding: 5px 0px 5px 0px; + background: #c5d5fb; + text-transform: uppercase; +} + +div.routersummary h4 { + border: 0px solid #f00; + border-bottom: 0 !important; + font-size: 9pt; + letter-spacing: 0.05em; + margin: -14px 0px -15px 1px !important; + padding: 2px 3px 3px 3px; + background: #c1d1f7; + text-transform: capitalize; + text-decoration: none !important; + color: #2b2; + text-align: center !important; +} + +div.routersummary table { + border: 0; + text-align: center !important; + margin: -5px 5px; + width: 175px !important; + overflow: hidden; + font-size: 8pt; + padding: 0px -10px; + background-image: none !important; + background-color: transparent !important; +} + +div.routersummary tr { + background-image: none !important; + background-color: transparent !important; + border: 0 !important; +} + +div.routersummary form { + margin-top: -25px !important; + margin-bottom: -25px !important; + text-align: center !important; +} + +div.routersummary p { + padding: 0; +} + +div.routersummary img { + margin: 5px -10px -5px -10px; + overflow: hidden; +} + +div.routersummary a:link, div.routersummary a:visited { + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.3); +} + +div.routersummary a:hover { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.routersummary td { + padding: 2px 4px; + background-image: none !important; + border: 0 !important; +} + +div.routersummary tr:nth-child(even) { + background-color: #f60; + background-image: none !important; +} + +div.routersummarytr:nth-child(odd) { + background-color: #f00; + background-image: none !important; +} + +div.news li { + padding-top: 0px 0px !important; + margin-bottom: -23px !important; +} + +div.logo { +} + +div.warning { + padding: 0px 20px 20px 80px; + margin-top: -20px; + margin-left: -10px !important; +} + +.langbox { + margin: 22px -20px 0px 5px; +} + +td { + text-align: left; +} + +th { + text-align: left; + padding-left: 3px; + padding-right: 1px; +} + +div.configure hr{ + margin: 10px 0 15px 0; +} + +input { + padding: 0; +} + +div.graphspanel img { + border: 1px solid #99f; + margin: 6px 0 !important; + background: #ddf; + -moz-box-shadow: inset 0px 0px 1px 1px #99f; +} + +div.graphspanel hr { + margin: 20px 0; +} \ No newline at end of file diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css new file mode 100644 index 000000000..fe902cb1e --- /dev/null +++ b/installer/resources/themes/console/dark/console.css @@ -0,0 +1,837 @@ +/* Not yet complete. Subject to flux and change. dr|z3d - 07.25.09 */ + +body { + margin: 25px 10px 0 5px; + padding: 0; + text-align: center; + background: #002; + color: #FFF; + font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; +} + +.hide { + display: none; +} + +img { + border: none; +} + +pre { + width: 98%; + overflow-x: scroll; + text-align: left; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #fff; +} + +div.logo { + float: left; + padding: 10px; + text-align: center; + font-color: #fff; + margin: 0 20px 0 20px; + border: 1px solid #99f; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + background: #003 url('images/darkbluebg.png'); + width: 175px; + -moz-box-shadow: inset 0px 0px 1px 0px #009; + -khtml-box-shadow: inset 0px 0px 1px 0px #009; + box-shadow: inset 0px 0px 1px 0px #009; +} + +div.toolbar { + margin: 0; + padding: 10px; + font-weight: bold; + background: #eef; + border: 1px solid #002; + display: none; +} + +div.toolbar a:link { + border: 1px outset #ddddc0; + padding: 0px 5px 1px 5px; + background: #bbf; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + color: #002; +} + +div.toolbar a:visited { + background: #ddf; +} + +div.toolbar a:hover, button:hover{ + border: 1px solid #f60; + background: #003; + color: #f60; +} + +a:active{ + color: #900; +} + +div.routersummaryouter { + float: left; + width: 200px; + margin: 0 0 10px 20px; + padding: 0; + border: 0; + clear: left;/* fixes a bug in Opera */ + text-align: center; + display: block; +} + +div.routersummary { + width: 175px; + padding: 10px; + text-align: center; + border: 1px solid #99f; + background: #003; + background: url(images/darkbluebg.png); + color: #eef; + font-size: 8pt; + clear: left;/* fixes a bug in Opera */ + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + float: left; + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; +} + +div.routersummary input[type=text] { + text-align: right !important; + -moz-box-shadow: inset 1px 1px 1px 0px #000; + -khtml-box-shadow: inset 1px 1px 1px 0px #000; + box-shadow: inset 1px 1px 1px 0px #000; +} + +div.routersummary hr { + color: #99f; + background: #99f; + height: 2px; + border-bottom: 1px solid #99f; + margin: 8px -10px 7px -10px; + -moz-box-shadow: inset 0px 1px 1px 1px #001; +} + +div.routersummary h3 { + border: 0; + font-size: 10pt; + letter-spacing: 0.05em; + margin: -7px -9px -10px -9px; + padding: 3px 0px 5px 0px; + background: #007; + text-transform: uppercase; + -moz-border-radius: 0; + -khtml-border-radius: 0; + border-radius: 0; + background: #007; + background-image: -moz-linear-gradient(top, bottom, from(#007), to(#005), color-stop(7%, #007), color-stop(100%, #005)); +} + +div.routersummary h4 { + border: 0; + border-bottom: 0 !important; + font-size: 9pt; + letter-spacing: 0.05em; + margin: -7px -9px -10px -9px !important; + padding: 2px 3px 5px 3px; + background: #005; + text-transform: capitalize; + text-decoration: none !important; + color: #2b2; + background-image: -moz-linear-gradient(top, bottom, from(#001), to(#005), color-stop(10%, #005), color-stop(100%, #004)); +} + +div.routersummary table { + border: 0; + text-align: center !important; + margin: -5px -5px; + width: 185px !important; + overflow: hidden; + font-size: 8pt; + padding: 0px -10px; + background-image: none !important; + background-color: transparent !important; +} + +div.routersummary tr { + background-image: none !important; + background-color: transparent !important; + border: 0 !important; +} + +div.routersummary form { + margin-top: 8px; +} + +div.routersummary p { + padding: 0; +} + +div.routersummary a:link, div.routersummary a:visited { + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.3); +} + +div.routersummary a:hover { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.routersummary td { + padding: 2px 4px; + background-image: none !important; + border: 0 !important; +} + + +div.routersummary tr:nth-child(even) { + background-color: #f60; + background-image: none !important; +} + +div.routersummarytr:nth-child(odd) { + background-color: #f00; + background-image: none !important; +} + +div.warning { + margin: 5px 20px 10px 240px; + padding: 0px 25px 20px 75px; + background: #005; + border: 1px solid #99f; + text-align: left; + color: #fff; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + text-align: justify; + background-image:url("images/errortriangle.png"); + background-position:15px center; + background-repeat:no-repeat; + -moz-box-shadow: inset 0px 0px 0px 1px #f00; + -khtml-box-shadow: inset 0px 0px 0px 1px #f00; + box-shadow: inset 0px 0px 0px 1px #f00; + word-wrap: break-word; +} + +div.main { + margin: 0px 0px 20px 215px; + padding: 0 15px 15px 25px; + background: #002; + text-align: left; + color: #eef; + width: auto; +/* overflow-x: scroll; */ +} + +div.main textarea { + background: #002; + color: #fff; + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + +div.news { + margin: 0px 15px 20px 240px; + padding: 20px 30px 20px 30px; + border: 1px solid #99f; + background: #004; + background: url("images/darkbluetile.png"); + color: #eef; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + text-align: justify; + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; +} + +div.news li { + text-align: justify; + list-style: url('images/info_dark.png'); + margin: 0 10px 0 30px; + padding: 5px; + vertical-align: middle; + word-wrap: break-word; +} + +div.confignav { + padding: 15px 10px !important; + margin: 0 0 25px 0; + background: #004 url('images/darkbluebg.png'); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #99f; + font-size: 10pt !important; + font-weight: bold !important; + line-height: 160% !important; + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; +} + +div.configure { + padding: 0 15px 15px 15px; + margin: 10px 0px; + background: #005; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #99f; + background: #003 url(images/darkbluebg.png); + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; +} + +div.messages { + padding: 10px; + margin: 10px 0 20px 0; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #99f; + background: #008 url('images/lightbluetile.png'); + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; +} + +div.messages span.error { + color: #dd0; +} + +div.messages span.notice { + font-style: italic; +} + +div.messages li { + text-align: justify !important; + font-weight: bold; + list-style: url(images/warning_dark.png) !important; + margin: 0 10px 0 35px !important; + padding: 5px 10px !important; + border: 0px !important; +} + +div.graphspanel { + padding: 15px 15px 15px 15px; + margin: 10px 0px; + background: #005; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #99f; + background: #003 url(images/darkbluebg.png); + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; +} + +div.graphspanel img { + border: 1px solid #001; + padding: 3px; + margin: 5px; + text-align: center !important; + background: #002; + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; + opacity: 0.9; +} + +div.graphspanel img:hover { + border: 1px solid #001; + padding: 3px; + margin: 5px; + text-align: center !important; + background: #002; + -moz-box-shadow: inset 0px 0px 1px 1px #f60; + -khtml-box-shadow: inset 0px 0px 1px 1px #f60; + box-shadow: inset 0px 0px 1px 1px #f60; + opacity: 1; +} +table { + border-collapse: collapse; + width: 100%; + border: 1px solid #99f; + margin: 5px 0px 5px 0px; + cell-padding: 1px; + font-size: 7pt; + background: #003; +} + +table hr { + padding: 0px 0; + color: #99f; + background: #99f; + border: 0px solid #99f; + margin: 0px 0px; + height: 1px; + display: none; +} + +th { + padding: 6px 2px; + color: #eef; + text-align: center; + font-size: 9pt; + background: #004 url('images/tabletitledark.png') repeat-x; + border-top: 1px solid #99f; + border-bottom: 1px solid #99f !important; + line-height: 110%; +} + +tr { + vertical-align: middle; +} + +tr:nth-child(even) { + background: #002 url('images/darkerbluetile.png') !important; + vertical-align: middle; +} + +tr:nth-child(odd) { + background: #003 url('images/darkbluetile.png') !important; + vertical-align: middle; +} +/* +tr:last-child { + background: #004 url('images/lightbluetile.png') !important; + font-weight: bold; + border: 1px solid #99f !important; +} +*/ +td { + padding: 6px 3px; + color: #eef; + vertical-align: middle; + border-top: 1px inset #006; + border-bottom: 1px outset #006; +} + +td img { + padding: 0 1px 0 2px; +} + +tt { + font: bold 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #FF0; + padding: 0 5px 2px 0; +} + +div.main li { + text-align: left; + list-style: square; + margin: 2px 0px 2px 30px; + padding: 1px 20px 1px 0px; + line-height: 150%; + word-wrap: break-word; +} + +.tidylist { + text-align: justify !important; +} + +ol { + display: inline; + margin: 1px 0 0 0; + padding: 1px 0 0 20px; +} + +ul { + display: inline; + margin: 0; + padding: 0; +} + +code { + text-align: left; + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + +a:link, h2 a:link{ + color: #99f; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #7bb; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:hover{ + color: #f60; + text-decoration: underline; + font-weight: bold; + word-wrap: break-word; +} + +.links { + list-style-image: url("images/link_dark.png"); + margin: 0 5px 0 0px; + padding: 0px 5px; + text-align: justify; +} + +p { + text-align: justify; + line-height: 160%; +} + +h1 { + text-align: left; + color: #fff; + padding: 10px 15px; + margin: 0 15px 25px 240px; + font-size: 16pt; + font-weight: bold; + font-style: normal; + text-transform: uppercase; + letter-spacing: 0.15em; + text-shadow: 0px 0px 3px rgba(255, 255, 255, 0.8); + white-space: normal; + background: #004 url('images/darkbluebg.png'); + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; + border: 1px solid #99f; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + line-height: 120%; +} + +h2 { + font-size: 12pt; + color: #fff; + text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5); + letter-spacing: 0.05em; + background: #003 url('images/titletile.png'); + padding: 5px 10px 8px 10px; + wordwrap: none; + border: 1px solid #99f; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + vertical-align: middle; + margin: 25px 0 20px 0 !important; + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; + word-wrap: break-word; +} + +h2 a:visited { + color: #44f; +} + +h2 a:hover { + color: #f60; + text-shadow: 0px 0px 1px rgba(255, 255, 72, 0.9); +} + +h3 { + border: 1px solid #99f; + border-left: 5px solid #99f; + padding: 3px 5px 3px 5px; + margin: 20px 0 15px 0; + border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + -khtml-border-radius: 0 4px 4px 0; + background: #007; +/* background: url(images/lightbluebg.png);*/ +} + +h4 { + border-bottom: 1px; + border-bottom-style: solid; + border-bottom-color: #99f; + padding: 0 0 10px 0; + margin: 5px 0 10px 0; + font-size: 11pt; +} + +button, button:visited { + font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px outset #77f; + padding: 1px 3px; + background: #bbf; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font-size: 8pt; + font-weight: bold; + margin: 2px 3px; + text-align: center; + vertical-align: middle; + min-width: 76px; + -moz-box-shadow: inset 0px 1px 1px 0px #55f; + -khtml-box-shadow: inset 0px 1px 1px 0px #55f; + box-shadow: inset 0px 1px 1px 0px #55f; + background: #003; + color: #99f; +} + +button:hover { + border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #eef; + -khtml-box-shadow: inset 0px 1px 1px 0px #eef; + box-shadow: inset 0px 1px 1px 0px #eef; + background: #001; + color: #f60; +} + +button:active { + border: 1px inset #f60; + background: #f60; + color: #fff; + -moz-box-shadow: inset 0px 0px 0px 0px #f60; + -khtml-box-shadow: inset 0px 0px 0px 0px #f60; + box-shadow: inset 0px 0px 0px 0px #f60; +} + +.underline { + border-bottom: 1px solid #eeeeff; + padding: 5px 0px 5px 0px; + margin: 0px 0px 10px 0px; +} + +.langbox { + margin: 2px 2px 2px 5px; + padding: 7px 10px 5px 10px; + color: #eef; + font-size: 7pt; + width: 140px; + text-align: right; + float: right; + vertical-align: middle; +} + +hr { + color: #99f; + background: #99f; + height: 1px; + border: 0px solid #99f; + margin: 10px 0; +} + +sidebarlogo { + text-align: center; +} + +input { + border: 1px outset #55f; + -moz-box-shadow: inset 0px 1px 1px 0px #55f; + -khtml-box-shadow: inset 0px 1px 1px 0px #55f; + box-shadow: inset 0px 1px 1px 0px #55f; + background: #003; + color: #99f; + margin: 5px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + padding: 1px 2px; + text-decoration: none; + min-width: 110px; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; +} + +input:hover { + background: #001; + color: #f60; + border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #eef; + -khtml-box-shadow: inset 0px 1px 1px 0px #eef; + box-shadow: inset 0px 1px 1px 0px #eef; +} + +input:active { + background: #002; + color: #f30; + border: 1px solid #f30; +} + +input:active { + border: 1px inset #f60; + background: #f60; + color: #fff; +} + +input[type=text] { + background: #002; + color: #eef; + margin: 5px 10px; + padding: 4px 2px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px solid #bbf; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + -moz-box-shadow: inset 1px 1px 1px 0px #000; + -khtml-box-shadow: inset 1px 1px 1px 0px #000; + box-shadow: inset 1px 1px 1px 0px #000; +} + +input[type=text]:active, input[type=text]:hover { + background: #001; +} + +fieldset { +overflow: hidden; +position: relative; +} + +select { + background: #002; + color: #eef; + margin: 5px 10px; + border: 1px solid #bbf; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + min-width: 110px; + font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + padding: 2px; +} + +textarea { + background: #001; + color: #eef; + padding: 5px; + margin: 10px; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + min-height: 100px; + min-width: 97%; + text-align: left; + border: 1px solid #99f; +} + +form {} + +.proxyfooter { + margin: 0 20px 10px 240px; + padding: 20px 25px 20px 75px; + font-color: #f00; + font-size: 7pt; + text-align: right !important; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border: 1px solid #001; + display: none; +} + +.statusnotes { + font-style: italic; + font-size: 8pt; + color: #eef; + text-align: center; + border: 1px solid #99f !important; + border-top: 0px !important; + margin: -5px 0 5px 0; + padding: 7px; + background: #004; + -moz-box-shadow: inset 0px 0px 0px 1px #009; + -khtml-box-shadow: inset 0px 0px 0px 1px #009; + box-shadow: inset 0px 0px 0px 1px #009; +} + +.joblog { + margin: 25px 0 25px 0; + padding: 20px 30px 20px 30px !important; + border: 1px solid #99f; + background-color: #004; + background: url("images/darkbluebg.png"); + color: #dfd; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + text-align: justify; + -moz-box-shadow: inset 0px 0px 1px 0px #eef; + -khtml-box-shadow: inset 0px 0px 1px 0px #eef; + box-shadow: inset 0px 0px 1px 0px #eef; + overflow-x: scroll; /* Opera fix */ + } + + div.joblog:li { + word-wrap: break-word !important; + text-align: justify; +} + + .joblog:ul { + word-wrap: break-word !important; + text-align: justify; +} + +.smallhead { + font-size: 7pt +} + +.mediumtags { + font-size: 9pt; +} + +.optbox { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; +overflow: hidden; +position: relative; +} + +.optbox:hover { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; +} + +.cells { + border: 1px inset #005; + border-left: 1px outset #002; +} + +.tablefooter tr, .tablefooter td { + background: #004 url('images/tabletitledark.png') repeat-x !important; + border-top: 1px solid #99f; + border-bottom: 1px solid #99f !important; + font-size: 7pt; + line-height: 110%; +} + +.formaction { + text-align: right; +} \ No newline at end of file diff --git a/installer/resources/themes/console/dark/default.css b/installer/resources/themes/console/dark/default.css new file mode 100644 index 000000000..dc9ceede8 --- /dev/null +++ b/installer/resources/themes/console/dark/default.css @@ -0,0 +1,310 @@ +body { + margin: 0px; + padding: 0px; + text-align: center; + font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif; + background-color: #001; + color: #000000; + font-size: 9pt; +/* we've avoided Tantek Hacks so far, + ** but we can't avoid using the non-w3c method of + ** box rendering. (and therefore one of mozilla's + ** proprietry -moz properties (which hopefully they'll + ** drop soon). + */ + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +div { + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +label { + margin: 0; + padding: 5px 4px 4px 4px; + float: left; + width: 120px; +/* height : 24px; */ + font-weight: normal; + text-align: right; + font-size: 8pt; + font-style: italic; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +h4 { + font-size: 14px; + font-weight: bold !important; + text-align: center; + border: 1px solid #99f; + margin: 5px 0 15px 0; + padding: 5px 10px; + background: #004 url(images/tabletitledark.png) repeat-x; + text-transform: uppercase; + text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.9); + letter-spacing: 0.08em; + -moz-box-shadow: inset 0px 0px 4px 0px #009; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} + +a { + text-decoration: none; +} + +form { + margin: 0px; +} + +textarea, input, select, button, a { + font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif; + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: 9pt; + float: left; +} + +button { + float: none; +} + +textarea { + border: 1px solid #9999ff; +} + +br { + clear: left; +} + +div.statusNotRunning { + float: left; + width: 78px; + height: 24px; + overflow: hidden; + color: #dd0000; + padding-top: 24px; + margin-top: 6px; + background: url('images/console_status_stopped.png') 0 0 no-repeat; +} + +div.statusRunning { + float: left; + width: 78px; + height: 24px; + overflow: hidden; + color: #00dd00; + padding-top: 24px; + margin-top: 6px; + background: url('images/console_status_running.png') 0 0 no-repeat; +} + +div.statusStarting { + float: left; + width: 78px; + height: 24px; + overflow: hidden; + color: #339933; + padding-top: 24px; + margin-top: 6px; + background: url('images/console_status_starting.png') 0 0 no-repeat; +} + +hr { + display: none; +} + +.separator, .subdivider { + clear: both; + height: 1px; + margin: 3px 0px 3px 0px; + border-bottom: 1px solid #99f; +} + +.subdivider { + border-bottom: 1px solid #99f; + padding: 5px 0px 0px 0px; +} + +.freetext { + width: 150px; + height : 22px; + border: 1px solid #9999ff; + padding: 2px; + margin: 4px 0 2px 4px; + background-color: #002; + font: bold 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + +.control { + margin: 6px 0 0 2px !important; + padding: 2px 0; + overflow: hidden; + min-width: 60px; + max-height: 24px; + font-size: 9pt; + font-weight: bold; + background-color: #b4c8ff; + color: black; + border: 1px outset #ddddc0; + text-align: center; + white-space: nowrap; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + margin-top: 8px; + background: url(images/tabletitlelight.png) repeat: x; + vertical-align: middle; + text-decoration: none; +} + +.control:link { + color: #001; + text-decoration: none; +} + +.control:hover { + border: 1px solid #eeeeff; + background-color: #003; + color: #ff6600 !important; + text-decoration: none; +} + +.control:active { + border: 1px inset; + background-color: #f60; + color: #fff !important; + text-decoration: none; +} + +.control:visited { + color: #001; + text-decoration: none; +} + +.panel { + width: 800px; + margin: 16px auto 16px auto; + overflow: hidden; + text-align: left; + font-size: 9pt; + color: white; + background-color: #002; + background: url(images/darkbluebg.png); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #99f; + padding: 10px 20px; +} + +.panel .footer { + float: right; + padding: 4px; +} + +.toolbox { + float: right; +} + +.rowItem { + width: 750px; + float: left; + margin: 0px; +} + +.comment { + font-style: italic; +} + +.text { +/* height: 24px;*/ + width: 150px; + padding: 4px 0 0 2px; + float: left; + margin: 0; + font-size: 9pt !important; + font-weight: bold; +} + +.accessKey { + text-decoration: underline; +} + +#globalOperationsPanel { + background-color: #003; + border: 1px solid #99f; + background: url(images/darkbluebg.png); + -moz-box-shadow: inset 0px 0px 0px 1px #f00; + padding: 5px 20px 11px 10px !important; +} + +#globalOperationsPanel .control { + width: 100px; +} + +.header { + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 0; +} + +a:link{ + color: #99f; + text-decoration: none; +} + +a:visited{ + color: #7bb; + text-decoration: none; +} + +a:hover{ + color: #ff6600; + text-decoration: underline; +} + +a:active{ + color: #900; + text-decoration: underline; +} + +input { + background-color: #002; + color: #eef; + margin: 0 2px 0 2px; + font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; + font-weight: bold; + border: 1px solid #99f; +/* + padding: 0px 2px 1px 2px; +*/ + text-decoration: none; +} + +input hover { + background-color: #f00; + color: #eef; + margin: 0 2px 0 2px; + font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; + font-weight: bold; + border: 1px solid #99f; + padding: 2px; + text-decoration: none; +} + +select { + background-color: #001; + color: #eef; + margin: 6px 2px 0 2px; + font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px solid #99f; + padding: 2px 2px 2px 4px; + max-height: 24px; +} + +form {} \ No newline at end of file diff --git a/installer/resources/themes/console/dark/i2ptunnel.css b/installer/resources/themes/console/dark/i2ptunnel.css new file mode 100644 index 000000000..cc2f5d97e --- /dev/null +++ b/installer/resources/themes/console/dark/i2ptunnel.css @@ -0,0 +1,139 @@ +/* I2P Tunnel Edit Page +*/ +#tunnelEditPage input { + width: 458px; +} + +#tunnelEditPage select { + width: 308px; +} + +#tunnelEditPage option [ selected ] { + color: green; +} + +#tunnelEditPage #targetField, #tunnelEditPage #accessField, #tunnelEditPage #optionsField { + height: 48px; + width: 150px; +} + +#tunnelEditPage #tunnelOptionsField { + height: 96px; + width: 150px; +} + +#tunnelEditPage #targetField label, #tunnelEditPage #accessField label, #tunnelEditPage #tunnelOptionsField label, #tunnelEditPage #optionsField label{ + height: 48px; + width: 150px; +} + +#tunnelEditPage #reachField, #tunnelEditPage #hostField, #tunnelEditPage #depthField, #tunnelEditPage #countField, #tunnelEditPage #optionsHostField { + width: 304px; + margin-right: 4px; +} + +#tunnelEditPage #portField, #tunnelEditPage #optionsPortField, #tunnelEditPage #backupField, #tunnelEditPage #varianceField { + width: 150px; +} + +#tunnelEditPage #reachField label, #tunnelEditPage #hostField label, #tunnelEditPage #portField label, #tunnelEditPage #optionsHostField label, #tunnelEditPage #optionsPortField label, #tunnelEditPage #depthField label, #tunnelEditPage #countField label, #tunnelEditPage #backupField label, #tunnelEditPage #varianceField label { + text-align: left; +} + +#tunnelEditPage #otherField label { + width: 300px; +} + +#tunnelEditPage #reachableByOther, #tunnelEditPage #tunnelDepth, #tunnelEditPage #tunnelQuantity, #tunnelEditPage #targetHost, #tunnelEditPage #clientHost { + width: 306px; +} + +#tunnelEditPage #port { + width: 80px; +} + +#tunnelEditPage #targetPort, #tunnelEditPage #clientPort, #tunnelEditPage #tunnelBackupQuantity, #tunnelEditPage #tunnelVariance { + width: 150px; +} + +#tunnelEditPage #shared, #tunnelEditPage #connectDelay, #tunnelEditPage #startOnLoad { + width: 16px; +} + +#tunnelEditPage label { + width: 150px; + font-weight: bold; + text-align: right; + float: left; +} +/* I2P Tunnel List Page +*/ + +#tunnelListPage .rowItem { + width: 150px; +} + +#tunnelListPage select { + width: 150px; +} + +#tunnelListPage textarea { + width: 100%; + height: 100px; + padding: 4px; + margin: 0 0 3px 0; + background-color: #000088; + color: #fff; + font-family: "Lucida Console", "Andale Mono", "Courier New", Courier, mono; + border: 1px inset #002; +} + +#tunnelListPage .footer .control { + margin-left: 2px; +} + +#tunnelListPage .footer label { + text-align: right; + height: 24px; + width: 360px; + float: left; + margin-top: 6px; + margin-right: 5px; +} +/* Use Leary and Langridge content replacement methods (LIR) +** to embed accessibility information into the document. +** Should allow the lists to be rendered nicely by +** screen readers. (and lynx!) +*/ + +#tunnelListPage label { + height: 0; + width: 0; + overflow: hidden; +} + +#tunnelListPage .nameHeaderField label, #tunnelListPage .portHeaderField label, #tunnelListPage .typeHeaderField label, #tunnelListPage .interfaceHeaderField label, #tunnelListPage .targetHeaderField label, #tunnelListPage .previewHeaderField label, #tunnelListPage .statusHeaderField label { + text-align: left; + width: 150px; + height: 28px; + float: left; +} + +#tunnelListPage .targetField, #tunnelListPage .targetField .text, #tunnelListPage .targetHeaderField, #tunnelListPage .targetHeaderField label { + width: 300px; +} + +#tunnelListPage .descriptionField, #tunnelListPage .destinationField { + width: 750px; +} + +#tunnelListPage .descriptionField .text, #tunnelListPage .destinationField input { + width: 590px; +} + +#tunnelListPage .descriptionField label, #tunnelListPage .destinationField label { + text-align: right; + width: 150px; + height: 24px; + float: left; +} \ No newline at end of file diff --git a/installer/resources/themes/console/dark/images/console_status_running.png b/installer/resources/themes/console/dark/images/console_status_running.png new file mode 100644 index 000000000..6bbc5e37a Binary files /dev/null and b/installer/resources/themes/console/dark/images/console_status_running.png differ diff --git a/installer/resources/themes/console/dark/images/console_status_starting.png b/installer/resources/themes/console/dark/images/console_status_starting.png new file mode 100644 index 000000000..fbff23409 Binary files /dev/null and b/installer/resources/themes/console/dark/images/console_status_starting.png differ diff --git a/installer/resources/themes/console/dark/images/console_status_stopped.png b/installer/resources/themes/console/dark/images/console_status_stopped.png new file mode 100644 index 000000000..0d43eb4ea Binary files /dev/null and b/installer/resources/themes/console/dark/images/console_status_stopped.png differ diff --git a/installer/resources/themes/console/dark/images/darkbluebg.png b/installer/resources/themes/console/dark/images/darkbluebg.png new file mode 100644 index 000000000..32a0972b9 Binary files /dev/null and b/installer/resources/themes/console/dark/images/darkbluebg.png differ diff --git a/installer/resources/themes/console/dark/images/darkbluetile.png b/installer/resources/themes/console/dark/images/darkbluetile.png new file mode 100644 index 000000000..5f7d1a01f Binary files /dev/null and b/installer/resources/themes/console/dark/images/darkbluetile.png differ diff --git a/installer/resources/themes/console/dark/images/darkerbluetile.png b/installer/resources/themes/console/dark/images/darkerbluetile.png new file mode 100644 index 000000000..2e28effaf Binary files /dev/null and b/installer/resources/themes/console/dark/images/darkerbluetile.png differ diff --git a/installer/resources/themes/console/dark/images/errortriangle.png b/installer/resources/themes/console/dark/images/errortriangle.png new file mode 100644 index 000000000..f1730ccbf Binary files /dev/null and b/installer/resources/themes/console/dark/images/errortriangle.png differ diff --git a/installer/resources/themes/console/dark/images/h1bg.png b/installer/resources/themes/console/dark/images/h1bg.png new file mode 100644 index 000000000..dd2ce3388 Binary files /dev/null and b/installer/resources/themes/console/dark/images/h1bg.png differ diff --git a/installer/resources/themes/console/dark/images/help_dark.png b/installer/resources/themes/console/dark/images/help_dark.png new file mode 100644 index 000000000..d61716906 Binary files /dev/null and b/installer/resources/themes/console/dark/images/help_dark.png differ diff --git a/installer/resources/themes/console/dark/images/i2plogo.png b/installer/resources/themes/console/dark/images/i2plogo.png new file mode 100644 index 000000000..52d1fd6c7 Binary files /dev/null and b/installer/resources/themes/console/dark/images/i2plogo.png differ diff --git a/installer/resources/themes/console/dark/images/info_dark.png b/installer/resources/themes/console/dark/images/info_dark.png new file mode 100644 index 000000000..678d2e6ba Binary files /dev/null and b/installer/resources/themes/console/dark/images/info_dark.png differ diff --git a/installer/resources/themes/console/dark/images/lightbluetile.png b/installer/resources/themes/console/dark/images/lightbluetile.png new file mode 100644 index 000000000..f31f7cd8e Binary files /dev/null and b/installer/resources/themes/console/dark/images/lightbluetile.png differ diff --git a/installer/resources/themes/console/dark/images/link.png b/installer/resources/themes/console/dark/images/link.png new file mode 100644 index 000000000..e0eba7969 Binary files /dev/null and b/installer/resources/themes/console/dark/images/link.png differ diff --git a/installer/resources/themes/console/dark/images/link_dark.png b/installer/resources/themes/console/dark/images/link_dark.png new file mode 100644 index 000000000..e33c92544 Binary files /dev/null and b/installer/resources/themes/console/dark/images/link_dark.png differ diff --git a/installer/resources/themes/console/dark/images/tabletitledark.png b/installer/resources/themes/console/dark/images/tabletitledark.png new file mode 100644 index 000000000..2616ec7a6 Binary files /dev/null and b/installer/resources/themes/console/dark/images/tabletitledark.png differ diff --git a/installer/resources/themes/console/dark/images/tabletitlelight.png b/installer/resources/themes/console/dark/images/tabletitlelight.png new file mode 100644 index 000000000..9c9092e73 Binary files /dev/null and b/installer/resources/themes/console/dark/images/tabletitlelight.png differ diff --git a/installer/resources/themes/console/dark/images/titletile.png b/installer/resources/themes/console/dark/images/titletile.png new file mode 100644 index 000000000..945acc5b9 Binary files /dev/null and b/installer/resources/themes/console/dark/images/titletile.png differ diff --git a/installer/resources/themes/console/dark/images/warning_dark.png b/installer/resources/themes/console/dark/images/warning_dark.png new file mode 100644 index 000000000..198786c50 Binary files /dev/null and b/installer/resources/themes/console/dark/images/warning_dark.png differ diff --git a/apps/routerconsole/jsp/default.css b/installer/resources/themes/console/defCon1/console.css similarity index 67% rename from apps/routerconsole/jsp/default.css rename to installer/resources/themes/console/defCon1/console.css index 527a7c9be..99077d1e0 100644 --- a/apps/routerconsole/jsp/default.css +++ b/installer/resources/themes/console/defCon1/console.css @@ -5,6 +5,7 @@ body { text-align: center; background-color: white; color: black; + font-size: 100%; } .hide { @@ -15,6 +16,11 @@ img { border: none; } +pre { + width: 100%; + overflow-x: scroll; +} + div.logo { float: left; width: 200px; @@ -30,25 +36,27 @@ div.toolbar { font-weight: bold; } -div.routersummary { - /* width: 8em; */ - /* height: 5em; */ - /* position: fixed; */ +div.routersummaryouter { float: left; - width: 200px; - /* left: 1em; */ - /* top: 1em; */ - margin: 0em; - padding: .5em; - text-align: left; - border: medium solid #efefff; - background-color: #fafaff; - color: inherit; - font-size: small; + width: 215px; + margin: 0; + padding: 0; + border: 0; clear: left; /* fixes a bug in Opera */ overflow: auto; } +div.routersummary { + background-color: #fafaff; + width: 195px; + color: inherit; + margin: 0em; + padding: 5px; + text-align: left; + border: medium solid #efefff; + font-size: 0.82em; +} + div.warning { margin: 0em 1em 1em 224px; padding: .5em 1em; @@ -67,6 +75,10 @@ div.main { color: inherit; } +div.main textarea { + width: 100% !important; +} + div.news { margin: 0em 1em 1em 224px; padding: .5em 1em; @@ -75,3 +87,26 @@ div.news { text-align: left; color: inherit; } + +div.confignav { + padding: 1em; + background-color: #efefff; +} + +div.configure { + padding: 1em; + background-color: #ffffc0; +} + +div.messages { + padding: 1em; + background-color: #fafaff; +} + +div.messages span.error { + color: #d00000; +} + +div.messages span.notice { + font-style: italic; +} diff --git a/installer/resources/themes/console/images/client.png b/installer/resources/themes/console/images/client.png new file mode 100644 index 000000000..d040bd022 Binary files /dev/null and b/installer/resources/themes/console/images/client.png differ diff --git a/installer/resources/themes/console/images/errortriangle.png b/installer/resources/themes/console/images/errortriangle.png new file mode 100644 index 000000000..f1730ccbf Binary files /dev/null and b/installer/resources/themes/console/images/errortriangle.png differ diff --git a/apps/routerconsole/jsp/favicon.ico b/installer/resources/themes/console/images/favicon.ico similarity index 100% rename from apps/routerconsole/jsp/favicon.ico rename to installer/resources/themes/console/images/favicon.ico diff --git a/installer/resources/themes/console/images/greentile.png b/installer/resources/themes/console/images/greentile.png new file mode 100644 index 000000000..64889014d Binary files /dev/null and b/installer/resources/themes/console/images/greentile.png differ diff --git a/installer/resources/themes/console/images/i2plogo.png b/installer/resources/themes/console/images/i2plogo.png new file mode 100644 index 000000000..52d1fd6c7 Binary files /dev/null and b/installer/resources/themes/console/images/i2plogo.png differ diff --git a/installer/resources/themes/console/images/i2psnark.png b/installer/resources/themes/console/images/i2psnark.png new file mode 100644 index 000000000..63fddb107 Binary files /dev/null and b/installer/resources/themes/console/images/i2psnark.png differ diff --git a/installer/resources/themes/console/images/inbound.png b/installer/resources/themes/console/images/inbound.png new file mode 100644 index 000000000..df0083f93 Binary files /dev/null and b/installer/resources/themes/console/images/inbound.png differ diff --git a/installer/resources/themes/console/images/local_down.png b/installer/resources/themes/console/images/local_down.png new file mode 100644 index 000000000..14c7d4b92 Binary files /dev/null and b/installer/resources/themes/console/images/local_down.png differ diff --git a/installer/resources/themes/console/images/local_inprogress.png b/installer/resources/themes/console/images/local_inprogress.png new file mode 100644 index 000000000..d8fcfe44e Binary files /dev/null and b/installer/resources/themes/console/images/local_inprogress.png differ diff --git a/installer/resources/themes/console/images/local_up.png b/installer/resources/themes/console/images/local_up.png new file mode 100644 index 000000000..1b70292fe Binary files /dev/null and b/installer/resources/themes/console/images/local_up.png differ diff --git a/installer/resources/themes/console/images/olivegreentile.png b/installer/resources/themes/console/images/olivegreentile.png new file mode 100644 index 000000000..e63010c9d Binary files /dev/null and b/installer/resources/themes/console/images/olivegreentile.png differ diff --git a/installer/resources/themes/console/images/orangetile.png b/installer/resources/themes/console/images/orangetile.png new file mode 100644 index 000000000..c8c32e4bb Binary files /dev/null and b/installer/resources/themes/console/images/orangetile.png differ diff --git a/installer/resources/themes/console/images/orangetilealt.png b/installer/resources/themes/console/images/orangetilealt.png new file mode 100644 index 000000000..be2a04d4d Binary files /dev/null and b/installer/resources/themes/console/images/orangetilealt.png differ diff --git a/installer/resources/themes/console/images/outbound.png b/installer/resources/themes/console/images/outbound.png new file mode 100644 index 000000000..a3e8722f0 Binary files /dev/null and b/installer/resources/themes/console/images/outbound.png differ diff --git a/installer/resources/themes/console/images/redtile.png b/installer/resources/themes/console/images/redtile.png new file mode 100644 index 000000000..2bae9121f Binary files /dev/null and b/installer/resources/themes/console/images/redtile.png differ diff --git a/installer/resources/themes/console/images/server.png b/installer/resources/themes/console/images/server.png new file mode 100644 index 000000000..720a237c7 Binary files /dev/null and b/installer/resources/themes/console/images/server.png differ diff --git a/installer/resources/themes/console/images/tabletitleorange.png b/installer/resources/themes/console/images/tabletitleorange.png new file mode 100644 index 000000000..ca9c1d0e6 Binary files /dev/null and b/installer/resources/themes/console/images/tabletitleorange.png differ diff --git a/installer/resources/themes/console/images/yellowtile.png b/installer/resources/themes/console/images/yellowtile.png new file mode 100644 index 000000000..4deb26684 Binary files /dev/null and b/installer/resources/themes/console/images/yellowtile.png differ diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css new file mode 100644 index 000000000..be4f6a3d6 --- /dev/null +++ b/installer/resources/themes/console/light/console.css @@ -0,0 +1,846 @@ +/* Not yet complete. Subject to flux and change. dr|z3d - 07.25.09 */ + +body { + margin: 25px 10px 0 5px; + padding: 0em; + text-align: center; + background: #eef; + color: #000; + font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; +} + +.hide { + display: none; +} + +img { + border: none; +} + +pre { + width: 98%; + overflow: auto; + text-align: left; + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #333; +} + +div.logo { + float: left; + padding: 10px; + text-align: center; + font-color: #fff; + margin: 0 20px 0 20px; + border: 1px solid #002; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + background: #ddddff url('images/lightbluetile.png'); + width: 175px; + -moz-box-shadow: inset 0px 0px 1px 0px #002; +} + +div.toolbar { + margin: 0; + padding: 10px; + font-weight: bold; + background: #eef; + border: 1px solid #002; + display: none !important; +} + +div.toolbar a:link { + border: 1px outset #ddddc0; + padding: 0px 5px 1px 5px; + line-height: 250%; + background: #bbf; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + display: none !important; +} + +div.toolbar a:visited { + background: #ddf; +} + +div.toolbar a:hover{ + border: 1px solid #eeeeff; + background: #003; + color: #f60; +} + +a:active{ + color: #900; +} + +div.routersummaryouter { + float: left; + width: 215px; + margin: 0 0 10px 20px; + padding: 0; + border: 0; + clear: left;/* fixes a bug in Opera */ + text-align: center !important; + display: block; +} + +div.routersummary { +/* margin: 0px 20px 20px 0px; */ + width: 175px; + padding: 10px; + text-align: center !important; + border: 1px solid #000033; + background: #ddf url('images/lightbluetile.png'); + color: #000; + font-size: 8pt; + clear: left;/* fixes a bug in Opera */ + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +/* + float: left; +*/ + -moz-box-shadow: inset 0px 0px 1px 0px #002; +} + +div.routersummary input[type=text] { + text-align: right !important; +} + +div.routersummary hr { + color: #eef; + background: #eef; + height: 2px; + border-bottom: 1px solid #eef; + margin: 8px -10px 7px -10px; + -moz-box-shadow: inset 0px 1px 1px 1px #001; +} + +div.routersummary h3 { + border: 0px solid #f00; +/* border-bottom: 1px solid #99f !important;*/ + font-size: 10pt; + letter-spacing: 0.05em; + margin: -7px -9px -7px -9px; + padding: 5px 0px 5px 0px; + background: #c5d5fb; + text-transform: uppercase; +} + +div.routersummary h4 { + border: 0px solid #f00; + border-bottom: 0 !important; + font-size: 9pt; + letter-spacing: 0.05em; + margin: -7px -9px -7px -9px !important; + padding: 2px 3px 3px 3px; + background: #c1d1f7; + text-transform: capitalize; + text-decoration: none !important; + color: #2b2; +} + +div.routersummary table { + border: 0; + text-align: center !important; + margin: -5px -5px; + width: 185px !important; + overflow: hidden; + font-size: 8pt; + padding: 0px -10px; + background-image: none !important; + background-color: transparent !important; +} + +div.routersummary tr { + background-image: none !important; + background-color: transparent !important; + border: 0 !important; +} + +div.routersummary form { + margin-top: 8px; +} + +div.routersummary p { + padding: 0; +} + +div.routersummary a:link, div.routersummary a:visited { + text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.3); +} + +div.routersummary a:hover { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.routersummary td { + padding: 2px 4px; + background-image: none !important; + border: 0 !important; +} + + +div.routersummary tr:nth-child(even) { + background-color: #f60; + background-image: none !important; +} + +div.routersummarytr:nth-child(odd) { + background-color: #f00; + background-image: none !important; +} + +div.warning { + margin: 5px 20px 10px 240px; + padding: 0px 25px 20px 75px; + background: #fff; + border: 1px solid #002; + text-align: left; + color: inherit; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + text-align: justify; + background-image:url("images/errortriangle.png"); + background-position:15px center; + background-repeat:no-repeat; + -moz-box-shadow: inset 0px 0px 1px 0px #d00; + word-wrap: break-word; +} + +div.main { + margin: 0px 0px 20px 220px; + padding: 0 15px 15px 25px; + background: #eef; + text-align: left; + color: #001; + width: auto; + min-width: 500px; +} + +div.main hr, hr { + color: #003; + background: #003; + height: 1px; + border: 0px solid #003; + margin: 10px 0; +} + +div.main textarea { + background: #eef; + color: #001; + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + +div.news { + margin: 0px 15px 20px 245px; + padding: 20px 30px 20px 30px; + border: 1px solid #003; + color: #410; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + text-align: justify !important; + line-height: 140%; + background: #fea url('images/sandtile.png'); + -moz-box-shadow: inset 0px 0px 1px 0px #410; +} + +div.news a:link{ + color: #630; + text-decoration: none; +} + +div.news a:visited{ + color: #830; +} + +div.news a:hover{ + color: #a30; + text-decoration: underline; +} + +div.news a:active{ + color: #c30; +} + +div.news hr{ + color: #410; + background: #410; + height: 1px; + border: 0px solid #410; + margin: 10px 0; +} + +div.news li { + text-align: justify; + list-style: none; + margin: 0 0 20px 0 !important; + padding: 5px 0; + vertical-align: bottom; + border: 1px solid #410; + border-left: 5px solid #410; + padding: 3px 5px 3px 5px; + border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + -khtml-border-radius: 0 4px 4px 0; + background: #fb1; + font-size: 10pt; + opacity: 0.8; +} + +div.news h4 { + border-bottom: 0px; + padding: 0; + margin: 0 0 -10px 0; + font-size: 11pt; +} + +div.confignav { + padding: 15px 10px !important; + margin: 0 0 25px 0; + background: #ddf url('images/lightbluetile.png'); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #000022; + font-size: 10pt !important; + font-weight: bold !important; + line-height: 160% !important; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + min-width: 400px; +} + +div.configure { + padding: 0 15px 15px 15px !important; + margin: 10px 0px 25px 0; + background: #ddf url('images/lightbluetile.png'); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #000022; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + min-width: 400px; +} + +div.graphspanel { + padding: 12px; + margin: 10px 0px 25px 0; + background: #ddf url('images/lightbluetile.png'); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #000022; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + text-align: center !important; +} + +div.graphspanel img { + border: 1px solid #003; + padding: 2px; + margin: 6px; + text-align: center !important; + background: #001; + -moz-box-shadow: inset 0px 0px 1px 1px #99f; + opacity: 0.8; +} + +div.graphspanel img:hover { + border: 1px solid #003; + padding: 2px; + margin: 6px; + text-align: center !important; + background: #001; + -moz-box-shadow: inset 0px 0px 2px 1px #f60; + opacity: 1; +} + +div.graphspanel form { + text-align: left; +} + +div.messages { + padding: 10px; + margin: 10px 0 20px 0; + background: #ddf; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #000033; + background: #008 url('images/lightbluetile.png'); + font-weight: bold; + -moz-box-shadow: inset 0px 0px 1px 0px #002; +} + +div.messages span.error { + color: #d00000; +} + +div.messages span.notice { + font-style: italic; +} + +div.messages li { + text-align: justify !important; + font-weight: bold; + list-style: url(images/warning.png) !important; + margin: 0 10px 0 35px !important; + padding: 5px 10px !important; + border: 0px !important; +} + +table { + border-collapse: collapse; + width: 100%; + border: 1px solid #000022; + margin: 5px 0px 5px 0px; + cell-padding: 1px; + font-size: 7pt; + background: #b4c8ff url('images/tabletitlelight.png') repeat-x; + font: 7pt/130% "Lucida Sans Unicode", Verdana, Bitstream Vera Sans", Tahoma, Helvetica, sans-serif; +} + +table hr { + padding: 0px 0; + color: #99f; + background: #99f; + border: 0px solid #99f; + margin: 0px 0px; + height: 1px; + display: none; +} + +th { + padding: 6px 2px; + color: #000; + background: #b4c8ff url('images/tabletitlelight.png') repeat-x; + text-align: center; + font-size: 9pt; + line-height: 110%; + border-bottom: 1px solid #001 !important; + border-top: 1px solid #001 !important; +} + +tr { + vertical-align: middle !important; + align: center; +} + +tr:nth-child(even) { + background: #99f url('images/tabletile.png') !important; +} + +tr:nth-child(odd) { + background: #bbf url('images/tabletile_alt.png') !important; +} +/* +tr:last-child { + background: #bbf url('images/tabletilelighter.png') !important; + font-weight: bold; + border: 1px solid #002 !important; +} +*/ +td { + padding: 5px 3px; + color: #000; + vertical-align: middle; + border-top: 1px inset #001; + border-bottom: 1px outset #99f; +} + +tt { + font: bold 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #008000; + padding: 1px 5px; +} + +div.main li { + text-align: left; + list-style: square; + margin: 2px 5px 0px 20px; + padding: 1px 20px 1px 10px; + line-height: 150%; + word-wrap: break-word; +} + +.tidylist { + text-align: justify !important; +} + +ol { + + margin: 1px 0 0 5px; + padding: 1px 0 0 20px; +} + +ul { + display: inline; + margin: 5px 0; + padding: 0; +} + +code { + text-align: left; + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + +a:link{ + color: #007; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #606; + text-decoration: none; + font-weight: bold; +} + +a:hover{ + color: #f60; + text-decoration: underline; + font-weight: bold; +} + +a:active{ + color: #f93; + text-decoration: underline; + font-weight: bold; +} + +.links { + list-style: url(images/link.png); + margin: 10px 5px 0 0px; + padding: 10px 20px 10px 30px; +} + +p { + text-align: justify; + line-height: 160%; +} + +h1 { + text-align: left; + color: #002; + padding: 10px 15px; + margin: 0 15px 25px 245px; + font: normal bold 16pt/120% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + letter-spacing: 0.15em; + text-transform: uppercase; + text-shadow: 0px 0px 1px rgba(0, 0, 148, 0.9); + -moz-box-shadow: inset 0px 0px 1px 0px #002; + white-space: normal; + background: #ddddff url('images/lightbluetile.png'); + border: 1px solid #002; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; +} + +h2 { + font-size: 12pt; + color: #001; + letter-spacing: 0.05em; + background: #ddf url('images/titletile.png'); + text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5); + padding: 7px 10px; + wordwrap: none; + border: 1px solid #002; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + margin: 25px 0 20px 0 !important; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + word-wrap: break-word; +} + +h2 a:hover { + text-shadow: 0px 0px 1px rgba(255, 255, 72, 0.9); + border-bottom: 1px #ff6600; + border-bottom-style: solid; + border-bottom-color: #002; + padding-bottom: 5px; +} + +h3 { + border: 1px solid #002; + border-left: 5px solid #002; + padding: 3px 5px 3px 5px; + margin: 20px 0 15px 0; + border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + -khtml-border-radius: 0 4px 4px 0; + background: #eef; +} + +h4 { + border-bottom: 1px; + border-bottom-style: solid; + border-bottom-color: #001; + padding: 0 0 10px 0; + margin: 5px 0 10px 0; + font-size: 11pt; +} + +button, button:visited { + font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px outset #999; + padding: 1px 3px; + background: #ddf !important; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font-size: 8pt; + font-weight: bold; + margin: 0 1px; + text-align: center; + min-width: 80px; + -moz-box-shadow: inset 0px 2px 8px 0px #fff; + color: #006; +} + +button:hover{ + border: 1px solid #f60; + background: #f60 !important; + color: #fff; + -moz-box-shadow: inset 0px 0px 0px 1px #fff; +} + +button:active{ + border: 1px solid #f60; + background: #001 !important; + color: #f60; + -moz-box-shadow: inset 0px 0px 0px 1px #f60; +} + +.underline { + border-bottom: 1px solid #000022; + padding: 5px 0px 5px 0px; + margin: 0px 0px 10px 0px; +} + +.langbox { + margin: 4px 2px 4px 5px; + padding: 5px 5px; + color: #001; + font-size: 7pt; + width: 120px; + text-align: center; + float: right; + valign: middle; +} + +input { + background: #eef; + color: #001; + margin: 5px 10px 5px 10px; + padding: 4px 2px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px solid #001; + text-decoration: none; + min-width: 110px; +} + +input, input:visited { + border: 1px outset #999; + background: #ddf; + color: #001; + margin: 5px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + padding: 1px 2px; + text-decoration: none; + min-width: 110px; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + -moz-box-shadow: inset 0px 2px 8px 0px #fff; + color: #006; + opacity: 0.9; +} + + +input:hover { + background: #f60; + color: #fff; + border: 1px solid #f60; + opacity: 1.0; + -moz-box-shadow: inset 0px 0px 0px 1px #fff; + +} + +input:active { + background: #002; + color: #f60; + border: 1px solid #f60; + opacity: 1.0; + -moz-box-shadow: inset 0px 0px 0px 1px #f60; +} + +input[type=text] { + background: #eef; + color: #001; + margin: 5px 10px 5px 10px; + padding: 4px 2px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px solid #001; + text-decoration: none; +} + +submit { + background: #f00; + color: #eef; + margin: 10px 2px 10px 0; + padding: 2px; + font-family: "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + font-weight: bold; + border: 1px solid #001; + text-decoration: none; +} + +input checkbox { + border: 0 !important; +} + +select { + background: #eef; + color: #003; + margin: 5px 10px 5px 10px; + padding: 4px; + border: 1px solid #001; + min-width: 110px; + font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + text-align: left !important; +} + +textarea { + padding: 5px; + margin: 5px 15px 5px 10px; + background: #eef; + color: #003; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + min-height: 100px; + min-width: 97%; + border: 1px solid #001; +} + +form {} + +.proxyfooter { + margin: 0 20px 10px 240px; + padding: 20px 25px 20px 75px; + font-color: #f00; + font-size: 7pt; + text-align: right !important; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border: 1px solid #001; + display: none; +} + +.statusnotes { + font-style: italic; + font-size: 8pt; + font-color: #001 !important; + text-align: center; + border: 1px solid #001 !important; + border-top: 0 !important; + margin: -5px 0 5px 0; + padding: 7px; + background: #bcf; + -moz-box-shadow: inset 0px 0px 2px 1px #eef; +} + +.joblog { + margin: 25px 0 25px 0; + padding: 20px 40px 20px 40px !important; + border: 1px solid #003; + background-color: #004; + background: #ddf url('images/lightbluetile.png'); + color: #001; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + text-align: justify; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + overflow: auto; + } + + div.joblog:li { + word-wrap: break-word !important; +} + + .joblog:ul { + word-wrap: break-word !important; +} + +.smallhead { + font-size: 7pt +} + +.mediumtags { + font-size: 8pt; + font-style: italic; + font-weight: bold; +} + +.optbox { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; +} + +.optbox:hover { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; +} + +.cells { + border-left: 1px outset #bbf; + border-top: 1px inset #99f !important; + border-bottom: 1px inset #99f !important; +} + +.tablefooter { + background: #b4c8ff url('images/tabletitlelight.png') repeat-x; +} + +.tablefooter tr, .tablefooter td { + background: #b4c8ff url('images/tabletitlelight.png') repeat-x; + border-top: 1px solid #001; + border-bottom: 1px solid #001 !important; + padding: 8px 2px !important; + font-size: 7pt; + line-height: 110%; +} + +.formaction { + text-align: right; +} \ No newline at end of file diff --git a/installer/resources/themes/console/light/default.css b/installer/resources/themes/console/light/default.css new file mode 100644 index 000000000..f8a27deed --- /dev/null +++ b/installer/resources/themes/console/light/default.css @@ -0,0 +1,373 @@ +body { + margin: 0px; + padding: 0px; + text-align: center; + font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif; + background-color: #eef; + color: #001; + font-size: 10pt; +/* we've avoided Tantek Hacks so far, + ** but we can't avoid using the non-w3c method of + ** box rendering. (and therefore one of mozilla's + ** proprietry -moz properties (which hopefully they'll + ** drop soon). + */ + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +div { + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +label { + margin: 0px 4px; + padding: 1px 10px 2px 0px; + float: left; + width: 120px; + height: 24px; + font-weight: normal; + text-align: right; + font-size: 8pt; + font-style: italic; + -moz-box-sizing: border-box; + box-sizing: border-box; + line-height: 120%; + color: #427; +} + +h4 { + font-size: 14px; + font-weight: bold !important; + color: #001; + text-align: center; + border: 1px solid #225; + margin: 5px 0 15px 0; + padding: 5px 10px; + background: #b4c8ff url(images/tabletitlelight.png) repeat-x; + text-transform: uppercase; + text-shadow: 0px 0px 2px rgba(64, 64, 255, 0.9); + letter-spacing: 0.08em; + -moz-box-shadow: inset 0px 0px 4px 0px #bbf; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} + +a { + text-decoration: none; +} + +form { + margin: 0px; +} + +textarea, input, select, button, a { + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: 9pt; + float: left; + vertical-align: middle; +} + +button { + float: none; + text-decoration: none; +} + +textarea { + border: 1px solid #9999ff; +} + +br { + clear: left; +} + +div.statusNotRunning { + float: left; + width: 68px; + height: 24px; + overflow: hidden; + color: #d00; + background: url('images/console_status_stopped.png') 0 0 no-repeat; + padding-top: 24px; + margin-top: 4px; +} + +div.statusRunning { + float: left; + width: 68px; + height: 24px; + overflow: hidden; + color: #0b0; + background: url('images/console_status_running.png') 0 0 no-repeat; + padding-top: 24px; + margin-top: 4px; +} + +div.statusStarting { + float: left; + width: 68px; + height: 24px; + overflow: hidden; + color: #339933; + background: url('images/console_status_starting.png') 0 0 no-repeat; + padding-top: 24px; + margin-top: 4px; +} + +hr { + display: none; +} + +.separator, .subdivider { + clear: both; + height: 1px; + margin: 1px 0px 1px 0px; + border-bottom: 1px solid #225; +/* + display: none; +*/ +} + +.subdivider { + border-bottom: 1px solid #225; + padding: 5px 0px 0px 0px; +} + +.freetext { + width: 150px; + height: 24px; + border: 1px solid #44d; + padding: 2px; + margin: 4px 0 2px 0px; + font: 10pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + font-weight: bold; + background: #ddf; + color: #001; + -moz-border-radius: 0 4px 4px 0; + -khtml-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +/* + -moz-box-shadow: inset 0px -1px 1px 0px #fff; +*/ +} + +.control, control:link, control:visited { + margin: 4px 0 0 4px !important; + padding: 2px; + overflow: hidden; + min-width: 60px; + font-weight: bold; + background-color: #bbbbff; + color: #001; + border: 1px outset #ddddc0; + text-align: center; + white-space: nowrap; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + margin-top: 8px; + text-decoration: none; +} + +/* +.control:active { + border: 1px inset; + background-color: #003; + color: #f60; + text-decoration: none; +} +*/ +.control:hover, control:visited:hover { + border: 1px solid #eef; + background-color: #f60; + color: #fff !important; + text-decoration: none; +} + +.control:link, control:visited { + margin: 4px 0 0 4px !important; + padding: 2px; + overflow: hidden; + min-width: 60px; + font-weight: bold; + color: #001; + border: 1px outset #ddddc0; + text-align: center; + white-space: nowrap; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + margin-top: 8px; + background: #bbf url(images/tabletitlelight.png) 0 0 repeat: x !important; + text-decoration: none; +} + +.panel { + width: 800px; + margin: 16px auto 16px auto; + overflow: hidden; + text-align: left !important; + font-size: 7pt; + background-color: #fff; + background: url(images/lightbluetile.png); + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #002; + padding: 10px 20px; + -moz-box-shadow: inset 0px 0px 1px 0px #002; +} + +.panel .footer { + float: right; + padding: 4px; +} + +.toolbox { + float: right; +} + +.rowItem { + width: 750px; + float: left; + margin: 0px; +} + +.comment { + font-weight: bold; + display: block; + padding: 2px 10px 0 20px; + text-align: left; +} + +.text { + height: 24px; + width: 150px; + padding: 0 0 0 2px; + float: left; + margin: 0; + font-size: 9pt !important; + font-weight: bold; +} + +.accessKey { + text-decoration: underline; +} + +#globalOperationsPanel { + background-color: #ddf; + border: 1px solid #003; + padding: 5px 20px 11px 10px; + background: url(images/lightbluetile.png); + -moz-box-shadow: inset 0px 0px 0px 1px #f00; +} + +#globalOperationsPanel .control { + min-width: 120px; +} + +#globalOperationsPanel .control:link { + min-width: 120px; +} + + +globalOperationsPanel .control:link { + min-width: 120px; + margin: 4px 0 0 4px !important; + padding: 2px; + overflow: hidden; + font-weight: bold; + background-color: #bbbbff; + color: black; + border: 1px outset #ddddc0; + text-align: center; + white-space: nowrap; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + margin-top: 8px; + background: url(images/tabletitlelight.png) 0 0 repeat: x !important; +} + + +globalOperationsPanel .control:visited { + min-width: 120px; + margin: 4px 0 0 4px !important; + padding: 2px; + overflow: hidden; + font-weight: bold; + background-color: #bbbbff; + color: black; + border: 1px outset #ddddc0; + text-align: center; + white-space: nowrap; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + margin-top: 8px; + background: url(images/tabletitlelight.png) 0 0 repeat: x !important; +} + +globalOperationsPanel .control:hover { + min-width: 120px; + margin: 4px 0 0 4px !important; + padding: 2px; + overflow: hidden; + font-weight: bold; + background-color: #003; + color: #f60; + border: 1px outset #fff; + text-align: center; + white-space: nowrap; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + margin-top: 8px; + background: url(images/tabletitlelight.png) 0 0 repeat: x !important; +} +.header { + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} + +select { + background-color: #eef; + color: #001; + margin: 4px; + font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; + font-weight: bold; + border: 1px solid #001; + padding: 2px; + min-width: 270px; + font-size: 8pt; + max-height: 24px; +} + +a:link{ + color: #007; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #606; + text-decoration: none; + font-weight: bold; +} + +a:hover{ + color: #f60; + text-decoration: underline; + font-weight: bold; +} + +a:active{ + color: #f93; + text-decoration: underline; + font-weight: bold; +} \ No newline at end of file diff --git a/installer/resources/themes/console/light/i2ptunnel.css b/installer/resources/themes/console/light/i2ptunnel.css new file mode 100644 index 000000000..d091a0e9b --- /dev/null +++ b/installer/resources/themes/console/light/i2ptunnel.css @@ -0,0 +1,145 @@ +/* I2P Tunnel Edit Page +*/ + +#tunnelEditPage input { + width: 560px; +} + +#tunnelEditPage select { + width: 300px; +} + +#tunnelEditPage option [ selected ] { + color: green; +} + +#tunnelEditPage #targetField, #tunnelEditPage #accessField, #tunnelEditPage #optionsField { + height: 48px; + width: 150px; +} + +#tunnelEditPage #tunnelOptionsField { + height: 96px; + width: 150px; +} + +#tunnelEditPage #targetField label, #tunnelEditPage #accessField label, #tunnelEditPage #tunnelOptionsField label, #tunnelEditPage #optionsField label{ + height: 48px; + width: 150px; +} + +#tunnelEditPage #reachField, #tunnelEditPage #hostField, #tunnelEditPage #depthField, #tunnelEditPage #countField, #tunnelEditPage #optionsHostField { + width: 304px; + margin-right: 4px; +} + +#tunnelEditPage #portField, #tunnelEditPage #optionsPortField, #tunnelEditPage #backupField, #tunnelEditPage #varianceField { + width: 150px; +} + +#tunnelEditPage #reachField label, #tunnelEditPage #hostField label, #tunnelEditPage #portField label, #tunnelEditPage #optionsHostField label, #tunnelEditPage #optionsPortField label, #tunnelEditPage #depthField label, #tunnelEditPage #countField label, #tunnelEditPage #backupField label, #tunnelEditPage #varianceField label { + text-align: left; +} + +#tunnelEditPage #otherField label { + width: 300px; +} + +#tunnelEditPage #reachableByOther, #tunnelEditPage #tunnelDepth, #tunnelEditPage #tunnelQuantity, #tunnelEditPage #targetHost, #tunnelEditPage #clientHost { + width: 300px; +} + +#tunnelEditPage #port { + width: 80px; +} + +#tunnelEditPage #targetPort, #tunnelEditPage #clientPort, #tunnelEditPage #tunnelBackupQuantity, #tunnelEditPage #tunnelVariance { + width: 150px; +} + +#tunnelEditPage #shared, #tunnelEditPage #connectDelay, #tunnelEditPage #startOnLoad { + width: 16px; +} + +#tunnelEditPage label { + width: 150px; + font-weight: bold; + text-align: right; + float: left; +} +/* I2P Tunnel List Page +*/ + +#tunnelListPage .rowItem { + width: 150px; +} + +#tunnelListPage select { + min-width: 120px; +} + +#tunnelListPage textarea { + width: 100%; + height: 100px; + padding: 4px; + margin: 2px 0 3px 0; + background-color: #005; + color: #030; + font-family: "Lucida Console", "DejaVu Sans Mono", "Andale Mono", "Courier New", Courier, mono; + border: 1px inset #002; + font-size: 9pt !important; + font-weight: bold; + text-align: justify !important; + background: #ddf url(images/tabletile.png); +} + +#tunnelListPage .footer .control { + margin-left: 2px; +} + +#tunnelListPage .footer label { + text-align: right; + height: 24px; + width: 360px; + float: left; + margin-top: 6px; + margin-right: 5px; +} +/* Use Leary and Langridge content replacement methods (LIR) +** to embed accessibility information into the document. +** Should allow the lists to be rendered nicely by +** screen readers. (and lynx!) +*/ + +#tunnelListPage label { + height: 0; + width: 0; + overflow: hidden; +} + +#tunnelListPage .nameHeaderField label, #tunnelListPage .portHeaderField label, #tunnelListPage .typeHeaderField label, #tunnelListPage .interfaceHeaderField label, #tunnelListPage .targetHeaderField label, #tunnelListPage .previewHeaderField label, #tunnelListPage .statusHeaderField label { + text-align: left; + width: 150px; + height: 28px; + float: left; + padding-top: 4px; +} + +#tunnelListPage .targetField, #tunnelListPage .targetField .text, #tunnelListPage .targetHeaderField, #tunnelListPage .targetHeaderField label { + width: 300px; +} + +#tunnelListPage .descriptionField, #tunnelListPage .destinationField { + width: 800px; +} + +#tunnelListPage .descriptionField .text, #tunnelListPage .destinationField input { + width: 580px; +} + +#tunnelListPage .descriptionField label, #tunnelListPage .destinationField label { + text-align: right; + width: 150px; + height: 28px; + float: left; +} \ No newline at end of file diff --git a/installer/resources/themes/console/light/images/console_status_running.png b/installer/resources/themes/console/light/images/console_status_running.png new file mode 100644 index 000000000..6bbc5e37a Binary files /dev/null and b/installer/resources/themes/console/light/images/console_status_running.png differ diff --git a/installer/resources/themes/console/light/images/console_status_starting.png b/installer/resources/themes/console/light/images/console_status_starting.png new file mode 100644 index 000000000..fbff23409 Binary files /dev/null and b/installer/resources/themes/console/light/images/console_status_starting.png differ diff --git a/installer/resources/themes/console/light/images/console_status_stopped.png b/installer/resources/themes/console/light/images/console_status_stopped.png new file mode 100644 index 000000000..0d43eb4ea Binary files /dev/null and b/installer/resources/themes/console/light/images/console_status_stopped.png differ diff --git a/installer/resources/themes/console/light/images/darkbluetile.png b/installer/resources/themes/console/light/images/darkbluetile.png new file mode 100644 index 000000000..89df70b96 Binary files /dev/null and b/installer/resources/themes/console/light/images/darkbluetile.png differ diff --git a/installer/resources/themes/console/light/images/darkerbluetile.png b/installer/resources/themes/console/light/images/darkerbluetile.png new file mode 100644 index 000000000..854d46f40 Binary files /dev/null and b/installer/resources/themes/console/light/images/darkerbluetile.png differ diff --git a/installer/resources/themes/console/light/images/errortriangle.png b/installer/resources/themes/console/light/images/errortriangle.png new file mode 100644 index 000000000..f1730ccbf Binary files /dev/null and b/installer/resources/themes/console/light/images/errortriangle.png differ diff --git a/installer/resources/themes/console/light/images/help.png b/installer/resources/themes/console/light/images/help.png new file mode 100644 index 000000000..4c5136f45 Binary files /dev/null and b/installer/resources/themes/console/light/images/help.png differ diff --git a/installer/resources/themes/console/light/images/i2plogo.png b/installer/resources/themes/console/light/images/i2plogo.png new file mode 100644 index 000000000..52d1fd6c7 Binary files /dev/null and b/installer/resources/themes/console/light/images/i2plogo.png differ diff --git a/installer/resources/themes/console/light/images/info.png b/installer/resources/themes/console/light/images/info.png new file mode 100644 index 000000000..13f25a9ae Binary files /dev/null and b/installer/resources/themes/console/light/images/info.png differ diff --git a/installer/resources/themes/console/light/images/lightbluetile.png b/installer/resources/themes/console/light/images/lightbluetile.png new file mode 100644 index 000000000..53f9d54de Binary files /dev/null and b/installer/resources/themes/console/light/images/lightbluetile.png differ diff --git a/installer/resources/themes/console/light/images/link.png b/installer/resources/themes/console/light/images/link.png new file mode 100644 index 000000000..e0eba7969 Binary files /dev/null and b/installer/resources/themes/console/light/images/link.png differ diff --git a/installer/resources/themes/console/light/images/sandtile.png b/installer/resources/themes/console/light/images/sandtile.png new file mode 100644 index 000000000..4d88cb847 Binary files /dev/null and b/installer/resources/themes/console/light/images/sandtile.png differ diff --git a/installer/resources/themes/console/light/images/tabletile.png b/installer/resources/themes/console/light/images/tabletile.png new file mode 100644 index 000000000..f34c06324 Binary files /dev/null and b/installer/resources/themes/console/light/images/tabletile.png differ diff --git a/installer/resources/themes/console/light/images/tabletile_alt.png b/installer/resources/themes/console/light/images/tabletile_alt.png new file mode 100644 index 000000000..ea691b8e2 Binary files /dev/null and b/installer/resources/themes/console/light/images/tabletile_alt.png differ diff --git a/installer/resources/themes/console/light/images/tabletilelighter.png b/installer/resources/themes/console/light/images/tabletilelighter.png new file mode 100644 index 000000000..5586bb063 Binary files /dev/null and b/installer/resources/themes/console/light/images/tabletilelighter.png differ diff --git a/installer/resources/themes/console/light/images/tabletitlelight.png b/installer/resources/themes/console/light/images/tabletitlelight.png new file mode 100644 index 000000000..9c9092e73 Binary files /dev/null and b/installer/resources/themes/console/light/images/tabletitlelight.png differ diff --git a/installer/resources/themes/console/light/images/titletile.png b/installer/resources/themes/console/light/images/titletile.png new file mode 100644 index 000000000..beb9552ba Binary files /dev/null and b/installer/resources/themes/console/light/images/titletile.png differ diff --git a/installer/resources/themes/console/light/images/warning.png b/installer/resources/themes/console/light/images/warning.png new file mode 100644 index 000000000..c2b7e8c09 Binary files /dev/null and b/installer/resources/themes/console/light/images/warning.png differ diff --git a/installer/resources/themes/console/snark.css b/installer/resources/themes/console/snark.css new file mode 100644 index 000000000..a5551156f --- /dev/null +++ b/installer/resources/themes/console/snark.css @@ -0,0 +1,329 @@ +/* Not yet complete. Subject to flux and change. dr|z3d - 07.25.09 */ + +body { + background-color: #eef; + color:#001; + font-family:"Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + font-size: 8pt; +} + +.snarkTitle { + font-size: 12pt; + font-weight: bold; + text-align: center; +} + +.snarkRefresh:link, .snarkRefresh:visited { + text-decoration: none !important; + text-transform: uppercase !important; + padding: 0 16px; + letter-spacing: 0.05em; + font-weight: bold; + font-size: 11pt; + color: #005; + text-shadow: 0px 0px 1px rgba(0, 0, 148, 0.9); + } + + .snarkRefresh:hover{ + text-decoration: none !important; + text-transform: uppercase !important; + padding: 0 16px; + letter-spacing: 0.05em; + font-weight: bold; + font-size: 11pt; + color: #f60; + border-bottom: 3px solid #f60; + border-top: 3px solid #f60; + text-shadow: 0px 0px 1px rgba(255, 128, 0, 0.9); + } + +.snarkRefresh:active{ + text-decoration: none !important; + text-transform: uppercase !important; + padding: 0 16px; + letter-spacing: 0.05em; + font-weight: bold; + font-size: 11pt; + color: #f30; + border-bottom: 3px solid #f30; + border-top: 3px solid #f30; + text-shadow: 0px 0px 1px rgba(255, 163, 0, 0.9); + } + +.snarkMessages { + background-color: #f83; + font-family: "Lucida Console", "DejaVu Sans Mono", Courier, mono !important; + font-size: 9pt; + font-weight: bold; + text-align: left; + margin: 0 0px 10px 0px; + padding: 0; + border-spacing: 0px; + -moz-border-radius: 4px 0 0 0; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 2px solid #930; + text-align: left; + overflow: auto; + background: #f40 url('../console/images/orangetile.png'); + color: #531; + height: 64px; + width: auto; +} + +pre { + font-family: "Lucida Console", "DejaVu Sans Mono", Courier, mono !important; + width: 100%; + font-size: 8pt; + padding: 0; + text-align: left !important; + height: 8px; +} + +table { + margin: 0px 0px 10px 0px; + border: 0px; + padding: 0px; + border-width: 0px; + border-spacing: 0px; + border-collapse: collapse; +} + +th { + padding: 5px; + font-size: 8pt; + border-top: 1px outset #001; + border-bottom: 1px inset #001; + background: #f60 url('/themes/console/images/tabletitleorange.png') repeat-x; + text-align: right; + whitespace: nowrap; +} + +.SnarkTorrents { + margin: 0; + border: 1px solid #001; + background-color: #f9f; +} + +td { + padding: 5px; + text-align: right; +} +.snarkTorrentEven { + background-color: #fb1; + font-size: 7pt; +} +.snarkTorrentOdd { + background-color: #fa1; + font-size: 7pt; +} +.snarkNewTorrent { + font-size: 9pt; +} +.snarkAddInfo { + font-size: 9pt; + line-height: 130% !important; +} +.snarkConfigTitle { + font-size: 11pt; + font-weight: bold; + text-decoration: underline; +} + +.snarkConfig { + font-size: 10pt; +} + +.page { + background-color: #fff; + color:#310; + min-width: 800px !important; +/* max-width: 800px !important; */ + margin: 20px; + padding: 10px 20px 5px 20px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #001; + font-size: 9pt !important; + line-height: 160% !important; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + text-align: center; + background: #ddf url('../console/light/images/lightbluetile.png'); + opacity: 1.0; +} + +form { + line-height: 250% +} + +p { + line-height: 150% +} + +a:link { + padding 5px; +} + +hr { + color: #003; + background: #003; + height: 1px; + border: 0px solid #003; + width: 100%; + margin: 10px 0 7px 0; + text-align: center; +} + +a:link{ + color: #930; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #606; + text-decoration: none; + font-weight: bold; +} + +a:hover{ + color: #900; + font-weight: bold; +} + +input { +/* font-family: "Lucida Console", "DejaVu Sans Mono", Courier, mono !important;*/ + font-size: 9pt; + font-weight: bold; + text-align: left; + padding: 2px; +} + +select { + font-family:"Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + background-color: #ffe; + color: #310; + font-size: 9pt; +} + +img { + border: none; + margin: 5px 5px 0px 5px; + opacity: 1.0; + line-height: 100% +} + +img:hover{ + border: none; + margin: 5px 5px 0px 5px; + opacity: 0.5; + line-height: 100% +} + + +div.section { + margin: 0 0 20px 0; + padding: 10px; + background: #ffe; + border: 1px solid #001; + text-align: center; + color: #001; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + word-wrap: break-word; + text-align: center; + background: #ffe url('../console/light/images/tabletile.png'); + opacity: 1.0; +} + +div.mainsection { + margin: 0 0 20px 0; + padding: 10px; + background: #ffe; + border: 1px solid #001; + text-align: center; + color: #001; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + word-wrap: break-word; + text-align: center; + background: #ffe url('../console/light/images/tabletile.png'); + opacity: 1.0; +} + +div.newtorrentsection { + margin: 0 0 20px 0; + padding: 10px; + background: #ffe; + border: 1px solid #001; + text-align: center; + color: #001; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + word-wrap: break-word; + text-align: center; + background: #ffe url('../console/images/yellowtile.png'); + opacity: 1.0; +} + +div.addtorrentsection { + margin: 0 0 20px 0; + padding: 10px; + background: #ffe; + border: 1px solid #001; + text-align: center; + color: #001; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + word-wrap: break-word; + text-align: center; + background: #ffe url('../console/images/greentile.png'); + opacity: 1.0; +} + +div.configsection { + margin: 0 0 20px 0; + padding: 10px; + background: #ffe; + border: 1px solid #001; + color: #ffb; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: inset 0px 0px 0px 1px #900; + word-wrap: break-word; + text-align: center; + background: #ffe url('../console/light/images/darkbluetile.png'); + font-weight: bold; /* red tile needs bold text! */ +} + +div.configsection a{ + color: #f90; +} + +div.configsection a:hover{ + color: #f60; + text-decoration: underline; +} + +.snarknavbar { + margin: 5px 0 20px 0 !important; + padding: 10px; + border: 1px solid #001; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + background: #eef; + -moz-box-shadow: inset 0px 0px 1px 0px #002; + background: #ddf url('../console/light/images/tabletile.png'); +} diff --git a/installer/resources/wrapper.config b/installer/resources/wrapper.config index 4d09ba12c..3f07e7c85 100644 --- a/installer/resources/wrapper.config +++ b/installer/resources/wrapper.config @@ -11,6 +11,19 @@ # with the runplain.sh script on Linux. Use the 'restartable' # icon on Windows or the i2prouter script on Linux to run the wrapper. # +# NOTE - Directory organization: +# The standard I2P Installation will set up a "split" directory structure +# with code in the install directory, data and configuration files in the +# user's home directory, and temporary files in the system temporary directory. +# To set up a single-directory "portable" installation suitable for +# a USB stick, make several changes specified below (search for PORTABLE). +# +# NOTE - The izpack installer performs variable subsitiution on this +# file upon installation. If you did not use izpack, you must +# find and replace all instances of (dollar)INSTALL_PATH and +# (dollar)SYSTEM_java_io_tmpdir with appropriate values +# (perhaps . and /var/tmp, respectively) +# #******************************************************************** # Java Application wrapper.java.command=java @@ -23,52 +36,45 @@ wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp # Java Classpath (include wrapper.jar) Add class path elements as # needed starting from 1 -# i2p sdk, public domain/BSD/Cryptix -wrapper.java.classpath.1=lib/i2p.jar -# router, depends on i2p.jar, public domain -wrapper.java.classpath.2=lib/router.jar -# compiled jbigi libraries, contains static libGMP, lgpl -wrapper.java.classpath.3=lib/jbigi.jar -# sam bridge, public domain (depends on i2p.jar) -wrapper.java.classpath.4=lib/sam.jar -# ministreaming lib -interfaces for streaming, BSD (depends on i2p.jar) -wrapper.java.classpath.5=lib/mstreaming.jar -# full streaming lib, public domain (depends on mstreaming.jar, i2p.jar) -wrapper.java.classpath.6=lib/streaming.jar -# router console, public domain (depends on i2p.jar, router.jar) -wrapper.java.classpath.7=lib/routerconsole.jar -# i2ptunnel, GPL (depends on mstreaming.jar, i2p.jar) -wrapper.java.classpath.8=lib/i2ptunnel.jar -# jetty libraries (and dependencies), apache licensed -wrapper.java.classpath.9=lib/org.mortbay.jetty.jar -wrapper.java.classpath.10=lib/javax.servlet.jar -wrapper.java.classpath.11=lib/jasper-compiler.jar -wrapper.java.classpath.12=lib/jasper-runtime.jar -wrapper.java.classpath.13=lib/commons-logging.jar -wrapper.java.classpath.14=lib/commons-el.jar -wrapper.java.classpath.15=lib/ant.jar -# java service wrapper, BSD -wrapper.java.classpath.16=lib/wrapper.jar -# systray, LGPL -wrapper.java.classpath.17=lib/systray.jar -wrapper.java.classpath.18=lib/systray4j.jar -# BOB -wrapper.java.classpath.19=lib/BOB.jar +# +# Doing it this way means we can add new apps without asking people +# to update their wrapper.config. +# The downside is that we lose control over classpath order, +# This is fine for new installs (where the uninstall jars +# copy.jar, delete.jar, and exec.jar containing duplicate FileUtil +# classes, or all the classes of i2p.jar, are in a different directory). +# Be sure there are no other duplicate classes. +# +wrapper.java.classpath.1=$INSTALL_PATH/lib/*.jar +# uncomment this to use the system classpath as well (e.g. to get tools.jar) +# wrapper.java.classpath.2=%CLASSPATH% # Java Library Path (location of Wrapper.DLL or libwrapper.so) -wrapper.java.library.path.1=. -wrapper.java.library.path.2=lib +wrapper.java.library.path.1=$INSTALL_PATH +wrapper.java.library.path.2=$INSTALL_PATH/lib # Java Additional Parameters +# Numbers must be consecutive (except for stripquotes) wrapper.java.additional.1=-DloggerFilenameOverride=logs/log-router-@.txt wrapper.java.additional.2=-Dorg.mortbay.http.Version.paranoid=true wrapper.java.additional.3=-Dorg.mortbay.util.FileResource.checkAliases=false wrapper.java.additional.4=-Dorg.mortbay.xml.XmlParser.NotValidating=true +wrapper.java.additional.5=-Di2p.dir.base="$INSTALL_PATH" +wrapper.java.additional.5.stripquotes=TRUE +# PORTABLE installation: +# uncomment the following +#wrapper.java.additional.6=-Di2p.dir.pid="$INSTALL_PATH" +#wrapper.java.additional.6.stripquotes=TRUE +#wrapper.java.additional.7=-Di2p.dir.temp="$INSTALL_PATH" +#wrapper.java.additional.7.stripquotes=TRUE +#wrapper.java.additional.8=-Di2p.dir.config="$INSTALL_PATH" +#wrapper.java.additional.8.stripquotes=TRUE +# # Uncomment this for better performance. # If it doesn't work, server mode is not available in your JVM. # This may not be required if your machine is already "server-class". # See http://java.sun.com/j2se/1.5.0/docs/guide/vm/server-class.html -#wrapper.java.additional.5=-server +#wrapper.java.additional.6=-server # Initial Java Heap Size (in MB) #wrapper.java.initmemory=4 @@ -99,7 +105,17 @@ wrapper.console.format=PM wrapper.console.loglevel=INFO # Log file to use for wrapper output logging. -wrapper.logfile=wrapper.log +# You may wish to change this on linux so the log is +# preserved across OS restarts. +# If you do change it, add the following line above to +# tell the router where to find the wrapper log +# (change X to the next available number) +# wrapper.java.additional.X=-Dwrapper.logfile=/path/to/wrapper.log +wrapper.logfile=$SYSTEM_java_io_tmpdir/wrapper.log +# PORTABLE installation: +# Use the following instead. I2P will find the logfile here, +# no need for a wrapper.java.additional line too. +#wrapper.logfile=$INSTALL_PATH/wrapper.log # Format of output for the log file. (See docs for formats) wrapper.logfile.format=LPTM @@ -139,10 +155,13 @@ wrapper.on_exit.5=RESTART wrapper.jvm_exit.timeout=30 # give the OS 60s to clear all the old sockets / etc before restarting -wrapper.restart.delay=60 +# Let's change the default from 60 to 15 seconds and see if anyone moans.. +wrapper.restart.delay=15 -wrapper.ping.interval=600 -wrapper.ping.timeout=605 +wrapper.ping.interval=300 +# The ping timeout must be at least 5 seconds longer than the value of wrapper.ping.interval. +# Extend this if you are getting 'JVM appears hung' shutdowns. +wrapper.ping.timeout=320 # use the wrapper's internal timer thread. otherwise this would # force a restart of the router during daylight savings time as well @@ -150,7 +169,14 @@ wrapper.ping.timeout=605 wrapper.use_system_time=false # pid file for the JVM -wrapper.java.pidfile=routerjvm.pid +# If you plan to have multiple wrappers running on the same machine, +# you should copy this file, change the location or file name, +# and edit the i2prouter script to change the WRAPPER_CONF setting +# to point to the new wrapper.config location. +wrapper.java.pidfile=$SYSTEM_java_io_tmpdir/routerjvm.pid +# PORTABLE installation: +# Use the following instead. +#wrapper.java.pidfile=$INSTALL_PATH/routerjvm.pid # pid file for the service monitoring the JVM # # From i2prouter: @@ -160,7 +186,11 @@ wrapper.java.pidfile=routerjvm.pid # PIDFILE="$PIDDIR/$APP_NAME.pid" # # This means i2prouter looks for './i2p.pid'. -wrapper.pidfile=i2p.pid +# See comments above for wrapper.java.pidfile +wrapper.pidfile=$SYSTEM_java_io_tmpdir/i2p.pid +# PORTABLE installation: +# Use the following instead. +#wrapper.pidfile=$INSTALL_PATH/i2p.pid #******************************************************************** # Wrapper NT Service Properties diff --git a/licenses/COPYING-BOB.txt b/licenses/COPYING-BOB.txt new file mode 100644 index 000000000..116db5958 --- /dev/null +++ b/licenses/COPYING-BOB.txt @@ -0,0 +1,21 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) sponge + Planet Earth + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + +See... + + http://sam.zoy.org/wtfpl/ + and + http://en.wikipedia.org/wiki/WTFPL + +...for any additional details and license questions. diff --git a/licenses/LICENSE-GeoIP.txt b/licenses/LICENSE-GeoIP.txt new file mode 100644 index 000000000..20670107e --- /dev/null +++ b/licenses/LICENSE-GeoIP.txt @@ -0,0 +1,18 @@ +Copyright (c) 2003 Direct Information Pvt. Ltd. All Rights Reserved. + +This application uses the IP-to-Country Database +provided by WebHosting.Info (http://www.webhosting.info), +available from http://ip-to-country.webhosting.info. + +BECAUSE THE DATABASE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE DATABASE, +TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE +COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE DATABASE "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE OR ANY WARRANTIES +REGARDING THE CONTENTS OR ACCURACY OF THE WORK. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT +HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE DATABASE AS PERMITTED +ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE DATABASE, EVEN +IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/licenses/NOTICE-Ant.txt b/licenses/NOTICE-Ant.txt deleted file mode 100644 index 1fb6dde47..000000000 --- a/licenses/NOTICE-Ant.txt +++ /dev/null @@ -1,15 +0,0 @@ - ========================================================================= - == NOTICE file corresponding to the section 4 d of == - == the Apache License, Version 2.0, == - == in this case for the Apache Ant distribution. == - ========================================================================= - - This product includes software developed by - The Apache Software Foundation (http://www.apache.org/). - - This product includes also software developed by : - - the W3C consortium (http://www.w3c.org) , - - the SAX project (http://www.saxproject.org) - - Please read the different LICENSE files present in the root directory of - this distribution. diff --git a/news.xml b/news.xml index 63adee7fa..be13ee443 100644 --- a/news.xml +++ b/news.xml @@ -1,5 +1,5 @@ - - +

          -• -2009-01-24: 0.7 Released +

          -The 0.7 release adds stability and flexibility to I2PSnark, -which can hopefully be used to distribute I2P updates in future. +I2P version 0.7.6 contains additional fixes for network stability issues +related to tunnel building and connection limits. +While the 0.7.5 release greatly improved the congestion that +appeared UTC evenings and weekends, it was not eliminated; +this release should improve the situation further.

          -The I2P router gets fixes and optimizations to various -transport-level and streaming issues, network exploration, -NetDB performance and the UDP introducer system. -Among other features, the new release offers -better connection limiting, higher tolerance to "out of memory" exceptions -in helper applications, and an experimental new address system -using Base32 hashes of destination keys (".b32.i2p" URLs). +This version also has new console themes by dr|z3d, +which may be selected on the new UI configuration page. +Sorry, the new themes are not available for IE browsers.

          -Both the BOB and SAM protocols are improved upon, -more old components dropped, Router Console features added -and a possible latency measurement attack mitigated. -From this release onwards, block lists for misbehaving peers -are activated by default. +The default tunnel length variance is changed from 1 to 0. +This mainly affects exploratory tunnels and iMule. +As explained on zzz.i2p, +a non-zero variance adds very little protection, at great cost +in resources. +Should you wish to reconfigure your exploratory settings back to the old variance of 1, +or change to length 3 variance 0, +you may do so on the config tunnels page. +iMule settings are best changed within that application.

          -It seems worthwhile to remind that already since -the last release, I2P requires Java 1.5 or higher. -If you are uncertain about your Java version, you can verify -by opening a terminal window or command prompt, -and entering the command "java -version". -If you have an older Java installed, please update it first!

          +I2P now stores temporary data in the system temp directory +(generally /var/tmp on Linux and %TEMP% on Windows). +For new installs only, +user data is in $HOME/.i2p on Linux/Mac and +%APPDATA%\I2P on Windows. +

          +The release contains several changes to reduce resource usage +(memory, CPU, and connections) and the usual assortment of bug fixes. +Upgrading is recommended. +

          +This is the first release built and signed by zzz. +Thanks again to Complication for his many contributions to the project +over the past five years. +I2P is undergoing the most rapid development in years. Please give the +developers feedback on IRC #i2p or forum.i2p +and get involved! +

          diff --git a/readme.html b/readme.html index 9ba805a72..3caf086ed 100644 --- a/readme.html +++ b/readme.html @@ -1,66 +1,83 @@ -

          English | Deutsch | Nederlands | Svenska

          -

          If you've just started I2P, the Active: numbers on the left should start to -grow over the next few minutes and you'll see a "shared clients" local destination listed -on the left (if not, see below). Once those show up, -you can:

          -
            -
          • browse "eepsites" - on I2P there are anonymously hosted websites - - tell your browser to use the HTTP proxy at localhost port 4444, then - browse to an eepsite - - - There are many more eepsites - just follow the links from the ones you see, - bookmark your favorites, and visit them often!
          • -
          • browse the web - there is currently an HTTP "outproxy" in I2P hooked - up to your own HTTP proxy on port 4444 - simply set your browser's proxy to - use it (as above) and go to any normal URL - your requests will be bounced - through the I2P network.
          • -
          • transfer files - there is an integrated port of the - Snark BitTorrent - client.
          • -
          • use anonymous email - postman has created a mail system compatible with normal mail - clients (POP3 / SMTP) that allows email within I2P as well as mail from and to the normal - internet! get your account at hq.postman.i2p. - We bundle susimail, - a web based anonymity-oriented pop3/smtp client configured to access postman's mail services.
          • -
          • chat anonymously - fire up your own IRC client and connect to the - server at localhost port 6668. This points at one of two anonymously hosted - IRC servers, but neither you nor they know where the other is.
          • -
          • blog anonymously - check out Syndie
          • -
          • and lots more
          • -
          - -

          Want your own eepsite?

          - -

          We've bundled some software to let you run your own eepsite - a -Jetty instance listening on -http://localhost:7658/. Simply place your files in -the eepsite/docroot/ directory (or place any standard JSP/Servlet .war -files under eepsite/webapps, or standard CGI script under eepsite/cgi-bin) -and they'll show up. After starting up an eepsite tunnel pointing at it, your eepsite -will be visible to others. -Detailed instructions for starting your eepsite are on -your temporary eepsite page. -

          - -

          Troubleshooting

          - -

          Be patient - I2P may be slow to start the first time as it searches for peers. -If, after 30 minutes, your Active: connected/recent count has less than 10 connected -peers, you should open port 8887 on your firewall for better connectivity. -If you cannot see any eepsites at all (even www.i2p2.i2p), -be sure your browser proxy is set to localhost port 4444. -You may also want to review the information on the -I2P website, post up messages to the -I2P discussion forum, or swing by #i2p or -#i2p-chat on IRC at irc.freenode.net, irc.postman.i2p or irc.freshcoffee.i2p (they're linked together).

          - -

          As a note, you can change this page by editing the file "docs/readme.html"

          +
          +
          English + Chinese + Deutsch + Français + Nederlands + Svenska
          +
          +

          Welcome to I2P!

          +

          If you've just started I2P, the Active: numbers on the left should start to + grow over the next few minutes and you'll see a "shared clients" local destination + listed on the left (if not, see below). Once those show + up, you can: +

            +
          • browse "eepsites" - on I2P there are anonymously hosted websites + - tell your browser to use the HTTP proxy at localhost port 4444, then + browse to an eepsite:
            +
          +
          +
          +
            +
          • browse the web - there is currently an HTTP + "outproxy" in I2P hooked up to your own HTTP proxy on port 4444 - simply + set your browser's proxy to use it (as above) and go to any normal URL + - your requests will be bounced through the I2P network.
          • +
          • transfer files - there is an integrated port + of the Snark BitTorrent + client.
          • +
          • use anonymous email - postman has created a + mail system compatible with normal mail clients (POP3 / SMTP) that allows + email within I2P as well as mail from and to the normal internet! get + your account at hq.postman.i2p. We + bundle susimail, a web based anonymity-oriented + pop3/smtp client configured to access postman's mail services.
          • +
          • chat anonymously - fire up your own IRC client + and connect to the server at localhost port 6668. This points at + one of two anonymously hosted IRC servers, but neither you nor they know + where the other is.
          • +
          • blog anonymously - check out Syndie
          • +
          • and lots more
          • +
          +
        +

        Want your own eepsite?

        +

        We've bundled some software to let you run your own eepsite - a Jetty + instance listening on http://localhost:7658/. + Simply place your files in the eepsite/docroot/ directory (or place + any standard JSP/Servlet .war files under eepsite/webapps, + or standard CGI script under eepsite/cgi-bin) and they'll show + up. After starting up an eepsite tunnel pointing at + it, your eepsite will be visible to others. Detailed instructions for starting + your eepsite are on your temporary eepsite + page.

        +

        Troubleshooting

        +

        Be patient - I2P may be slow to start the first time as it searches for peers. + If, after 30 minutes, your Active: connected/recent count has less than 10 connected + peers, you should open port 8887 on your firewall for better connectivity. If + you cannot see any eepsites at all (even www.i2p2.i2p), + be sure your browser proxy is set to localhost port 4444. You may also want + to review the information on the I2P website, + post up messages to the I2P discussion forum, + or swing by #i2p or #i2p-chat on IRC at irc.freenode.net, + irc.postman.i2p or irc.freshcoffee.i2p (they're linked together).

        +
        diff --git a/readme_de.html b/readme_de.html index a6d233d6a..f6e3a1d1c 100644 --- a/readme_de.html +++ b/readme_de.html @@ -1,40 +1,44 @@ -

        English | Deutsch | Nederlands | Svenska

        +
        +
        English Chinese Deutsch Français Nederlands Svenska
        +
        +

        Willkommen zu I2P!

        Wenn Du gerade I2P gestartet hast, sollten die "Active:" Zahlen links in den nächsten paar Minuten anwachsen und Du siehst dann dort ein "shared clients" lokales Ziel gelistet (falls nicht, siehe Unten). Sobald das erscheint, kannst Du:

          -
        • "Eepsites" besuchen - In I2P sind anonym gehostete Websites - - Stelle Deinen Browser so ein, über den HTTP proxy: localhost port 4444 zu surfen, dann besuche eine Eepsite - -
          Es gibt viel mehr Eepsites - folge einfach den Links die du findest, - bookmarke Deine Favoriten und besuche sie oft!
        • -
        • Im Internet surfen - Es gibt einen HTTP "outproxy" in I2P in Deinem + bookmarke Deine Favoriten und besuche sie oft!

        • +
        • Im Internet surfen - Es gibt einen HTTP "outproxy" in I2P in Deinem HTTP proxy auf Port 4444 - Konfiguriere Deine Browser's Proxy Einstellung darauf (siehe Oben) und besuche jede normale URL - Deine Anfrage wird durch das I2P Netzwerk geroutet.
        • -
        • Daten austauschen - Es gibt eine Portierung des +
        • Daten austauschen - Es gibt eine Portierung des Snark BitTorrent Clients.
        • -
        • Anonyme Email - Postman hat ein Email System aufgebaut, das +
        • Anonyme Email - Postman hat ein Email System aufgebaut, das kompatibel mit normalen Email-Clients (POP3 / SMTP) ist, welches erlaubt, Email innerhalb von I2P sowie Email von und zum normalen Internet zu schicken! Hole Dir Dein Emailkonto auf hq.postman.i2p. Im Verbund dazu haben wir susimail, ein Internet-Browser basierter, anonymer pop3/smtp Client, fertig eingerichtet für Postman's Email Service.
        • -
        • Anonymer Chat - Starte Deinen Lieblings IRC Client und verbinde ihn +
        • Anonymer Chat - Starte Deinen Lieblings IRC Client und verbinde ihn mit dem Server localhost Port 6668. Das richtet Dich auf auf einen von zwei anonym gehosteten IRC Servern, aber weder Du noch die wissen wer der Andere ist.
        • -
        • Anonymer Blog - Probiere Syndie aus
        • -
        • und Vieles mehr
        • +
        • Anonymer Blog - Probiere Syndie aus
        • +
        • und Vieles mehr

        Willst Du Deine eigene Eepsite?

        @@ -67,6 +71,4 @@ ins I2P discussion forum posten, oder chatten auf #i2p or #i2p-chat beim IRC auf irc.freenode.net, irc.postman.i2p - oder irc.freshcoffee.i2p (die verbunden sind).

        - -

        Übrigens, diese Seite kannst Du ändern indem Du "docs/readme_de.html" editierst

        + oder irc.freshcoffee.i2p (die verbunden sind).


        diff --git a/readme_fr.html b/readme_fr.html new file mode 100644 index 000000000..cc429e20e --- /dev/null +++ b/readme_fr.html @@ -0,0 +1,39 @@ +
        +
        English Chinese Deutsch Français Nederlands Svenska
        +
        +

        Bienvenu a I2P!

        +

        Si vous venez juste de lancer I2P, les chiffres sur la gauche à coté de Active devraient commencer à augmenter dans les prochaines minutes et vous verrez un "Shared client" en destination locale listés sur la gauche (si non, voir plus bas). Une fois qu'ils apparaissent, vous pouvez:

        +
          +
        • parcourir les "eepsites" - sur I2P il y a des sites web anonymes hébergés - dites à votre navigateur d'utiliser le HTTP proxy a l'adresse localhost port 4444, ensuite vous pouvez naviguer sur les eepsites:
          + + Il y a bien plus d'eepsites - suivez juste les liens au départ de ceux sur lesquels vous êtes, mettez-les dans vos favoris et visitez-les souvent!

        • +
        • Parcourez le web - Il y a pour l'instant un outproxy HTTP sur I2P attaché à votre propre proxy HTTP sur le port 4444 - vous devez simplement configurer le proxy de votre navigateur pour l'utiliser (comme expliqué ci-dessus) et aller sur n'importe quel URL normale - vos requêtes seront relayées par le réseau i2p.
        • +
        • Transfer de fichiers - Il y a un port intégré de Snark le client BitTorrent.
        • +
        • Utiliser le service de mail anonyme - Postman a créé un sytème de mails compatible avec un client de messagerie normal (POP3 / SMTP) qui permet d'envoyer des emails autant au sein d'i2p que vers et à partir de l'internet normal! Créez-vous un compte à hq.postman.i2p. + Nous fournissons dans la version de base de i2p susimail, + un client web pop3/smtp orienté sur l'anonymat qui est configuré pour accéder aux services email de postman.
        • +
        • Chatter de manière anonyme - Activez votre client IRC et connectez-le sur le serveur localhost port 6668. Ceci pointe vers l'un des deux serveur IRC anonyme, mais ni vous ni eux ne savent qui est l'autre
        • +
        • Créez-vous un blog anonyme - Renseignez-vous chez Syndie
        • +
        • Et bien d'autres
        • +
        + +

        Vous voulez votre propre eepsite?

        + +

        Nous fournissons de base quelques logiciels pour vous permettre de créer votre propre eepsite - une instance +Jetty, qui écoute sur +http://localhost:7658/. Placer simplement vos fichiers dans le répertoire eepsite/docroot/ (ou placez n'importe quel fichier JSP/Servlet standard .war) dans eepsite/webapps, ou script CGI standard dans eepsite/cgi-bin) et ils apparaitront. Après avoir démarré un tunnel pour votre eepsite (le tunnel doit pointer sur l'adresse locale du eepsite), votre eepsite sera visible pour les autes. Des instructions plus détaillées pour créer un eepsite se trouvent sur Votre eepsite temporaire. +

        + +

        Dépannage

        + +

        Soyez patient - i2p peut s'avérer lent à démarrer la première fois car il recherche des pairs. Si, après 30 minutes, votre Actives: connecté/récent compte moins de 10 pairs connectés, vous devez ouvrir le port 8887 sur votre pare-feu pour avoir une meilleure connection. Si vous ne pouvez accéder à aucun eepsite (même www.i2p2.i2p), soyez sûr que votre navigateur utilise bien le proxy localhost sur le port 4444. Vous pouvez aussi faire part de votre démarche sur le site web I2P, poster des message sur le forum de discussion, ou passer par #i2p ou #i2p-chat sur IRC sur le serveur irc.freenode.net, irc.postman.i2p ou irc.freshcoffee.i2p (ils sont liés).


        diff --git a/readme_nl.html b/readme_nl.html index 3203c79b5..973ceed31 100644 --- a/readme_nl.html +++ b/readme_nl.html @@ -1,7 +1,10 @@ -

        English | Deutsch | Nederlands | Svenska

        +
        +
        English Chinese Deutsch Français Nederlands Svenska
        +
        +

        Welkom bij I2P!

        Als je net I2P opgestart hebt, zullen de 'Active:' (Actieve) getallen aan de linkerkant in de komende minuten stijgen, en je zal een "Shared clients" (Gedeelde clients) lokale bestemming zien staan aan de linkerkant (indien niet, zie hieronder). Eenmaal je deze bestemming ziet, kan je:

          -
        • surfen naar "eepsites" - op I2P zijn er anonieme websites - stel je browser in om de HTTP proxy op localhost, poort 4444 te gebruiken, en surf vervolgens naar een eepsite - +
        • surfen naar "eepsites" - op I2P zijn er anonieme websites - stel je browser in om de HTTP proxy op localhost, poort 4444 te gebruiken, en surf vervolgens naar een eepsite:

          • inproxy.tino.i2p en perv.i2p: sites die lijsten bijhouden van actieve eepsites
          • @@ -11,8 +14,8 @@
          • eepsites.i2p: een anoniem gehoste zoekmachine voor eepsites
          • ugha.i2p: ugha's eepsite, een wiki die door iedereen aangepast kan worden, met veel links
          • fproxy.tino.i2p: proxy naar het Freenet-netwerk
          • -
          - Er zijn nog veel meer eepsites - volg gewoon de links vanaf diegene die je ziet. Voeg de beste toe aan je favorieten, en bezoek ze regelmatig!
        • +

        + Er zijn nog veel meer eepsites - volg gewoon de links vanaf diegene die je ziet. Voeg de beste toe aan je favorieten, en bezoek ze regelmatig!

      • surfen op het web - er is momenteel een HTTP "outproxy" in I2P, vastgehaakt aan je eigen HTTP proxy op poort 4444 - stel eenvoudigweg de proxy van je browser in om deze te gebruiken (zoals hierboven voor eepsites) en ga naar een willekeurige normale URL - je verzoeken voor websites worden rondgestuurd via het I2P-network.
      • bestanden versturen - er is een geintegreerde aangepaste versie van de Snark BitTorrent @@ -52,6 +55,4 @@ controleer dan nog eens of de proxy van je browser op localhost poort 4444 staat Je zou best ook de informatie controleren op de I2P website, of plaats een bericht op het I2P discussie forum, of kom langs bij #i2p of -#i2p-chat op IRC bij de kanalen irc.freenode.net, irc.postman.i2p of irc.freshcoffee.i2p (ze linken allemaal door naar elkaar).

        - -

        Als extra informatie, je kan deze pagina wijzigen door het bestand "docs/readme_nl.html" aan te passen.

        +#i2p-chat op IRC bij de kanalen irc.freenode.net, irc.postman.i2p of irc.freshcoffee.i2p (ze linken allemaal door naar elkaar).


        diff --git a/readme_sv.html b/readme_sv.html index e368fbc53..c6b021eef 100644 --- a/readme_sv.html +++ b/readme_sv.html @@ -1,6 +1,7 @@ -

        English -| Deutsch | Nederlands | Svenska

        +
        +
        English Chinese Deutsch Français Nederlands Svenska
        +
        +

        Welcome to I2P!

        Om du just har startat I2P kommer de "Aktiva: #/#" börja öka inom några få minuter och du kommer se en destination kallad "delade klienter" på den vänstra listan (om inte se @@ -8,8 +9,8 @@ nedan). När de syns kan du:

        • surfa på "eepsidor" - inom I2P finns det anonyma sajter - ställ in din webbläsare till att använda HTTP proxy vid -localhost port 4444, surfa sen till en eepsida - -
            +localhost port 4444, surfa sen till en eepsida:
            + +
          • echelon.i2p: software archive and information for I2P
          • +

          Det finns många fler eepsidor - följ bara länkarna från dom du ser, - spara dina favoriter och besök dom ofta!
        • + spara dina favoriter och besök dom ofta!
        • surfa på nätet - det finns för närvarande en "utproxy" i I2P som är ansluten till din egen HTTP proxt på port 4444 - ställ helt enkelt in din @@ -95,7 +97,4 @@ Du kanske också vill kika på information på förbi #i2p eller #i2p-chat på IRC på irc.freenode.net, irc.postman.i2p -eller irc.freshcoffee.i2p (de är alla sammankopplade).

          - -

          Du kan förändra denhär sidan genom att ändra i filen -"docs/readme_sv.html"

          \ No newline at end of file +eller irc.freshcoffee.i2p (de är alla sammankopplade).


          diff --git a/readme_zh.html b/readme_zh.html new file mode 100644 index 000000000..47c9cf9a4 --- /dev/null +++ b/readme_zh.html @@ -0,0 +1,35 @@ +
          +
          English + Chinese + Deutsch + Français + Nederlands + Svenska
          +
          +

          Welcome to I2P!

          +

          å¦‚æœ I2P å·²ç»è¿è¡Œï¼Œæœªæ¥ç„几分钟里æ§åˆ¶å°å·¦ä¾§ç„æ´»å¨è‚点(Active)æ•°é‡å°†å¼€å§‹å¢é•¿ï¼Œå¹¶ä¼å‡ºç°å为 "已共享客户"("shared clients") ç„æœ¬åœ°ç›®æ ‡ă€‚(å¦‚æœæ²¡æœ‰,è¯·è§ ç–‘é¾è§£ç­”)ă€‚å¾…å‡ºç°ä»¥ä¸æ¶ˆæ¯å,您å¯ä»¥:

          +
            +
          • æµè§ˆ IIP网站 "eepsites" - I2P 网络内匿åè¿è¡Œç„站点 - 您è¦é¦–先设置æµè§ˆå™¨ç„ HTTP ä»£ç† ä¸º localhost:4444 ç„¶åæ‰èƒ½æµè§ˆIIP站点 -
              +
            • inproxy.tino.i2p å’Œ perv.i2p: 这两个站点用äºè·Ÿè¸ªå“ªäº› IIP ç«™ç‚¹åœ¨çº¿ă€‚
            • +
            • forum.i2p: 安全匿åç„访问I2På®˜æ–¹è®ºå› forum.i2p2.de
            • +
            • www.i2p2.i2p ä¸å…¶é•œåƒ i2p-projekt.i2p: 安全匿åç„访问I2P官网 www.i2p2.de
            • +
            • eepsites.i2p: 匿å建立ç„IIP网站æœç´¢å¼•æ“
            • +
            • ugha.i2p: UGHA ç„IIP站点, 任何人都å¯ä»¥ç¼–辑ç„WIKI, 有丰富ç„链æ¥
            • +
            • fproxy.tino.i2p: FREENET 代ç†
            • +

            + I2P网络中还有很å¤å…¶ä»–ç„IIP网站(EEPSITE) - 访问ä¸é¢ç„ç½‘ç«™ä½ ä¼æ‰¾åˆ°æ›´å¤ï¼Œæ”¶è—ä½ å–œçˆ±ç„ IIP 网站,别忘了常å»çœ‹çœ‹ï¼

          • +
          • æµè§ˆ Web 网页 - ç›®å‰ IP2 ç½‘ç»œä¸­åªæœ‰ä¸€ä¸ª HTTP 出å£ä»£ç†("outproxy")挂æ¥åœ¨ä½ ä¸»æœº4444端å£ç„HTTP代ç†ä¸ă€‚- åªè¦å°†æµè§ˆå™¨ç„代ç†è®¾ç½®æŒ‡å‘为å‰é¢ç„地å€(localhost:4444),然å访问任何普é€é“¾æ¥å³å¯ - 您ç„HTTP请求将在 I2P ç½‘ç»œå†…éƒ¨ä¼ é€’ă€‚
          • +
          • æ–‡ä»¶äº¤æ¢ - 本机ç„其中一个内置 ç«¯å£ ä¸­æä¾› Snark BitTorrent å®¢æˆ·ç«¯ă€‚
          • +
          • 匿å电邮 - POSTMAN 创建了兼容普é€é‚®ä»¶å®¢æˆ·ç«¯ (POP3 / SMTP)ç„邮件系统,该系统å¯ä»¥åœ¨ I2P 网络内部收å‘Email 也å¯ä»¥æ”¶å‘æ¥è‡ªå¤–部 Internet ç„邮件ï¼ç”µé‚®è´¦å·è¯·åˆ° hq.postman.i2p ç”³è¯·ă€‚æˆ‘ä»¬å°†ç”¨äºåŒ¿åPOP3/SMTPç„Web邮件客户端 SUSIMail, 集æˆåœ¨I2P中,并将其é…置为使用POSTMAN ç„邮件æœå¡ă€‚
          • +
          • 匿åè天 - æ‰“å¼€æ‚¨ç„ IRC 客户端并链æ¥è‡³ localhost:6668ă€‚è¿™æ ·å¯ä»¥è®¿é—®ä¸¤ä¸ªåŒ¿åç„ IRC æœå¡å™¨, 但无论你还是æœå¡å™¨éƒ½ä¸çŸ¥é“å…¶ä»–äººåœ¨å“ªé‡Œă€‚
          • +
          • 匿åå客 - 请访问 Syndie
          • +
          • 以åå…¶ä»–æœå¡ă€‚
          • +
          + +

          想创建å±äºæ‚¨è‡ªå·±ç„ IIP 站点(EEPSITE)?

          + +

          我们已ç»é›†æˆäº†ä¸€äº›è½¯ä»¶æ¥å¸®å©ä½ è¿è¡Œè‡ªå·±ç„EEPSITE - 有一个Jetty å®ä¾‹ç›‘å¬äºæœ¬æœº http://localhost:7658/ä¸ă€‚åªè¦å°†ä½ ç„文件放在 eepsite/docroot/ 文件夹中 (æˆ–å°†ä»»ä½•æ ‡å‡†ç„ JSP/Servlet .war æ–‡ä»¶æ”¾ç½®äº eepsite/webapps 中, æ ‡å‡†ç„ CGI è„æœ¬åº”ç½®äº eepsite/cgi-bin 目录内) 之åå°±å¯ä»¥æµè§ˆå•¦ă€‚æ­¤åè¿è¡Œ IIP站点é§é“(EEPSITE TUNEL) 将其指å‘站点ç„端å£, 您ç„站点就å¯ä»¥è¢«ä»–äººçœ‹åˆ°äº†ă€‚å½“æ‚¨åˆ›å»ºIIP站点时ç„具体æ“作å‚è§ æ‚¨ç„临时EEPSITE页é¢ă€‚

          + +

          ç–‘é¾è§£ç­”

          + +

          ä¿æŒè€å¿ƒ - I2P 第一次å¯å¨æ—¶éœ€è¦æœç´¢è‚点,å¯èƒ½æ¯”è¾ƒç¼“æ…¢ă€‚å¦‚æœ30分钟åï¼Œæ‚¨ç„æ´»å¨è‚点(Active:å·²è¿æ¥/æ–°è¿‘è¿æ¥) 计数ä»åœ¨ 10 个è‚点以下, 请在防ç«å¢™ä¸­æ‰“å¼€ 8887 ç«¯å£æ”¹å–„è¿æ¥æ€§èƒ½ă€‚å¦‚æœæ‚¨æ ¹æœ¬æ— æ³•打开任何EEPSITE(ç”至 www.i2p2.i2p)ï¼Œæ£€æŸ¥æ‚¨ç„æµè§ˆå™¨ä»£ç†è®¾ç½®æ˜¯å¦ä¸ºæœ¬åœ°ç„ localhost:4444ă€‚ä½ ä¹Ÿå¯ä»¥æŸ¥çœ‹ I2P 网站 ä¸ç„ä¿¡æ¯, 在 I2P è®ºå› ä¸­å‘帖, æ¥ irc.freenode.net , irc.postman.i2p 或 irc.freshcoffee.i2p ä¸ç„ #i2p 或 #i2p-chat 两个IRC频é“åå。 (这些æœå¡å™¨ä¸ç„è¿™ä¸¤ä¸ªé¢‘é“æ˜¯ç›¸é€ç„)。


          diff --git a/router/java/build.xml b/router/java/build.xml index 95878e468..efb0b3091 100644 --- a/router/java/build.xml +++ b/router/java/build.xml @@ -22,15 +22,29 @@ - + + + + + + + + + + + - + + + - + + + diff --git a/router/java/nbproject/project.xml b/router/java/nbproject/project.xml new file mode 100644 index 000000000..3947ad82a --- /dev/null +++ b/router/java/nbproject/project.xml @@ -0,0 +1,93 @@ + + + org.netbeans.modules.ant.freeform + + + i2p_router + + + + i2p_router + + + + + . + UTF-8 + + + + java + src + UTF-8 + + + + java + test + UTF-8 + + + + + build + + + clean + + + javadoc + + + test + + + clean + build + + + + folder + build/obj + build + + + + + + src + + + + test + + + build.xml + + + + + + + + + + + + + + + src + build/obj:../../core/java/build/i2p.jar + build/obj + build/javadoc + 1.5 + + + test + + 1.5 + + + + diff --git a/router/java/src/net/i2p/data/i2np/DataMessage.java b/router/java/src/net/i2p/data/i2np/DataMessage.java index 7e839117f..cd4c4d327 100644 --- a/router/java/src/net/i2p/data/i2np/DataMessage.java +++ b/router/java/src/net/i2p/data/i2np/DataMessage.java @@ -12,7 +12,7 @@ import java.io.IOException; import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; -import net.i2p.util.Log; +// import net.i2p.util.Log; /** * Defines a message containing arbitrary bytes of data @@ -20,11 +20,11 @@ import net.i2p.util.Log; * @author jrandom */ public class DataMessage extends I2NPMessageImpl { - private final static Log _log = new Log(DataMessage.class); + // private final static Log _log = new Log(DataMessage.class); public final static int MESSAGE_TYPE = 20; private byte _data[]; - private static final int MAX_SIZE = 64*1024; + // private static final int MAX_SIZE = 64*1024; // LINT -- field hides another field, and not used public DataMessage(I2PAppContext context) { super(context); @@ -81,6 +81,7 @@ public class DataMessage extends I2NPMessageImpl { return curIndex; } + @Override protected void written() { super.written(); _data = null; @@ -88,10 +89,12 @@ public class DataMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return DataHelper.hashCode(getData()); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof DataMessage) ) { DataMessage msg = (DataMessage)object; @@ -101,8 +104,9 @@ public class DataMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DataMessage: "); buf.append("\n\tData: ").append(DataHelper.toString(getData(), 64)); buf.append("]"); diff --git a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java index 4a6da92e3..43e2ee8d5 100644 --- a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java +++ b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java @@ -215,6 +215,7 @@ public class DatabaseLookupMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return DataHelper.hashCode(getSearchKey()) + DataHelper.hashCode(getFrom()) + @@ -222,6 +223,7 @@ public class DatabaseLookupMessage extends I2NPMessageImpl { DataHelper.hashCode(_dontIncludePeers); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof DatabaseLookupMessage) ) { DatabaseLookupMessage msg = (DatabaseLookupMessage)object; @@ -234,8 +236,9 @@ public class DatabaseLookupMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DatabaseLookupMessage: "); buf.append("\n\tSearch Key: ").append(getSearchKey()); buf.append("\n\tFrom: ").append(getFrom()); diff --git a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java index 2f1bc87e7..f477ef2a1 100644 --- a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java +++ b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java @@ -110,6 +110,7 @@ public class DatabaseSearchReplyMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof DatabaseSearchReplyMessage) ) { DatabaseSearchReplyMessage msg = (DatabaseSearchReplyMessage)object; @@ -121,14 +122,16 @@ public class DatabaseSearchReplyMessage extends I2NPMessageImpl { } } + @Override public int hashCode() { return DataHelper.hashCode(getSearchKey()) + DataHelper.hashCode(getFromHash()) + DataHelper.hashCode(_peerHashes); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DatabaseSearchReplyMessage: "); buf.append("\n\tSearch Key: ").append(getSearchKey()); buf.append("\n\tReplies: # = ").append(getNumReplies()); diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java index cb838daca..9bf61e843 100644 --- a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java +++ b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java @@ -231,6 +231,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return DataHelper.hashCode(getKey()) + DataHelper.hashCode(getLeaseSet()) + @@ -241,6 +242,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { DataHelper.hashCode(getReplyGateway()); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof DatabaseStoreMessage) ) { DatabaseStoreMessage msg = (DatabaseStoreMessage)object; @@ -256,8 +258,9 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DatabaseStoreMessage: "); buf.append("\n\tExpiration: ").append(getMessageExpiration()); buf.append("\n\tUnique ID: ").append(getUniqueId()); diff --git a/router/java/src/net/i2p/data/i2np/DateMessage.java b/router/java/src/net/i2p/data/i2np/DateMessage.java index 554c31ef2..166ecafd3 100644 --- a/router/java/src/net/i2p/data/i2np/DateMessage.java +++ b/router/java/src/net/i2p/data/i2np/DateMessage.java @@ -53,10 +53,12 @@ public class DateMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return (int)getNow(); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof DateMessage) ) { DateMessage msg = (DateMessage)object; @@ -66,8 +68,9 @@ public class DateMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DateMessage: "); buf.append("Now: ").append(_now); buf.append("]"); diff --git a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java index 3e46fc8fe..98935a394 100644 --- a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java +++ b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java @@ -350,6 +350,7 @@ public class DeliveryInstructions extends DataStructureImpl { + getAdditionalInfoSize(); } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof DeliveryInstructions)) return false; @@ -364,6 +365,7 @@ public class DeliveryInstructions extends DataStructureImpl { DataHelper.eq(getTunnelId(), instr.getTunnelId()); } + @Override public int hashCode() { return (int)getDelaySeconds() + getDeliveryMode() + @@ -373,8 +375,9 @@ public class DeliveryInstructions extends DataStructureImpl { DataHelper.hashCode(getTunnelId()); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[DeliveryInstructions: "); buf.append("\n\tDelivery mode: "); switch (getDeliveryMode()) { diff --git a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java index 9f1d61b45..9325a6333 100644 --- a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java +++ b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java @@ -64,10 +64,12 @@ public class DeliveryStatusMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return (int)getMessageId() + (int)getArrival(); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof DeliveryStatusMessage) ) { DeliveryStatusMessage msg = (DeliveryStatusMessage)object; @@ -78,8 +80,9 @@ public class DeliveryStatusMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[DeliveryStatusMessage: "); buf.append("\n\tMessage ID: ").append(getMessageId()); buf.append("\n\tArrival: ").append(_context.clock().now() - _arrival); diff --git a/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java b/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java index 8f5763ae4..4b3f919c8 100644 --- a/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java +++ b/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java @@ -44,17 +44,20 @@ public class EndPointPrivateKey extends DataStructureImpl { _key.writeBytes(out); } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof EndPointPublicKey)) return false; return DataHelper.eq(getKey(), ((EndPointPublicKey)obj).getKey()); } + @Override public int hashCode() { if (_key == null) return 0; return getKey().hashCode(); } + @Override public String toString() { return "[EndPointPrivateKey: " + getKey() + "]"; } diff --git a/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java b/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java index 3920d0bda..a366bf73b 100644 --- a/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java +++ b/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java @@ -44,17 +44,20 @@ public class EndPointPublicKey extends DataStructureImpl { _key.writeBytes(out); } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof EndPointPublicKey)) return false; return DataHelper.eq(getKey(), ((EndPointPublicKey)obj).getKey()); } + @Override public int hashCode() { if (_key == null) return 0; return getKey().hashCode(); } + @Override public String toString() { return "[EndPointPublicKey: " + getKey() + "]"; } diff --git a/router/java/src/net/i2p/data/i2np/GarlicClove.java b/router/java/src/net/i2p/data/i2np/GarlicClove.java index cb6808756..867071c86 100644 --- a/router/java/src/net/i2p/data/i2np/GarlicClove.java +++ b/router/java/src/net/i2p/data/i2np/GarlicClove.java @@ -107,25 +107,25 @@ public class GarlicClove extends DataStructureImpl { public void writeBytes(OutputStream out) throws DataFormatException, IOException { - StringBuffer error = null; + StringBuilder error = null; if (_instructions == null) { - if (error == null) error = new StringBuffer(); + if (error == null) error = new StringBuilder(); error.append("No instructions "); } if (_msg == null) { - if (error == null) error = new StringBuffer(); + if (error == null) error = new StringBuilder(); error.append("No message "); } if (_cloveId < 0) { - if (error == null) error = new StringBuffer(); + if (error == null) error = new StringBuilder(); error.append("CloveID < 0 [").append(_cloveId).append("] "); } if (_expiration == null) { - if (error == null) error = new StringBuffer(); + if (error == null) error = new StringBuilder(); error.append("Expiration is null "); } if (_certificate == null) { - if (error == null) error = new StringBuffer(); + if (error == null) error = new StringBuilder(); error.append("Certificate is null "); } @@ -156,6 +156,7 @@ public class GarlicClove extends DataStructureImpl { _log.debug("Written cert: " + _certificate); } + @Override public byte[] toByteArray() { byte rv[] = new byte[estimateSize()]; int offset = 0; @@ -186,6 +187,7 @@ public class GarlicClove extends DataStructureImpl { + _certificate.size(); // certificate } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof GarlicClove)) return false; @@ -197,6 +199,7 @@ public class GarlicClove extends DataStructureImpl { DataHelper.eq(getInstructions(), clove.getInstructions()); } + @Override public int hashCode() { return DataHelper.hashCode(getCertificate()) + (int)getCloveId() + @@ -205,8 +208,9 @@ public class GarlicClove extends DataStructureImpl { DataHelper.hashCode(getInstructions()); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[GarlicClove: "); buf.append("\n\tInstructions: ").append(getInstructions()); buf.append("\n\tCertificate: ").append(getCertificate()); diff --git a/router/java/src/net/i2p/data/i2np/GarlicMessage.java b/router/java/src/net/i2p/data/i2np/GarlicMessage.java index 5d76a2b22..88d2f2b37 100644 --- a/router/java/src/net/i2p/data/i2np/GarlicMessage.java +++ b/router/java/src/net/i2p/data/i2np/GarlicMessage.java @@ -67,15 +67,18 @@ public class GarlicMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return DataHelper.hashCode(getData()); } + @Override protected void written() { super.written(); _data = null; } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof GarlicMessage) ) { GarlicMessage msg = (GarlicMessage)object; @@ -85,8 +88,9 @@ public class GarlicMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[GarlicMessage: "); buf.append("\n\tData length: ").append(getData().length).append(" bytes"); buf.append("]"); diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java index b745db9c0..e241ff1f4 100644 --- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java +++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java @@ -187,6 +187,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM return calculateWrittenLength()+5; } + @Override public byte[] toByteArray() { byte data[] = new byte[getMessageSize()]; int written = toByteArray(data); diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java b/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java index f89e4b898..4d0008642 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java +++ b/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java @@ -232,6 +232,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl { } + @Override public byte[] toByteArray() { byte rv[] = super.toByteArray(); if (rv == null) @@ -239,6 +240,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl { return rv; } + @Override public int hashCode() { return DataHelper.hashCode(getNextRouter()) + DataHelper.hashCode(getNextTunnelId()) + @@ -246,6 +248,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl { DataHelper.hashCode(getReplyTunnel()); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof TunnelCreateMessage) ) { TunnelCreateMessage msg = (TunnelCreateMessage)object; @@ -258,8 +261,9 @@ public class TunnelCreateMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[TunnelCreateMessage: "); buf.append("\n\tNext Router: ").append(getNextRouter()); buf.append("\n\tNext Tunnel: ").append(getNextTunnelId()); diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java b/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java index a5994f26d..07185f340 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java +++ b/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java @@ -87,12 +87,14 @@ public class TunnelCreateStatusMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return DataHelper.hashCode(getReceiveTunnelId()) + getStatus() + (int)getNonce(); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof TunnelCreateStatusMessage) ) { TunnelCreateStatusMessage msg = (TunnelCreateStatusMessage)object; @@ -104,8 +106,9 @@ public class TunnelCreateStatusMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[TunnelCreateStatusMessage: "); buf.append("\n\tTunnel ID: ").append(getReceiveTunnelId()); buf.append("\n\tStatus: ").append(getStatus()); diff --git a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java index a07b99069..a55efc2b1 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java +++ b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java @@ -112,11 +112,13 @@ public class TunnelDataMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return (int)_tunnelId + DataHelper.hashCode(_data); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof TunnelDataMessage) ) { TunnelDataMessage msg = (TunnelDataMessage)object; @@ -127,6 +129,7 @@ public class TunnelDataMessage extends I2NPMessageImpl { } } + @Override public byte[] toByteArray() { byte rv[] = super.toByteArray(); if (rv == null) @@ -134,8 +137,9 @@ public class TunnelDataMessage extends I2NPMessageImpl { return rv; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[TunnelDataMessage:"); buf.append(" MessageId: ").append(getUniqueId()); buf.append(" Tunnel ID: ").append(getTunnelId()); diff --git a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java index f611c3213..43fc4bce6 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java +++ b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java @@ -75,6 +75,11 @@ public class TunnelGatewayMessage extends I2NPMessageImpl { } DataHelper.toLong(out, curIndex, 2, _msgData.length); curIndex += 2; + // where is this coming from? + if (curIndex + _msgData.length > out.length) { + _log.log(Log.ERROR, "output buffer too small idx: " + curIndex + " len: " + _msgData.length + " outlen: " + out.length); + throw new I2NPMessageException("Too much data to write out (id=" + _tunnelId + " data=" + _msg + ")"); + } System.arraycopy(_msgData, 0, out, curIndex, _msgData.length); curIndex += _msgData.length; return curIndex; @@ -85,6 +90,7 @@ public class TunnelGatewayMessage extends I2NPMessageImpl { I2NPMessageHandler h = new I2NPMessageHandler(_context); readMessage(data, offset, dataSize, type, h); } + @Override public void readMessage(byte data[], int offset, int dataSize, int type, I2NPMessageHandler handler) throws I2NPMessageException, IOException { if (type != MESSAGE_TYPE) throw new I2NPMessageException("Message type is incorrect for this message"); int curIndex = offset; @@ -105,11 +111,13 @@ public class TunnelGatewayMessage extends I2NPMessageImpl { public int getType() { return MESSAGE_TYPE; } + @Override public int hashCode() { return DataHelper.hashCode(getTunnelId()) + DataHelper.hashCode(_msg); } + @Override public boolean equals(Object object) { if ( (object != null) && (object instanceof TunnelGatewayMessage) ) { TunnelGatewayMessage msg = (TunnelGatewayMessage)object; @@ -121,8 +129,9 @@ public class TunnelGatewayMessage extends I2NPMessageImpl { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("[TunnelGatewayMessage:"); buf.append(" Tunnel ID: ").append(getTunnelId()); buf.append(" Message: ").append(_msg); diff --git a/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java b/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java index b73cbfa79..c4effc303 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java +++ b/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java @@ -44,17 +44,20 @@ public class TunnelSessionKey extends DataStructureImpl { _key.writeBytes(out); } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof TunnelSessionKey)) return false; return DataHelper.eq(getKey(), ((TunnelSessionKey)obj).getKey()); } + @Override public int hashCode() { if (_key == null) return 0; return getKey().hashCode(); } + @Override public String toString() { return "[TunnelSessionKey: " + getKey() + "]"; } diff --git a/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java b/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java index ec1f88746..03d017915 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java +++ b/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java @@ -45,17 +45,20 @@ public class TunnelSigningPrivateKey extends DataStructureImpl { _key.writeBytes(out); } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof TunnelSigningPrivateKey)) return false; return DataHelper.eq(getKey(), ((TunnelSigningPrivateKey)obj).getKey()); } + @Override public int hashCode() { if (_key == null) return 0; return getKey().hashCode(); } + @Override public String toString() { return "[EndPointPrivateKey: " + getKey() + "]"; } diff --git a/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java b/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java index 9ce7e79ad..1f3530949 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java +++ b/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java @@ -44,17 +44,20 @@ public class TunnelSigningPublicKey extends DataStructureImpl { _key.writeBytes(out); } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof TunnelSigningPublicKey)) return false; return DataHelper.eq(getKey(), ((TunnelSigningPublicKey)obj).getKey()); } + @Override public int hashCode() { if (_key == null) return 0; return getKey().hashCode(); } + @Override public String toString() { return "[TunnelSigningPublicKey: " + getKey() + "]"; } diff --git a/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java b/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java index aec62c93e..7c2e4f001 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java +++ b/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java @@ -69,6 +69,7 @@ public class TunnelVerificationStructure extends DataStructureImpl { _authSignature.writeBytes(out); } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof TunnelVerificationStructure)) return false; @@ -77,11 +78,13 @@ public class TunnelVerificationStructure extends DataStructureImpl { DataHelper.eq(getAuthorizationSignature(), str.getAuthorizationSignature()); } + @Override public int hashCode() { if ( (_msgHash == null) || (_authSignature == null) ) return 0; return getMessageHash().hashCode() + getAuthorizationSignature().hashCode(); } + @Override public String toString() { return "[TunnelVerificationStructure: " + getMessageHash() + " " + getAuthorizationSignature() + "]"; } diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java index 1c50eaa65..b50017ca5 100644 --- a/router/java/src/net/i2p/router/Blocklist.java +++ b/router/java/src/net/i2p/router/Blocklist.java @@ -13,14 +13,13 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.*; -import net.i2p.I2PAppContext; import net.i2p.data.Base64; import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.RouterAddress; import net.i2p.data.RouterInfo; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; -import net.i2p.util.HexDump; +import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; /** @@ -55,22 +54,18 @@ public class Blocklist { private RouterContext _context; private long _blocklist[]; private int _blocklistSize; - private Object _lock; + private final Object _lock = new Object(); private Entry _wrapSave; - private Set _inProcess; - private Map _peerBlocklist; - private Set _singleIPBlocklist; + private final Set _inProcess = new HashSet(0); + private Map _peerBlocklist = new HashMap(0); + private final Set _singleIPBlocklist = new ConcurrentHashSet(0); public Blocklist(RouterContext context) { _context = context; _log = context.logManager().getLog(Blocklist.class); _blocklist = null; _blocklistSize = 0; - _lock = new Object(); _wrapSave = null; - _inProcess = new HashSet(0); - _peerBlocklist = new HashMap(0); - _singleIPBlocklist = new HashSet(0); } public Blocklist() { @@ -116,7 +111,7 @@ public class Blocklist { } for (Iterator iter = _peerBlocklist.keySet().iterator(); iter.hasNext(); ) { Hash peer = (Hash) iter.next(); - String reason = "Blocklisted by router hash"; + String reason = "Banned by router hash"; String comment = (String) _peerBlocklist.get(peer); if (comment != null) reason = reason + ": " + comment; @@ -171,6 +166,8 @@ public class Blocklist { */ private void readBlocklistFile(String file) { File BLFile = new File(file); + if (!BLFile.isAbsolute()) + BLFile = new File(_context.getConfigDir(), file); if (BLFile == null || (!BLFile.exists()) || BLFile.length() <= 0) { if (_log.shouldLog(Log.WARN)) _log.warn("Blocklist file not found: " + file); @@ -191,7 +188,7 @@ public class Blocklist { FileInputStream in = null; try { in = new FileInputStream(BLFile); - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); while (DataHelper.readLine(in, buf) && count < maxSize) { Entry e = parse(buf, true); buf.setLength(0); @@ -270,7 +267,7 @@ public class Blocklist { } } - private Entry parse(StringBuffer buf, boolean bitch) { + private Entry parse(StringBuilder buf, boolean bitch) { byte[] ip1; byte[] ip2; int start1 = 0; @@ -381,7 +378,7 @@ public class Blocklist { FileInputStream in = null; try { in = new FileInputStream(BLFile); - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); while (DataHelper.readLine(in, buf)) { lines++; buf.setLength(0); @@ -448,15 +445,11 @@ public class Blocklist { } private boolean add(int ip) { - synchronized(_singleIPBlocklist) { - return _singleIPBlocklist.add(new Integer(ip)); - } + return _singleIPBlocklist.add(Integer.valueOf(ip)); } private boolean isOnSingleList(int ip) { - synchronized(_singleIPBlocklist) { - return _singleIPBlocklist.contains(new Integer(ip)); - } + return _singleIPBlocklist.contains(Integer.valueOf(ip)); } /** @@ -588,11 +581,11 @@ public class Blocklist { // methods to get and store the from/to values in the array - private int getFrom(long entry) { + private static int getFrom(long entry) { return (int) ((entry >> 32) & 0xffffffff); } - private int getTo(long entry) { + private static int getTo(long entry) { return (int) (entry & 0xffffffff); } @@ -604,7 +597,7 @@ public class Blocklist { * So the size is (cough) almost 2MB for the 240,000 line splist.txt. * */ - private long toEntry(byte ip1[], byte ip2[]) { + private static long toEntry(byte ip1[], byte ip2[]) { long entry = 0; for (int i = 0; i < 4; i++) entry |= ((long) (ip2[i] & 0xff)) << ((3-i)*8); @@ -623,15 +616,19 @@ public class Blocklist { _blocklist[idx] = entry; } - private int toInt(byte ip[]) { + private static int toInt(byte ip[]) { int rv = 0; for (int i = 0; i < 4; i++) rv |= (ip[i] & 0xff) << ((3-i)*8); return rv; } - private String toStr(long entry) { - StringBuffer buf = new StringBuffer(32); + public static String toStr(byte[] ip) { + return toStr(toInt(ip)); + } + + private static String toStr(long entry) { + StringBuilder buf = new StringBuilder(32); for (int i = 7; i >= 0; i--) { buf.append((entry >> (8*i)) & 0xff); if (i == 4) @@ -642,8 +639,8 @@ public class Blocklist { return buf.toString(); } - private String toStr(int ip) { - StringBuffer buf = new StringBuffer(16); + private static String toStr(int ip) { + StringBuilder buf = new StringBuilder(16); for (int i = 3; i >= 0; i--) { buf.append((ip >> (8*i)) & 0xff); if (i > 0) @@ -662,7 +659,7 @@ public class Blocklist { */ public void shitlist(Hash peer) { // Temporary reason, until the job finishes - _context.shitlist().shitlistRouterForever(peer, "IP Blocklisted"); + _context.shitlist().shitlistRouterForever(peer, "IP Banned"); if (! "true".equals( _context.getProperty(PROP_BLOCKLIST_DETAIL, "true"))) return; boolean shouldRunJob; @@ -685,7 +682,7 @@ public class Blocklist { super(_context); _peer = p; } - public String getName() { return "Shitlist Peer Forever"; } + public String getName() { return "Ban Peer by IP"; } public void runJob() { shitlistForever(_peer); synchronized (_inProcess) { @@ -706,6 +703,8 @@ public class Blocklist { private synchronized void shitlistForever(Hash peer) { String file = _context.getProperty(PROP_BLOCKLIST_FILE, BLOCKLIST_FILE_DEFAULT); File BLFile = new File(file); + if (!BLFile.isAbsolute()) + BLFile = new File(_context.getConfigDir(), file); if (BLFile == null || (!BLFile.exists()) || BLFile.length() <= 0) { if (_log.shouldLog(Log.ERROR)) _log.error("Blocklist file not found: " + file); @@ -720,7 +719,7 @@ public class Blocklist { FileInputStream in = null; try { in = new FileInputStream(BLFile); - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); // assume the file is unsorted, so go through the whole thing while (DataHelper.readLine(in, buf)) { Entry e = parse(buf, false); @@ -736,7 +735,7 @@ public class Blocklist { if (i != 3) reason = reason + '.'; } - reason = reason + " blocklisted by entry \"" + buf + "\""; + reason = reason + " banned by " + BLOCKLIST_FILE_DEFAULT + " entry \"" + buf + "\""; if (_log.shouldLog(Log.WARN)) _log.warn("Shitlisting " + peer + " " + reason); _context.shitlist().shitlistRouterForever(peer, reason); @@ -754,37 +753,34 @@ public class Blocklist { // We already shitlisted in shitlist(peer), that's good enough } + /** write directly to the stream so we don't OOM on a huge list */ public void renderStatusHTML(Writer out) throws IOException { - StringBuffer buf = new StringBuffer(1024); - buf.append("

          IP Blocklist

          "); + out.write("

          Banned IPs

          "); Set singles = new TreeSet(); - synchronized(_singleIPBlocklist) { - singles.addAll(_singleIPBlocklist); - } + singles.addAll(_singleIPBlocklist); if (singles.size() > 0) { - buf.append(""); + out.write("
          Transient IPs
          "); for (Iterator iter = singles.iterator(); iter.hasNext(); ) { int ip = ((Integer) iter.next()).intValue(); - buf.append("\n"); + out.write("\n"); } - buf.append("
          Transient IPs
          ").append(toStr(ip)).append("
          "); out.write(toStr(ip)); out.write("
          "); + out.write("
      "); } if (_blocklistSize > 0) { - buf.append(""); + out.write("
      IPs from Blocklist File
      FromTo
      "); for (int i = 0; i < _blocklistSize; i++) { int from = getFrom(_blocklist[i]); - buf.append("\n"); - else - buf.append(" \n"); + if (to != from) { + out.write(toStr(to)); out.write("\n"); + } else + out.write(" \n"); } - buf.append("
      IPs from Blocklist File
      From:To:
      ").append(toStr(from)).append(""); + out.write("
      "); out.write(toStr(from)); out.write(""); int to = getTo(_blocklist[i]); - if (to != from) - buf.append(toStr(to)).append("
      "); + out.write("
    "); } else { - buf.append("
    No blocklist file entries"); + out.write("
    No blocklist file entries."); } - out.write(buf.toString()); out.flush(); } diff --git a/router/java/src/net/i2p/router/ClientManagerFacade.java b/router/java/src/net/i2p/router/ClientManagerFacade.java index 07f6e561f..0ce20df6a 100644 --- a/router/java/src/net/i2p/router/ClientManagerFacade.java +++ b/router/java/src/net/i2p/router/ClientManagerFacade.java @@ -13,6 +13,7 @@ import java.io.Writer; import java.util.Collections; import java.util.Set; +import net.i2p.crypto.SessionKeyManager; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; @@ -72,6 +73,7 @@ public abstract class ClientManagerFacade implements Service { public abstract void messageReceived(ClientMessage msg); public boolean verifyClientLiveliness() { return true; } + public boolean isAlive() { return true; } /** * Does the client specified want their leaseSet published? */ @@ -90,5 +92,6 @@ public abstract class ClientManagerFacade implements Service { * */ public abstract SessionConfig getClientSessionConfig(Destination dest); + public abstract SessionKeyManager getClientSessionKeyManager(Destination dest); public void renderStatusHTML(Writer out) throws IOException { } } diff --git a/router/java/src/net/i2p/router/ClientTunnelSettings.java b/router/java/src/net/i2p/router/ClientTunnelSettings.java index e0f95e611..cc8c74e6c 100644 --- a/router/java/src/net/i2p/router/ClientTunnelSettings.java +++ b/router/java/src/net/i2p/router/ClientTunnelSettings.java @@ -44,8 +44,9 @@ public class ClientTunnelSettings { _outboundSettings.writeToProperties("outbound.", props); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); Properties p = new Properties(); writeToProperties(p); buf.append("Client tunnel settings:\n"); diff --git a/router/java/src/net/i2p/router/CommSystemFacade.java b/router/java/src/net/i2p/router/CommSystemFacade.java index 6d0927c63..e8a45724e 100644 --- a/router/java/src/net/i2p/router/CommSystemFacade.java +++ b/router/java/src/net/i2p/router/CommSystemFacade.java @@ -34,7 +34,9 @@ public abstract class CommSystemFacade implements Service { public int countActivePeers() { return 0; } public int countActiveSendPeers() { return 0; } - public boolean haveCapacity() { return true; } + public boolean haveInboundCapacity(int pct) { return true; } + public boolean haveOutboundCapacity(int pct) { return true; } + public boolean haveHighOutboundCapacity() { return true; } public List getMostRecentErrorMessages() { return Collections.EMPTY_LIST; } /** @@ -58,6 +60,11 @@ public abstract class CommSystemFacade implements Service { public boolean isBacklogged(Hash dest) { return false; } public boolean wasUnreachable(Hash dest) { return false; } public boolean isEstablished(Hash dest) { return false; } + public byte[] getIP(Hash dest) { return null; } + public void queueLookup(byte[] ip) {} + public String getCountry(Hash peer) { return null; } + public String getCountryName(String code) { return code; } + public String renderPeerHTML(Hash peer) { return null; } /** * Tell other transports our address changed diff --git a/router/java/src/net/i2p/router/DummyClientManagerFacade.java b/router/java/src/net/i2p/router/DummyClientManagerFacade.java index 61e312875..5e362e3dd 100644 --- a/router/java/src/net/i2p/router/DummyClientManagerFacade.java +++ b/router/java/src/net/i2p/router/DummyClientManagerFacade.java @@ -8,6 +8,7 @@ package net.i2p.router; * */ +import net.i2p.crypto.SessionKeyManager; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; @@ -40,6 +41,7 @@ public class DummyClientManagerFacade extends ClientManagerFacade { public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered) {} public SessionConfig getClientSessionConfig(Destination _dest) { return null; } + public SessionKeyManager getClientSessionKeyManager(Destination _dest) { return null; } public void requestLeaseSet(Hash dest, LeaseSet set) {} diff --git a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java index f50e7b368..e192e7752 100644 --- a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java @@ -58,6 +58,7 @@ class DummyNetworkDatabaseFacade extends NetworkDatabaseFacade { _routers.remove(dbEntry); } + public Set getAllRouters() { return new HashSet(_routers.keySet()); } public Set findNearestRouters(Hash key, int maxNumRouters, Set peersToIgnore) { return new HashSet(_routers.values()); } public void renderStatusHTML(Writer out) throws IOException {} diff --git a/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java b/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java index f7f204857..3a19cd117 100644 --- a/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java +++ b/router/java/src/net/i2p/router/DummyTunnelManagerFacade.java @@ -10,6 +10,7 @@ package net.i2p.router; import java.io.IOException; import java.io.Writer; +import java.util.Set; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -26,7 +27,6 @@ class DummyTunnelManagerFacade implements TunnelManagerFacade { public TunnelInfo selectInboundTunnel(Hash destination) { return null; } public TunnelInfo selectOutboundTunnel() { return null; } public TunnelInfo selectOutboundTunnel(Hash destination) { return null; } - public boolean isInUse(Hash peer) { return false; } public boolean isValidTunnel(Hash client, TunnelInfo tunnel) { return false; } public int getParticipatingCount() { return 0; } public int getFreeTunnelCount() { return 0; } @@ -44,6 +44,7 @@ class DummyTunnelManagerFacade implements TunnelManagerFacade { public void setInboundSettings(Hash client, TunnelPoolSettings settings) {} public void setOutboundSettings(Hash client, TunnelPoolSettings settings) {} public int getInboundBuildQueueSize() { return 0; } + public Set selectPeersInTooManyTunnels() { return null; } public void renderStatusHTML(Writer out) throws IOException {} public void restart() {} diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java index 4ab5c77b4..802aedec0 100644 --- a/router/java/src/net/i2p/router/InNetMessagePool.java +++ b/router/java/src/net/i2p/router/InNetMessagePool.java @@ -35,9 +35,9 @@ public class InNetMessagePool implements Service { private Log _log; private RouterContext _context; private HandlerJobBuilder _handlerJobBuilders[]; - private List _pendingDataMessages; - private List _pendingDataMessagesFrom; - private List _pendingGatewayMessages; + private final List _pendingDataMessages; + private final List _pendingDataMessagesFrom; + private final List _pendingGatewayMessages; private SharedShortCircuitDataJob _shortCircuitDataJob; private SharedShortCircuitGatewayJob _shortCircuitGatewayJob; private boolean _alive; diff --git a/router/java/src/net/i2p/router/JobImpl.java b/router/java/src/net/i2p/router/JobImpl.java index 84190940b..2934855c8 100644 --- a/router/java/src/net/i2p/router/JobImpl.java +++ b/router/java/src/net/i2p/router/JobImpl.java @@ -33,8 +33,9 @@ public abstract class JobImpl implements Job { public final RouterContext getContext() { return _context; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(super.toString()); buf.append(": Job ").append(_id).append(": ").append(getName()); return buf.toString(); diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index 915288cc6..af58277ca 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -33,7 +33,7 @@ public class JobQueue { private RouterContext _context; /** Integer (runnerId) to JobQueueRunner for created runners */ - private HashMap _queueRunners; + private final HashMap _queueRunners; /** a counter to identify a job runner */ private volatile static int _runnerId = 0; /** list of jobs that are ready to run ASAP */ @@ -41,7 +41,7 @@ public class JobQueue { /** list of jobs that are scheduled for running in the future */ private ArrayList _timedJobs; /** job name to JobStat for that job */ - private SortedMap _jobStats; + private final SortedMap _jobStats; /** how many job queue runners can go concurrently */ private int _maxRunners = 1; private QueuePumper _pumper; @@ -50,7 +50,7 @@ public class JobQueue { /** have we been killed or are we alive? */ private boolean _alive; - private Object _jobLock; + private final Object _jobLock; /** default max # job queue runners operating */ private final static int DEFAULT_MAX_RUNNERS = 1; @@ -94,7 +94,7 @@ public class JobQueue { * queue runners wait on this whenever they're not doing anything, and * this gets notified *once* whenever there are ready jobs */ - private Object _runnerLock = new Object(); + private final Object _runnerLock = new Object(); public JobQueue(RouterContext context) { _context = context; @@ -245,7 +245,7 @@ public class JobQueue { _jobLock.notifyAll(); } if (_log.shouldLog(Log.WARN)) { - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); buf.append("current jobs: \n"); for (Iterator iter = _queueRunners.values().iterator(); iter.hasNext(); ) { JobQueueRunner runner = (JobQueueRunner)iter.next(); @@ -587,7 +587,7 @@ public class JobQueue { numRunners = _queueRunners.size(); } - StringBuffer str = new StringBuffer(128); + StringBuilder str = new StringBuilder(128); str.append("\n"); out.flush(); - StringBuffer buf = new StringBuffer(32*1024); - buf.append("

    JobQueue

    "); - buf.append("# runners: ").append(numRunners).append(" [states="); + StringBuilder buf = new StringBuilder(32*1024); + buf.append("

    I2P JobQueue

    # runners: ").append(numRunners).append(" [states="); if (states != null) for (int i = 0; i < states.length; i++) buf.append(states[i]).append(" "); - buf.append("]
    \n"); + buf.append("]

    \n"); long now = _context.clock().now(); - buf.append("# active jobs: ").append(activeJobs.size()).append("
      \n"); + buf.append("
      # active jobs: ").append(activeJobs.size()).append("
        \n"); for (int i = 0; i < activeJobs.size(); i++) { Job j = (Job)activeJobs.get(i); buf.append("
      1. [started ").append(now-j.getTiming().getStartAfter()).append("ms ago]: "); buf.append(j.toString()).append("
      2. \n"); } buf.append("
      \n"); - buf.append("# just finished jobs: ").append(justFinishedJobs.size()).append("
        \n"); + buf.append("
        # just finished jobs: ").append(justFinishedJobs.size()).append("
          \n"); for (int i = 0; i < justFinishedJobs.size(); i++) { Job j = (Job)justFinishedJobs.get(i); buf.append("
        1. [finished ").append(now-j.getTiming().getActualEnd()).append("ms ago]: "); buf.append(j.toString()).append("
        2. \n"); } buf.append("
        \n"); - buf.append("# ready/waiting jobs: ").append(readyJobs.size()).append(" (lots of these mean there's likely a big problem)
          \n"); + buf.append("
          # ready/waiting jobs: ").append(readyJobs.size()).append(" (lots of these mean there's likely a big problem)
            \n"); for (int i = 0; i < readyJobs.size(); i++) { Job j = (Job)readyJobs.get(i); buf.append("
          1. [waiting "); @@ -641,7 +640,7 @@ public class JobQueue { buf.append("
          \n"); out.flush(); - buf.append("# timed jobs: ").append(timedJobs.size()).append("
            \n"); + buf.append("
            # timed jobs: ").append(timedJobs.size()).append("
              \n"); TreeMap ordered = new TreeMap(); for (int i = 0; i < timedJobs.size(); i++) { Job j = (Job)timedJobs.get(i); @@ -653,7 +652,7 @@ public class JobQueue { buf.append("
            1. ").append(j.getName()).append(" in "); buf.append(DataHelper.formatDuration(time)).append("
            2. \n"); } - buf.append("
            \n"); + buf.append("
    \n"); out.write("\n"); out.flush(); @@ -667,11 +666,11 @@ public class JobQueue { } /** render the HTML for the job stats */ - private void getJobStats(StringBuffer buf) { - buf.append("\n"); - buf.append(""); - buf.append(""); - buf.append("\n"); + private void getJobStats(StringBuilder buf) { + buf.append("
    JobRunsTimeAvgMaxMinPendingAvgMaxMin
    \n"); + buf.append(""); + buf.append(""); + buf.append("\n"); long totRuns = 0; long totExecTime = 0; long avgExecTime = 0; @@ -735,6 +734,6 @@ public class JobQueue { buf.append(""); buf.append("\n"); - buf.append("
    JobRunsTimeAvgMaxMinPendingAvgMaxMin
    ").append(minPendingTime).append("
    \n"); + buf.append("
    \n"); } } diff --git a/router/java/src/net/i2p/router/JobStats.java b/router/java/src/net/i2p/router/JobStats.java index d3cf345d0..148fb7410 100644 --- a/router/java/src/net/i2p/router/JobStats.java +++ b/router/java/src/net/i2p/router/JobStats.java @@ -59,7 +59,9 @@ class JobStats { return 0; } + @Override public int hashCode() { return _job.hashCode(); } + @Override public boolean equals(Object obj) { if ( (obj != null) && (obj instanceof JobStats) ) { JobStats stats = (JobStats)obj; @@ -73,8 +75,9 @@ class JobStats { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("Over ").append(getRuns()).append(" runs, job ").append(getName()).append(" took "); buf.append(getTotalTime()).append("ms (").append(getAvgTime()).append("ms/").append(getMaxTime()).append("ms/"); buf.append(getMinTime()).append("ms avg/max/min) after a total lag of "); diff --git a/router/java/src/net/i2p/router/KeyManager.java b/router/java/src/net/i2p/router/KeyManager.java index 4e2ed2c51..711759a40 100644 --- a/router/java/src/net/i2p/router/KeyManager.java +++ b/router/java/src/net/i2p/router/KeyManager.java @@ -41,7 +41,7 @@ public class KeyManager { private PublicKey _publicKey; private SigningPrivateKey _signingPrivateKey; private SigningPublicKey _signingPublicKey; - private Map _leaseSetKeys; // Destination --> LeaseSetKeys + private final Map _leaseSetKeys; // Destination --> LeaseSetKeys private SynchronizeKeysJob _synchronizeJob; public final static String PROP_KEYDIR = "router.keyBackupDir"; @@ -147,10 +147,8 @@ public class KeyManager { super(KeyManager.this._context); } public void runJob() { - String keyDir = getContext().getProperty(PROP_KEYDIR); - if (keyDir == null) - keyDir = DEFAULT_KEYDIR; - File dir = new File(keyDir); + String keyDir = getContext().getProperty(PROP_KEYDIR, DEFAULT_KEYDIR); + File dir = new File(getContext().getRouterDir(), keyDir); if (!dir.exists()) dir.mkdirs(); if (dir.exists() && dir.isDirectory() && dir.canRead() && dir.canWrite()) { diff --git a/router/java/src/net/i2p/router/LeaseSetKeys.java b/router/java/src/net/i2p/router/LeaseSetKeys.java index c88b0808a..1017ab43d 100644 --- a/router/java/src/net/i2p/router/LeaseSetKeys.java +++ b/router/java/src/net/i2p/router/LeaseSetKeys.java @@ -73,6 +73,7 @@ public class LeaseSetKeys extends DataStructureImpl { _revocationKey.writeBytes(out); } + @Override public int hashCode() { int rv = 0; rv += DataHelper.hashCode(_dest); @@ -81,6 +82,7 @@ public class LeaseSetKeys extends DataStructureImpl { return rv; } + @Override public boolean equals(Object obj) { if ( (obj != null) && (obj instanceof LeaseSetKeys) ) { LeaseSetKeys keys = (LeaseSetKeys)obj; diff --git a/router/java/src/net/i2p/router/LoadTestManager.java b/router/java/src/net/i2p/router/LoadTestManager.java deleted file mode 100644 index d3e5c46f5..000000000 --- a/router/java/src/net/i2p/router/LoadTestManager.java +++ /dev/null @@ -1,639 +0,0 @@ -package net.i2p.router; - -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import net.i2p.I2PAppContext; -import net.i2p.data.Certificate; -import net.i2p.data.Hash; -import net.i2p.data.RouterInfo; -import net.i2p.data.SessionKey; -import net.i2p.data.SessionTag; -import net.i2p.data.TunnelId; -import net.i2p.data.i2np.DataMessage; -import net.i2p.data.i2np.DeliveryInstructions; -import net.i2p.data.i2np.DeliveryStatusMessage; -import net.i2p.data.i2np.GarlicMessage; -import net.i2p.data.i2np.I2NPMessage; -import net.i2p.data.i2np.TunnelGatewayMessage; -import net.i2p.router.message.GarlicMessageBuilder; -import net.i2p.router.message.PayloadGarlicConfig; -import net.i2p.router.tunnel.TunnelCreatorConfig; -import net.i2p.util.Log; -import net.i2p.util.SimpleTimer; - -/** - * Coordinate some tests of peers to see how much load they can handle. If - * TEST_LIVE_TUNNELS is set to false, it builds load test tunnels across various - * peers in ways that are not anonymity sensitive (but may help with testing the net). - * If it is set to true, however, it runs a few tests at a time for actual tunnels that - * are built, to help determine whether our peer selection is insufficient. - * - * Load tests of fake tunnels are conducted by building a single one hop inbound - * tunnel with the peer in question acting as the inbound gateway. We then send - * messages directly to that gateway, which they batch up and send "down the - * tunnel" (aka directly to us), at which point we then send another message, - * and so on, until the tunnel expires. Along the way, we record a few vital - * stats to the "loadtest.log" file. If we don't receive a message, we send another - * after 10 seconds. - * - * If "router.loadTestSmall=true", we transmit a tiny DeliveryStatusMessage (~96 bytes - * at the SSU level), which is sent back to us as a single TunnelDataMessage (~1KB). - * Otherwise, we transmit a 4KB DataMessage wrapped inside a garlic message, which is - * sent back to us as five (1KB) TunnelDataMessages. This size is chosen because the - * streaming lib uses 4KB messages by default. - * - * Load tests of live tunnels pick a random tunnel from the tested pool's pair (e.g. if - * we are testing an outbound tunnel for a particular destination, it picks an inbound - * tunnel from that destination's inbound pool), with each message going down that one - * randomly paired tunnel for the duration of the load test (varying the paired tunnel - * with each message had poor results) - * - */ -public class LoadTestManager { - private RouterContext _context; - private Log _log; - private Writer _out; - private List _untestedPeers; - private List _active; - - private static final String PROP_LOG_DATA = "router.loadTestLog"; - private static final String DEFAULT_LOG_DATA = "false"; - - public LoadTestManager(RouterContext ctx) { - _context = ctx; - _log = ctx.logManager().getLog(LoadTestManager.class); - _active = Collections.synchronizedList(new ArrayList()); - if (Boolean.valueOf(ctx.getProperty(PROP_LOG_DATA, DEFAULT_LOG_DATA)).booleanValue()) { - try { - _out = new BufferedWriter(new FileWriter("loadtest.log", true)); - _out.write("startup at " + ctx.clock().now() + "\n"); - } catch (IOException ioe) { - _log.log(Log.CRIT, "error creating log", ioe); - } - } - _context.statManager().createRateStat("test.lifetimeSuccessful", "How many messages we can pump through a load test during a tunnel's lifetime", "test", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("test.lifetimeFailed", "How many messages we fail to pump through (period == successful)", "test", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("test.timeoutAfter", "How many messages have we successfully pumped through a tunnel when one particular message times out", "test", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("test.rtt", "How long it takes to get a reply", "test", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("test.rttHigh", "How long it takes to get a reply, if it is a slow rtt", "test", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - } - - public static final boolean TEST_LIVE_TUNNELS = true; - - /** 1 peer at a time */ - private static final int CONCURRENT_PEERS = 1; - /** 4 messages per peer at a time */ - private static final int CONCURRENT_MESSAGES = 1;//4; - - private static final boolean DEFAULT_ENABLE = false; - - /** disable all load testing for the moment */ - public static final boolean FORCE_DISABLE = true; - - public static boolean isEnabled(I2PAppContext ctx) { - if (FORCE_DISABLE) return false; - String enable = ctx.getProperty("router.enableLoadTesting"); - if ( (DEFAULT_ENABLE) && (enable != null) && (!Boolean.valueOf(enable).booleanValue()) ) - return false; - else if ( (!DEFAULT_ENABLE) && ((enable == null) || (!Boolean.valueOf(enable).booleanValue()) ) ) - return false; - return true; - } - public static void setEnableLoadTesting(RouterContext ctx, boolean enable) { - if (enable) - ctx.router().setConfigSetting("router.enableLoadTesting", "true"); - else - ctx.router().setConfigSetting("router.enableLoadTesting", "false"); - } - - private int getConcurrency() { - if (!isEnabled(_context)) return 0; - - int rv = _context.getProperty("router.loadTestConcurrency", CONCURRENT_PEERS); - if (rv < 0) - rv = 0; - if (rv > 50) - rv = 50; - return rv; - } - - private int getPeerMessages() { - int rv = _context.getProperty("router.loadTestMessagesPerPeer", CONCURRENT_MESSAGES); - if (rv < 1) - rv = 1; - if (rv > 50) - rv = 50; - return rv; - } - - /** - * Actually send the messages through the given tunnel - */ - private void runTest(LoadTestTunnelConfig tunnel) { - if (!isEnabled(_context)) return; - log(tunnel, "start"); - int peerMessages = getPeerMessages(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Run test on " + tunnel + " with " + peerMessages + " messages"); - for (int i = 0; i < peerMessages; i++) - sendTestMessage(tunnel); - } - - private void pickTunnels(LoadTestTunnelConfig tunnel) { - TunnelInfo inbound = null; - TunnelInfo outbound = null; - if (tunnel.getTunnel().isInbound()) { - inbound = _context.tunnelManager().getTunnelInfo(tunnel.getReceiveTunnelId(0)); - if ( (inbound == null) && (_log.shouldLog(Log.WARN)) ) - _log.warn("where are we? inbound tunnel isn't known: " + tunnel, new Exception("source")); - if (tunnel.getTunnel().getDestination() != null) - outbound = _context.tunnelManager().selectOutboundTunnel(tunnel.getTunnel().getDestination()); - else - outbound = _context.tunnelManager().selectOutboundTunnel(); - } else { - outbound = _context.tunnelManager().getTunnelInfo(tunnel.getSendTunnelId(0)); - if ( (outbound == null) && (_log.shouldLog(Log.WARN)) ) - _log.warn("where are we? outbound tunnel isn't known: " + tunnel, new Exception("source")); - if (tunnel.getTunnel().getDestination() != null) - inbound = _context.tunnelManager().selectInboundTunnel(tunnel.getTunnel().getDestination()); - else - inbound = _context.tunnelManager().selectInboundTunnel(); - } - tunnel.setInbound(inbound); - tunnel.setOutbound(outbound); - } - - private void sendTestMessage(LoadTestTunnelConfig tunnel) { - long now = _context.clock().now(); - if (now > tunnel.getExpiration()) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Not sending a test message to " + tunnel + " because it expired"); - tunnel.logComplete(); - _active.remove(tunnel); - return; - } - - if (TEST_LIVE_TUNNELS) { - TunnelInfo inbound = tunnel.getInbound(); - TunnelInfo outbound = tunnel.getOutbound(); - if ( (inbound == null) || (outbound == null) ) { - pickTunnels(tunnel); - inbound = tunnel.getInbound(); - outbound = tunnel.getOutbound(); - } - - if (inbound == null) { - log(tunnel, "No inbound tunnels found"); - _active.remove(tunnel); - return; - } else if (outbound == null) { - log(tunnel, "No outbound tunnels found"); - tunnel.logComplete(); - _active.remove(tunnel); - return; - } - - if ( (now >= inbound.getExpiration()) || (now >= outbound.getExpiration()) ) { - tunnel.logComplete(); - _active.remove(tunnel); - return; - } - - if (_log.shouldLog(Log.DEBUG)) - _log.debug("inbound and outbound found for " + tunnel); - - I2NPMessage payloadMessage = createPayloadMessage(); - - if (_log.shouldLog(Log.DEBUG)) - _log.debug("testing live tunnels with inbound [" + inbound + "] and outbound [" + outbound + "]"); - - // this should take into consideration both the inbound and outbound tunnels - // ... but it doesn't, yet. - long uniqueId = -1; - if (payloadMessage != null) { - uniqueId = payloadMessage.getUniqueId(); - } else { - tunnel.logComplete(); - _active.remove(tunnel); - return; - } - _context.messageRegistry().registerPending(new Selector(tunnel, uniqueId), - new SendAgain(_context, tunnel, uniqueId, true), - new SendAgain(_context, tunnel, uniqueId, false), - 10*1000); - _context.tunnelDispatcher().dispatchOutbound(payloadMessage, outbound.getSendTunnelId(0), - inbound.getReceiveTunnelId(0), - inbound.getPeer(0)); - //log(tunnel, payloadMessage.getUniqueId() + " sent via " + inbound + " / " + outbound); - } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("NOT testing live tunnels for [" + tunnel + "]"); - RouterInfo target = _context.netDb().lookupRouterInfoLocally(tunnel.getPeer(0)); - if (target == null) { - log(tunnel, "lookup failed"); - return; - } - - I2NPMessage payloadMessage = createPayloadMessage(); - - TunnelGatewayMessage tm = new TunnelGatewayMessage(_context); - tm.setMessage(payloadMessage); - tm.setTunnelId(tunnel.getReceiveTunnelId(0)); - tm.setMessageExpiration(payloadMessage.getMessageExpiration()); - - OutNetMessage om = new OutNetMessage(_context); - om.setMessage(tm); - SendAgain failed = new SendAgain(_context, tunnel, payloadMessage.getUniqueId(), false); - om.setOnFailedReplyJob(failed); - om.setOnReplyJob(new SendAgain(_context, tunnel, payloadMessage.getUniqueId(), true)); - //om.setOnFailedSendJob(failed); - om.setReplySelector(new Selector(tunnel, payloadMessage.getUniqueId())); - om.setTarget(target); - om.setExpiration(tm.getMessageExpiration()); - om.setPriority(40); - _context.outNetMessagePool().add(om); - //log(tunnel, m.getMessageId() + " sent"); - } - } - - private static final boolean SMALL_PAYLOAD = false; - - private boolean useSmallPayload() { - return Boolean.valueOf(_context.getProperty("router.loadTestSmall", SMALL_PAYLOAD + "")).booleanValue(); - } - - private I2NPMessage createPayloadMessage() { - // doesnt matter whats in the message, as it gets dropped anyway, since we match - // on it with the message.uniqueId - if (useSmallPayload()) { - DeliveryStatusMessage m = new DeliveryStatusMessage(_context); - long now = _context.clock().now(); - m.setArrival(now); - m.setMessageExpiration(now + 10*1000); - m.setMessageId(_context.random().nextLong(I2NPMessage.MAX_ID_VALUE)); - return m; - } else { - DataMessage m = new DataMessage(_context); - byte data[] = new byte[4096]; - _context.random().nextBytes(data); - m.setData(data); - long now = _context.clock().now(); - m.setMessageExpiration(now + 10*1000); - - if (true) { - // garlic wrap the data message to ourselves so the endpoints and gateways - // can't tell its a test, encrypting it with a random key and tag, - // remembering that key+tag so that we can decrypt it later without any ElGamal - DeliveryInstructions instructions = new DeliveryInstructions(); - instructions.setDeliveryMode(DeliveryInstructions.DELIVERY_MODE_LOCAL); - - PayloadGarlicConfig payload = new PayloadGarlicConfig(); - payload.setCertificate(new Certificate(Certificate.CERTIFICATE_TYPE_NULL, null)); - payload.setId(_context.random().nextLong(I2NPMessage.MAX_ID_VALUE)); - payload.setId(m.getUniqueId()); - payload.setPayload(m); - payload.setRecipient(_context.router().getRouterInfo()); - payload.setDeliveryInstructions(instructions); - payload.setRequestAck(false); - payload.setExpiration(m.getMessageExpiration()); - - SessionKey encryptKey = _context.keyGenerator().generateSessionKey(); - SessionTag encryptTag = new SessionTag(true); - SessionKey sentKey = new SessionKey(); - Set sentTags = null; - GarlicMessage msg = GarlicMessageBuilder.buildMessage(_context, payload, sentKey, sentTags, - _context.keyManager().getPublicKey(), - encryptKey, encryptTag); - - Set encryptTags = new HashSet(1); - encryptTags.add(encryptTag); - _context.sessionKeyManager().tagsReceived(encryptKey, encryptTags); - - return msg; - } else { - return m; - } - } - } - - private class SendAgain extends JobImpl implements ReplyJob { - private LoadTestTunnelConfig _cfg; - private long _messageId; - private boolean _ok; - private boolean _run; - private long _dontStartUntil; - public SendAgain(RouterContext ctx, LoadTestTunnelConfig cfg, long messageId, boolean ok) { - super(ctx); - _cfg = cfg; - _messageId = messageId; - _ok = ok; - _run = false; - _dontStartUntil = ctx.clock().now() + 10*1000; - } - public String getName() { return "send another load test"; } - public void runJob() { - if (!_ok) { - if (!_run) { - log(_cfg, _messageId + " " + _cfg.getFullMessageCount() + " TIMEOUT"); - getContext().statManager().addRateData("test.timeoutAfter", _cfg.getFullMessageCount(), 0); - if (getContext().clock().now() >= _dontStartUntil) { - sendTestMessage(_cfg); - _cfg.incrementFailed(); - } else { - getTiming().setStartAfter(_dontStartUntil); - getContext().jobQueue().addJob(SendAgain.this); - } - } - _run = true; - } else { - sendTestMessage(_cfg); - } - } - - public void setMessage(I2NPMessage message) {} - } - - private class Selector implements MessageSelector { - private LoadTestTunnelConfig _cfg; - private long _messageId; - public Selector(LoadTestTunnelConfig cfg, long messageId) { - _cfg = cfg; - _messageId = messageId; - } - public boolean continueMatching() { return false; } - public long getExpiration() { return _cfg.getExpiration(); } - public boolean isMatch(I2NPMessage message) { - if (message.getUniqueId() == _messageId) { - long count = _cfg.getFullMessageCount(); - _cfg.incrementFull(); - long period = _context.clock().now() - (message.getMessageExpiration() - 10*1000); - log(_cfg, _messageId + " " + count + " after " + period); - _context.statManager().addRateData("test.rtt", period, count); - if (period > 2000) - _context.statManager().addRateData("test.rttHigh", period, count); - TunnelInfo info = _cfg.getOutbound(); - if (info != null) - info.incrementVerifiedBytesTransferred(5*1024); - // the inbound tunnel is incremented by the tunnel management system itself, - // so don't double count it here - return true; - } - return false; - } - } - - private void log(LoadTestTunnelConfig tunnel, String msg) { - if (_out == null) return; - StringBuffer buf = new StringBuffer(128); - if (tunnel.getInbound() == null) { - for (int i = 0; i < tunnel.getLength()-1; i++) { - Hash peer = tunnel.getPeer(i); - if ( (peer != null) && (peer.equals(_context.routerHash())) ) - continue; - else if (peer != null) - buf.append(peer.toBase64()); - else - buf.append("[unknown_peer]"); - buf.append(" "); - TunnelId id = tunnel.getReceiveTunnelId(i); - if (id != null) - buf.append(id.getTunnelId()); - else - buf.append("[unknown_tunnel]"); - buf.append(" "); - buf.append(_context.clock().now()).append(" hop ").append(i).append(" ").append(msg).append("\n"); - } - } else { - int hop = 0; - TunnelInfo info = tunnel.getOutbound(); - for (int i = 0; (info != null) && (i < info.getLength()); i++) { - Hash peer = info.getPeer(i); - if ( (peer != null) && (peer.equals(_context.routerHash())) ) - continue; - else if (peer != null) - buf.append(peer.toBase64()); - else - buf.append("[unknown_peer]"); - buf.append(" "); - TunnelId id = info.getReceiveTunnelId(i); - if (id != null) - buf.append(id.getTunnelId()); - else - buf.append("[unknown_tunnel]"); - buf.append(" "); - buf.append(_context.clock().now()).append(" out_hop ").append(hop).append(" ").append(msg).append("\n"); - hop++; - } - info = tunnel.getInbound(); - for (int i = 0; (info != null) && (i < info.getLength()); i++) { - Hash peer = info.getPeer(i); - if ( (peer != null) && (peer.equals(_context.routerHash())) ) - continue; - else if (peer != null) - buf.append(peer.toBase64()); - else - buf.append("[unknown_peer]"); - buf.append(" "); - TunnelId id = info.getReceiveTunnelId(i); - if (id != null) - buf.append(id.getTunnelId()); - else - buf.append("[unknown_tunnel]"); - buf.append(" "); - buf.append(_context.clock().now()).append(" in_hop ").append(hop).append(" ").append(msg).append("\n"); - hop++; - } - } - try { - synchronized (_out) { - _out.write(buf.toString()); - } - } catch (IOException ioe) { - _log.error("error logging [" + msg + "]", ioe); - } - } - - /** - * If we are testing live tunnels, see if we want to test the one that was just created - * fully. - */ - public void addTunnelTestCandidate(TunnelCreatorConfig cfg) { - LoadTestTunnelConfig ltCfg = new LoadTestTunnelConfig(cfg); - if (wantToTest(ltCfg)) { - // wait briefly so everyone has their things in order (not really necessary...) - long delay = _context.random().nextInt(30*1000) + 30*1000; - SimpleTimer.getInstance().addEvent(new BeginTest(ltCfg), delay); - if (_log.shouldLog(Log.INFO)) - _log.info("Testing " + cfg + ", with " + _active.size() + " active"); - } else { - if (_log.shouldLog(Log.INFO)) - _log.info("Not testing " + cfg + " because we have " + _active.size() + " active: " + _active); - } - } - public void removeTunnelTestCandidate(TunnelCreatorConfig cfg) { _active.remove(cfg); } - - private class BeginTest implements SimpleTimer.TimedEvent { - private LoadTestTunnelConfig _cfg; - public BeginTest(LoadTestTunnelConfig cfg) { - _cfg = cfg; - } - public void timeReached() { - _context.jobQueue().addJob(new Expire(_context, _cfg, false)); - runTest(_cfg); - } - } - - private boolean wantToTest(LoadTestTunnelConfig cfg) { - // wait 10 minutes before testing anything - if (_context.router().getUptime() <= 10*60*1000) return false; - if (bandwidthOverloaded()) return false; - - if (TEST_LIVE_TUNNELS && _active.size() < getConcurrency()) { - // length == #hops+1 (as it includes the creator) - if (cfg.getLength() < 2) - return false; - _active.add(cfg); - return true; - } else { - return false; - } - } - - private boolean bandwidthOverloaded() { - int msgLoadBps = CONCURRENT_MESSAGES - * 5 * 1024 // message size - / 10; // 10 seconds before timeout & retransmission - msgLoadBps *= 2; // buffer - int curBps = getBps(); - if ((curBps + msgLoadBps)/1024 >= _context.bandwidthLimiter().getOutboundKBytesPerSecond()) - return true; - if ((curBps + msgLoadBps)/1024 >= _context.bandwidthLimiter().getInboundKBytesPerSecond()) - return true; - if (_context.throttle().getMessageDelay() > 1000) - return true; - return false; - } - - private int getBps() { - int used1s = _context.router().get1sRate(); - int used1m = _context.router().get1mRate(); - int used5m = _context.router().get5mRate(); - return Math.max(used1s, Math.max(used1m, used5m)); - } - - private class CreatedJob extends JobImpl { - private LoadTestTunnelConfig _cfg; - public CreatedJob(RouterContext ctx, LoadTestTunnelConfig cfg) { - super(ctx); - _cfg = cfg; - } - public String getName() { return "Test tunnel created"; } - public void runJob() { - if (_log.shouldLog(Log.INFO)) - _log.info("Tunnel created for testing peer " + _cfg.getPeer(0).toBase64()); - getContext().tunnelDispatcher().joinInbound(_cfg.getTunnel()); - //log(_cfg, "joined"); - _active.add(_cfg); - Expire j = new Expire(getContext(), _cfg); - //_cfg.setExpireJob(j); - getContext().jobQueue().addJob(j); - runTest(_cfg); - } - } - private long TEST_PERIOD_MAX = 5*60*1000; - private long TEST_PERIOD_MIN = 1*60*1000; - - private class Expire extends JobImpl { - private LoadTestTunnelConfig _cfg; - private boolean _removeFromDispatcher; - public Expire(RouterContext ctx, LoadTestTunnelConfig cfg) { - this(ctx, cfg, true); - } - public Expire(RouterContext ctx, LoadTestTunnelConfig cfg, boolean removeFromDispatcher) { - super(ctx); - _cfg = cfg; - _removeFromDispatcher = removeFromDispatcher; - long duration = ctx.random().nextLong(TEST_PERIOD_MAX); - if (duration < TEST_PERIOD_MIN) - duration += TEST_PERIOD_MIN; - long expiration = duration + ctx.clock().now(); - if (expiration > cfg.getExpiration()+60*1000) - expiration = cfg.getExpiration()+60*1000; - getTiming().setStartAfter(expiration); - } - public String getName() { return "expire test tunnel"; } - public void runJob() { - if (_removeFromDispatcher) - getContext().tunnelDispatcher().remove(_cfg.getTunnel()); - _cfg.logComplete(); - TunnelInfo info = _cfg.getOutbound(); - if (info != null) - info.incrementVerifiedBytesTransferred(0); // just to wrap up the test data - _active.remove(_cfg); - } - } - private class FailedJob extends JobImpl { - private LoadTestTunnelConfig _cfg; - public FailedJob(RouterContext ctx, LoadTestTunnelConfig cfg) { - super(ctx); - _cfg = cfg; - } - public String getName() { return "Test tunnel failed"; } - public void runJob() { - if (_log.shouldLog(Log.INFO)) - _log.info("Tunnel failed for testing peer " + _cfg.getPeer(0).toBase64()); - log(_cfg, "failed"); - } - } - - private class LoadTestTunnelConfig { - private TunnelCreatorConfig _cfg; - private long _failed; - private long _fullMessages; - private TunnelInfo _testInbound; - private TunnelInfo _testOutbound; - private boolean _completed; - public LoadTestTunnelConfig(TunnelCreatorConfig cfg) { - _cfg = cfg; - _failed = 0; - _fullMessages = 0; - _completed = false; - } - - public long getExpiration() { return _cfg.getExpiration(); } - public Hash getPeer(int peer) { return _cfg.getPeer(peer); } - public TunnelId getReceiveTunnelId(int peer) { return _cfg.getReceiveTunnelId(peer); } - public TunnelId getSendTunnelId(int peer) { return _cfg.getSendTunnelId(peer); } - public int getLength() { return _cfg.getLength(); } - - public void incrementFailed() { ++_failed; } - public long getFailedMessageCount() { return _failed; } - public void incrementFull() { ++_fullMessages; } - public long getFullMessageCount() { return _fullMessages; } - public TunnelCreatorConfig getTunnel() { return _cfg; } - public void setInbound(TunnelInfo info) { _testInbound = info; } - public void setOutbound(TunnelInfo info) { _testOutbound = info; } - public TunnelInfo getInbound() { return _testInbound; } - public TunnelInfo getOutbound() { return _testOutbound; } - public String toString() { return _cfg + ": failed=" + _failed + " full=" + _fullMessages; } - - void logComplete() { - if (_completed) return; - _completed = true; - LoadTestTunnelConfig cfg = LoadTestTunnelConfig.this; - log(cfg, "expired after sending " + cfg.getFullMessageCount() + " / " + cfg.getFailedMessageCount() - + " in " + (10*60*1000l - (cfg.getExpiration()-_context.clock().now()))); - _context.statManager().addRateData("test.lifetimeSuccessful", cfg.getFullMessageCount(), cfg.getFailedMessageCount()); - if (cfg.getFailedMessageCount() > 0) - _context.statManager().addRateData("test.lifetimeFailed", cfg.getFailedMessageCount(), cfg.getFullMessageCount()); - } - } -} diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java index d88d653de..a116aaca7 100644 --- a/router/java/src/net/i2p/router/MessageHistory.java +++ b/router/java/src/net/i2p/router/MessageHistory.java @@ -26,7 +26,7 @@ import net.i2p.util.Log; public class MessageHistory { private Log _log; private RouterContext _context; - private List _unwrittenEntries; // list of raw entries (strings) yet to be written + private final List _unwrittenEntries = new ArrayList(64); // list of raw entries (strings) yet to be written private String _historyFile; // where to write private String _localIdent; // placed in each entry to uniquely identify the local router private boolean _doLog; // true == we want to log @@ -61,7 +61,7 @@ public class MessageHistory { } void setDoLog(boolean log) { _doLog = log; } - boolean getDoLog() { return _doLog; } + public boolean getDoLog() { return _doLog; } void setPauseFlushes(boolean doPause) { _doPause = doPause; } String getFilename() { return _historyFile; } @@ -104,7 +104,7 @@ public class MessageHistory { _doLog = DEFAULT_KEEP_MESSAGE_HISTORY; _historyFile = filename; _localIdent = getName(_context.routerHash()); - _unwrittenEntries = new ArrayList(64); + // _unwrittenEntries = new ArrayList(64); updateSettings(); // clear the history file on startup if (_firstPass) { @@ -144,7 +144,7 @@ public class MessageHistory { */ public void requestTunnelCreate(TunnelId createTunnel, TunnelId outTunnel, Hash peerRequested, Hash nextPeer, TunnelId replyTunnel, Hash replyThrough) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("request [").append(getName(peerRequested)).append("] to create tunnel ["); buf.append(createTunnel.getTunnelId()).append("] "); @@ -169,7 +169,7 @@ public class MessageHistory { */ public void receiveTunnelCreate(TunnelId createTunnel, Hash nextPeer, Date expire, boolean ok, Hash sourceRoutePeer) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("receive tunnel create [").append(createTunnel.getTunnelId()).append("] "); if (nextPeer != null) @@ -187,7 +187,7 @@ public class MessageHistory { public void tunnelJoined(String state, TunnelInfo tunnel) { if (!_doLog) return; if (tunnel == null) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("joining as [").append(state); buf.append("] to tunnel: ").append(tunnel.toString()); @@ -203,7 +203,7 @@ public class MessageHistory { public void tunnelJoined(String state, HopConfig tunnel) { if (!_doLog) return; if (tunnel == null) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("joining as [").append(state); buf.append("] to tunnel: ").append(tunnel.toString()); @@ -242,7 +242,7 @@ public class MessageHistory { public void tunnelFailed(TunnelId tunnel) { if (!_doLog) return; if (tunnel == null) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("failing tunnel [").append(tunnel.getTunnelId()).append("]"); addEntry(buf.toString()); @@ -258,7 +258,7 @@ public class MessageHistory { public void tunnelValid(TunnelInfo tunnel, long timeToTest) { if (!_doLog) return; if (tunnel == null) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("tunnel ").append(tunnel).append(" tested ok after ").append(timeToTest).append("ms"); addEntry(buf.toString()); @@ -271,7 +271,7 @@ public class MessageHistory { public void tunnelRejected(Hash peer, TunnelId tunnel, Hash replyThrough, String reason) { if (!_doLog) return; if ( (tunnel == null) || (peer == null) ) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("tunnel [").append(tunnel.getTunnelId()).append("] was rejected by ["); buf.append(getName(peer)).append("] for [").append(reason).append("]"); @@ -283,7 +283,7 @@ public class MessageHistory { public void tunnelParticipantRejected(Hash peer, String msg) { if (!_doLog) return; if (peer == null) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("tunnel participation rejected by ["); buf.append(getName(peer)).append("]: ").append(msg); @@ -298,7 +298,7 @@ public class MessageHistory { public void tunnelRequestTimedOut(Hash peer, TunnelId tunnel) { if (!_doLog) return; if ( (tunnel == null) || (peer == null) ) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("tunnel [").append(tunnel.getTunnelId()).append("] timed out on ["); buf.append(getName(peer)).append("]"); @@ -314,7 +314,7 @@ public class MessageHistory { */ public void droppedTunnelMessage(TunnelId id, long msgId, Date expiration, Hash from) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("dropped message ").append(msgId).append(" for unknown tunnel [").append(id.getTunnelId()); buf.append("] from [").append(getName(from)).append("]").append(" expiring on "); @@ -328,7 +328,7 @@ public class MessageHistory { public void droppedOtherMessage(I2NPMessage message, Hash from) { if (!_doLog) return; if (message == null) return; - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append(getPrefix()); buf.append("dropped [").append(message.getClass().getName()).append("] ").append(message.getUniqueId()); buf.append(" [").append(message.toString()).append("] from ["); @@ -342,7 +342,7 @@ public class MessageHistory { public void droppedInboundMessage(long messageId, Hash from, String info) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append(getPrefix()); buf.append("dropped inbound message ").append(messageId); buf.append(" from "); @@ -364,7 +364,7 @@ public class MessageHistory { public void replyTimedOut(OutNetMessage sentMessage) { if (!_doLog) return; if (sentMessage == null) return; - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append(getPrefix()); buf.append("timed out waiting for a reply to [").append(sentMessage.getMessageType()); buf.append("] [").append(sentMessage.getMessageId()).append("] expiring on ["); @@ -383,7 +383,7 @@ public class MessageHistory { */ public void messageProcessingError(long messageId, String messageType, String error) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("Error processing [").append(messageType).append("] [").append(messageId).append("] failed with [").append(error).append("]"); addEntry(buf.toString()); @@ -420,7 +420,7 @@ public class MessageHistory { public void sendMessage(String messageType, long messageId, long expiration, Hash peer, boolean sentOk, String info) { if (!_doLog) return; if (false) return; - StringBuffer buf = new StringBuffer(256); + StringBuilder buf = new StringBuilder(256); buf.append(getPrefix()); buf.append("send [").append(messageType).append("] message [").append(messageId).append("] "); buf.append("to [").append(getName(peer)).append("] "); @@ -448,7 +448,7 @@ public class MessageHistory { public void receiveMessage(String messageType, long messageId, long expiration, Hash from, boolean isValid) { if (!_doLog) return; if (false) return; - StringBuffer buf = new StringBuffer(256); + StringBuilder buf = new StringBuilder(256); buf.append(getPrefix()); buf.append("receive [").append(messageType).append("] with id [").append(messageId).append("] "); if (from != null) @@ -470,7 +470,7 @@ public class MessageHistory { */ public void wrap(String bodyMessageType, long bodyMessageId, String containerMessageType, long containerMessageId) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("Wrap message [").append(bodyMessageType).append("] id [").append(bodyMessageId).append("] "); buf.append("in [").append(containerMessageType).append("] id [").append(containerMessageId).append("]"); @@ -483,7 +483,7 @@ public class MessageHistory { */ public void receivePayloadMessage(long messageId) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append(getPrefix()); buf.append("Receive payload message [").append(messageId).append("]"); addEntry(buf.toString()); @@ -498,7 +498,7 @@ public class MessageHistory { */ public void sendPayloadMessage(long messageId, boolean successfullySent, long timeToSend) { if (!_doLog) return; - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(getPrefix()); buf.append("Send payload message in [").append(messageId).append("] in [").append(timeToSend).append("] successfully? ").append(successfullySent); addEntry(buf.toString()); @@ -507,7 +507,7 @@ public class MessageHistory { public void receiveTunnelFragment(long messageId, int fragmentId, Object status) { if (!_doLog) return; if (messageId == -1) throw new IllegalArgumentException("why are you -1?"); - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getPrefix()); buf.append("Receive fragment ").append(fragmentId).append(" in ").append(messageId); buf.append(" status: ").append(status.toString()); @@ -516,7 +516,7 @@ public class MessageHistory { public void receiveTunnelFragmentComplete(long messageId) { if (!_doLog) return; if (messageId == -1) throw new IllegalArgumentException("why are you -1?"); - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getPrefix()); buf.append("Receive fragmented message completely: ").append(messageId); addEntry(buf.toString()); @@ -524,7 +524,7 @@ public class MessageHistory { public void droppedFragmentedMessage(long messageId, String status) { if (!_doLog) return; if (messageId == -1) throw new IllegalArgumentException("why are you -1?"); - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getPrefix()); buf.append("Fragmented message dropped: ").append(messageId); buf.append(" ").append(status); @@ -533,7 +533,7 @@ public class MessageHistory { public void fragmentMessage(long messageId, int numFragments, int totalLength, List messageIds, String msg) { if (!_doLog) return; //if (messageId == -1) throw new IllegalArgumentException("why are you -1?"); - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getPrefix()); buf.append("Break message ").append(messageId).append(" into fragments: ").append(numFragments); buf.append(" total size ").append(totalLength); @@ -545,7 +545,7 @@ public class MessageHistory { public void fragmentMessage(long messageId, int numFragments, int totalLength, List messageIds, Object tunnel, String msg) { if (!_doLog) return; //if (messageId == -1) throw new IllegalArgumentException("why are you -1?"); - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getPrefix()); buf.append("Break message ").append(messageId).append(" into fragments: ").append(numFragments); buf.append(" total size ").append(totalLength); @@ -559,7 +559,7 @@ public class MessageHistory { public void droppedTunnelDataMessageUnknown(long msgId, long tunnelId) { if (!_doLog) return; if (msgId == -1) throw new IllegalArgumentException("why are you -1?"); - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getPrefix()); buf.append("Dropped data message ").append(msgId).append(" for unknown tunnel ").append(tunnelId); addEntry(buf.toString()); @@ -567,7 +567,7 @@ public class MessageHistory { public void droppedTunnelGatewayMessageUnknown(long msgId, long tunnelId) { if (!_doLog) return; if (msgId == -1) throw new IllegalArgumentException("why are you -1?"); - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getPrefix()); buf.append("Dropped gateway message ").append(msgId).append(" for unknown tunnel ").append(tunnelId); addEntry(buf.toString()); @@ -585,7 +585,7 @@ public class MessageHistory { } private final String getPrefix() { - StringBuffer buf = new StringBuffer(48); + StringBuilder buf = new StringBuilder(48); buf.append(getTime(_context.clock().now())); buf.append(' ').append(_localIdent).append(": "); return buf.toString(); diff --git a/router/java/src/net/i2p/router/MultiRouter.java b/router/java/src/net/i2p/router/MultiRouter.java index 144c4e1db..d8d316ae8 100644 --- a/router/java/src/net/i2p/router/MultiRouter.java +++ b/router/java/src/net/i2p/router/MultiRouter.java @@ -58,6 +58,7 @@ public class MultiRouter { _defaultContext.clock().setOffset(0); Runtime.getRuntime().addShutdownHook(new Thread() { + @Override public void run() { Thread.currentThread().setName("Router* Shutdown"); try { Thread.sleep(120*1000); } catch (InterruptedException ie) {} diff --git a/router/java/src/net/i2p/router/MultiRouterBuilder.java b/router/java/src/net/i2p/router/MultiRouterBuilder.java index 9518e4fac..6a7c635bc 100644 --- a/router/java/src/net/i2p/router/MultiRouterBuilder.java +++ b/router/java/src/net/i2p/router/MultiRouterBuilder.java @@ -77,7 +77,7 @@ public class MultiRouterBuilder { buildStartupScriptNix(args); } private static void buildStartupScriptNix(String args[]) { - StringBuffer buf = new StringBuffer(4096); + StringBuilder buf = new StringBuilder(4096); buf.append("#!/bin/sh\n"); buf.append("export CP=.; for LIB in lib/* ; do export CP=$CP:$LIB ; done\n"); buf.append("nohup java -cp $CP "); @@ -106,7 +106,7 @@ public class MultiRouterBuilder { File baseDir = new File(dir); baseDir.mkdirs(); File cfgFile = new File(baseDir, "router.config"); - StringBuffer buf = new StringBuffer(8*1024); + StringBuilder buf = new StringBuilder(8*1024); buf.append("router.profileDir=").append(baseDir.getPath()).append("/peerProfiles\n"); buf.append("router.historyFilename=").append(baseDir.getPath()).append("/messageHistory.txt\n"); buf.append("router.sessionKeys.location=").append(baseDir.getPath()).append("/sessionKeys.dat\n"); diff --git a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java index e4a5ce08b..865fbf8ec 100644 --- a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java @@ -10,10 +10,6 @@ package net.i2p.router; import java.io.IOException; import java.io.Writer; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; import java.util.Set; import net.i2p.data.Hash; @@ -59,8 +55,12 @@ public abstract class NetworkDatabaseFacade implements Service { public abstract void unpublish(LeaseSet localLeaseSet); public abstract void fail(Hash dbEntry); + public abstract Set getAllRouters(); public int getKnownRouters() { return 0; } public int getKnownLeaseSets() { return 0; } + public boolean isInitialized() { return true; } + public void rescan() {} public void renderRouterInfoHTML(Writer out, String s) throws IOException {} + public void renderLeaseSetHTML(Writer out) throws IOException {} public void renderStatusHTML(Writer out, boolean b) throws IOException {} } diff --git a/router/java/src/net/i2p/router/OutNetMessage.java b/router/java/src/net/i2p/router/OutNetMessage.java index 2240af423..39921a5e7 100644 --- a/router/java/src/net/i2p/router/OutNetMessage.java +++ b/router/java/src/net/i2p/router/OutNetMessage.java @@ -287,7 +287,7 @@ public class OutNetMessage { public void finalize() throws Throwable { if (_message != null) { if (_log.shouldLog(Log.WARN)) { - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); buf.append("Undiscarded ").append(_messageSize).append("byte "); buf.append(_messageType).append(" message created "); buf.append((_context.clock().now() - _created)).append("ms ago: "); @@ -302,8 +302,9 @@ public class OutNetMessage { super.finalize(); } */ + @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("[OutNetMessage contains "); if (_message == null) { buf.append("*no message*"); @@ -333,7 +334,7 @@ public class OutNetMessage { return buf.toString(); } - private void renderTimestamps(StringBuffer buf) { + private void renderTimestamps(StringBuilder buf) { if (_log.shouldLog(Log.INFO)) { synchronized (this) { long lastWhen = -1; @@ -365,6 +366,7 @@ public class OutNetMessage { } } + @Override public int hashCode() { int rv = 0; rv += DataHelper.hashCode(_message); @@ -373,7 +375,10 @@ public class OutNetMessage { return rv; } + @Override public boolean equals(Object obj) { + if(obj == null) return false; + if(obj.getClass() != OutNetMessage.class) return false; return obj == this; // two OutNetMessages are different even if they contain the same message } } diff --git a/router/java/src/net/i2p/router/PeerManagerFacade.java b/router/java/src/net/i2p/router/PeerManagerFacade.java index 791b77616..61b1d3799 100644 --- a/router/java/src/net/i2p/router/PeerManagerFacade.java +++ b/router/java/src/net/i2p/router/PeerManagerFacade.java @@ -8,7 +8,6 @@ package net.i2p.router; * */ -import java.io.Writer; import java.util.List; import net.i2p.data.Hash; diff --git a/router/java/src/net/i2p/router/PersistentKeyRing.java b/router/java/src/net/i2p/router/PersistentKeyRing.java index d02275ea2..c92437111 100644 --- a/router/java/src/net/i2p/router/PersistentKeyRing.java +++ b/router/java/src/net/i2p/router/PersistentKeyRing.java @@ -4,16 +4,12 @@ import java.io.IOException; import java.io.Writer; import java.util.Iterator; -import java.util.Map; -import java.util.TreeMap; -import net.i2p.data.Base64; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.SessionKey; -import net.i2p.router.TunnelPoolSettings; import net.i2p.util.KeyRing; /** @@ -31,6 +27,7 @@ public class PersistentKeyRing extends KeyRing { addFromProperties(); } + @Override public SessionKey put(Hash h, SessionKey sk) { SessionKey old = super.put(h, sk); if (!sk.equals(old)) { @@ -56,7 +53,7 @@ public class PersistentKeyRing extends KeyRing { if (key == null || key.length() != 44) continue; String hb = prop.substring(PROP_PFX.length()); - hb.replace("$", "="); + hb = hb.replace("$", "="); Hash dest = new Hash(); SessionKey sk = new SessionKey(); try { @@ -67,13 +64,14 @@ public class PersistentKeyRing extends KeyRing { } } + @Override public void renderStatusHTML(Writer out) throws IOException { - StringBuffer buf = new StringBuffer(1024); - buf.append("\n"); + StringBuilder buf = new StringBuilder(1024); + buf.append("\n
    Destination HashName or Dest.Session Key
    "); for (Entry e : entrySet()) { buf.append("\n
    Destination HashName or Dest.Session Key
    "); Hash h = e.getKey(); - buf.append(h.toBase64().substring(0, 6)).append("..."); + buf.append(h.toBase64().substring(0, 6)).append("…"); buf.append(""); LeaseSet ls = _ctx.netDb().lookupLeaseSetLocally(h); if (ls != null) { @@ -83,13 +81,13 @@ public class PersistentKeyRing extends KeyRing { if (in != null && in.getDestinationNickname() != null) buf.append(in.getDestinationNickname()); else - buf.append(dest.toBase64().substring(0, 6)).append("..."); + buf.append(dest.toBase64().substring(0, 6)).append("…"); } else { String host = _ctx.namingService().reverseLookup(dest); if (host != null) buf.append(host); else - buf.append(dest.toBase64().substring(0, 6)).append("..."); + buf.append(dest.toBase64().substring(0, 6)).append("…"); } } buf.append(""); diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 033678924..bbfd6f4fc 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -9,7 +9,6 @@ package net.i2p.router; */ import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.Writer; @@ -36,6 +35,7 @@ import net.i2p.data.i2np.GarlicMessage; import net.i2p.router.message.GarlicMessageHandler; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.router.startup.StartupJob; +import net.i2p.router.startup.WorkingDir; import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; @@ -53,19 +53,19 @@ import net.i2p.util.SimpleTimer; public class Router { private Log _log; private RouterContext _context; - private Properties _config; + private final Properties _config; + /** full path */ private String _configFilename; private RouterInfo _routerInfo; private long _started; private boolean _higherVersionSeen; - private SessionKeyPersistenceHelper _sessionKeyPersistenceHelper; + //private SessionKeyPersistenceHelper _sessionKeyPersistenceHelper; private boolean _killVMOnEnd; private boolean _isAlive; private int _gracefulExitCode; private I2PThread.OOMEventListener _oomListener; private ShutdownHook _shutdownHook; - private I2PThread _gracefulShutdownDetector; - private Set _shutdownTasks; + private final I2PThread _gracefulShutdownDetector; public final static String PROP_CONFIG_FILE = "router.configLocation"; @@ -75,7 +75,13 @@ public class Router { /** used to differentiate routerInfo files on different networks */ public static final int NETWORK_ID = 2; + /** coalesce stats this often - should be a little less than one minute, so the graphs get updated */ + private static final int COALESCE_TIME = 50*1000; + + /** this puts an 'H' in your routerInfo **/ public final static String PROP_HIDDEN = "router.hiddenMode"; + /** this does not put an 'H' in your routerInfo **/ + public final static String PROP_HIDDEN_HIDDEN = "router.isHidden"; public final static String PROP_DYNAMIC_KEYS = "router.dynamicKeys"; public final static String PROP_INFO_FILENAME = "router.info.location"; public final static String PROP_INFO_FILENAME_DEFAULT = "router.info"; @@ -91,8 +97,6 @@ public class Router { System.setProperty("sun.net.inetaddr.negative.ttl", DNS_CACHE_TIME); System.setProperty("networkaddress.cache.ttl", DNS_CACHE_TIME); System.setProperty("networkaddress.cache.negative.ttl", DNS_CACHE_TIME); - // until we handle restricted routes and/or all peers support v6, try v4 first - System.setProperty("java.net.preferIPv4Stack", "true"); System.setProperty("http.agent", "I2P"); // (no need for keepalive) System.setProperty("http.keepAlive", "false"); @@ -105,14 +109,6 @@ public class Router { public Router(Properties envProps) { this(null, envProps); } public Router(String configFilename) { this(configFilename, null); } public Router(String configFilename, Properties envProps) { - if (!beginMarkingLiveliness(envProps)) { - System.err.println("ERROR: There appears to be another router already running!"); - System.err.println(" Please make sure to shut down old instances before starting up"); - System.err.println(" a new one. If you are positive that no other instance is running,"); - System.err.println(" please delete the file " + getPingFile(envProps)); - System.exit(-1); - } - _gracefulExitCode = -1; _config = new Properties(); @@ -126,7 +122,42 @@ public class Router { _configFilename = configFilename; } + // we need the user directory figured out by now, so figure it out here rather than + // in the RouterContext() constructor. + // + // We have not read the config file yet. Therefore the base and config locations + // are determined solely by properties (first envProps then System), for the purposes + // of initializing the user's config directory if it did not exist. + // If the base dir and/or config dir are set in the config file, + // they wil be used after the initialization of the (possibly different) dirs + // determined by WorkingDir. + // So for now, it doesn't make much sense to set the base or config dirs in the config file - + // use properties instead. If for some reason, distros need this, we can revisit it. + // + // Then add it to envProps (but not _config, we don't want it in the router.config file) + // where it will then be available to all via _context.dir() + // + // This call also migrates all files to the new working directory, + // including router.config + // + + // Do we copy all the data files to the new directory? default false + String migrate = System.getProperty("i2p.dir.migrate"); + boolean migrateFiles = Boolean.valueOf(migrate).booleanValue(); + String userDir = WorkingDir.getWorkingDir(envProps, migrateFiles); + + // Use the router.config file specified in the router.configLocation property + // (default "router.config"), + // if it is an abolute path, otherwise look in the userDir returned by getWorkingDir + // replace relative path with absolute + File cf = new File(_configFilename); + if (!cf.isAbsolute()) { + cf = new File(userDir, _configFilename); + _configFilename = cf.getAbsolutePath(); + } + readConfig(); + if (envProps == null) { envProps = _config; } else { @@ -136,14 +167,47 @@ public class Router { envProps.setProperty(k, v); } } - + // This doesn't work, guess it has to be in the static block above? + // if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue()) + // System.setProperty("java.net.preferIPv4Stack", "true"); + + if (envProps.getProperty("i2p.dir.config") == null) + envProps.setProperty("i2p.dir.config", userDir); + + // The important thing that happens here is the directory paths are set and created + // i2p.dir.router defaults to i2p.dir.config + // i2p.dir.app defaults to i2p.dir.router + // i2p.dir.log defaults to i2p.dir.router + // i2p.dir.pid defaults to i2p.dir.router + // i2p.dir.base defaults to user.dir == $CWD _context = new RouterContext(this, envProps); + + // This is here so that we can get the directory location from the context + // for the ping file + if (!beginMarkingLiveliness()) { + System.err.println("ERROR: There appears to be another router already running!"); + System.err.println(" Please make sure to shut down old instances before starting up"); + System.err.println(" a new one. If you are positive that no other instance is running,"); + System.err.println(" please delete the file " + getPingFile().getAbsolutePath()); + System.exit(-1); + } + + // This is here so that we can get the directory location from the context + // for the zip file and the base location to unzip to. + // If it does an update, it never returns. + // I guess it's better to have the other-router check above this, we don't want to + // overwrite an existing running router's jar files. Other than ours. + installUpdates(); + + // NOW we start all the activity + _context.initAll(); + _routerInfo = null; _higherVersionSeen = false; _log = _context.logManager().getLog(Router.class); _log.info("New router created with config file " + _configFilename); - _sessionKeyPersistenceHelper = new SessionKeyPersistenceHelper(_context); + //_sessionKeyPersistenceHelper = new SessionKeyPersistenceHelper(_context); _killVMOnEnd = true; _oomListener = new I2PThread.OOMEventListener() { public void outOfMemory(OutOfMemoryError oom) { @@ -171,7 +235,6 @@ public class Router { watchdog.setDaemon(true); watchdog.start(); - _shutdownTasks = new HashSet(0); } /** @@ -245,6 +308,7 @@ public class Router { _context.keyManager().startup(); + // why are we reading this again, it's read in the constructor readConfig(); setupHandlers(); @@ -258,10 +322,10 @@ public class Router { _context.inNetMessagePool().startup(); startupQueue(); //_context.jobQueue().addJob(new CoalesceStatsJob(_context)); - SimpleScheduler.getInstance().addPeriodicEvent(new CoalesceStatsEvent(_context), 20*1000); + SimpleScheduler.getInstance().addPeriodicEvent(new CoalesceStatsEvent(_context), COALESCE_TIME); _context.jobQueue().addJob(new UpdateRoutingKeyModifierJob(_context)); warmupCrypto(); - _sessionKeyPersistenceHelper.startup(); + //_sessionKeyPersistenceHelper.startup(); //_context.adminManager().startup(); _context.blocklist().startup(); @@ -285,6 +349,7 @@ public class Router { } } + /** this does not use ctx.getConfigDir(), must provide a full path in filename */ private static Properties getConfig(RouterContext ctx, String filename) { Log log = null; if (ctx != null) { @@ -426,7 +491,7 @@ public class Router { RouterInfo ri = _routerInfo; if ( (ri != null) && (ri.isHidden()) ) return true; - return Boolean.valueOf(_context.getProperty("router.isHidden", "false")).booleanValue(); + return Boolean.valueOf(_context.getProperty(PROP_HIDDEN_HIDDEN)).booleanValue(); } public Certificate createCertificate() { Certificate cert = new Certificate(); @@ -446,20 +511,21 @@ public class Router { */ private static final String _rebuildFiles[] = new String[] { "router.info", "router.keys", - "netDb/my.info", - "connectionTag.keys", + "netDb/my.info", // no longer used + "connectionTag.keys", // never used? "keyBackup/privateEncryption.key", "keyBackup/privateSigning.key", "keyBackup/publicEncryption.key", "keyBackup/publicSigning.key", - "sessionKeys.dat" }; + "sessionKeys.dat" // no longer used + }; static final String IDENTLOG = "identlog.txt"; - public static void killKeys() { + public void killKeys() { new Exception("Clearing identity files").printStackTrace(); int remCount = 0; for (int i = 0; i < _rebuildFiles.length; i++) { - File f = new File(_rebuildFiles[i]); + File f = new File(_context.getRouterDir(),_rebuildFiles[i]); if (f.exists()) { boolean removed = f.delete(); if (removed) { @@ -473,7 +539,7 @@ public class Router { if (remCount > 0) { FileOutputStream log = null; try { - log = new FileOutputStream(IDENTLOG, true); + log = new FileOutputStream(new File(_context.getRouterDir(), IDENTLOG), true); log.write((new Date() + ": Old router identity keys cleared\n").getBytes()); } catch (IOException ioe) { // ignore @@ -490,13 +556,12 @@ public class Router { */ public void rebuildNewIdentity() { killKeys(); - try { - for (Iterator iter = _shutdownTasks.iterator(); iter.hasNext(); ) { - Runnable task = (Runnable)iter.next(); + for (Runnable task : _context.getShutdownTasks()) { + try { task.run(); + } catch (Throwable t) { + _log.log(Log.CRIT, "Error running shutdown task", t); } - } catch (Throwable t) { - _log.log(Log.CRIT, "Error running shutdown task", t); } // hard and ugly finalShutdown(EXIT_HARD_RESTART); @@ -534,7 +599,7 @@ public class Router { " " + "
    \n"); - StringBuffer buf = new StringBuffer(32*1024); + StringBuilder buf = new StringBuilder(32*1024); if ( (_routerInfo != null) && (_routerInfo.getIdentity() != null) ) buf.append("Router: ").append(_routerInfo.getIdentity().getHash().toBase64()).append("
    \n"); @@ -688,15 +753,16 @@ public class Router { out.write("\n
    \n"); + _context.netDb().renderLeaseSetHTML(out); _context.netDb().renderStatusHTML(out); buf.setLength(0); buf.append("\n
    \n"); List msgs = _context.logManager().getBuffer().getMostRecentMessages(); - buf.append("\n

    Most recent console messages:

    \n"); + buf.append("\n

    Most recent console messages:

    \n"); for (Iterator iter = msgs.iterator(); iter.hasNext(); ) { String msg = (String)iter.next(); - buf.append("\n"); } @@ -705,14 +771,15 @@ public class Router { out.flush(); } - private static int MAX_MSG_LENGTH = 120; - private static final void appendLogMessage(StringBuffer buf, String msg) { + //private static int MAX_MSG_LENGTH = 120; + private static final void appendLogMessage(StringBuilder buf, String msg) { // disable this code for the moment because i think it // looks ugly (on the router console) - if (true) { + //if (true) { buf.append(msg); return; - } + //} +/****** if (msg.length() < MAX_MSG_LENGTH) { buf.append(msg); return; @@ -744,11 +811,13 @@ public class Router { newline = msg.indexOf('\n'); len = msg.length(); } +******/ } /** main-ish method for testing appendLogMessage */ +/****** private static final void testAppendLog() { - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); Router.appendLogMessage(buf, "hi\nhow are you\nh0h0h0"); System.out.println("line: [" + buf.toString() + "]"); buf.setLength(0); @@ -780,12 +849,7 @@ public class Router { System.out.println("line: [" + buf.toString() + "]"); buf.setLength(0); } - - public void addShutdownTask(Runnable task) { - synchronized (_shutdownTasks) { - _shutdownTasks.add(task); - } - } +******/ public static final int EXIT_GRACEFUL = 2; public static final int EXIT_HARD = 3; @@ -799,13 +863,12 @@ public class Router { I2PThread.removeOOMEventListener(_oomListener); // Run the shutdown hooks first in case they want to send some goodbye messages // Maybe we need a delay after this too? - try { - for (Iterator iter = _shutdownTasks.iterator(); iter.hasNext(); ) { - Runnable task = (Runnable)iter.next(); + for (Runnable task : _context.getShutdownTasks()) { + try { task.run(); + } catch (Throwable t) { + _log.log(Log.CRIT, "Error running shutdown task", t); } - } catch (Throwable t) { - _log.log(Log.CRIT, "Error running shutdown task", t); } try { _context.clientManager().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the client manager", t); } try { _context.jobQueue().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the job queue", t); } @@ -819,9 +882,10 @@ public class Router { try { _context.messageRegistry().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the message registry", t); } try { _context.messageValidator().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the message validator", t); } try { _context.inNetMessagePool().shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the inbound net pool", t); } - try { _sessionKeyPersistenceHelper.shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the session key manager", t); } + //try { _sessionKeyPersistenceHelper.shutdown(); } catch (Throwable t) { _log.log(Log.CRIT, "Error shutting down the session key manager", t); } + _context.deleteTempDir(); RouterContext.listContexts().remove(_context); - dumpStats(); + //dumpStats(); finalShutdown(exitCode); } @@ -839,7 +903,7 @@ public class Router { killKeys(); } - File f = new File(getPingFile()); + File f = getPingFile(); f.delete(); if (_killVMOnEnd) { try { Thread.sleep(1000); } catch (InterruptedException ie) {} @@ -859,6 +923,10 @@ public class Router { public void shutdownGracefully() { shutdownGracefully(EXIT_GRACEFUL); } + /** + * Call this with EXIT_HARD or EXIT_HARD_RESTART for a non-blocking, + * hard, non-graceful shutdown with a brief delay to allow a UI response + */ public void shutdownGracefully(int exitCode) { _gracefulExitCode = exitCode; _config.setProperty(PROP_SHUTDOWN_IN_PROGRESS, "true"); @@ -887,7 +955,9 @@ public class Router { } /** How long until the graceful shutdown will kill us? */ public long getShutdownTimeRemaining() { - if (_gracefulExitCode <= 0) return -1; + if (_gracefulExitCode <= 0) return -1; // maybe Long.MAX_VALUE would be better? + if (_gracefulExitCode == EXIT_HARD || _gracefulExitCode == EXIT_HARD_RESTART) + return 0; long exp = _context.tunnelManager().getLastParticipatingExpiration(); if (exp < 0) return -1; @@ -906,9 +976,20 @@ public class Router { while (true) { boolean shutdown = (null != _config.getProperty(PROP_SHUTDOWN_IN_PROGRESS)); if (shutdown) { - if (_context.tunnelManager().getParticipatingCount() <= 0) { - if (_log.shouldLog(Log.CRIT)) + if (_gracefulExitCode == EXIT_HARD || _gracefulExitCode == EXIT_HARD_RESTART || + _context.tunnelManager().getParticipatingCount() <= 0) { + if (_gracefulExitCode == EXIT_HARD) + _log.log(Log.CRIT, "Shutting down after a brief delay"); + else if (_gracefulExitCode == EXIT_HARD_RESTART) + _log.log(Log.CRIT, "Restarting after a brief delay"); + else _log.log(Log.CRIT, "Graceful shutdown progress - no more tunnels, safe to die"); + // Allow time for a UI reponse + try { + synchronized (Thread.currentThread()) { + Thread.currentThread().wait(2*1000); + } + } catch (InterruptedException ie) {} shutdown(_gracefulExitCode); return; } else { @@ -938,7 +1019,7 @@ public class Router { FileOutputStream fos = null; try { fos = new FileOutputStream(_configFilename); - StringBuffer buf = new StringBuffer(8*1024); + StringBuilder buf = new StringBuilder(8*1024); synchronized (_config) { TreeSet ordered = new TreeSet(_config.keySet()); for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) { @@ -991,10 +1072,10 @@ public class Router { } public static void main(String args[]) { - System.out.println("Starting I2P " + RouterVersion.VERSION + "-" + RouterVersion.BUILD); - System.out.println(RouterVersion.ID); - installUpdates(); - verifyWrapperConfig(); + System.out.println("Starting I2P " + RouterVersion.FULL_VERSION); + // installUpdates() moved to constructor so we can get file locations from the context + // installUpdates(); + //verifyWrapperConfig(); Router r = new Router(); if ( (args != null) && (args.length == 1) && ("rebuild".equals(args[0])) ) { r.rebuildNewIdentity(); @@ -1005,25 +1086,61 @@ public class Router { public static final String UPDATE_FILE = "i2pupdate.zip"; - private static void installUpdates() { - File updateFile = new File(UPDATE_FILE); - if (updateFile.exists()) { + /** + * Unzip update file found in the router dir OR base dir, to the base dir + * + * If we can't write to the base dir, complain. + * Note: _log not available here. + */ + private void installUpdates() { + File updateFile = new File(_context.getRouterDir(), UPDATE_FILE); + boolean exists = updateFile.exists(); + if (!exists) { + updateFile = new File(_context.getBaseDir(), UPDATE_FILE); + exists = updateFile.exists(); + } + if (exists) { + // do a simple permissions test, if it fails leave the file in place and don't restart + File test = new File(_context.getBaseDir(), "history.txt"); + if ((test.exists() && !test.canWrite()) || (!_context.getBaseDir().canWrite())) { + System.out.println("ERROR: No write permissions on " + _context.getBaseDir() + + " to extract software update file"); + // carry on + return; + } System.out.println("INFO: Update file exists [" + UPDATE_FILE + "] - installing"); - boolean ok = FileUtil.extractZip(updateFile, new File(".")); + boolean ok = FileUtil.extractZip(updateFile, _context.getBaseDir()); if (ok) System.out.println("INFO: Update installed"); else System.out.println("ERROR: Update failed!"); - boolean deleted = updateFile.delete(); - if (!deleted) { - System.out.println("ERROR: Unable to delete the update file!"); - updateFile.deleteOnExit(); + if (!ok) { + // we can't leave the file in place or we'll continually restart, so rename it + File bad = new File(_context.getRouterDir(), "BAD-" + UPDATE_FILE); + boolean renamed = updateFile.renameTo(bad); + if (renamed) { + System.out.println("Moved update file to " + bad.getAbsolutePath()); + } else { + System.out.println("Deleting file " + updateFile.getAbsolutePath()); + ok = true; // so it will be deleted + } } - System.out.println("INFO: Restarting after update"); + if (ok) { + boolean deleted = updateFile.delete(); + if (!deleted) { + System.out.println("ERROR: Unable to delete the update file!"); + updateFile.deleteOnExit(); + } + } + if (System.getProperty("wrapper.version") != null) + System.out.println("INFO: Restarting after update"); + else + System.out.println("WARNING: Exiting after update, restart I2P"); System.exit(EXIT_HARD_RESTART); } } +/******* private static void verifyWrapperConfig() { File cfgUpdated = new File("wrapper.config.updated"); if (cfgUpdated.exists()) { @@ -1033,15 +1150,22 @@ public class Router { System.exit(EXIT_HARD); } } +*******/ +/* private static String getPingFile(Properties envProps) { if (envProps != null) return envProps.getProperty("router.pingFile", "router.ping"); else return "router.ping"; } - private String getPingFile() { - return _context.getProperty("router.pingFile", "router.ping"); +*/ + private File getPingFile() { + String s = _context.getProperty("router.pingFile", "router.ping"); + File f = new File(s); + if (!f.isAbsolute()) + f = new File(_context.getPIDDir(), s); + return f; } static final long LIVELINESS_DELAY = 60*1000; @@ -1053,9 +1177,8 @@ public class Router { * * @return true if the router is the only one running */ - private boolean beginMarkingLiveliness(Properties envProps) { - String filename = getPingFile(envProps); - File f = new File(filename); + private boolean beginMarkingLiveliness() { + File f = getPingFile(); if (f.exists()) { long lastWritten = f.lastModified(); if (System.currentTimeMillis()-lastWritten > LIVELINESS_DELAY) { @@ -1198,13 +1321,13 @@ public class Router { return Math.max(send, recv); } -} +/* following classes are now private static inner classes, didn't bother to reindent */ /** * coalesce the stats framework every minute * */ -class CoalesceStatsEvent implements SimpleTimer.TimedEvent { +private static class CoalesceStatsEvent implements SimpleTimer.TimedEvent { private RouterContext _ctx; public CoalesceStatsEvent(RouterContext ctx) { _ctx = ctx; @@ -1239,7 +1362,7 @@ class CoalesceStatsEvent implements SimpleTimer.TimedEvent { long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); getContext().statManager().addRateData("router.memoryUsed", used, 0); - getContext().tunnelDispatcher().updateParticipatingStats(); + getContext().tunnelDispatcher().updateParticipatingStats(COALESCE_TIME); getContext().statManager().coalesceStats(); @@ -1270,7 +1393,7 @@ class CoalesceStatsEvent implements SimpleTimer.TimedEvent { * This is done here because we want to make sure the key is updated before anyone * uses it. */ -class UpdateRoutingKeyModifierJob extends JobImpl { +private static class UpdateRoutingKeyModifierJob extends JobImpl { private Log _log; private Calendar _cal = new GregorianCalendar(TimeZone.getTimeZone("GMT")); public UpdateRoutingKeyModifierJob(RouterContext ctx) { @@ -1302,7 +1425,7 @@ class UpdateRoutingKeyModifierJob extends JobImpl { } } -class MarkLiveliness implements Runnable { +private static class MarkLiveliness implements Runnable { private RouterContext _context; private Router _router; private File _pingFile; @@ -1334,7 +1457,7 @@ class MarkLiveliness implements Runnable { } } -class ShutdownHook extends Thread { +private static class ShutdownHook extends Thread { private RouterContext _context; private static int __id = 0; private int _id; @@ -1342,6 +1465,7 @@ class ShutdownHook extends Thread { _context = ctx; _id = ++__id; } + @Override public void run() { setName("Router " + _id + " shutdown"); Log l = _context.logManager().getLog(Router.class); @@ -1351,7 +1475,7 @@ class ShutdownHook extends Thread { } /** update the router.info file whenever its, er, updated */ -class PersistRouterInfoJob extends JobImpl { +private static class PersistRouterInfoJob extends JobImpl { private Log _log; public PersistRouterInfoJob(RouterContext ctx) { super(ctx); @@ -1362,15 +1486,14 @@ class PersistRouterInfoJob extends JobImpl { if (_log.shouldLog(Log.DEBUG)) _log.debug("Persisting updated router info"); - String infoFilename = getContext().getProperty(Router.PROP_INFO_FILENAME); - if (infoFilename == null) - infoFilename = Router.PROP_INFO_FILENAME_DEFAULT; + String infoFilename = getContext().getProperty(PROP_INFO_FILENAME, PROP_INFO_FILENAME_DEFAULT); + File infoFile = new File(getContext().getRouterDir(), infoFilename); RouterInfo info = getContext().router().getRouterInfo(); FileOutputStream fos = null; try { - fos = new FileOutputStream(infoFilename); + fos = new FileOutputStream(infoFile); info.writeBytes(fos); } catch (DataFormatException dfe) { _log.error("Error rebuilding the router information", dfe); @@ -1381,3 +1504,5 @@ class PersistRouterInfoJob extends JobImpl { } } } + +} diff --git a/router/java/src/net/i2p/router/RouterClock.java b/router/java/src/net/i2p/router/RouterClock.java index 3174e6027..d071013b2 100644 --- a/router/java/src/net/i2p/router/RouterClock.java +++ b/router/java/src/net/i2p/router/RouterClock.java @@ -15,11 +15,11 @@ import net.i2p.util.Log; */ public class RouterClock extends Clock { - RouterContext _context; + RouterContext _contextRC; // LINT field hides another field public RouterClock(RouterContext context) { super(context); - _context = context; + _contextRC = context; } /** @@ -27,6 +27,7 @@ public class RouterClock extends Clock { * value means that we are slow, while a negative value means we are fast. * */ + @Override public void setOffset(long offsetMs, boolean force) { if (false) return; @@ -53,10 +54,10 @@ public class RouterClock extends Clock { } // If so configured, check sanity of proposed clock offset - if (Boolean.valueOf(_context.getProperty("router.clockOffsetSanityCheck","true")).booleanValue() == true) { + if (Boolean.valueOf(_contextRC.getProperty("router.clockOffsetSanityCheck","true")).booleanValue() == true) { // Try calculating peer clock skew - Long peerClockSkew = _context.commSystem().getFramedAveragePeerClockSkew(50); + Long peerClockSkew = _contextRC.commSystem().getFramedAveragePeerClockSkew(50); if (peerClockSkew != null) { @@ -88,9 +89,9 @@ public class RouterClock extends Clock { getLog().info("Updating clock offset to " + offsetMs + "ms from " + _offset + "ms"); if (!_statCreated) - _context.statManager().createRateStat("clock.skew", "How far is the already adjusted clock being skewed?", "Clock", new long[] { 10*60*1000, 3*60*60*1000, 24*60*60*60 }); + _contextRC.statManager().createRateStat("clock.skew", "How far is the already adjusted clock being skewed?", "Clock", new long[] { 10*60*1000, 3*60*60*1000, 24*60*60*60 }); _statCreated = true; - _context.statManager().addRateData("clock.skew", delta, 0); + _contextRC.statManager().addRateData("clock.skew", delta, 0); } else { getLog().log(Log.INFO, "Initializing clock offset to " + offsetMs + "ms from " + _offset + "ms"); } diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java index 517a5ba35..467338eb2 100644 --- a/router/java/src/net/i2p/router/RouterContext.java +++ b/router/java/src/net/i2p/router/RouterContext.java @@ -6,19 +6,15 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.data.Hash; -import net.i2p.router.admin.AdminManager; import net.i2p.router.client.ClientManagerFacadeImpl; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.router.peermanager.Calculator; import net.i2p.router.peermanager.CapacityCalculator; import net.i2p.router.peermanager.IntegrationCalculator; -import net.i2p.router.peermanager.IsFailingCalculator; import net.i2p.router.peermanager.PeerManagerFacadeImpl; import net.i2p.router.peermanager.ProfileManagerImpl; import net.i2p.router.peermanager.ProfileOrganizer; -import net.i2p.router.peermanager.ReliabilityCalculator; import net.i2p.router.peermanager.SpeedCalculator; -import net.i2p.router.peermanager.StrictSpeedCalculator; import net.i2p.router.transport.CommSystemFacadeImpl; import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.router.transport.OutboundMessageRegistry; @@ -38,7 +34,6 @@ import net.i2p.util.KeyRing; */ public class RouterContext extends I2PAppContext { private Router _router; - private AdminManager _adminManager; private ClientManagerFacade _clientManagerFacade; private ClientMessagePool _clientMessagePool; private JobQueue _jobQueue; @@ -61,13 +56,10 @@ public class RouterContext extends I2PAppContext { private MessageValidator _messageValidator; private MessageStateMonitor _messageStateMonitor; private RouterThrottle _throttle; - private RouterClock _clock; - private Calculator _isFailingCalc; + private RouterClock _clockX; // LINT field hides another field, hope rename won't break anything. private Calculator _integrationCalc; private Calculator _speedCalc; - private Calculator _reliabilityCalc; private Calculator _capacityCalc; - private Calculator _oldSpeedCalc; private static List _contexts = new ArrayList(1); @@ -76,7 +68,11 @@ public class RouterContext extends I2PAppContext { public RouterContext(Router router, Properties envProps) { super(filterProps(envProps)); _router = router; - initAll(); + // Disabled here so that the router can get a context and get the + // directory locations from it, to do an update, without having + // to init everything. Caller MUST call initAll() afterwards. + // Sorry, this breaks some main() unit tests out there. + //initAll(); _contexts.add(this); } /** @@ -92,8 +88,7 @@ public class RouterContext extends I2PAppContext { envProps.setProperty("time.disabled", "false"); return envProps; } - private void initAll() { - _adminManager = new AdminManager(this); + public void initAll() { if ("false".equals(getProperty("i2p.dummyClientFacade", "false"))) _clientManagerFacade = new ClientManagerFacadeImpl(this); else @@ -132,11 +127,8 @@ public class RouterContext extends I2PAppContext { _messageValidator = new MessageValidator(this); //_throttle = new RouterThrottleImpl(this); _throttle = new RouterDoSThrottle(this); - _isFailingCalc = new IsFailingCalculator(this); _integrationCalc = new IntegrationCalculator(this); _speedCalc = new SpeedCalculator(this); - _oldSpeedCalc = new StrictSpeedCalculator(this); - _reliabilityCalc = new ReliabilityCalculator(this); _capacityCalc = new CapacityCalculator(this); } @@ -154,11 +146,6 @@ public class RouterContext extends I2PAppContext { /** convenience method for querying the router's ident */ public Hash routerHash() { return _router.getRouterInfo().getIdentity().getHash(); } - /** - * Controls a basic admin interface - * - */ - public AdminManager adminManager() { return _adminManager; } /** * How are we coordinating clients for the router? */ @@ -264,20 +251,16 @@ public class RouterContext extends I2PAppContext { */ public RouterThrottle throttle() { return _throttle; } - /** how do we rank the failure of profiles? */ - public Calculator isFailingCalculator() { return _isFailingCalc; } /** how do we rank the integration of profiles? */ public Calculator integrationCalculator() { return _integrationCalc; } /** how do we rank the speed of profiles? */ public Calculator speedCalculator() { return _speedCalc; } - public Calculator oldSpeedCalculator() { return _oldSpeedCalc; } - /** how do we rank the reliability of profiles? */ - public Calculator reliabilityCalculator() { return _reliabilityCalc; } /** how do we rank the capacity of profiles? */ public Calculator capacityCalculator() { return _capacityCalc; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append("RouterContext: ").append(super.toString()).append('\n'); buf.append(_router).append('\n'); buf.append(_clientManagerFacade).append('\n'); @@ -298,10 +281,8 @@ public class RouterContext extends I2PAppContext { buf.append(_statPublisher).append('\n'); buf.append(_shitlist).append('\n'); buf.append(_messageValidator).append('\n'); - buf.append(_isFailingCalc).append('\n'); buf.append(_integrationCalc).append('\n'); buf.append(_speedCalc).append('\n'); - buf.append(_reliabilityCalc).append('\n'); return buf.toString(); } @@ -310,6 +291,7 @@ public class RouterContext extends I2PAppContext { * I2PAppContext says. * */ + @Override public String getProperty(String propName) { if (_router != null) { String val = _router.getConfigSetting(propName); @@ -322,6 +304,7 @@ public class RouterContext extends I2PAppContext { * I2PAppContext says. * */ + @Override public String getProperty(String propName, String defaultVal) { if (_router != null) { String val = _router.getConfigSetting(propName); @@ -333,6 +316,7 @@ public class RouterContext extends I2PAppContext { /** * Return an int with an int default */ + @Override public int getProperty(String propName, int defaultVal) { if (_router != null) { String val = _router.getConfigSetting(propName); @@ -355,14 +339,16 @@ public class RouterContext extends I2PAppContext { * that it triggers initializeClock() of which we definitely * need the local version to run. */ + @Override public Clock clock() { if (!_clockInitialized) initializeClock(); - return _clock; + return _clockX; } + @Override protected void initializeClock() { synchronized (this) { - if (_clock == null) - _clock = new RouterClock(this); + if (_clockX == null) + _clockX = new RouterClock(this); _clockInitialized = true; } } diff --git a/router/java/src/net/i2p/router/RouterDoSThrottle.java b/router/java/src/net/i2p/router/RouterDoSThrottle.java index c161ddda5..79471627a 100644 --- a/router/java/src/net/i2p/router/RouterDoSThrottle.java +++ b/router/java/src/net/i2p/router/RouterDoSThrottle.java @@ -19,6 +19,7 @@ class RouterDoSThrottle extends RouterThrottleImpl { private static final long LOOKUP_THROTTLE_PERIOD = 10*1000; private static final long LOOKUP_THROTTLE_MAX = 20; + @Override public boolean acceptNetDbLookupRequest(Hash key) { // if we were going to refuse it anyway, drop it boolean shouldAccept = super.acceptNetDbLookupRequest(key); diff --git a/router/java/src/net/i2p/router/RouterLaunch.java b/router/java/src/net/i2p/router/RouterLaunch.java index 6aab4e8ac..13ee2f3cf 100644 --- a/router/java/src/net/i2p/router/RouterLaunch.java +++ b/router/java/src/net/i2p/router/RouterLaunch.java @@ -1,13 +1,39 @@ package net.i2p.router; +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; +/** + * This is the class called by the runplain.sh script on linux + * and the i2p.exe launcher on Windows. + * (i.e. no wrapper) + * + * If there is no -Dwrapper.log=/path/to/wrapper.log on the java command line + * to specify a log file, check for existence of wrapper.log in CWD, + * for backward compatibility in old installations (don't move it). + * Otherwise, use (system temp dir)/wrapper.log. + * Create if it doesn't exist, and append to it if it does. + * Put the location in the environment as an absolute path, so logs.jsp can find it. + */ public class RouterLaunch { + private static final String PROP_WRAPPER_LOG = "wrapper.logfile"; + private static final String DEFAULT_WRAPPER_LOG = "wrapper.log"; + public static void main(String args[]) { + String path = System.getProperty(PROP_WRAPPER_LOG); + File logfile; + if (path != null) { + logfile = new File(path); + } else { + logfile = new File(DEFAULT_WRAPPER_LOG); + if (!logfile.exists()) + logfile = new File(System.getProperty("java.io.tmpdir"), DEFAULT_WRAPPER_LOG); + } + System.setProperty(PROP_WRAPPER_LOG, logfile.getAbsolutePath()); try { - System.setOut(new PrintStream(new FileOutputStream("wrapper.log"))); + System.setOut(new PrintStream(new FileOutputStream(logfile, true))); } catch (IOException ioe) { ioe.printStackTrace(); } diff --git a/router/java/src/net/i2p/router/RouterThrottleImpl.java b/router/java/src/net/i2p/router/RouterThrottleImpl.java index fc38b1695..228c216f1 100644 --- a/router/java/src/net/i2p/router/RouterThrottleImpl.java +++ b/router/java/src/net/i2p/router/RouterThrottleImpl.java @@ -31,8 +31,10 @@ class RouterThrottleImpl implements RouterThrottle { private static int THROTTLE_EVENT_LIMIT = 30; private static final String PROP_MAX_TUNNELS = "router.maxParticipatingTunnels"; - private static final int DEFAULT_MAX_TUNNELS = 2000; + private static final int DEFAULT_MAX_TUNNELS = 2500; private static final String PROP_DEFAULT_KBPS_THROTTLE = "router.defaultKBpsThrottle"; + private static final String PROP_MAX_PROCESSINGTIME = "router.defaultProcessingTimeThrottle"; + private static final int DEFAULT_MAX_PROCESSINGTIME = 1500; /** tunnel acceptance */ public static final int TUNNEL_ACCEPT = 0; @@ -96,19 +98,48 @@ class RouterThrottleImpl implements RouterThrottle { return TunnelHistory.TUNNEL_REJECT_BANDWIDTH; long lag = _context.jobQueue().getMaxLag(); -// reject here if lag too high??? + // reject here if lag too high??? + RateStat rs = _context.statManager().getRate("transport.sendProcessingTime"); - Rate r = null; - if (rs != null) - r = rs.getRate(60*1000); - double processTime = (r != null ? r.getAverageValue() : 0); - if (processTime > 5000) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Refusing tunnel request with the job lag of " + lag - + "since the 1 minute message processing time is too slow (" + processTime + ")"); - _context.statManager().addRateData("router.throttleTunnelProcessingTime1m", (long)processTime, (long)processTime); - setTunnelStatus("Rejecting tunnels: High message delay"); - return TunnelHistory.TUNNEL_REJECT_TRANSIENT_OVERLOAD; + Rate r = rs.getRate(60*1000); + + //Reject tunnels if the time to process messages and send them is too large. Too much time implies congestion. + if(r != null) { + double totalSendProcessingTimeEvents = r.getCurrentEventCount() + r.getLastEventCount(); + double avgSendProcessingTime = 0; + double currentSendProcessingTime = 0; + double lastSendProcessingTime = 0; + + //Calculate times + if(r.getCurrentEventCount() > 0) { + currentSendProcessingTime = r.getCurrentTotalValue()/r.getCurrentEventCount(); + } + if(r.getLastEventCount() > 0) { + lastSendProcessingTime = r.getLastTotalValue()/r.getLastEventCount(); + } + if(totalSendProcessingTimeEvents > 0) { + avgSendProcessingTime = (r.getCurrentTotalValue() + r.getLastTotalValue())/totalSendProcessingTimeEvents; + } + else { + avgSendProcessingTime = r.getAverageValue(); + if(_log.shouldLog(Log.WARN)) { + _log.warn("No events occurred. Using 1 minute average to look at message delay."); + } + } + + int maxProcessingTime = _context.getProperty(PROP_MAX_PROCESSINGTIME, DEFAULT_MAX_PROCESSINGTIME); + + //Set throttling if necessary + if((avgSendProcessingTime > maxProcessingTime*0.9 + || currentSendProcessingTime > maxProcessingTime + || lastSendProcessingTime > maxProcessingTime)) { + if(_log.shouldLog(Log.WARN)) { + _log.warn("Refusing tunnel request due to sendProcessingTime of " + avgSendProcessingTime + + " ms over the last two minutes, which is too much."); + } + setTunnelStatus("Rejecting tunnels: congestion"); + return TunnelHistory.TUNNEL_REJECT_BANDWIDTH; + } } int numTunnels = _context.tunnelManager().getParticipatingCount(); @@ -262,6 +293,7 @@ class RouterThrottleImpl implements RouterThrottle { } private static final int DEFAULT_MESSAGES_PER_TUNNEL_ESTIMATE = 40; // .067KBps + /** also limited to 90% - see below */ private static final int MIN_AVAILABLE_BPS = 4*1024; // always leave at least 4KBps free when allowing private static final String LIMIT_STR = "Rejecting tunnels: Bandwidth limit"; @@ -282,8 +314,11 @@ class RouterThrottleImpl implements RouterThrottle { int used1mOut = _context.router().get1mRate(true); // Check the inbound and outbound total bw available (separately) - int availBps = (maxKBpsIn*1024) - usedIn; - availBps = Math.min(availBps, (maxKBpsOut*1024) - usedOut); + // We block all tunnels when share bw is over (max * 0.9) - 4KB + // This gives reasonable growth room for existing tunnels on both low and high + // bandwidth routers. We want to be rejecting tunnels more aggressively than + // dropping packets with WRED + int availBps = Math.min((maxKBpsIn*1024*9/10) - usedIn, (maxKBpsOut*1024*9/10) - usedOut); if (availBps < MIN_AVAILABLE_BPS) { if (_log.shouldLog(Log.WARN)) _log.warn("Reject, avail (" + availBps + ") less than min"); setTunnelStatus(LIMIT_STR); @@ -303,8 +338,7 @@ class RouterThrottleImpl implements RouterThrottle { _context.statManager().addRateData("router.throttleTunnelBytesAllowed", availBps, (long)bytesAllocated); // Now see if 1m rates are too high - long overage = used1mIn - (maxKBpsIn*1024); - overage = Math.max(overage, used1mOut - (maxKBpsOut*1024)); + long overage = Math.max(used1mIn - (maxKBpsIn*1024), used1mOut - (maxKBpsOut*1024)); if ( (overage > 0) && ((overage/(float)(maxKBps*1024f)) > _context.random().nextFloat()) ) { if (_log.shouldLog(Log.WARN)) _log.warn("Reject tunnel, 1m rate (" + overage + " over) indicates overload."); @@ -312,7 +346,8 @@ class RouterThrottleImpl implements RouterThrottle { return false; } - float maxBps = maxKBps * 1024f; + // limit at 90% - 4KBps (see above) + float maxBps = (maxKBps * 1024f * 0.9f) - MIN_AVAILABLE_BPS; float pctFull = (maxBps - availBps) / (maxBps); double probReject = Math.pow(pctFull, 16); // steep curve double rand = _context.random().nextFloat(); diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 5203f2360..217d41d54 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -13,13 +13,17 @@ import net.i2p.CoreVersion; /** * Expose a version string * - */ +n */ public class RouterVersion { - public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $"; + /** deprecated */ + public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 5; + public final static long BUILD = 11; + /** for example "-test" */ + public final static String EXTRA = ""; + public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; public static void main(String args[]) { - System.out.println("I2P Router version: " + VERSION + "-" + BUILD); + System.out.println("I2P Router version: " + FULL_VERSION); System.out.println("Router ID: " + RouterVersion.ID); System.out.println("I2P Core version: " + CoreVersion.VERSION); System.out.println("Core ID: " + CoreVersion.ID); diff --git a/router/java/src/net/i2p/router/RouterWatchdog.java b/router/java/src/net/i2p/router/RouterWatchdog.java index 3f4965e13..14dc01c1e 100644 --- a/router/java/src/net/i2p/router/RouterWatchdog.java +++ b/router/java/src/net/i2p/router/RouterWatchdog.java @@ -3,6 +3,7 @@ package net.i2p.router; import net.i2p.data.DataHelper; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; +import net.i2p.util.ShellCommand; import net.i2p.util.Log; /** @@ -13,6 +14,7 @@ import net.i2p.util.Log; class RouterWatchdog implements Runnable { private Log _log; private RouterContext _context; + private int _consecutiveErrors; private static final long MAX_JOB_RUN_LAG = 60*1000; @@ -47,7 +49,15 @@ class RouterWatchdog implements Runnable { } private boolean shutdownOnHang() { - return Boolean.valueOf(_context.getProperty("watchdog.haltOnHang", "false")).booleanValue(); + // prop default false + if (!Boolean.valueOf(_context.getProperty("watchdog.haltOnHang")).booleanValue()) + return false; + + // Client manager starts complaining after 10 minutes, and we run every minute, + // so this will restart 30 minutes after we lose a lease, if the wrapper is present. + if (_consecutiveErrors >= 20 && System.getProperty("wrapper.version") != null) + return true; + return false; } private void dumpStatus() { @@ -80,6 +90,21 @@ class RouterWatchdog implements Runnable { r = rs.getRate(60*1000); double kbps = (r != null ? r.getAverageValue() : 0); _log.error("Outbound send rate: " + kbps + "KBps"); + long max = Runtime.getRuntime().maxMemory(); + long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + _log.error("Memory: " + DataHelper.formatSize(used) + '/' + DataHelper.formatSize(max)); + if (_consecutiveErrors == 1) { + _log.log(Log.CRIT, "Router appears hung, or there is severe network congestion. Watchdog starts barking!"); + // This works on linux... + // It won't on windows, and we can't call i2prouter.bat either, it does something + // completely different... + if (System.getProperty("wrapper.version") != null && !System.getProperty("os.name").startsWith("Win")) { + ShellCommand sc = new ShellCommand(); + boolean success = sc.executeSilentAndWaitTimed("./i2prouter dump", 10); + if (success) + _log.log(Log.CRIT, "Threads dumped to wrapper log"); + } + } } } @@ -103,10 +128,13 @@ class RouterWatchdog implements Runnable { ok = ok && (verifyClientLiveliness() || netErrors >= 5); - if (!ok) { + if (ok) { + _consecutiveErrors = 0; + } else { + _consecutiveErrors++; dumpStatus(); if (shutdownOnHang()) { - _log.log(Log.CRIT, "Router hung! hard restart!"); + _log.log(Log.CRIT, "Router hung! Restart forced by watchdog!"); try { Thread.sleep(30*1000); } catch (InterruptedException ie) {} // halt and not system.exit, since some of the shutdown hooks might be misbehaving Runtime.getRuntime().halt(Router.EXIT_HARD_RESTART); diff --git a/router/java/src/net/i2p/router/SessionKeyPersistenceHelper.java b/router/java/src/net/i2p/router/SessionKeyPersistenceHelper.java deleted file mode 100644 index 57db42bb4..000000000 --- a/router/java/src/net/i2p/router/SessionKeyPersistenceHelper.java +++ /dev/null @@ -1,115 +0,0 @@ -package net.i2p.router; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.Writer; - -import net.i2p.crypto.PersistentSessionKeyManager; -import net.i2p.crypto.SessionKeyManager; -import net.i2p.util.Log; - -/** - * Centralize the sessionKeyManager persistence (rather than leave it to a private - * job in the startup job) - * - */ -public class SessionKeyPersistenceHelper implements Service { - private Log _log; - private RouterContext _context; - private SessionKeyWriterJob _writerJob; - private final static long PERSIST_DELAY = 3*60*1000; - private final static String PROP_SESSION_KEY_FILE = "router.sessionKeys.location"; - private final static String DEFAULT_SESSION_KEY_FILE = "sessionKeys.dat"; - - public SessionKeyPersistenceHelper(RouterContext context) { - _context = context; - _log = _context.logManager().getLog(SessionKeyPersistenceHelper.class); - _writerJob = new SessionKeyWriterJob(); - } - - public void shutdown() { - writeState(); - } - - public void restart() { - writeState(); - startup(); - } - - private String getKeyFile() { - String val = _context.router().getConfigSetting(PROP_SESSION_KEY_FILE); - if (val == null) - val = DEFAULT_SESSION_KEY_FILE; - return val; - } - - public void startup() { - SessionKeyManager mgr = _context.sessionKeyManager(); - if (mgr instanceof PersistentSessionKeyManager) { - PersistentSessionKeyManager manager = (PersistentSessionKeyManager)mgr; - File f = new File(getKeyFile()); - if (f.exists()) { - FileInputStream fin = null; - try { - fin = new FileInputStream(f); - manager.loadState(fin); - int expired = manager.aggressiveExpire(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Session keys loaded [not error] with " + expired - + " sets immediately expired"); - } catch (Throwable t) { - _log.error("Error reading in session key data", t); - } finally { - if (fin != null) try { fin.close(); } catch (IOException ioe) {} - } - } - _context.jobQueue().addJob(_writerJob); - } - } - - private void writeState() { - if (true) return; - - Object o = _context.sessionKeyManager(); - if (!(o instanceof PersistentSessionKeyManager)) { - _log.error("Unable to persist the session key state - manager is " + o.getClass().getName()); - return; - } - PersistentSessionKeyManager mgr = (PersistentSessionKeyManager)o; - - // only need for synchronization is during shutdown() - synchronized (mgr) { - FileOutputStream fos = null; - try { - int expired = mgr.aggressiveExpire(); - if (expired > 0) { - _log.info("Agressive expired " + expired + " tag sets"); - } - fos = new FileOutputStream(getKeyFile()); - mgr.saveState(fos); - fos.flush(); - _log.debug("Session keys written"); - } catch (Throwable t) { - _log.debug("Error writing session key state", t); - } finally { - if (fos != null) try { fos.close(); } catch (IOException ioe) {} - } - } - } - - public void renderStatusHTML(Writer out) { } - - private class SessionKeyWriterJob extends JobImpl { - public SessionKeyWriterJob() { - super(SessionKeyPersistenceHelper.this._context); - getTiming().setStartAfter(PERSIST_DELAY); - } - public String getName() { return "Write Session Keys"; } - public void runJob() { - writeState(); - requeue(PERSIST_DELAY); - } - } -} diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java index 29d384de9..d1307fdea 100644 --- a/router/java/src/net/i2p/router/Shitlist.java +++ b/router/java/src/net/i2p/router/Shitlist.java @@ -13,8 +13,6 @@ import java.io.Writer; import java.util.concurrent.ConcurrentHashMap; import java.util.ArrayList; import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -67,7 +65,7 @@ public class Shitlist { _toUnshitlist = new ArrayList(4); getTiming().setStartAfter(ctx.clock().now() + SHITLIST_CLEANER_START_DELAY); } - public String getName() { return "Cleanup shitlist"; } + public String getName() { return "Expire banned peers"; } public void runJob() { _toUnshitlist.clear(); long now = getContext().clock().now(); @@ -254,8 +252,8 @@ public class Shitlist { } public void renderStatusHTML(Writer out) throws IOException { - StringBuffer buf = new StringBuffer(1024); - buf.append("

    Shitlist

    "); + StringBuilder buf = new StringBuilder(1024); + buf.append("

    Banned Peers

    "); Map entries = new TreeMap(new HashComparator()); entries.putAll(_entries); @@ -265,8 +263,7 @@ public class Shitlist { for (Map.Entry e : entries.entrySet()) { Hash key = e.getKey(); Entry entry = e.getValue(); - buf.append("
  • ").append(key.toBase64()).append(""); - buf.append(" (netdb)"); + buf.append("
  • ").append(_context.commSystem().renderPeerHTML(key)); buf.append(" expiring in "); buf.append(DataHelper.formatDuration(entry.expireOn-_context.clock().now())); Set transports = entry.transports; @@ -276,7 +273,7 @@ public class Shitlist { buf.append("
    \n"); buf.append(entry.cause); } - buf.append(" (unshitlist now)"); + buf.append(" (unban now)"); buf.append("
  • \n"); } buf.append("\n"); diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java index d959c25d3..86b0ee113 100644 --- a/router/java/src/net/i2p/router/StatisticsManager.java +++ b/router/java/src/net/i2p/router/StatisticsManager.java @@ -29,12 +29,9 @@ public class StatisticsManager implements Service { private Log _log; private RouterContext _context; private boolean _includePeerRankings; - private int _publishedStats; public final static String PROP_PUBLISH_RANKINGS = "router.publishPeerRankings"; public final static String DEFAULT_PROP_PUBLISH_RANKINGS = "true"; - public final static String PROP_MAX_PUBLISHED_PEERS = "router.publishPeerMax"; - public final static int DEFAULT_MAX_PUBLISHED_PEERS = 10; private final DecimalFormat _fmt; private final DecimalFormat _pct; @@ -52,43 +49,8 @@ public class StatisticsManager implements Service { startup(); } public void startup() { - String val = _context.router().getConfigSetting(PROP_PUBLISH_RANKINGS); - try { - if (val == null) { - if (_log.shouldLog(Log.INFO)) - _log.info("Peer publishing setting " + PROP_PUBLISH_RANKINGS - + " not set - using default " + DEFAULT_PROP_PUBLISH_RANKINGS); - val = DEFAULT_PROP_PUBLISH_RANKINGS; - } else { - if (_log.shouldLog(Log.INFO)) - _log.info("Peer publishing setting " + PROP_PUBLISH_RANKINGS - + " set to " + val); - } - boolean v = Boolean.TRUE.toString().equalsIgnoreCase(val); - _includePeerRankings = v; - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Setting includePeerRankings = " + v); - } catch (Throwable t) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Error determining whether to publish rankings [" - + PROP_PUBLISH_RANKINGS + "=" + val - + "], so we're defaulting to FALSE"); - _includePeerRankings = false; - } - val = _context.router().getConfigSetting(PROP_MAX_PUBLISHED_PEERS); - if (val == null) { - _publishedStats = DEFAULT_MAX_PUBLISHED_PEERS; - } else { - try { - int num = Integer.parseInt(val); - _publishedStats = num; - } catch (NumberFormatException nfe) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Invalid max number of peers to publish [" + val - + "], defaulting to " + DEFAULT_MAX_PUBLISHED_PEERS, nfe); - _publishedStats = DEFAULT_MAX_PUBLISHED_PEERS; - } - } + String val = _context.getProperty(PROP_PUBLISH_RANKINGS, DEFAULT_PROP_PUBLISH_RANKINGS); + _includePeerRankings = Boolean.valueOf(val); } /** Retrieve a snapshot of the statistics that should be published */ @@ -124,13 +86,10 @@ public class StatisticsManager implements Service { ***/ if (_includePeerRankings) { - if (false) - stats.putAll(_context.profileManager().summarizePeers(_publishedStats)); - long publishedUptime = _context.router().getUptime(); // Don't publish these for first hour - if (publishedUptime > 60*60*1000) - includeThroughput(stats); + if (publishedUptime > 62*60*1000) + includeAverageThroughput(stats); //includeRate("router.invalidMessageTime", stats, new long[] { 10*60*1000 }); //includeRate("router.duplicateMessageId", stats, new long[] { 24*60*60*1000 }); //includeRate("tunnel.duplicateIV", stats, new long[] { 24*60*60*1000 }); @@ -162,7 +121,9 @@ public class StatisticsManager implements Service { //includeRate("transport.sendProcessingTime", stats, new long[] { 60*60*1000 }); //includeRate("jobQueue.jobRunSlow", stats, new long[] { 10*60*1000l, 60*60*1000l }); //includeRate("crypto.elGamal.encrypt", stats, new long[] { 60*60*1000 }); - includeRate("tunnel.participatingTunnels", stats, new long[] { 5*60*1000, 60*60*1000 }); + // total event count can be used to track uptime + boolean hideTotals = ! RouterVersion.VERSION.equals("0.7.6"); + includeRate("tunnel.participatingTunnels", stats, new long[] { 60*60*1000 }, hideTotals); //includeRate("tunnel.testSuccessTime", stats, new long[] { 10*60*1000l }); //includeRate("client.sendAckTime", stats, new long[] { 60*60*1000 }, true); //includeRate("udp.sendConfirmTime", stats, new long[] { 10*60*1000 }); @@ -172,12 +133,6 @@ public class StatisticsManager implements Service { //includeRate("stream.con.sendDuplicateSize", stats, new long[] { 60*60*1000 }); //includeRate("stream.con.receiveDuplicateSize", stats, new long[] { 60*60*1000 }); - // Round smaller uptimes to 1 hour, to frustrate uptime tracking - // Round 2nd hour to 90m since peers use 2h minimum to route - if (publishedUptime < 60*60*1000) publishedUptime = 60*60*1000; - else if (publishedUptime < 2*60*60*1000) publishedUptime = 90*60*1000; - - stats.setProperty("stat_uptime", DataHelper.formatDuration(publishedUptime)); //stats.setProperty("stat__rateKey", "avg;maxAvg;pctLifetime;[sat;satLim;maxSat;maxSatLim;][num;lifetimeFreq;maxFreq]"); //includeRate("tunnel.decryptRequestTime", stats, new long[] { 60*1000, 10*60*1000 }); @@ -185,29 +140,21 @@ public class StatisticsManager implements Service { //includeRate("udp.packetVerifyTime", stats, new long[] { 60*1000 }); //includeRate("tunnel.buildRequestTime", stats, new long[] { 10*60*1000 }); - includeRate("tunnel.buildClientExpire", stats, new long[] { 10*60*1000 }); - includeRate("tunnel.buildClientReject", stats, new long[] { 10*60*1000 }); - includeRate("tunnel.buildClientSuccess", stats, new long[] { 10*60*1000 }); - includeRate("tunnel.buildExploratoryExpire", stats, new long[] { 10*60*1000 }); - includeRate("tunnel.buildExploratoryReject", stats, new long[] { 10*60*1000 }); - includeRate("tunnel.buildExploratorySuccess", stats, new long[] { 10*60*1000 }); + long rate = 60*60*1000; + includeTunnelRates("Client", stats, rate); + includeTunnelRates("Exploratory", stats, rate); //includeRate("tunnel.rejectTimeout", stats, new long[] { 10*60*1000 }); //includeRate("tunnel.rejectOverloaded", stats, new long[] { 10*60*1000 }); //includeRate("tunnel.acceptLoad", stats, new long[] { 10*60*1000 }); - - _log.debug("Publishing peer rankings"); - } else { - // So that we will still get build requests - stats.setProperty("stat_uptime", "90m"); - _log.debug("Not publishing peer rankings"); } + + // So that we will still get build requests + stats.setProperty("stat_uptime", "90m"); if (FloodfillNetworkDatabaseFacade.isFloodfill(_context.router().getRouterInfo())) { stats.setProperty("netdb.knownRouters", ""+_context.netDb().getKnownRouters()); stats.setProperty("netdb.knownLeaseSets", ""+_context.netDb().getKnownLeaseSets()); } - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Building status: " + stats); return stats; } @@ -245,7 +192,7 @@ public class StatisticsManager implements Service { } private String renderRate(Rate rate, boolean fudgeQuantity) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(num(rate.getAverageValue())).append(';'); buf.append(num(rate.getExtremeAverageValue())).append(';'); buf.append(pct(rate.getPercentageOfLifetimeValue())).append(';'); @@ -274,41 +221,66 @@ public class StatisticsManager implements Service { return buf.toString(); } - private void includeThroughput(Properties stats) { - RateStat sendRate = _context.statManager().getRate("bw.sendRate"); - if (sendRate != null) { - /**** - if (_context.router().getUptime() > 5*60*1000) { - Rate r = sendRate.getRate(5*60*1000); - if (r != null) - stats.setProperty("stat_bandwidthSendBps.5m", num(r.getAverageValue()) + ';' + num(r.getExtremeAverageValue()) + ";0;0;"); - } - ****/ - if (_context.router().getUptime() > 60*60*1000) { - Rate r = sendRate.getRate(60*60*1000); - if (r != null) - stats.setProperty("stat_bandwidthSendBps.60m", num(r.getAverageValue()) + ';' + num(r.getExtremeAverageValue()) + ";0;0;"); - } + private static final String[] tunnelStats = { "Expire", "Reject", "Success" }; + + /** + * Add tunnel build rates with some mods to hide absolute quantities + * In particular, report counts normalized to 100 (i.e. a percentage) + */ + private void includeTunnelRates(String tunnelType, Properties stats, long selectedPeriod) { + long totalEvents = 0; + for (String tunnelStat : tunnelStats) { + String rateName = "tunnel.build" + tunnelType + tunnelStat; + RateStat stat = _context.statManager().getRate(rateName); + if (stat == null) continue; + Rate curRate = stat.getRate(selectedPeriod); + if (curRate == null) continue; + totalEvents += curRate.getLastEventCount(); } - - RateStat recvRate = _context.statManager().getRate("bw.recvRate"); - if (recvRate != null) { - /**** - if (_context.router().getUptime() > 5*60*1000) { - Rate r = recvRate.getRate(5*60*1000); - if (r != null) - stats.setProperty("stat_bandwidthReceiveBps.5m", num(r.getAverageValue()) + ';' + num(r.getExtremeAverageValue()) + ";0;0;"); - } - ****/ - if (_context.router().getUptime() > 60*60*1000) { - Rate r = recvRate.getRate(60*60*1000); - if (r != null) - stats.setProperty("stat_bandwidthReceiveBps.60m", num(r.getAverageValue()) + ';' + num(r.getExtremeAverageValue()) + ";0;0;"); - } + if (totalEvents <= 0) + return; + for (String tunnelStat : tunnelStats) { + String rateName = "tunnel.build" + tunnelType + tunnelStat; + RateStat stat = _context.statManager().getRate(rateName); + if (stat == null) continue; + Rate curRate = stat.getRate(selectedPeriod); + if (curRate == null) continue; + double fudgeQuantity = 100.0d * curRate.getLastEventCount() / totalEvents; + stats.setProperty("stat_" + rateName + '.' + getPeriod(curRate), renderRate(curRate, fudgeQuantity)); } } - + private String renderRate(Rate rate, double fudgeQuantity) { + StringBuilder buf = new StringBuilder(128); + buf.append(num(rate.getAverageValue())).append(';'); + buf.append(num(rate.getExtremeAverageValue())).append(';'); + buf.append(pct(rate.getPercentageOfLifetimeValue())).append(';'); + if (rate.getLifetimeTotalEventTime() > 0) { + // bah saturation + buf.append("0;0;0;0;"); + } + long numPeriods = rate.getLifetimePeriods(); + buf.append(num(fudgeQuantity)).append(';'); + return buf.toString(); + } + + /* report the same data for tx and rx, for enhanced anonymity */ + private void includeAverageThroughput(Properties stats) { + RateStat sendRate = _context.statManager().getRate("bw.sendRate"); + RateStat recvRate = _context.statManager().getRate("bw.recvRate"); + if (sendRate == null || recvRate == null) + return; + Rate s = sendRate.getRate(60*60*1000); + Rate r = recvRate.getRate(60*60*1000); + if (s == null || r == null) + return; + double speed = (s.getAverageValue() + r.getAverageValue()) / 2; + double max = Math.max(s.getExtremeAverageValue(), r.getExtremeAverageValue()); + String str = num(speed) + ';' + num(max) + ";0;0;"; + stats.setProperty("stat_bandwidthSendBps.60m", str); + stats.setProperty("stat_bandwidthReceiveBps.60m", str); + } + private String getPeriod(Rate rate) { return DataHelper.formatDuration(rate.getPeriod()); } private final String num(double num) { diff --git a/router/java/src/net/i2p/router/TunnelManagerFacade.java b/router/java/src/net/i2p/router/TunnelManagerFacade.java index a6c1c9614..e8bdc31d3 100644 --- a/router/java/src/net/i2p/router/TunnelManagerFacade.java +++ b/router/java/src/net/i2p/router/TunnelManagerFacade.java @@ -8,8 +8,7 @@ package net.i2p.router; * */ -import java.io.IOException; -import java.io.Writer; +import java.util.Set; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -36,12 +35,6 @@ public interface TunnelManagerFacade extends Service { /** pick an outbound tunnel bound to the given destination */ TunnelInfo selectOutboundTunnel(Hash destination); - /** - * True if the peer currently part of a tunnel - * - */ - boolean isInUse(Hash peer); - /** Is a tunnel a valid member of the pool? */ public boolean isValidTunnel(Hash client, TunnelInfo tunnel); @@ -62,6 +55,9 @@ public interface TunnelManagerFacade extends Service { /** count how many inbound tunnel requests we have received but not yet processed */ public int getInboundBuildQueueSize(); + /** @return Set of peers that should not be allowed to be in another tunnel */ + public Set selectPeersInTooManyTunnels(); + /** * the client connected (or updated their settings), so make sure we have * the tunnels for them, and whenever necessary, ask them to authorize diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java index a92470d2e..ceb3814a9 100644 --- a/router/java/src/net/i2p/router/TunnelPoolSettings.java +++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java @@ -49,7 +49,7 @@ public class TunnelPoolSettings { // public static final int DEFAULT_REBUILD_PERIOD = 60*1000; public static final int DEFAULT_DURATION = 10*60*1000; public static final int DEFAULT_LENGTH = 2; - public static final int DEFAULT_LENGTH_VARIANCE = 1; + public static final int DEFAULT_LENGTH_VARIANCE = 0; public static final boolean DEFAULT_ALLOW_ZERO_HOP = true; public static final int DEFAULT_IP_RESTRICTION = 2; // class B (/16) @@ -185,8 +185,9 @@ public class TunnelPoolSettings { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); Properties p = new Properties(); writeToProperties("", p); buf.append("Tunnel pool settings:\n"); diff --git a/router/java/src/net/i2p/router/TunnelSettings.java b/router/java/src/net/i2p/router/TunnelSettings.java index 3ea8baa56..99249f7c7 100644 --- a/router/java/src/net/i2p/router/TunnelSettings.java +++ b/router/java/src/net/i2p/router/TunnelSettings.java @@ -105,6 +105,7 @@ public class TunnelSettings extends DataStructureImpl { } + @Override public int hashCode() { int rv = 0; rv += _includeDummy ? 100 : 0; @@ -118,6 +119,7 @@ public class TunnelSettings extends DataStructureImpl { return rv; } + @Override public boolean equals(Object obj) { if ( (obj != null) && (obj instanceof TunnelSettings) ) { TunnelSettings settings = (TunnelSettings)obj; diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java index 4f979c5c9..a084bafce 100644 --- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java +++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java @@ -13,11 +13,12 @@ import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.ConcurrentHashMap; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import net.i2p.crypto.SessionKeyManager; +import net.i2p.crypto.TransientSessionKeyManager; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; @@ -69,11 +70,13 @@ public class ClientConnectionRunner { private Set _acceptedPending; /** thingy that does stuff */ private I2CPMessageReader _reader; + /** just for this destination */ + private SessionKeyManager _sessionKeyManager; /** * This contains the last 10 MessageIds that have had their (non-ack) status * delivered to the client (so that we can be sure only to update when necessary) */ - private List _alreadyProcessed; + private final List _alreadyProcessed; private ClientWriterRunner _writer; private Hash _destHashCache; /** are we, uh, dead */ @@ -111,7 +114,7 @@ public class ClientConnectionRunner { t.setDaemon(true); t.setPriority(I2PThread.MAX_PRIORITY); t.start(); - _out = _socket.getOutputStream(); + _out = _socket.getOutputStream(); // LINT -- OWCH! needs a better way so it can be final. _reader.startReading(); } catch (IOException ioe) { _log.error("Error starting up the runner", ioe); @@ -130,6 +133,8 @@ public class ClientConnectionRunner { if (_writer != null) _writer.stopWriting(); if (_socket != null) try { _socket.close(); } catch (IOException ioe) { } _messages.clear(); + if (_sessionKeyManager != null) + _sessionKeyManager.shutdown(); if (_manager != null) _manager.unregisterConnection(this); if (_currentLeaseSet != null) @@ -144,6 +149,8 @@ public class ClientConnectionRunner { /** current client's config */ public SessionConfig getConfig() { return _config; } + /** current client's sessionkeymanager */ + public SessionKeyManager getSessionKeyManager() { return _sessionKeyManager; } /** currently allocated leaseSet */ public LeaseSet getLeaseSet() { return _currentLeaseSet; } void setLeaseSet(LeaseSet ls) { _currentLeaseSet = ls; } @@ -182,6 +189,11 @@ public class ClientConnectionRunner { if (_log.shouldLog(Log.DEBUG)) _log.debug("SessionEstablished called for destination " + _destHashCache.toBase64()); _config = config; + // per-dest unimplemented + //if (_sessionKeyManager == null) + // _sessionKeyManager = new TransientSessionKeyManager(_context); + //else + // _log.error("SessionEstablished called for twice for destination " + _destHashCache.toBase64().substring(0,4)); _manager.destinationEstablished(this); } @@ -412,7 +424,7 @@ public class ClientConnectionRunner { } if (_log.shouldLog(Log.DEBUG)) _log.debug("after writeMessage("+ msg.getClass().getName() + "): " - + (_context.clock().now()-before) + "ms");; + + (_context.clock().now()-before) + "ms"); } catch (I2CPMessageException ime) { _log.error("Message exception sending I2CP message: " + ime); stopRunning(); @@ -464,7 +476,7 @@ public class ClientConnectionRunner { // this *should* be mod 65536, but UnsignedInteger is still b0rked. FIXME private final static int MAX_MESSAGE_ID = 32767; private static volatile int _messageId = RandomSource.getInstance().nextInt(MAX_MESSAGE_ID); // messageId counter - private static Object _messageIdLock = new Object(); + private final static Object _messageIdLock = new Object(); static int getNextMessageId() { synchronized (_messageIdLock) { diff --git a/router/java/src/net/i2p/router/client/ClientListenerRunner.java b/router/java/src/net/i2p/router/client/ClientListenerRunner.java index 074b161df..0f26b8d00 100644 --- a/router/java/src/net/i2p/router/client/ClientListenerRunner.java +++ b/router/java/src/net/i2p/router/client/ClientListenerRunner.java @@ -31,7 +31,7 @@ public class ClientListenerRunner implements Runnable { private int _port; private boolean _bindAllInterfaces; private boolean _running; - private long _nextFailDelay = 1000; + private boolean _listening; public static final String BIND_ALL_INTERFACES = "i2cp.tcp.bindAllInterfaces"; @@ -41,13 +41,15 @@ public class ClientListenerRunner implements Runnable { _manager = manager; _port = port; _running = false; + _listening = false; - String val = context.getProperty(BIND_ALL_INTERFACES, "False"); + String val = context.getProperty(BIND_ALL_INTERFACES); _bindAllInterfaces = Boolean.valueOf(val).booleanValue(); } public void setPort(int port) { _port = port; } public int getPort() { return _port; } + public boolean isListening() { return _running && _listening; } /** * Start up the socket listener, listens for connections, and @@ -58,7 +60,7 @@ public class ClientListenerRunner implements Runnable { */ public void runServer() { _running = true; - int curDelay = 0; + int curDelay = 1000; while (_running) { try { if (_bindAllInterfaces) { @@ -77,7 +79,8 @@ public class ClientListenerRunner implements Runnable { if (_log.shouldLog(Log.DEBUG)) _log.debug("ServerSocket created, before accept: " + _socket); - curDelay = 0; + curDelay = 1000; + _listening = true; while (_running) { try { Socket socket = _socket.accept(); @@ -96,6 +99,7 @@ public class ClientListenerRunner implements Runnable { } catch (Throwable t) { if (_context.router().isAlive()) _log.error("Fatal error running client listener - killing the thread!", t); + _listening = false; return; } } @@ -104,6 +108,7 @@ public class ClientListenerRunner implements Runnable { _log.error("Error listening on port " + _port, ioe); } + _listening = false; if (_socket != null) { try { _socket.close(); } catch (IOException ioe) {} _socket = null; @@ -111,14 +116,16 @@ public class ClientListenerRunner implements Runnable { if (!_context.router().isAlive()) break; - _log.error("Error listening, waiting " + _nextFailDelay + "ms before we try again"); - try { Thread.sleep(_nextFailDelay); } catch (InterruptedException ie) {} - curDelay += _nextFailDelay; - _nextFailDelay *= 5; + if (curDelay < 60*1000) + _log.error("Error listening, waiting " + (curDelay/1000) + "s before we try again"); + else + _log.log(Log.CRIT, "I2CP error listening to port " + _port + " - is another I2P instance running? Resolve conflicts and restart"); + try { Thread.sleep(curDelay); } catch (InterruptedException ie) {} + curDelay = Math.min(curDelay*3, 60*1000); } if (_context.router().isAlive()) - _log.error("CANCELING I2CP LISTEN. delay = " + curDelay, new Exception("I2CP Listen cancelled!!!")); + _log.error("CANCELING I2CP LISTEN", new Exception("I2CP Listen cancelled!!!")); _running = false; } diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index 18c9c7742..b042d5240 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import net.i2p.crypto.SessionKeyManager; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -41,8 +42,8 @@ import net.i2p.util.Log; public class ClientManager { private Log _log; private ClientListenerRunner _listener; - private HashMap _runners; // Destination --> ClientConnectionRunner - private Set _pendingRunners; // ClientConnectionRunner for clients w/out a Dest yet + private final HashMap _runners; // Destination --> ClientConnectionRunner + private final Set _pendingRunners; // ClientConnectionRunner for clients w/out a Dest yet private RouterContext _ctx; /** ms to wait before rechecking for inbound messages to deliver to clients */ @@ -108,6 +109,8 @@ public class ClientManager { } } + public boolean isAlive() { return _listener.isListening(); } + public void registerConnection(ClientConnectionRunner runner) { synchronized (_pendingRunners) { _pendingRunners.add(runner); @@ -312,6 +315,18 @@ public class ClientManager { return null; } + /** + * Return the client's SessionKeyManager + * + */ + public SessionKeyManager getClientSessionKeyManager(Destination dest) { + ClientConnectionRunner runner = getRunner(dest); + if (runner != null) + return runner.getSessionKeyManager(); + else + return null; + } + private ClientConnectionRunner getRunner(Hash destHash) { if (destHash == null) return null; @@ -372,7 +387,7 @@ public class ClientManager { } public void renderStatusHTML(Writer out) throws IOException { - StringBuffer buf = new StringBuffer(8*1024); + StringBuilder buf = new StringBuilder(8*1024); buf.append("Local destinations
    "); Map runners = null; diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java index 796a098a9..9e706beda 100644 --- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java +++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.Set; +import net.i2p.crypto.SessionKeyManager; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -48,18 +49,8 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade { public void startup() { _log.info("Starting up the client subsystem"); - String portStr = _context.router().getConfigSetting(PROP_CLIENT_PORT); - if (portStr != null) { - try { - int port = Integer.parseInt(portStr); - _manager = new ClientManager(_context, port); - } catch (NumberFormatException nfe) { - _log.error("Error setting the port: " + portStr + " is not valid", nfe); - _manager = new ClientManager(_context, DEFAULT_PORT); - } - } else { - _manager = new ClientManager(_context, DEFAULT_PORT); - } + int port = _context.getProperty(PROP_CLIENT_PORT, DEFAULT_PORT); + _manager = new ClientManager(_context, port); } public void shutdown() { @@ -74,7 +65,11 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade { startup(); } + @Override + public boolean isAlive() { return _manager != null && _manager.isAlive(); } + private static final long MAX_TIME_TO_REBUILD = 10*60*1000; + @Override public boolean verifyClientLiveliness() { if (_manager == null) return true; boolean lively = true; @@ -165,6 +160,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade { } } + @Override public boolean shouldPublishLeaseSet(Hash destinationHash) { return _manager.shouldPublishLeaseSet(destinationHash); } public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered) { @@ -194,6 +190,20 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade { } } + /** + * Return the client's current manager or null if not connected + * + */ + public SessionKeyManager getClientSessionKeyManager(Destination dest) { + if (_manager != null) + return _manager.getClientSessionKeyManager(dest); + else { + _log.error("Null manager on getClientSessionKeyManager!"); + return null; + } + } + + @Override public void renderStatusHTML(Writer out) throws IOException { if (_manager != null) _manager.renderStatusHTML(out); @@ -204,6 +214,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade { * * @return set of Destination objects */ + @Override public Set listClients() { if (_manager != null) return _manager.listClients(); diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index 0dcc81870..3b4b1a6be 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -11,10 +11,12 @@ package net.i2p.router.client; import java.util.Properties; import net.i2p.data.Payload; +import net.i2p.data.i2cp.BandwidthLimitsMessage; import net.i2p.data.i2cp.CreateLeaseSetMessage; import net.i2p.data.i2cp.CreateSessionMessage; import net.i2p.data.i2cp.DestLookupMessage; import net.i2p.data.i2cp.DestroySessionMessage; +import net.i2p.data.i2cp.GetBandwidthLimitsMessage; import net.i2p.data.i2cp.GetDateMessage; import net.i2p.data.i2cp.I2CPMessage; import net.i2p.data.i2cp.I2CPMessageException; @@ -93,6 +95,9 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi case ReconfigureSessionMessage.MESSAGE_TYPE: handleReconfigureSession(reader, (ReconfigureSessionMessage)message); break; + case GetBandwidthLimitsMessage.MESSAGE_TYPE: + handleGetBWLimits(reader, (GetBandwidthLimitsMessage)message); + break; default: if (_log.shouldLog(Log.ERROR)) _log.error("Unhandled I2CP type received: " + message.getType()); @@ -274,6 +279,24 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi } } + /** + * Divide router limit by 1.75 for overhead. + * This could someday give a different answer to each client. + * But it's not enforced anywhere. + */ + private void handleGetBWLimits(I2CPMessageReader reader, GetBandwidthLimitsMessage message) { + if (_log.shouldLog(Log.INFO)) + _log.info("Got BW Limits request"); + int in = _context.bandwidthLimiter().getInboundKBytesPerSecond() * 4 / 7; + int out = _context.bandwidthLimiter().getOutboundKBytesPerSecond() * 4 / 7; + BandwidthLimitsMessage msg = new BandwidthLimitsMessage(in, out); + try { + _runner.doSend(msg); + } catch (I2CPMessageException ime) { + _log.error("Error writing out the session status message", ime); + } + } + // this *should* be mod 65536, but UnsignedInteger is still b0rked. FIXME private final static int MAX_SESSION_ID = 32767; diff --git a/router/java/src/net/i2p/router/client/CreateSessionJob.java b/router/java/src/net/i2p/router/client/CreateSessionJob.java index 11608980d..0ee1f177f 100644 --- a/router/java/src/net/i2p/router/client/CreateSessionJob.java +++ b/router/java/src/net/i2p/router/client/CreateSessionJob.java @@ -59,10 +59,10 @@ class CreateSessionJob extends JobImpl { // XXX props.putAll(Router.getInstance().getConfigMap()); // override them by the client's settings - props.putAll(_runner.getConfig().getOptions()); + props.putAll(cfg.getOptions()); // and load 'em up (using anything not yet set as the software defaults) settings.readFromProperties(props); - getContext().tunnelManager().buildTunnels(_runner.getConfig().getDestination(), settings); + getContext().tunnelManager().buildTunnels(cfg.getDestination(), settings); } } diff --git a/router/java/src/net/i2p/router/message/CloveSet.java b/router/java/src/net/i2p/router/message/CloveSet.java index 1774c9be0..8c414edcd 100644 --- a/router/java/src/net/i2p/router/message/CloveSet.java +++ b/router/java/src/net/i2p/router/message/CloveSet.java @@ -42,8 +42,9 @@ public class CloveSet { public long getExpiration() { return _expiration; } public void setExpiration(long expiration) { _expiration = expiration; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("{"); for (int i = 0; i < _cloves.size(); i++) { GarlicClove clove = (GarlicClove)_cloves.get(i); diff --git a/router/java/src/net/i2p/router/message/GarlicConfig.java b/router/java/src/net/i2p/router/message/GarlicConfig.java index 3b6359a89..1c616f43c 100644 --- a/router/java/src/net/i2p/router/message/GarlicConfig.java +++ b/router/java/src/net/i2p/router/message/GarlicConfig.java @@ -156,8 +156,9 @@ public class GarlicConfig { protected String getSubData() { return ""; } private final static String NL = System.getProperty("line.separator"); + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("").append(NL); buf.append("").append(getCertificate()).append("").append(NL); buf.append("").append(getDeliveryInstructions()).append("").append(NL); diff --git a/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java b/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java index 5d6b37a96..a049b7b8c 100644 --- a/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java +++ b/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java @@ -14,8 +14,10 @@ import java.util.Date; import java.util.HashSet; import java.util.Set; +import net.i2p.crypto.SessionKeyManager; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; +import net.i2p.data.Destination; import net.i2p.data.PublicKey; import net.i2p.data.SessionKey; import net.i2p.data.SessionTag; @@ -30,22 +32,61 @@ import net.i2p.util.Log; * */ public class GarlicMessageBuilder { - public static int estimateAvailableTags(RouterContext ctx, PublicKey key) { - SessionKey curKey = ctx.sessionKeyManager().getCurrentKey(key); + + /** + * This was 100 since 0.6.1.10 (50 before that). It's important because: + * - Tags are 32 bytes. So it previously added 3200 bytes to an initial message. + * - Too many tags adds a huge overhead to short-duration connections + * (like http, datagrams, etc.) + * - Large messages have a much higher chance of being dropped due to + * one of their 1KB fragments being discarded by a tunnel participant. + * - This reduces the effective maximum datagram size because the client + * doesn't know when tags will be bundled, so the tag size must be + * subtracted from the maximum I2NP size or transport limit. + * + * Issues with too small a value: + * - When tags are sent, a reply leaseset (~1KB) is always bundled. + * Maybe don't need to bundle more than every minute or so + * rather than every time? + * - Does the number of tags (and the threshold of 20) limit the effective + * streaming lib window size? Should the threshold and the number of + * sent tags be variable based on the message rate? + * + * We have to be very careful if we implement an adaptive scheme, + * since the key manager is per-router, not per-local-dest. + * Or maybe that's a bad idea, and we need to move to a per-dest manager. + * This needs further investigation. + * + * So a value somewhat higher than the low threshold + * seems appropriate. + */ + private static final int DEFAULT_TAGS = 40; + private static final int LOW_THRESHOLD = 20; + + public static int estimateAvailableTags(RouterContext ctx, PublicKey key, Destination local) { + // per-dest Unimplemented + //SessionKeyManager skm = ctx.clientManager().getClientSessionKeyManager(local); + SessionKeyManager skm = ctx.sessionKeyManager(); + if (skm == null) + return 0; + SessionKey curKey = skm.getCurrentKey(key); if (curKey == null) return 0; - return ctx.sessionKeyManager().getAvailableTags(key, curKey); + return skm.getAvailableTags(key, curKey); } public static GarlicMessage buildMessage(RouterContext ctx, GarlicConfig config) { return buildMessage(ctx, config, new SessionKey(), new HashSet()); } + public static GarlicMessage buildMessage(RouterContext ctx, GarlicConfig config, SessionKey wrappedKey, Set wrappedTags) { - return buildMessage(ctx, config, wrappedKey, wrappedTags, 100); + return buildMessage(ctx, config, wrappedKey, wrappedTags, DEFAULT_TAGS); } + public static GarlicMessage buildMessage(RouterContext ctx, GarlicConfig config, SessionKey wrappedKey, Set wrappedTags, int numTagsToDeliver) { return buildMessage(ctx, config, wrappedKey, wrappedTags, numTagsToDeliver, false); } + public static GarlicMessage buildMessage(RouterContext ctx, GarlicConfig config, SessionKey wrappedKey, Set wrappedTags, int numTagsToDeliver, boolean forceElGamal) { Log log = ctx.logManager().getLog(GarlicMessageBuilder.class); PublicKey key = config.getRecipientPublicKey(); @@ -74,13 +115,13 @@ public class GarlicMessageBuilder { if (log.shouldLog(Log.DEBUG)) log.debug("Available tags for encryption to " + key + ": " + availTags); - if (availTags < 20) { // arbitrary threshold + if (availTags < LOW_THRESHOLD) { // arbitrary threshold for (int i = 0; i < numTagsToDeliver; i++) wrappedTags.add(new SessionTag(true)); if (log.shouldLog(Log.INFO)) - log.info("Less than 20 tags are available (" + availTags + "), so we're including more"); + log.info("Too few are available (" + availTags + "), so we're including more"); } else if (ctx.sessionKeyManager().getAvailableTimeLeft(key, curKey) < 60*1000) { - // if we have > 20 tags, but they expire in under 30 seconds, we want more + // if we have enough tags, but they expire in under 30 seconds, we want more for (int i = 0; i < numTagsToDeliver; i++) wrappedTags.add(new SessionTag(true)); if (log.shouldLog(Log.INFO)) diff --git a/router/java/src/net/i2p/router/message/GarlicMessageParser.java b/router/java/src/net/i2p/router/message/GarlicMessageParser.java index 3e99e0731..84ed50b2c 100644 --- a/router/java/src/net/i2p/router/message/GarlicMessageParser.java +++ b/router/java/src/net/i2p/router/message/GarlicMessageParser.java @@ -9,8 +9,6 @@ package net.i2p.router.message; */ import java.util.Date; -import java.util.HashSet; -import java.util.Set; import net.i2p.data.Certificate; import net.i2p.data.DataFormatException; diff --git a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java index a114764f6..05aecfb89 100644 --- a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java +++ b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java @@ -106,6 +106,7 @@ public class HandleGarlicMessageJob extends JobImpl implements GarlicMessageRece } } + @Override public void dropped() { getContext().messageHistory().messageProcessingError(_message.getUniqueId(), _message.getClass().getName(), diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java index 0515d5c34..b4382f97e 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java @@ -34,6 +34,8 @@ import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.TunnelInfo; import net.i2p.util.Log; +import net.i2p.util.SimpleScheduler; +import net.i2p.util.SimpleTimer; /** * Send a client message out a random outbound tunnel and into a random inbound @@ -98,6 +100,11 @@ public class OutboundClientMessageOneShotJob extends JobImpl { */ private static final int BUNDLE_PROBABILITY_DEFAULT = 100; + private static final Object _initializeLock = new Object(); + private static boolean _initialized = false; + private static final int CLEAN_INTERVAL = 5*60*1000; + private static final int REPLY_REQUEST_INTERVAL = 60*1000; + /** * Send the sucker */ @@ -105,20 +112,26 @@ public class OutboundClientMessageOneShotJob extends JobImpl { super(ctx); _log = ctx.logManager().getLog(OutboundClientMessageOneShotJob.class); - ctx.statManager().createFrequencyStat("client.sendMessageFailFrequency", "How often does a client fail to send a message?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.sendMessageSize", "How large are messages sent by the client?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.sendAckTime", "Message round trip time", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.timeoutCongestionTunnel", "How lagged our tunnels are when a send times out?", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.timeoutCongestionMessage", "How fast we process messages locally when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.timeoutCongestionInbound", "How much faster we are receiving data than our average bps when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.leaseSetFoundLocally", "How often we tried to look for a leaseSet and found it locally?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.leaseSetFoundRemoteTime", "How long we tried to look for a remote leaseSet (when we succeeded)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.leaseSetFailedRemoteTime", "How long we tried to look for a remote leaseSet (when we failed)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchPrepareTime", "How long until we've queued up the dispatch job (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchTime", "How long until we've dispatched the message (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchSendTime", "How long the actual dispatching takes?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchNoTunnels", "How long after start do we run out of tunnels to send/receive with?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchNoACK", "Repeated message sends to a peer (no ack required)", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l }); + synchronized (_initializeLock) { + if (!_initialized) { + SimpleScheduler.getInstance().addPeriodicEvent(new OCMOSJCacheCleaner(ctx), CLEAN_INTERVAL, CLEAN_INTERVAL); + ctx.statManager().createFrequencyStat("client.sendMessageFailFrequency", "How often does a client fail to send a message?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.sendMessageSize", "How large are messages sent by the client?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.sendAckTime", "Message round trip time", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.timeoutCongestionTunnel", "How lagged our tunnels are when a send times out?", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.timeoutCongestionMessage", "How fast we process messages locally when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.timeoutCongestionInbound", "How much faster we are receiving data than our average bps when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.leaseSetFoundLocally", "How often we tried to look for a leaseSet and found it locally?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.leaseSetFoundRemoteTime", "How long we tried to look for a remote leaseSet (when we succeeded)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.leaseSetFailedRemoteTime", "How long we tried to look for a remote leaseSet (when we failed)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchPrepareTime", "How long until we've queued up the dispatch job (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchTime", "How long until we've dispatched the message (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchSendTime", "How long the actual dispatching takes?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchNoTunnels", "How long after start do we run out of tunnels to send/receive with?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchNoACK", "Repeated message sends to a peer (no ack required)", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l }); + _initialized = true; + } + } long timeoutMs = OVERALL_TIMEOUT_MS_DEFAULT; _clientMessage = msg; _clientMessageId = msg.getMessageId(); @@ -200,8 +213,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * * Key the cache on the source+dest pair. */ - private static HashMap _leaseSetCache = new HashMap(); - private static long _lscleanTime = 0; + private static HashMap _leaseSetCache = new HashMap(); private LeaseSet getReplyLeaseSet(boolean force) { LeaseSet newLS = getContext().netDb().lookupLeaseSetLocally(_from.calculateHash()); if (newLS == null) @@ -235,12 +247,8 @@ public class OutboundClientMessageOneShotJob extends JobImpl { // If the last leaseSet we sent him is still good, don't bother sending again long now = getContext().clock().now(); synchronized (_leaseSetCache) { - if (now - _lscleanTime > 5*60*1000) { // clean out periodically - cleanLeaseSetCache(_leaseSetCache); - _lscleanTime = now; - } if (!force) { - LeaseSet ls = (LeaseSet) _leaseSetCache.get(hashPair()); + LeaseSet ls = _leaseSetCache.get(hashPair()); if (ls != null) { if (ls.equals(newLS)) { // still good, send it 10% of the time @@ -305,8 +313,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * lease). * */ - private static HashMap _leaseCache = new HashMap(); - private static long _lcleanTime = 0; + private static HashMap _leaseCache = new HashMap(); private boolean getNextLease() { _leaseSet = getContext().netDb().lookupLeaseSetLocally(_to.calculateHash()); if (_leaseSet == null) { @@ -319,11 +326,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { // Use the same lease if it's still good // Even if _leaseSet changed, _leaseSet.getEncryptionKey() didn't... synchronized (_leaseCache) { - if (now - _lcleanTime > 5*60*1000) { // clean out periodically - cleanLeaseCache(_leaseCache); - _lcleanTime = now; - } - _lease = (Lease) _leaseCache.get(hashPair()); + _lease = _leaseCache.get(hashPair()); if (_lease != null) { // if outbound tunnel length == 0 && lease.firsthop.isBacklogged() don't use it ?? if (!_lease.isExpired(Router.CLOCK_FUDGE_FACTOR)) { @@ -444,6 +447,14 @@ public class OutboundClientMessageOneShotJob extends JobImpl { } } + /** + * This cache is used to ensure that we request a reply every so often. + * Hopefully this allows the router to recognize a failed tunnel and switch, + * before upper layers like streaming lib fail, even for low-bandwidth + * connections like IRC. + */ + private static HashMap _lastReplyRequestCache = new HashMap(); + /** * Send the message to the specified tunnel by creating a new garlic message containing * the (already created) payload clove as well as a new delivery status message. This garlic @@ -454,18 +465,27 @@ public class OutboundClientMessageOneShotJob extends JobImpl { */ private void send() { if (_finished) return; - if (getContext().clock().now() >= _overallExpiration) { + long now = getContext().clock().now(); + if (now >= _overallExpiration) { dieFatal(); return; } - int existingTags = GarlicMessageBuilder.estimateAvailableTags(getContext(), _leaseSet.getEncryptionKey()); + int existingTags = GarlicMessageBuilder.estimateAvailableTags(getContext(), _leaseSet.getEncryptionKey(), _from); _outTunnel = selectOutboundTunnel(_to); + // boolean wantACK = _wantACK || existingTags <= 30 || getContext().random().nextInt(100) < 5; // what's the point of 5% random? possible improvements or replacements: - // - wantACK if we changed their inbound lease (getNextLease() sets _wantACK) - // - wantACK if we changed our outbound tunnel (selectOutboundTunnel() sets _wantACK) - // - wantACK if we haven't in last 1m (requires a new static cache probably) - boolean wantACK = _wantACK || existingTags <= 30 || getContext().random().nextInt(100) < 5; + // DONE (getNextLease() is called before this): wantACK if we changed their inbound lease (getNextLease() sets _wantACK) + // DONE (selectOutboundTunnel() moved above here): wantACK if we changed our outbound tunnel (selectOutboundTunnel() sets _wantACK) + // DONE (added new cache): wantACK if we haven't in last 1m (requires a new static cache probably) + boolean wantACK; + synchronized (_lastReplyRequestCache) { + Long lastSent = _lastReplyRequestCache.get(hashPair()); + wantACK = _wantACK || existingTags <= 30 || + lastSent == null || lastSent.longValue() < now - REPLY_REQUEST_INTERVAL; + if (wantACK) + _lastReplyRequestCache.put(hashPair(), Long.valueOf(now)); + } PublicKey key = _leaseSet.getEncryptionKey(); SessionKey sessKey = new SessionKey(); @@ -499,7 +519,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { // we dont receive the reply? hmm...) if (_log.shouldLog(Log.WARN)) _log.warn(getJobId() + ": Unable to create the garlic message (no tunnels left or too lagged) to " + _toString); - getContext().statManager().addRateData("client.dispatchNoTunnels", getContext().clock().now() - _start, 0); + getContext().statManager().addRateData("client.dispatchNoTunnels", now - _start, 0); dieFatal(); return; } @@ -537,12 +557,12 @@ public class OutboundClientMessageOneShotJob extends JobImpl { } else { if (_log.shouldLog(Log.WARN)) _log.warn(getJobId() + ": Could not find any outbound tunnels to send the payload through... this might take a while"); - getContext().statManager().addRateData("client.dispatchNoTunnels", getContext().clock().now() - _start, 0); + getContext().statManager().addRateData("client.dispatchNoTunnels", now - _start, 0); dieFatal(); } _clientMessage = null; _clove = null; - getContext().statManager().addRateData("client.dispatchPrepareTime", getContext().clock().now() - _start, 0); + getContext().statManager().addRateData("client.dispatchPrepareTime", now - _start, 0); if (!wantACK) getContext().statManager().addRateData("client.dispatchNoACK", 1, 0); } @@ -580,7 +600,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { /** * This is the place where we make I2P go fast. * - * We have four static caches. + * We have five static caches. * - The LeaseSet cache is used to decide whether to bundle our own leaseset, * which minimizes overhead. * - The Lease cache is used to persistently send to the same lease for the destination, @@ -588,6 +608,8 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * - The Tunnel and BackloggedTunnel caches are used to persistently use the same outbound tunnel * for the same destination, * which keeps the streaming lib happy by minimizing out-of-order delivery. + * - The last reply requested cache ensures that a reply is requested every so often, + * so that failed tunnels are recognized. * */ @@ -607,7 +629,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * (needed for cleanTunnelCache) * 44 = 32 * 4 / 3 */ - private Hash sourceFromHashPair(String s) { + private static Hash sourceFromHashPair(String s) { return new Hash(Base64.decode(s.substring(44, 88))); } @@ -627,17 +649,17 @@ public class OutboundClientMessageOneShotJob extends JobImpl { } if (_lease != null) { synchronized(_leaseCache) { - Lease l = (Lease) _leaseCache.get(key); + Lease l = _leaseCache.get(key); if (l != null && l.equals(_lease)) _leaseCache.remove(key); } } if (_outTunnel != null) { synchronized(_tunnelCache) { - TunnelInfo t =(TunnelInfo) _backloggedTunnelCache.get(key); + TunnelInfo t = _backloggedTunnelCache.get(key); if (t != null && t.equals(_outTunnel)) _backloggedTunnelCache.remove(key); - t = (TunnelInfo) _tunnelCache.get(key); + t = _tunnelCache.get(key); if (t != null && t.equals(_outTunnel)) _tunnelCache.remove(key); } @@ -648,19 +670,14 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * Clean out old leaseSets from a set. * Caller must synchronize on tc. */ - private void cleanLeaseSetCache(HashMap tc) { - long now = getContext().clock().now(); - List deleteList = new ArrayList(); + private static void cleanLeaseSetCache(RouterContext ctx, HashMap tc) { + long now = ctx.clock().now(); for (Iterator iter = tc.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); String k = (String) entry.getKey(); LeaseSet l = (LeaseSet) entry.getValue(); if (l.getEarliestLeaseDate() < now) - deleteList.add(k); - } - for (Iterator iter = deleteList.iterator(); iter.hasNext(); ) { - String k = (String) iter.next(); - tc.remove(k); + iter.remove(); } } @@ -668,18 +685,13 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * Clean out old leases from a set. * Caller must synchronize on tc. */ - private void cleanLeaseCache(HashMap tc) { - List deleteList = new ArrayList(); + private static void cleanLeaseCache(HashMap tc) { for (Iterator iter = tc.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); String k = (String) entry.getKey(); Lease l = (Lease) entry.getValue(); if (l.isExpired(Router.CLOCK_FUDGE_FACTOR)) - deleteList.add(k); - } - for (Iterator iter = deleteList.iterator(); iter.hasNext(); ) { - String k = (String) iter.next(); - tc.remove(k); + iter.remove(); } } @@ -687,18 +699,48 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * Clean out old tunnels from a set. * Caller must synchronize on tc. */ - private void cleanTunnelCache(HashMap tc) { - List deleteList = new ArrayList(); + private static void cleanTunnelCache(RouterContext ctx, HashMap tc) { for (Iterator iter = tc.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); String k = (String) entry.getKey(); TunnelInfo tunnel = (TunnelInfo) entry.getValue(); - if (!getContext().tunnelManager().isValidTunnel(sourceFromHashPair(k), tunnel)) - deleteList.add(k); + if (!ctx.tunnelManager().isValidTunnel(sourceFromHashPair(k), tunnel)) + iter.remove(); } - for (Iterator iter = deleteList.iterator(); iter.hasNext(); ) { - String k = (String) iter.next(); - tc.remove(k); + } + + /** + * Clean out old reply times + * Caller must synchronize on tc. + */ + private static void cleanReplyCache(RouterContext ctx, HashMap tc) { + long now = ctx.clock().now(); + for (Iterator iter = tc.values().iterator(); iter.hasNext(); ) { + Long l = (Long) iter.next(); + if (l.longValue() < now - CLEAN_INTERVAL) + iter.remove(); + } + } + + private static class OCMOSJCacheCleaner implements SimpleTimer.TimedEvent { + private RouterContext _ctx; + private OCMOSJCacheCleaner(RouterContext ctx) { + _ctx = ctx; + } + public void timeReached() { + synchronized(_leaseSetCache) { + cleanLeaseSetCache(_ctx, _leaseSetCache); + } + synchronized(_leaseCache) { + cleanLeaseCache(_leaseCache); + } + synchronized(_tunnelCache) { + cleanTunnelCache(_ctx, _tunnelCache); + cleanTunnelCache(_ctx, _backloggedTunnelCache); + } + synchronized(_lastReplyRequestCache) { + cleanReplyCache(_ctx, _lastReplyRequestCache); + } } } @@ -710,25 +752,19 @@ public class OutboundClientMessageOneShotJob extends JobImpl { * Key the caches on the source+dest pair. * */ - private static HashMap _tunnelCache = new HashMap(); - private static HashMap _backloggedTunnelCache = new HashMap(); - private static long _cleanTime = 0; + private static HashMap _tunnelCache = new HashMap(); + private static HashMap _backloggedTunnelCache = new HashMap(); private TunnelInfo selectOutboundTunnel(Destination to) { TunnelInfo tunnel; long now = getContext().clock().now(); synchronized (_tunnelCache) { - if (now - _cleanTime > 5*60*1000) { // clean out periodically - cleanTunnelCache(_tunnelCache); - cleanTunnelCache(_backloggedTunnelCache); - _cleanTime = now; - } /** * If old tunnel is valid and no longer backlogged, use it. * This prevents an active anonymity attack, where a peer could tell * if you were the originator by backlogging the tunnel, then removing the * backlog and seeing if traffic came back or not. */ - tunnel = (TunnelInfo) _backloggedTunnelCache.get(hashPair()); + tunnel = _backloggedTunnelCache.get(hashPair()); if (tunnel != null) { if (getContext().tunnelManager().isValidTunnel(_from.calculateHash(), tunnel)) { if (!getContext().commSystem().isBacklogged(tunnel.getPeer(1))) { @@ -743,7 +779,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { _backloggedTunnelCache.remove(hashPair()); } // Use the same tunnel unless backlogged - tunnel = (TunnelInfo) _tunnelCache.get(hashPair()); + tunnel = _tunnelCache.get(hashPair()); if (tunnel != null) { if (getContext().tunnelManager().isValidTunnel(_from.calculateHash(), tunnel)) { if (tunnel.getLength() <= 1 || !getContext().commSystem().isBacklogged(tunnel.getPeer(1))) diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java b/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java index b24154d6f..3d15ce07c 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java @@ -20,7 +20,7 @@ class OutboundClientMessageStatus { private ClientMessage _msg; private PayloadGarlicConfig _clove; private LeaseSet _leaseSet; - private Set _sent; + private final Set _sent; private int _numLookups; private boolean _success; private boolean _failure; @@ -114,6 +114,7 @@ class OutboundClientMessageStatus { public Hash getGateway() { return _gateway; } public TunnelId getTunnel() { return _tunnel; } + @Override public int hashCode() { int rv = 0; if (_gateway != null) @@ -123,6 +124,7 @@ class OutboundClientMessageStatus { return rv; } + @Override public boolean equals(Object o) { if (o == null) return false; if (o.getClass() != Tunnel.class) return false; diff --git a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java index eb2c04886..a5e8368d3 100644 --- a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java +++ b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java @@ -33,8 +33,9 @@ public class PayloadGarlicConfig extends GarlicConfig { } public I2NPMessage getPayload() { return _payload; } + @Override protected String getSubData() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("").append(_payload).append(""); return buf.toString(); } diff --git a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java index 10a9bf13b..be1b1e3eb 100644 --- a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java +++ b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java @@ -120,7 +120,7 @@ public class SendMessageDirectJob extends JobImpl { } _sent = true; Hash to = _router.getIdentity().getHash(); - Hash us = getContext().router().getRouterInfo().getIdentity().getHash(); + Hash us = getContext().routerHash(); if (us.equals(to)) { if (_selector != null) { OutNetMessage outM = new OutNetMessage(getContext()); diff --git a/router/java/src/net/i2p/router/networkdb/DatabaseLookupMessageHandler.java b/router/java/src/net/i2p/router/networkdb/DatabaseLookupMessageHandler.java index db696461a..84dd56890 100644 --- a/router/java/src/net/i2p/router/networkdb/DatabaseLookupMessageHandler.java +++ b/router/java/src/net/i2p/router/networkdb/DatabaseLookupMessageHandler.java @@ -28,19 +28,12 @@ public class DatabaseLookupMessageHandler implements HandlerJobBuilder { _context = context; _log = context.logManager().getLog(DatabaseLookupMessageHandler.class); _context.statManager().createRateStat("netDb.lookupsReceived", "How many netDb lookups have we received?", "NetworkDatabase", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + // FIXME: is netDb.lookupsDropped actually used elsewhere? _context.statManager().createRateStat("netDb.lookupsDropped", "How many netDb lookups did we drop due to throttling?", "NetworkDatabase", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); } public Job createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) { _context.statManager().addRateData("netDb.lookupsReceived", 1, 0); - - if (true || _context.throttle().acceptNetDbLookupRequest(((DatabaseLookupMessage)receivedMessage).getSearchKey())) { - return new HandleDatabaseLookupMessageJob(_context, (DatabaseLookupMessage)receivedMessage, from, fromHash); - } else { - if (_log.shouldLog(Log.INFO)) - _log.info("Dropping lookup request as throttled"); - _context.statManager().addRateData("netDb.lookupsDropped", 1, 1); - return null; - } + return new HandleDatabaseLookupMessageJob(_context, (DatabaseLookupMessage)receivedMessage, from, fromHash); } } diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java index a953bd595..76bc897ed 100644 --- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java @@ -262,6 +262,7 @@ public class HandleDatabaseLookupMessageJob extends JobImpl { public String getName() { return "Handle Database Lookup Message"; } + @Override public void dropped() { getContext().messageHistory().messageProcessingError(_message.getUniqueId(), _message.getClass().getName(), diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java index 3a395db0a..c4a0b9f45 100644 --- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java @@ -132,6 +132,7 @@ public class HandleDatabaseStoreMessageJob extends JobImpl { public String getName() { return "Handle Database Store Message"; } + @Override public void dropped() { getContext().messageHistory().messageProcessingError(_message.getUniqueId(), _message.getClass().getName(), "Dropped due to overload"); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java index c6807183b..ae4132678 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java @@ -14,13 +14,18 @@ import net.i2p.data.DataStructure; import net.i2p.data.Hash; public interface DataStore { + public boolean isInitialized(); public boolean isKnown(Hash key); public DataStructure get(Hash key); + public DataStructure get(Hash key, boolean persist); public void put(Hash key, DataStructure data); + public void put(Hash key, DataStructure data, boolean persist); public DataStructure remove(Hash key); - public DataStructure removeLease(Hash key); + public DataStructure remove(Hash key, boolean persist); public Set getKeys(); + public void stop(); public void restart(); + public void rescan(); public int countLeaseSets(); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java index e5957eaff..25ac1c200 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java @@ -8,6 +8,7 @@ package net.i2p.router.networkdb.kademlia; * */ +import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Iterator; @@ -20,25 +21,20 @@ import net.i2p.router.RouterContext; import net.i2p.util.Log; /** - * Go through the routing table pick routers that are performing poorly or - * is out of date, but don't expire routers we're actively tunneling through. - * If a peer is performing worse than some threshold (via profile.rankLiveliness) - * drop it and don't ask any questions. If a peer isn't ranked really poorly, but - * we just haven't heard from it in a while, drop it and add it to the set of - * keys we want the netDb to explore. + * Go through the routing table pick routers that are + * is out of date, but don't expire routers we're actively connected to. + * + * We could in the future use profile data, netdb total size, a Kademlia XOR distance, + * or other criteria to minimize netdb size, but for now we just use _facade's + * validate(), which is a sliding expriation based on netdb size. * */ class ExpireRoutersJob extends JobImpl { private Log _log; private KademliaNetworkDatabaseFacade _facade; + /** rerun fairly often, so the fails don't queue up too many netdb searches at once */ private final static long RERUN_DELAY_MS = 120*1000; - /** - * If a routerInfo structure isn't updated within an hour, drop it - * and search for a later version. This value should be large enough - * to deal with the Router.CLOCK_FUDGE_FACTOR. - */ - public final static long EXPIRE_DELAY = 60*60*1000; public ExpireRoutersJob(RouterContext ctx, KademliaNetworkDatabaseFacade facade) { super(ctx); @@ -62,44 +58,25 @@ class ExpireRoutersJob extends JobImpl { /** * Run through all of the known peers and pick ones that have really old - * routerInfo publish dates, excluding ones that are in use by some tunnels, + * routerInfo publish dates, excluding ones that we are connected to, * so that they can be failed & queued for searching * + * @return nothing for now */ private Set selectKeysToExpire() { - Set possible = getNotInUse(); - Set expiring = new HashSet(16); - - for (Iterator iter = possible.iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); - RouterInfo ri = _facade.lookupRouterInfoLocally(key); - if (ri != null) { - if (!ri.isCurrent(EXPIRE_DELAY)) { - if (_log.shouldLog(Log.INFO)) - _log.info("Expiring RouterInfo for " + key.toBase64() + " [published on " + new Date(ri.getPublished()) + "]"); - expiring.add(key); - } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Not expiring routerInfo for " + key.toBase64() + " [published on " + new Date(ri.getPublished()) + "]"); - } - } - } - - return expiring; - } - - /** all peers not in use by tunnels */ - private Set getNotInUse() { - Set possible = new HashSet(16); for (Iterator iter = _facade.getAllRouters().iterator(); iter.hasNext(); ) { - Hash peer = (Hash)iter.next(); - if (!getContext().tunnelManager().isInUse(peer)) { - possible.add(peer); - } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Peer is in use: " + peer.toBase64()); + Hash key = (Hash)iter.next(); + // Don't expire anybody we are connected to + if (!getContext().commSystem().isEstablished(key)) { + // This does a _facade.validate() and fail() which is sufficient... + // no need to impose our own expiration here. + // One issue is this will queue a ton of floodfill queries the first time it is run + // after the 1h router startup grace period. + RouterInfo ri = _facade.lookupRouterInfoLocally(key); } } - return possible; + + // let _facade do all the work for now + return Collections.EMPTY_SET; } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java index 388afa886..b03ea1473 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java @@ -8,10 +8,11 @@ package net.i2p.router.networkdb.kademlia; * */ +import java.util.HashSet; import java.util.List; +import java.util.Set; import net.i2p.data.Hash; -import net.i2p.data.RouterInfo; import net.i2p.data.TunnelId; import net.i2p.data.i2np.DatabaseLookupMessage; import net.i2p.router.RouterContext; @@ -41,11 +42,11 @@ class ExploreJob extends SearchJob { /** only send the closest "dont tell me about" refs... * Override to make this bigger because we want to include both the * floodfills and the previously-queried peers */ - static final int MAX_CLOSEST = 20; + static final int MAX_CLOSEST = 20; // LINT -- field hides another field, this isn't an override. /** Override to make this shorter, since we don't sort out the * unresponsive ff peers like we do in FloodOnlySearchJob */ - static final int PER_FLOODFILL_PEER_TIMEOUT = 5*1000; + static final int PER_FLOODFILL_PEER_TIMEOUT = 5*1000; // LINT -- field hides another field, this isn't an override. /** * Create a new search for the routingKey specified @@ -78,6 +79,7 @@ class ExploreJob extends SearchJob { * @param replyGateway gateway for the reply tunnel * @param expiration when the search should stop */ + @Override protected DatabaseLookupMessage buildMessage(TunnelId replyTunnelId, Hash replyGateway, long expiration) { DatabaseLookupMessage msg = new DatabaseLookupMessage(getContext(), true); msg.setSearchKey(getState().getTarget()); @@ -96,7 +98,13 @@ class ExploreJob extends SearchJob { available = MAX_CLOSEST - msg.getDontIncludePeers().size(); if (available > 0) { - List peers = _peerSelector.selectNearestExplicit(getState().getTarget(), available, msg.getDontIncludePeers(), getFacade().getKBuckets()); + // selectNearestExplicit adds our hash to the dontInclude set (3rd param) ... + // And we end up with MAX_CLOSEST+1 entries. + // We don't want our hash in the message's don't-include list though. + // We're just exploring, but this could give things away, and tie our exploratory tunnels to our router, + // so let's not put our hash in there. + Set dontInclude = new HashSet(msg.getDontIncludePeers()); + List peers = _peerSelector.selectNearestExplicit(getState().getTarget(), available, dontInclude, getFacade().getKBuckets()); msg.getDontIncludePeers().addAll(peers); } @@ -106,17 +114,8 @@ class ExploreJob extends SearchJob { return msg; } - - /** - * We're looking for a router, so lets build the lookup message (no need to tunnel route either, so just have - * replies sent back to us directly). This uses the similar overrides as the other buildMessage above. - * - */ - protected DatabaseLookupMessage buildMessage(long expiration) { - return buildMessage(null, getContext().router().getRouterInfo().getIdentity().getHash(), expiration); - } - /** max # of concurrent searches */ + @Override protected int getBredth() { return EXPLORE_BREDTH; } @@ -125,6 +124,7 @@ class ExploreJob extends SearchJob { * number of peers that we didn't know about before. * */ + @Override protected void newPeersFound(int numNewPeers) { // who cares about how many new peers. well, maybe we do. but for now, // we'll do the simplest thing that could possibly work. @@ -139,5 +139,6 @@ class ExploreJob extends SearchJob { * */ + @Override public String getName() { return "Kademlia NetDb Explore"; } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java index b8c46fc33..ff98d1429 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java @@ -3,7 +3,6 @@ package net.i2p.router.networkdb.kademlia; import net.i2p.data.i2np.DatabaseSearchReplyMessage; import net.i2p.data.i2np.DatabaseStoreMessage; import net.i2p.data.i2np.I2NPMessage; -import net.i2p.router.JobImpl; import net.i2p.router.MessageSelector; import net.i2p.router.RouterContext; import net.i2p.util.Log; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java index 5e6886302..b6fec178c 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java @@ -8,11 +8,7 @@ import java.util.List; import net.i2p.data.Hash; import net.i2p.data.i2np.DatabaseLookupMessage; -import net.i2p.data.i2np.DatabaseSearchReplyMessage; -import net.i2p.data.i2np.DatabaseStoreMessage; -import net.i2p.data.i2np.I2NPMessage; import net.i2p.router.Job; -import net.i2p.router.JobImpl; import net.i2p.router.MessageSelector; import net.i2p.router.OutNetMessage; import net.i2p.router.ReplyJob; @@ -44,8 +40,8 @@ class FloodOnlySearchJob extends FloodSearchJob { protected Log _log; private FloodfillNetworkDatabaseFacade _facade; protected Hash _key; - private List _onFind; - private List _onFailed; + private final List _onFind; + private final List _onFailed; private long _expiration; protected int _timeoutMs; private long _origExpiration; @@ -54,9 +50,9 @@ class FloodOnlySearchJob extends FloodSearchJob { private volatile boolean _dead; private long _created; private boolean _shouldProcessDSRM; - private HashSet _unheardFrom; + private final HashSet _unheardFrom; - protected List _out; + protected final List _out; protected MessageSelector _replySelector; protected ReplyJob _onReply; protected Job _onTimeout; @@ -83,6 +79,7 @@ class FloodOnlySearchJob extends FloodSearchJob { _created = System.currentTimeMillis(); _shouldProcessDSRM = false; } + @Override void addDeferred(Job onFind, Job onFailed, long timeoutMs, boolean isLease) { if (_dead) { getContext().jobQueue().addJob(onFailed); @@ -91,18 +88,22 @@ class FloodOnlySearchJob extends FloodSearchJob { if (onFailed != null) synchronized (_onFailed) { _onFailed.add(onFailed); } } } + @Override public long getExpiration() { return _expiration; } public long getCreated() { return _created; } public boolean shouldProcessDSRM() { return _shouldProcessDSRM; } private static final int CONCURRENT_SEARCHES = 2; + @Override public void runJob() { // pick some floodfill peers and send out the searches List floodfillPeers = _facade.getFloodfillPeers(); if (floodfillPeers.size() <= 3) _shouldProcessDSRM = true; if (floodfillPeers.size() <= 0) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Running netDb searches against the floodfill peers, but we don't know any"); + // ask anybody, they may not return the answer but they will return a few ff peers we can go look up, + // so this situation should be temporary + if (_log.shouldLog(Log.WARN)) + _log.warn("Running netDb searches against the floodfill peers, but we don't know any"); floodfillPeers = new ArrayList(_facade.getAllRouters()); if (floodfillPeers.size() <= 0) { if (_log.shouldLog(Log.ERROR)) @@ -184,10 +185,14 @@ class FloodOnlySearchJob extends FloodSearchJob { failed(); } } + @Override public String getName() { return "NetDb flood search (phase 1)"; } + @Override Hash getKey() { return _key; } + @Override void decrementRemaining() { if (_lookupsRemaining > 0) _lookupsRemaining--; } + @Override int getLookupsRemaining() { return _lookupsRemaining; } /** Note that we heard from the peer */ void decrementRemaining(Hash peer) { @@ -197,6 +202,7 @@ class FloodOnlySearchJob extends FloodSearchJob { } } + @Override void failed() { synchronized (this) { if (_dead) return; @@ -224,6 +230,7 @@ class FloodOnlySearchJob extends FloodSearchJob { } } } + @Override void success() { synchronized (this) { if (_dead) return; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java index 26eaa2fad..a1a74fc86 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java @@ -46,7 +46,12 @@ class FloodfillMonitorJob extends JobImpl { getContext().router().rebuildRouterInfo(); if (_log.shouldLog(Log.INFO)) _log.info("Should we be floodfill? " + ff); - requeue((REQUEUE_DELAY / 2) + getContext().random().nextInt(REQUEUE_DELAY)); + int delay = (REQUEUE_DELAY / 2) + getContext().random().nextInt(REQUEUE_DELAY); + // there's a lot of eligible non-floodfills, keep them from all jumping in at once + // To do: somehow assess the size of the network to make this adaptive? + if (!ff) + delay *= 3; + requeue(delay); } private boolean shouldBeFloodfill() { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java index 575de5e7b..3772b18d1 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -31,7 +31,7 @@ import net.i2p.util.Log; */ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacade { public static final char CAPACITY_FLOODFILL = 'f'; - private Map _activeFloodQueries; + private final Map _activeFloodQueries; private boolean _floodfillEnabled; /** for testing, see isFloodfill() below */ private static String _alwaysQuery; @@ -55,11 +55,13 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad _context.statManager().createRateStat("netDb.republishQuantity", "How many peers do we need to send a found leaseSet to?", "NetworkDatabase", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000l }); } + @Override public void startup() { super.startup(); _context.jobQueue().addJob(new FloodfillMonitorJob(_context, this)); } + @Override protected void createHandlers() { _context.inNetMessagePool().registerHandlerJobBuilder(DatabaseLookupMessage.MESSAGE_TYPE, new FloodfillDatabaseLookupMessageHandler(_context)); _context.inNetMessagePool().registerHandlerJobBuilder(DatabaseStoreMessage.MESSAGE_TYPE, new FloodfillDatabaseStoreMessageHandler(_context, this)); @@ -70,6 +72,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad /** * @throws IllegalArgumentException if the local router info is invalid */ + @Override public void publish(RouterInfo localRouterInfo) throws IllegalArgumentException { if (localRouterInfo == null) throw new IllegalArgumentException("wtf, null localRouterInfo?"); if (_context.router().isHidden()) return; // DE-nied! @@ -77,6 +80,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad sendStore(localRouterInfo.getIdentity().calculateHash(), localRouterInfo, null, null, PUBLISH_TIMEOUT, null); } + @Override public void sendStore(Hash key, DataStructure ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) { // if we are a part of the floodfill netDb, don't send out our own leaseSets as part // of the flooding - instead, send them to a random floodfill peer so *they* can flood 'em out. @@ -131,6 +135,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad private static final int FLOOD_PRIORITY = 200; private static final int FLOOD_TIMEOUT = 30*1000; + @Override protected PeerSelector createPeerSelector() { return new FloodfillPeerSelector(_context); } public void setFloodfillEnabled(boolean yes) { _floodfillEnabled = yes; } @@ -183,6 +188,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad * without any match) * */ + @Override SearchJob search(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs, boolean isLease) { //if (true) return super.search(key, onFindJob, onFailedLookupJob, timeoutMs, isLease); if (key == null) throw new IllegalArgumentException("searchin for nothin, eh?"); @@ -282,6 +288,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad * Search for a newer router info, drop it from the db if the search fails, * unless just started up or have bigger problems. */ + @Override protected void lookupBeforeDropping(Hash peer, RouterInfo info) { // following are some special situations, we don't want to // drop the peer in these cases @@ -356,8 +363,8 @@ class FloodSearchJob extends JobImpl { private Log _log; private FloodfillNetworkDatabaseFacade _facade; private Hash _key; - private List _onFind; - private List _onFailed; + private final List _onFind; + private final List _onFailed; private long _expiration; private int _timeoutMs; private long _origExpiration; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java index 7504e660a..d051460a2 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java @@ -31,10 +31,12 @@ class FloodfillPeerSelector extends PeerSelector { * * @return List of Hash for the peers selected */ + @Override public List selectMostReliablePeers(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { return selectNearestExplicitThin(key, maxNumRouters, peersToIgnore, kbuckets, true); } + @Override public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { return selectNearestExplicitThin(key, maxNumRouters, peersToIgnore, kbuckets, false); } @@ -42,7 +44,7 @@ class FloodfillPeerSelector extends PeerSelector { public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets, boolean preferConnected) { if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); FloodfillSelectionCollector matches = new FloodfillSelectionCollector(key, peersToIgnore, maxNumRouters); if (kbuckets == null) return new ArrayList(); kbuckets.getAll(matches); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java index f3880597d..3279f437c 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java @@ -12,6 +12,8 @@ import java.util.Set; import net.i2p.data.DataStructure; import net.i2p.data.Hash; +import net.i2p.data.LeaseSet; +import net.i2p.data.RouterInfo; import net.i2p.router.Job; import net.i2p.router.RouterContext; @@ -34,17 +36,34 @@ class FloodfillStoreJob extends StoreJob { _facade = facade; } + @Override protected int getParallelization() { return 1; } + @Override protected int getRedundancy() { return 1; } /** * Send was totally successful */ + @Override protected void succeed() { super.succeed(); - if (_state != null) - getContext().jobQueue().addJob(new FloodfillVerifyStoreJob(getContext(), _state.getTarget(), _facade)); + if (_state != null) { + // Get the time stamp from the data we sent, so the Verify job can meke sure that + // it finds something stamped with that time or newer. + long published = 0; + boolean isRouterInfo = false; + DataStructure data = _state.getData(); + if (data instanceof RouterInfo) { + published = ((RouterInfo) data).getPublished(); + isRouterInfo = true; + } else if (data instanceof LeaseSet) { + published = ((LeaseSet) data).getEarliestLeaseDate(); + } + getContext().jobQueue().addJob(new FloodfillVerifyStoreJob(getContext(), _state.getTarget(), + published, isRouterInfo, _facade)); + } } + @Override public String getName() { return "Floodfill netDb store"; } -} \ No newline at end of file +} diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java index 0e5829b24..e368b4567 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java @@ -5,6 +5,8 @@ import java.util.List; import net.i2p.data.DataStructure; import net.i2p.data.Hash; +import net.i2p.data.LeaseSet; +import net.i2p.data.RouterInfo; import net.i2p.data.i2np.DatabaseLookupMessage; import net.i2p.data.i2np.DatabaseSearchReplyMessage; import net.i2p.data.i2np.DatabaseStoreMessage; @@ -29,21 +31,33 @@ public class FloodfillVerifyStoreJob extends JobImpl { private FloodfillNetworkDatabaseFacade _facade; private long _expiration; private long _sendTime; + private long _published; + private boolean _isRouterInfo; private static final int VERIFY_TIMEOUT = 10*1000; - public FloodfillVerifyStoreJob(RouterContext ctx, Hash key, FloodfillNetworkDatabaseFacade facade) { + public FloodfillVerifyStoreJob(RouterContext ctx, Hash key, long published, boolean isRouterInfo, FloodfillNetworkDatabaseFacade facade) { super(ctx); _key = key; + _published = published; + _isRouterInfo = isRouterInfo; _log = ctx.logManager().getLog(getClass()); _facade = facade; // wait 10 seconds before trying to verify the store getTiming().setStartAfter(ctx.clock().now() + VERIFY_TIMEOUT); - getContext().statManager().createRateStat("netDb.floodfillVerifyOK", "How long a floodfill verify takes when it succeeds", "NetworkDatabase", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - getContext().statManager().createRateStat("netDb.floodfillVerifyFail", "How long a floodfill verify takes when it fails", "NetworkDatabase", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - getContext().statManager().createRateStat("netDb.floodfillVerifyTimeout", "How long a floodfill verify takes when it times out", "NetworkDatabase", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + getContext().statManager().createRateStat("netDb.floodfillVerifyOK", "How long a floodfill verify takes when it succeeds", "NetworkDatabase", new long[] { 60*60*1000 }); + getContext().statManager().createRateStat("netDb.floodfillVerifyFail", "How long a floodfill verify takes when it fails", "NetworkDatabase", new long[] { 60*60*1000 }); + getContext().statManager().createRateStat("netDb.floodfillVerifyTimeout", "How long a floodfill verify takes when it times out", "NetworkDatabase", new long[] { 60*60*1000 }); } public String getName() { return "Verify netdb store"; } + + /** + * Wait 10 seconds, then query a random floodfill for the leaseset or routerinfo + * that we just stored to a (hopefully different) floodfill peer. + * + * If it fails (after waiting up to another 10 seconds), resend the data. + * If the queried data is older than what we stored, that counts as a fail. + **/ public void runJob() { _target = pickTarget(); if (_target == null) return; @@ -100,16 +114,10 @@ public class FloodfillVerifyStoreJob extends JobImpl { public boolean isMatch(I2NPMessage message) { if (message instanceof DatabaseStoreMessage) { DatabaseStoreMessage dsm = (DatabaseStoreMessage)message; - if (_key.equals(dsm.getKey())) - return true; - else - return false; + return _key.equals(dsm.getKey()); } else if (message instanceof DatabaseSearchReplyMessage) { DatabaseSearchReplyMessage dsrm = (DatabaseSearchReplyMessage)message; - if (_key.equals(dsrm.getSearchKey())) - return true; - else - return false; + return _key.equals(dsrm.getSearchKey()); } return false; } @@ -124,20 +132,29 @@ public class FloodfillVerifyStoreJob extends JobImpl { public void runJob() { long delay = getContext().clock().now() - _sendTime; if (_message instanceof DatabaseStoreMessage) { - // store ok, w00t! - // Hmm should we verify it's as recent as the one we sent??? - getContext().profileManager().dbLookupSuccessful(_target, delay); - getContext().statManager().addRateData("netDb.floodfillVerifyOK", delay, 0); - } else { - // store failed, boo, hiss! - if (_message instanceof DatabaseSearchReplyMessage) { - // assume 0 old, all new, 0 invalid, 0 dup - getContext().profileManager().dbLookupReply(_target, 0, - ((DatabaseSearchReplyMessage)_message).getNumReplies(), 0, 0, delay); + // Verify it's as recent as the one we sent + boolean success = false; + DatabaseStoreMessage dsm = (DatabaseStoreMessage)_message; + if (_isRouterInfo && dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) + success = dsm.getRouterInfo().getPublished() >= _published; + else if ((!_isRouterInfo) && dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) + success = dsm.getLeaseSet().getEarliestLeaseDate() >= _published; + if (success) { + // store ok, w00t! + getContext().profileManager().dbLookupSuccessful(_target, delay); + getContext().statManager().addRateData("netDb.floodfillVerifyOK", delay, 0); + return; } - getContext().statManager().addRateData("netDb.floodfillVerifyFail", delay, 0); - resend(); + if (_log.shouldLog(Log.WARN)) + _log.warn("Verify failed - older"); + } else if (_message instanceof DatabaseSearchReplyMessage) { + // assume 0 old, all new, 0 invalid, 0 dup + getContext().profileManager().dbLookupReply(_target, 0, + ((DatabaseSearchReplyMessage)_message).getNumReplies(), 0, 0, delay); } + // store failed, boo, hiss! + getContext().statManager().addRateData("netDb.floodfillVerifyFail", delay, 0); + resend(); } public void setMessage(I2NPMessage message) { _message = message; } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java index e3a6b6df9..f8c7adf42 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java @@ -30,6 +30,7 @@ public class HandleFloodfillDatabaseLookupMessageJob extends HandleDatabaseLooku super(ctx, receivedMessage, from, fromHash); } + @Override protected boolean answerAllQueries() { if (!FloodfillNetworkDatabaseFacade.floodfillEnabled(getContext())) return false; return FloodfillNetworkDatabaseFacade.isFloodfill(getContext().router().getRouterInfo()); @@ -40,6 +41,7 @@ public class HandleFloodfillDatabaseLookupMessageJob extends HandleDatabaseLooku * This gets the word out to routers that we are no longer floodfill, so they * will stop bugging us. */ + @Override protected void sendClosest(Hash key, Set routerInfoSet, Hash toPeer, TunnelId replyTunnel) { super.sendClosest(key, routerInfoSet, toPeer, replyTunnel); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java index 1b00a1b25..2c3cdbe4e 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java @@ -41,6 +41,8 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { _log = ctx.logManager().getLog(getClass()); ctx.statManager().createRateStat("netDb.storeHandled", "How many netDb store messages have we handled?", "NetworkDatabase", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); ctx.statManager().createRateStat("netDb.storeLeaseSetHandled", "How many leaseSet store messages have we handled?", "NetworkDatabase", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + //ctx.statManager().createRateStat("netDb.storeLocalLeaseSetAttempt", "Peer tries to store our leaseset (multihome?)", "NetworkDatabase", new long[] { 60*60*1000l }); + //ctx.statManager().createRateStat("netDb.storeLocalRouterInfoAttempt", "Peer tries to store our router info", "NetworkDatabase", new long[] { 60*60*1000l }); ctx.statManager().createRateStat("netDb.storeRouterInfoHandled", "How many routerInfo store messages have we handled?", "NetworkDatabase", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); ctx.statManager().createRateStat("netDb.storeRecvTime", "How long it takes to handle the local store part of a dbStore?", "NetworkDatabase", new long[] { 60*1000l, 10*60*1000l }); ctx.statManager().createRateStat("netDb.storeFloodNew", "How long it takes to flood out a newly received entry?", "NetworkDatabase", new long[] { 60*1000l, 10*60*1000l }); @@ -64,6 +66,18 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { getContext().statManager().addRateData("netDb.storeLeaseSetHandled", 1, 0); try { + // Never store a leaseSet for a local dest received from somebody else. + // This generally happens from a FloodfillVerifyStoreJob. + // If it is valid, it shouldn't be newer than what we have - unless + // somebody has our keys... + // This could happen with multihoming - where it's really important to prevent + // storing the other guy's leaseset, it will confuse us badly. + if (getContext().clientManager().isLocal(_message.getKey())) { + //getContext().statManager().addRateData("netDb.storeLocalLeaseSetAttempt", 1, 0); + // throw rather than return, so that we send the ack below (prevent easy attack) + throw new IllegalArgumentException("Peer attempted to store local leaseSet: " + + _message.getKey().toBase64().substring(0, 4)); + } LeaseSet ls = _message.getLeaseSet(); // mark it as something we received, so we'll answer queries // for it. this flag does NOT get set on entries that we @@ -86,6 +100,15 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { _log.info("Handling dbStore of router " + key + " with publishDate of " + new Date(_message.getRouterInfo().getPublished())); try { + // Never store our RouterInfo received from somebody else. + // This generally happens from a FloodfillVerifyStoreJob. + // If it is valid, it shouldn't be newer than what we have - unless + // somebody has our keys... + if (getContext().routerHash().equals(key)) { + //getContext().statManager().addRateData("netDb.storeLocalRouterInfoAttempt", 1, 0); + // throw rather than return, so that we send the ack below (prevent easy attack) + throw new IllegalArgumentException("Peer attempted to store our RouterInfo"); + } prevNetDb = getContext().netDb().store(key, _message.getRouterInfo()); wasNew = ((null == prevNetDb) || (prevNetDb.getPublished() < _message.getRouterInfo().getPublished())); // Check new routerinfo address against blocklist @@ -146,9 +169,13 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { } } else { + // Should we record in the profile? if (_log.shouldLog(Log.WARN)) _log.warn("Peer " + _fromHash.toBase64() + " sent bad data: " + invalidMessage); } + } else if (invalidMessage != null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Unknown peer sent bad data: " + invalidMessage); } } @@ -184,6 +211,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { public String getName() { return "Handle Database Store Message"; } + @Override public void dropped() { getContext().messageHistory().messageProcessingError(_message.getUniqueId(), _message.getClass().getName(), "Dropped due to overload"); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java index 5d8e186f5..58e6b16c4 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java @@ -26,7 +26,7 @@ import net.i2p.util.RandomSource; class KBucketImpl implements KBucket { private Log _log; /** set of Hash objects for the peers in the kbucket */ - private List _entries; + private final List _entries; /** we center the kbucket set on the given hash, and derive distances from this */ private Hash _local; /** include if any bits equal or higher to this bit (in big endian order) */ @@ -328,8 +328,9 @@ class KBucketImpl implements KBucket { return BigInteger.ZERO.setBit(_begin); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); buf.append("KBucketImpl: "); synchronized (_entries) { buf.append(_entries.toString()).append("\n"); @@ -379,7 +380,7 @@ class KBucketImpl implements KBucket { } private static void testRand() { - StringBuffer buf = new StringBuffer(2048); + StringBuilder buf = new StringBuilder(2048); int low = 1; int high = 3; Log log = I2PAppContext.getGlobalContext().logManager().getLog(KBucketImpl.class); @@ -415,7 +416,7 @@ class KBucketImpl implements KBucket { private static void testRand2() { Log log = I2PAppContext.getGlobalContext().logManager().getLog(KBucketImpl.class); - StringBuffer buf = new StringBuffer(1024*1024*16); + StringBuilder buf = new StringBuilder(1024*1024*16); int low = 1; int high = 200; byte hash[] = new byte[Hash.HASH_LENGTH]; @@ -451,7 +452,7 @@ class KBucketImpl implements KBucket { private final static String toString(byte b[]) { if (true) return DataHelper.toHexString(b); - StringBuffer buf = new StringBuffer(b.length); + StringBuilder buf = new StringBuilder(b.length); for (int i = 0; i < b.length; i++) { buf.append(toString(b[i])); buf.append(" "); @@ -460,7 +461,7 @@ class KBucketImpl implements KBucket { } private final static String toString(byte b) { - StringBuffer buf = new StringBuffer(8); + StringBuilder buf = new StringBuilder(8); for (int i = 7; i >= 0; i--) { boolean bb = (0 != (b & (1<= 0; j--) { boolean bb = (0 != (val[i] & (1< getAllRouters() { if (!_initialized) return new HashSet(0); Set keys = _ds.getKeys(); Set rv = new HashSet(keys.size()); @@ -331,6 +351,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { return rv; } + @Override public int getKnownRouters() { if (_kb == null) return 0; CountRouters count = new CountRouters(); @@ -349,11 +370,13 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } } + @Override public int getKnownLeaseSets() { if (_ds == null) return 0; return _ds.countLeaseSets(); } - + + /* aparently, not used?? should be public if used elsewhere. */ private class CountLeaseSets implements SelectionCollector { private int _count; public int size() { return _count; } @@ -364,7 +387,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { _count++; } } - + /** * This is fast and doesn't use synchronization, * but it includes both routerinfos and leasesets. @@ -566,7 +589,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { _log.error("LeaseSet to expire too far in the future: " + leaseSet.getDestination().calculateHash().toBase64() + " expires on " + new Date(leaseSet.getEarliestLeaseDate()), new Exception("Rejecting store")); - return "Expired leaseSet for " + leaseSet.getDestination().calculateHash().toBase64() + return "Future expiring leaseSet for " + leaseSet.getDestination().calculateHash().toBase64() + " expiring in " + DataHelper.formatDuration(age); } return null; @@ -620,7 +643,23 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { */ String validate(Hash key, RouterInfo routerInfo) throws IllegalArgumentException { long now = _context.clock().now(); - + boolean upLongEnough = _context.router().getUptime() > 60*60*1000; + // Once we're over 150 routers, reduce the expiration time down from the default, + // as a crude way of limiting memory usage. + // i.e. at 300 routers the expiration time will be about half the default, etc. + // And if we're floodfill, we can keep the expiration really short, since + // we are always getting the latest published to us. + // As the net grows this won't be sufficient, and we'll have to implement + // flushing some from memory, while keeping all on disk. + long adjustedExpiration; + if (FloodfillNetworkDatabaseFacade.floodfillEnabled(_context)) + adjustedExpiration = ROUTER_INFO_EXPIRATION_FLOODFILL; + else + // _kb.size() includes leasesets but that's ok + adjustedExpiration = Math.min(ROUTER_INFO_EXPIRATION, + ROUTER_INFO_EXPIRATION_MIN + + ((ROUTER_INFO_EXPIRATION - ROUTER_INFO_EXPIRATION_MIN) * 150 / (_kb.size() + 1))); + if (!key.equals(routerInfo.getIdentity().getHash())) { if (_log.shouldLog(Log.WARN)) _log.warn("Invalid store attempt! key does not match routerInfo.identity! key = " + key + ", router = " + routerInfo); @@ -629,7 +668,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { if (_log.shouldLog(Log.WARN)) _log.warn("Invalid routerInfo signature! forged router structure! router = " + routerInfo); return "Invalid routerInfo signature on " + key.toBase64(); - } else if (!routerInfo.isCurrent(ROUTER_INFO_EXPIRATION) && (_context.router().getUptime() > 60*60*1000) ) { + } else if (upLongEnough && !routerInfo.isCurrent(adjustedExpiration)) { if (routerInfo.getNetworkId() != Router.NETWORK_ID) { _context.shitlist().shitlistRouter(key, "Peer is not in our network"); return "Peer is not in our network (" + routerInfo.getNetworkId() + ", wants " @@ -657,10 +696,10 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { String rv = "Peer " + key.toBase64() + " is from another network, not accepting it (id=" + routerInfo.getNetworkId() + ", want " + Router.NETWORK_ID + ")"; return rv; - } else if ( (_context.router().getUptime() > 60*60*1000) && (routerInfo.getPublished() < now - 2*24*60*60*1000l) ) { + } else if (upLongEnough && (routerInfo.getPublished() < now - 2*24*60*60*1000l) ) { long age = _context.clock().now() - routerInfo.getPublished(); return "Peer " + key.toBase64() + " published " + DataHelper.formatDuration(age) + " ago"; - } else if (!routerInfo.isCurrent(ROUTER_INFO_EXPIRATION_SHORT) && (_context.router().getUptime() > 60*60*1000) ) { + } else if (upLongEnough && !routerInfo.isCurrent(ROUTER_INFO_EXPIRATION_SHORT)) { if (routerInfo.getAddresses().size() <= 0) return "Peer " + key.toBase64() + " published > 90m ago with no addresses"; RouterAddress ra = routerInfo.getTargetAddress("SSU"); @@ -680,9 +719,13 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { * @throws IllegalArgumentException if the routerInfo is not valid */ public RouterInfo store(Hash key, RouterInfo routerInfo) throws IllegalArgumentException { + return store(key, routerInfo, true); + } + + public RouterInfo store(Hash key, RouterInfo routerInfo, boolean persist) throws IllegalArgumentException { if (!_initialized) return null; - RouterInfo rv = (RouterInfo)_ds.get(key); + RouterInfo rv = (RouterInfo)_ds.get(key, persist); if ( (rv != null) && (rv.equals(routerInfo)) ) { // no need to validate @@ -699,7 +742,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { + new Date(routerInfo.getPublished())); _context.peerManager().setCapabilities(key, routerInfo.getCapabilities()); - _ds.put(key, routerInfo); + _ds.put(key, routerInfo, persist); if (rv == null) _kb.add(key); return rv; @@ -730,10 +773,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { // if we dont know the key, lets make sure it isn't a now-dead peer } - if (isRouterInfo) - _ds.remove(dbEntry); - else - _ds.removeLease(dbEntry); + _ds.remove(dbEntry, isRouterInfo); } /** don't use directly - see F.N.D.F. override */ @@ -868,8 +908,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } } + @Override public void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException { - StringBuffer buf = new StringBuffer(4*1024); + StringBuilder buf = new StringBuilder(4*1024); buf.append("

    Network Database RouterInfo Lookup

    \n"); if (".".equals(routerPrefix)) { renderRouterInfo(buf, _context.router().getRouterInfo(), true, true); @@ -895,23 +936,14 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { renderStatusHTML(out, true); } - public void renderStatusHTML(Writer out, boolean full) throws IOException { - int size = getKnownRouters() * 512; - if (full) - size *= 4; - StringBuffer buf = new StringBuffer(size); + @Override + public void renderLeaseSetHTML(Writer out) throws IOException { + StringBuilder buf = new StringBuilder(4*1024); buf.append("

    Network Database Contents

    \n"); - if (!_initialized) { - buf.append("Not initialized\n"); - out.write(buf.toString()); - out.flush(); - return; - } + buf.append("View RouterInfo"); + buf.append("

    LeaseSets

    \n"); Set leases = new TreeSet(new LeaseSetComparator()); leases.addAll(getLeases()); - buf.append("

    Leases

    \n"); - out.write(buf.toString()); - buf.setLength(0); long now = _context.clock().now(); for (Iterator iter = leases.iterator(); iter.hasNext(); ) { LeaseSet ls = (LeaseSet)iter.next(); @@ -951,9 +983,27 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { out.write(buf.toString()); buf.setLength(0); } + out.write(buf.toString()); + out.flush(); + } + + @Override + public void renderStatusHTML(Writer out, boolean full) throws IOException { + int size = getKnownRouters() * 512; + if (full) + size *= 4; + StringBuilder buf = new StringBuilder(size); + out.write("

    Network Database Contents

    \n"); + if (!_initialized) { + buf.append("Not initialized\n"); + out.write(buf.toString()); + out.flush(); + return; + } + out.write("View LeaseSets"); Hash us = _context.routerHash(); - out.write("

    Routers (

    Routers (view without"); else @@ -965,8 +1015,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { out.write(buf.toString()); buf.setLength(0); - /* coreVersion to Map of routerVersion to Integer */ - Map versions = new TreeMap(); + ObjectCounter versions = new ObjectCounter(); + ObjectCounter countries = new ObjectCounter(); Set routers = new TreeSet(new RouterInfoComparator()); routers.addAll(getRouters()); @@ -978,49 +1028,56 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { renderRouterInfo(buf, ri, false, full); out.write(buf.toString()); buf.setLength(0); - String coreVersion = ri.getOption("coreVersion"); String routerVersion = ri.getOption("router.version"); - if ( (coreVersion != null) && (routerVersion != null) ) { - Map routerVersions = (Map)versions.get(coreVersion); - if (routerVersions == null) { - routerVersions = new TreeMap(); - versions.put(coreVersion, routerVersions); - } - Integer val = (Integer)routerVersions.get(routerVersion); - if (val == null) - routerVersions.put(routerVersion, Integer.valueOf(1)); - else - routerVersions.put(routerVersion, Integer.valueOf(val.intValue() + 1)); - } + if (routerVersion != null) + versions.increment(routerVersion); + String country = _context.commSystem().getCountry(key); + if(country != null) + countries.increment(country); } } - if (versions.size() > 0) { - buf.append("

    ");
    +            buf.append("
    ");
                 appendLogMessage(buf, msg);
                 buf.append("
    \n"); - buf.append("\n"); - for (Iterator iter = versions.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry)iter.next(); - String coreVersion = (String)entry.getKey(); - Map routerVersions = (Map)entry.getValue(); - for (Iterator routerIter = routerVersions.keySet().iterator(); routerIter.hasNext(); ) { - String routerVersion = (String)routerIter.next(); - Integer num = (Integer)routerVersions.get(routerVersion); - buf.append("\n"); - } + buf.append("
    Core versionRouter versionNumber
    ").append(DataHelper.stripHTML(coreVersion)); - buf.append("").append(DataHelper.stripHTML(routerVersion)); - buf.append("").append(num.intValue()).append("
    "); + List versionList = new ArrayList(versions.objects()); + if (versionList.size() > 0) { + Collections.sort(versionList, Collections.reverseOrder()); + buf.append("\n"); + buf.append("\n"); + for (String routerVersion : versionList) { + int num = versions.count(routerVersion); + buf.append("\n"); } buf.append("
    VersionCount
    ").append(DataHelper.stripHTML(routerVersion)); + buf.append("").append(num).append("
    \n"); } + buf.append("
    "); + out.write(buf.toString()); + buf.setLength(0); + + List countryList = new ArrayList(countries.objects()); + if (countryList.size() > 0) { + Collections.sort(countryList); + buf.append("\n"); + buf.append("\n"); + for (String country : countryList) { + int num = countries.count(country); + buf.append("\n"); + } + buf.append("
    CountryCount
    \"").append(country.toUpperCase()).append("\""); "); + buf.append(_context.commSystem().getCountryName(country)); + buf.append("").append(num).append("
    \n"); + } + buf.append("
    "); out.write(buf.toString()); out.flush(); } - private void renderRouterInfo(StringBuffer buf, RouterInfo info, boolean isUs, boolean full) { + private void renderRouterInfo(StringBuilder buf, RouterInfo info, boolean isUs, boolean full) { String hash = info.getIdentity().getHash().toBase64(); - buf.append(""); + buf.append(""); if (isUs) { - buf.append("Our info: ").append(hash).append("
    \n"); + buf.append("
    Our info: ").append(hash).append("
    \n"); } else { buf.append("Peer info for: ").append(hash).append("
    \n"); } @@ -1033,6 +1090,11 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { else buf.append("Published: in ").append(DataHelper.formatDuration(0-age)).append("???
    \n"); buf.append("Address(es): "); + String country = _context.commSystem().getCountry(info.getIdentity().getHash()); + if(country != null) { + buf.append("\"").append(country.toUpperCase()).append("\""); "); + } for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) { RouterAddress addr = (RouterAddress)iter.next(); buf.append(addr.getTransportStyle()).append(": "); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java index 26c1799a3..acf533bf7 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java @@ -42,7 +42,7 @@ public class PeerSelector { * * @return ordered list of Hash objects */ - public List selectMostReliablePeers(Hash key, int numClosest, Set alreadyChecked, KBucketSet kbuckets) { + public List selectMostReliablePeers(Hash key, int numClosest, Set alreadyChecked, KBucketSet kbuckets) {// LINT -- Exporting non-public type through public API // get the peers closest to the key List nearest = selectNearestExplicit(key, numClosest, alreadyChecked, kbuckets); return nearest; @@ -55,13 +55,13 @@ public class PeerSelector { * * @return List of Hash for the peers selected, ordered by bucket (but intra bucket order is not defined) */ - public List selectNearestExplicit(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { + public List selectNearestExplicit(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) {// LINT -- Exporting non-public type through public API if (true) return selectNearestExplicitThin(key, maxNumRouters, peersToIgnore, kbuckets); if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); Set allHashes = kbuckets.getAll(peersToIgnore); removeFailingPeers(allHashes); Map diffMap = new HashMap(allHashes.size()); @@ -91,10 +91,10 @@ public class PeerSelector { * * @return List of Hash for the peers selected, ordered by bucket (but intra bucket order is not defined) */ - public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { + public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { // LINT -- Exporting non-public type through public API if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); MatchSelectionCollector matches = new MatchSelectionCollector(key, peersToIgnore); kbuckets.getAll(matches); List rv = matches.get(maxNumRouters); @@ -195,7 +195,7 @@ public class PeerSelector { * * @return List of Hash for the peers selected, ordered by bucket (but intra bucket order is not defined) */ - public List selectNearest(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { + public List selectNearest(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { // LINT -- Exporting non-public type through public API // sure, this may not be exactly correct per kademlia (peers on the border of a kbucket in strict kademlia // would behave differently) but I can see no reason to keep around an /additional/ more complicated algorithm. // later if/when selectNearestExplicit gets costly, we may revisit this (since kbuckets let us cache the distance() diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index 5d0d219db..d80a3248b 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -13,10 +13,10 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.Iterator; import java.util.Map; +import java.util.NoSuchElementException; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.DataFormatException; import net.i2p.data.DataStructure; @@ -26,6 +26,7 @@ import net.i2p.data.RouterInfo; import net.i2p.router.JobImpl; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.networkdb.reseed.ReseedChecker; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -39,6 +40,8 @@ class PersistentDataStore extends TransientDataStore { private String _dbDir; private KademliaNetworkDatabaseFacade _facade; private Writer _writer; + private ReadJob _readJob; + private boolean _initialized; private final static int READ_DELAY = 60*1000; @@ -47,42 +50,98 @@ class PersistentDataStore extends TransientDataStore { _log = ctx.logManager().getLog(PersistentDataStore.class); _dbDir = dbDir; _facade = facade; - _context.jobQueue().addJob(new ReadJob()); - ctx.statManager().createRateStat("netDb.writeClobber", "How often we clobber a pending netDb write", "NetworkDatabase", new long[] { 60*1000, 10*60*1000 }); - ctx.statManager().createRateStat("netDb.writePending", "How many pending writes are there", "NetworkDatabase", new long[] { 60*1000, 10*60*1000 }); + _readJob = new ReadJob(); + _context.jobQueue().addJob(_readJob); + ctx.statManager().createRateStat("netDb.writeClobber", "How often we clobber a pending netDb write", "NetworkDatabase", new long[] { 20*60*1000 }); + ctx.statManager().createRateStat("netDb.writePending", "How many pending writes are there", "NetworkDatabase", new long[] { 60*1000 }); + ctx.statManager().createRateStat("netDb.writeOut", "How many we wrote", "NetworkDatabase", new long[] { 20*60*1000 }); + ctx.statManager().createRateStat("netDb.writeTime", "How long it took", "NetworkDatabase", new long[] { 20*60*1000 }); _writer = new Writer(); I2PThread writer = new I2PThread(_writer, "DBWriter"); - writer.setDaemon(true); + // stop() must be called to flush data to disk + //writer.setDaemon(true); writer.start(); } + + public boolean isInitialized() { return _initialized; } + + // this doesn't stop the read job or the writer, maybe it should? + @Override + public void stop() { + super.stop(); + _writer.flush(); + } + @Override public void restart() { + super.restart(); _dbDir = _facade.getDbDir(); } + public void rescan() { + if (_initialized) + _readJob.wakeup(); + } + + @Override + public DataStructure get(Hash key) { + return get(key, true); + } + + /** + * Prepare for having only a partial set in memory and the rest on disk + * @param persist if false, call super only, don't access disk + */ + @Override + public DataStructure get(Hash key, boolean persist) { + DataStructure rv = super.get(key); +/***** + if (rv != null || !persist) + return rv; + rv = _writer.get(key); + if (rv != null) + return rv; + Job rrj = new ReadRouterJob(getRouterInfoName(key), key)); + run in same thread + rrj.runJob(); +*******/ + return rv; + } + + @Override public DataStructure remove(Hash key) { - _context.jobQueue().addJob(new RemoveJob(key)); + return remove(key, true); + } + + /* + * @param persist if false, call super only, don't access disk + */ + @Override + public DataStructure remove(Hash key, boolean persist) { + if (persist) { + _writer.remove(key); + _context.jobQueue().addJob(new RemoveJob(key)); + } return super.remove(key); } + @Override public void put(Hash key, DataStructure data) { + put(key, data, true); + } + + /* + * @param persist if false, call super only, don't access disk + */ + @Override + public void put(Hash key, DataStructure data, boolean persist) { if ( (data == null) || (key == null) ) return; super.put(key, data); // Don't bother writing LeaseSets to disk - if (data instanceof RouterInfo) + if (persist && data instanceof RouterInfo) _writer.queue(key, data); } - private void accept(LeaseSet ls) { - super.put(ls.getDestination().calculateHash(), ls); - } - private void accept(RouterInfo ri) { - Hash key = ri.getIdentity().getHash(); - super.put(key, ri); - // add recently loaded routers to the routing table - _facade.getKBuckets().add(key); - } - private class RemoveJob extends JobImpl { private Hash _key; public RemoveJob(Hash key) { @@ -101,56 +160,105 @@ class PersistentDataStore extends TransientDataStore { } } + /** How many files to write every 10 minutes. Doesn't make sense to limit it, + * they just back up in the queue hogging memory. + */ + private static final int WRITE_LIMIT = 10000; + private static final long WRITE_DELAY = 10*60*1000; + /* - * Queue up writes, write up to 600 files every 10 minutes + * Queue up writes, write unlimited files every 10 minutes. + * Since we write all we have, don't save the write order. + * We store a reference to the data here too, + * rather than simply pull it from super.get(), because + * we will soon have to implement a scheme for keeping only + * a subset of all DataStructures in memory and keeping the rest on disk. */ private class Writer implements Runnable { - private Map _keys; - private List _keyOrder; + private final Map_keys; + private Object _waitLock; + private volatile boolean _quit; + public Writer() { - _keys = new HashMap(64); - _keyOrder = new ArrayList(64); + _keys = new ConcurrentHashMap(64); + _waitLock = new Object(); } + public void queue(Hash key, DataStructure data) { - boolean exists = false; - int pending = 0; - synchronized (_keys) { - pending = _keys.size(); - exists = (null != _keys.put(key, data)); - if (!exists) - _keyOrder.add(key); - _keys.notifyAll(); - } + int pending = _keys.size(); + boolean exists = (null != _keys.put(key, data)); if (exists) _context.statManager().addRateData("netDb.writeClobber", pending, 0); _context.statManager().addRateData("netDb.writePending", pending, 0); } + + /** check to see if it's in the write queue */ + public DataStructure get(Hash key) { + return _keys.get(key); + } + + public void remove(Hash key) { + _keys.remove(key); + } + public void run() { + _quit = false; Hash key = null; DataStructure data = null; int count = 0; - while (true) { // hmm, probably want a shutdown handle... though this is a daemon thread + int lastCount = 0; + long startTime = 0; + while (true) { + // get a new iterator every time to get a random entry without + // having concurrency issues or copying to a List or Array + Iterator> iter = _keys.entrySet().iterator(); try { - synchronized (_keys) { - if (_keyOrder.size() <= 0) { - count = 0; - _keys.wait(); - } else { - count++; - key = (Hash)_keyOrder.remove(0); - data = (DataStructure)_keys.remove(key); - } - } - } catch (InterruptedException ie) {} - - if ( (key != null) && (data != null) ) - write(key, data); - key = null; - data = null; - if (count >= 600) + Map.Entry entry = iter.next(); + key = entry.getKey(); + data = entry.getValue(); + iter.remove(); + count++; + } catch (NoSuchElementException nsee) { + lastCount = count; count = 0; - if (count == 0) - try { Thread.sleep(10*60*1000); } catch (InterruptedException ie) {} + } catch (IllegalStateException ise) { + lastCount = count; + count = 0; + } + + if (key != null) { + if (data != null) { + write(key, data); + data = null; + } + key = null; + } + if (count >= WRITE_LIMIT) + count = 0; + if (count == 0) { + if (lastCount > 0) { + long time = _context.clock().now() - startTime; + if (_log.shouldLog(Log.WARN)) + _log.warn("Wrote " + lastCount + " entries to disk in " + time); + _context.statManager().addRateData("netDb.writeOut", lastCount, 0); + _context.statManager().addRateData("netDb.writeTime", time, 0); + } + if (_quit) + break; + synchronized (_waitLock) { + try { + _waitLock.wait(WRITE_DELAY); + } catch (InterruptedException ie) {} + } + startTime = _context.clock().now(); + } + } + } + + public void flush() { + synchronized(_waitLock) { + _quit = true; + _waitLock.notifyAll(); } } } @@ -221,6 +329,10 @@ class PersistentDataStore extends TransientDataStore { requeue(READ_DELAY); } + public void wakeup() { + requeue(0); + } + private void readFiles() { int routerCount = 0; try { @@ -240,9 +352,10 @@ class PersistentDataStore extends TransientDataStore { _log.error("Error reading files in the db dir", ioe); } - if ( (routerCount <= 5) && (!_alreadyWarned) ) { - _log.error("Very few routerInfo files remaining - please reseed"); + if (!_alreadyWarned) { + ReseedChecker.checkReseed(_context, routerCount); _alreadyWarned = true; + _initialized = true; } } } @@ -258,7 +371,8 @@ class PersistentDataStore extends TransientDataStore { public String getName() { return "Read RouterInfo"; } private boolean shouldRead() { - DataStructure data = get(_key); + // persist = false to call only super.get() + DataStructure data = get(_key, false); if (data == null) return true; if (data instanceof RouterInfo) { long knownDate = ((RouterInfo)data).getPublished(); @@ -289,7 +403,8 @@ class PersistentDataStore extends TransientDataStore { + " is from a different network"); } else { try { - _facade.store(ri.getIdentity().getHash(), ri); + // persist = false so we don't write what we just read + _facade.store(ri.getIdentity().getHash(), ri, false); } catch (IllegalArgumentException iae) { _log.info("Refused locally loaded routerInfo - deleting"); corrupt = true; @@ -312,7 +427,7 @@ class PersistentDataStore extends TransientDataStore { private File getDbDir() throws IOException { - File f = new File(_dbDir); + File f = new File(_context.getRouterDir(), _dbDir); if (!f.exists()) { boolean created = f.mkdirs(); if (!created) @@ -332,22 +447,22 @@ class PersistentDataStore extends TransientDataStore { private final static String ROUTERINFO_PREFIX = "routerInfo-"; private final static String ROUTERINFO_SUFFIX = ".dat"; - private String getLeaseSetName(Hash hash) { + private static String getLeaseSetName(Hash hash) { return LEASESET_PREFIX + hash.toBase64() + LEASESET_SUFFIX; } - private String getRouterInfoName(Hash hash) { + private static String getRouterInfoName(Hash hash) { return ROUTERINFO_PREFIX + hash.toBase64() + ROUTERINFO_SUFFIX; } - private Hash getLeaseSetHash(String filename) { + private static Hash getLeaseSetHash(String filename) { return getHash(filename, LEASESET_PREFIX, LEASESET_SUFFIX); } - private Hash getRouterInfoHash(String filename) { + private static Hash getRouterInfoHash(String filename) { return getHash(filename, ROUTERINFO_PREFIX, ROUTERINFO_SUFFIX); } - private Hash getHash(String filename, String prefix, String suffix) { + private static Hash getHash(String filename, String prefix, String suffix) { try { String key = filename.substring(prefix.length()); key = key.substring(0, key.length() - suffix.length()); @@ -355,7 +470,8 @@ class PersistentDataStore extends TransientDataStore { h.fromBase64(key); return h; } catch (Exception e) { - _log.warn("Unable to fetch the key from [" + filename + "]", e); + // static + //_log.warn("Unable to fetch the key from [" + filename + "]", e); return null; } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java index ac191a96c..95af13a43 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java @@ -23,7 +23,7 @@ import net.i2p.util.Log; public class RepublishLeaseSetJob extends JobImpl { private Log _log; private final static long REPUBLISH_LEASESET_DELAY = 5*60*1000; - public final static long REPUBLISH_LEASESET_TIMEOUT = 60*1000; + public final /* static */ long REPUBLISH_LEASESET_TIMEOUT = 60*1000; private Hash _dest; private KademliaNetworkDatabaseFacade _facade; /** this is actually last attempted publish */ diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java index 868c6b108..d26ac1a5e 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java @@ -47,7 +47,7 @@ class SearchJob extends JobImpl { private boolean _isLease; private Job _pendingRequeueJob; private PeerSelector _peerSelector; - private List _deferredSearches; + private final List _deferredSearches; private boolean _deferredCleared; private long _startedOn; private boolean _floodfillPeersExhausted; @@ -452,6 +452,7 @@ class SearchJob extends JobImpl { } /** we're searching for a router, so we can just send direct */ +/******* always send through the lease protected void sendRouterSearch(RouterInfo router) { int timeout = _facade.getPeerTimeout(router.getIdentity().getHash()); long expiration = getContext().clock().now() + timeout; @@ -471,6 +472,7 @@ class SearchJob extends JobImpl { j.runJob(); //getContext().jobQueue().addJob(j); } +**********/ /** * what tunnel will we send the search out through? @@ -513,6 +515,7 @@ class SearchJob extends JobImpl { * replies sent back to us directly) * */ +/******* always send through the lease protected DatabaseLookupMessage buildMessage(long expiration) { DatabaseLookupMessage msg = new DatabaseLookupMessage(getContext(), true); msg.setSearchKey(_state.getTarget()); @@ -522,6 +525,7 @@ class SearchJob extends JobImpl { msg.setReplyTunnel(null); return msg; } +*********/ void replyFound(DatabaseSearchReplyMessage message, Hash peer) { long duration = _state.replyFound(peer); @@ -780,6 +784,7 @@ class SearchJob extends JobImpl { public String getName() { return "Kademlia NetDb Search"; } + @Override public String toString() { return super.toString() + " started " + DataHelper.formatDuration((getContext().clock().now() - _startedOn)) + " ago"; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java index 4f3869072..73b3ddf24 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java @@ -36,6 +36,7 @@ class SearchMessageSelector implements MessageSelector { _log.debug("[" + _id + "] Created: " + toString()); } + @Override public String toString() { return "Search selector [" + _id + "] looking for a reply from " + _peer + " with regards to " + _state.getTarget(); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java index da00483ab..6fe5831dd 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java @@ -17,12 +17,12 @@ import net.i2p.router.RouterContext; */ class SearchState { private RouterContext _context; - private HashSet _pendingPeers; + private final HashSet _pendingPeers; private HashMap _pendingPeerTimes; - private HashSet _attemptedPeers; - private HashSet _failedPeers; - private HashSet _successfulPeers; - private HashSet _repliedPeers; + private final HashSet _attemptedPeers; + private final HashSet _failedPeers; + private final HashSet _successfulPeers; + private final HashSet _repliedPeers; private Hash _searchKey; private volatile long _completed; private volatile long _started; @@ -166,8 +166,9 @@ class SearchState { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(256); + StringBuilder buf = new StringBuilder(256); buf.append("Searching for ").append(_searchKey); buf.append(" "); if (_completed <= 0) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java index 8c40d117b..24c0350f9 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java @@ -8,6 +8,12 @@ import net.i2p.util.Log; /** * Ask the peer who sent us the DSRM for the RouterInfos. + * + * If we have the routerInfo already, try to refetch it from that router itself, + * if we aren't already connected to that router, + * which will help us establish that router as a good floodfill and speed our + * integration into the network. + * * A simple version of SearchReplyJob in SearchJob.java. * Skip the profile updates - this should be rare. * @@ -28,6 +34,8 @@ class SingleLookupJob extends JobImpl { continue; if (getContext().netDb().lookupRouterInfoLocally(peer) == null) getContext().jobQueue().addJob(new SingleSearchJob(getContext(), peer, from)); + else if (!getContext().commSystem().isEstablished(peer)) + getContext().jobQueue().addJob(new SingleSearchJob(getContext(), peer, peer)); } } public String getName() { return "NetDb process DSRM"; } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java index 3ec005ec5..74c75cb5a 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java @@ -2,7 +2,6 @@ package net.i2p.router.networkdb.kademlia; import net.i2p.data.Hash; import net.i2p.data.i2np.DatabaseLookupMessage; -import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; import net.i2p.router.OutNetMessage; import net.i2p.router.TunnelInfo; @@ -23,8 +22,11 @@ class SingleSearchJob extends FloodOnlySearchJob { super(ctx, null, key, null, null, 5*1000, false); _to = to; } + @Override public String getName() { return "NetDb search key from DSRM"; } + @Override public boolean shouldProcessDSRM() { return false; } // don't loop + @Override public void runJob() { _onm = getContext().messageRegistry().registerPending(_replySelector, _onReply, _onTimeout, _timeoutMs); DatabaseLookupMessage dlm = new DatabaseLookupMessage(getContext(), true); @@ -44,8 +46,10 @@ class SingleSearchJob extends FloodOnlySearchJob { getContext().tunnelDispatcher().dispatchOutbound(dlm, outTunnel.getSendTunnelId(0), _to); _lookupsRemaining = 1; } + @Override void failed() { getContext().messageRegistry().unregisterPending(_onm); } + @Override void success() {} } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java index 26d4fda13..de9f946b9 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java @@ -55,8 +55,9 @@ class StoreMessageSelector implements MessageSelector { } } + @Override public String toString() { - StringBuffer rv = new StringBuffer(64); + StringBuilder rv = new StringBuilder(64); rv.append("Waiting for netDb confirm from ").append(_peer.toBase64()).append(", found? "); rv.append(_found).append(" waiting for ").append(_waitingForId); return rv.toString(); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java index e7bfe3292..91e7687ba 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java @@ -15,12 +15,12 @@ class StoreState { private RouterContext _context; private Hash _key; private DataStructure _data; - private HashSet _pendingPeers; + private final HashSet _pendingPeers; private HashMap _pendingPeerTimes; - private HashSet _successfulPeers; - private HashSet _successfulExploratoryPeers; - private HashSet _failedPeers; - private HashSet _attemptedPeers; + private final HashSet _successfulPeers; + private final HashSet _successfulExploratoryPeers; + private final HashSet _failedPeers; + private final HashSet _attemptedPeers; private int _completeCount; private volatile long _completed; private volatile long _started; @@ -147,8 +147,9 @@ class StoreState { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(256); + StringBuilder buf = new StringBuilder(256); buf.append("Storing ").append(_key); buf.append(" "); if (_completed <= 0) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java index d21141468..a09bc4860 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java @@ -10,9 +10,7 @@ package net.i2p.router.networkdb.kademlia; import java.util.Date; import java.util.concurrent.ConcurrentHashMap; -import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -37,14 +35,27 @@ class TransientDataStore implements DataStore { _log.info("Data Store initialized"); } - public void restart() { + public boolean isInitialized() { return true; } + + public void stop() { _data.clear(); } + public void restart() { + stop(); + } + + public void rescan() {} + public Set getKeys() { return new HashSet(_data.keySet()); } + /** for PersistentDataStore only - don't use here */ + public DataStructure get(Hash key, boolean persist) { + throw new IllegalArgumentException("no"); + } + public DataStructure get(Hash key) { return _data.get(key); } @@ -67,6 +78,11 @@ class TransientDataStore implements DataStore { /** don't accept tunnels set to expire more than 3 hours in the future, which is insane */ private final static long MAX_FUTURE_EXPIRATION_DATE = KademliaNetworkDatabaseFacade.MAX_LEASE_FUTURE; + /** for PersistentDataStore only - don't use here */ + public void put(Hash key, DataStructure data, boolean persist) { + throw new IllegalArgumentException("no"); + } + public void put(Hash key, DataStructure data) { if (data == null) return; if (_log.shouldLog(Log.DEBUG)) @@ -119,16 +135,19 @@ class TransientDataStore implements DataStore { } } + @Override public int hashCode() { return DataHelper.hashCode(_data); } + @Override public boolean equals(Object obj) { if ( (obj == null) || (obj.getClass() != getClass()) ) return false; TransientDataStore ds = (TransientDataStore)obj; return DataHelper.eq(ds._data, _data); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("Transient DataStore: ").append(_data.size()).append("\nKeys: "); for (Map.Entry e : _data.entrySet()) { Hash key = e.getKey(); @@ -139,8 +158,9 @@ class TransientDataStore implements DataStore { return buf.toString(); } - public DataStructure removeLease(Hash key) { - return remove(key); + /** for PersistentDataStore only - don't use here */ + public DataStructure remove(Hash key, boolean persist) { + throw new IllegalArgumentException("no"); } public DataStructure remove(Hash key) { diff --git a/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java new file mode 100644 index 000000000..dd11c4ae2 --- /dev/null +++ b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java @@ -0,0 +1,45 @@ +package net.i2p.router.networkdb.reseed; + +import java.io.File; + +import net.i2p.router.RouterContext; +import net.i2p.util.Log; + +/** + * Moved from RouterConsoleRunner.java + * + * Reseeding is not strictly a router function, it used to be + * in the routerconsole app, but this made it impossible to + * bootstrap an embedded router lacking a routerconsole, + * in iMule or android for example, without additional modifications. + * + * Also, as this is now called from PersistentDataStore, not from the + * routerconsole, we can get started as soon as the netdb has read + * the netDb/ directory, not when the console starts. + */ +public class ReseedChecker { + + private static final int MINIMUM = 15; + + public static void checkReseed(RouterContext context, int count) { + if (count >= MINIMUM) + return; + + // we check the i2p installation directory for a flag telling us not to reseed, + // but also check the home directory for that flag too, since new users installing i2p + // don't have an installation directory that they can put the flag in yet. + File noReseedFile = new File(new File(System.getProperty("user.home")), ".i2pnoreseed"); + File noReseedFileAlt1 = new File(new File(System.getProperty("user.home")), "noreseed.i2p"); + File noReseedFileAlt2 = new File(context.getConfigDir(), ".i2pnoreseed"); + File noReseedFileAlt3 = new File(context.getConfigDir(), "noreseed.i2p"); + if (!noReseedFile.exists() && !noReseedFileAlt1.exists() && !noReseedFileAlt2.exists() && !noReseedFileAlt3.exists()) { + Log _log = context.logManager().getLog(ReseedChecker.class); + if (count <= 1) + _log.error("Downloading peer router information for a new I2P installation"); + else + _log.error("Very few routerInfo files remaining - reseeding now"); + Reseeder reseeder = new Reseeder(context); + reseeder.requestReseed(); + } + } +} diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java new file mode 100644 index 000000000..f37f01aa2 --- /dev/null +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -0,0 +1,269 @@ +package net.i2p.router.networkdb.reseed; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; + +import net.i2p.I2PAppContext; +import net.i2p.router.RouterContext; +import net.i2p.util.EepGet; +import net.i2p.util.I2PThread; +import net.i2p.util.Log; + +/** + * Moved from ReseedHandler in routerconsole. See ReseedChecker for additional comments. + * + * Handler to deal with reseed requests. This will reseed from the URLs + * specified below unless the I2P configuration property "i2p.reseedURL" is + * set. It always writes to ./netDb/, so don't mess with that. + * + */ +public class Reseeder { + private static ReseedRunner _reseedRunner; + private RouterContext _context; + private Log _log; + + // Reject unreasonably big files, because we download into a ByteArrayOutputStream. + private static final long MAX_RESEED_RESPONSE_SIZE = 8 * 1024 * 1024; + + private static final String DEFAULT_SEED_URL = "http://netdb.i2p2.de/,http://b.netdb.i2p2.de/,http://reseed.i2p-projekt.de/"; + private static final String PROP_INPROGRESS = "net.i2p.router.web.ReseedHandler.reseedInProgress"; + private static final String PROP_ERROR = "net.i2p.router.web.ReseedHandler.errorMessage"; + private static final String PROP_STATUS = "net.i2p.router.web.ReseedHandler.statusMessage"; + + public Reseeder(RouterContext ctx) { + _context = ctx; + _log = ctx.logManager().getLog(Reseeder.class); + } + + public void requestReseed() { + synchronized (Reseeder.class) { + if (_reseedRunner == null) + _reseedRunner = new ReseedRunner(); + if (_reseedRunner.isRunning()) { + return; + } else { + System.setProperty(PROP_INPROGRESS, "true"); + I2PThread reseed = new I2PThread(_reseedRunner, "Reseed"); + reseed.start(); + } + } + + } + + public class ReseedRunner implements Runnable, EepGet.StatusListener { + private boolean _isRunning; + + public ReseedRunner() { + _isRunning = false; + System.setProperty(PROP_STATUS, "Reseeding."); + } + public boolean isRunning() { return _isRunning; } + public void run() { + _isRunning = true; + System.out.println("Reseed start"); + reseed(false); + System.out.println("Reseed complete"); + System.setProperty(PROP_INPROGRESS, "false"); + _isRunning = false; + } + + // EepGet status listeners + public void attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause) { + // Since readURL() runs an EepGet with 0 retries, + // we can report errors with attemptFailed() instead of transferFailed(). + // It has the benefit of providing cause of failure, which helps resolve issues. + if (_log.shouldLog(Log.ERROR)) _log.error("EepGet failed on " + url, cause); + } + public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {} + public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {} + public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {} + public void headerReceived(String url, int attemptNum, String key, String val) {} + public void attempting(String url) {} + // End of EepGet status listeners + + /** + * Reseed has been requested, so lets go ahead and do it. Fetch all of + * the routerInfo-*.dat files from the specified URL (or the default) and + * save them into this router's netDb dir. + * + */ + private static final String RESEED_TIPS = + "Ensure that nothing blocks outbound HTTP, check logs " + + "and if nothing helps, read FAQ about reseeding manually."; + + private void reseed(boolean echoStatus) { + List URLList = new ArrayList(); + String URLs = _context.getProperty("i2p.reseedURL", DEFAULT_SEED_URL); + StringTokenizer tok = new StringTokenizer(URLs, " ,"); + while (tok.hasMoreTokens()) + URLList.add(tok.nextToken().trim()); + Collections.shuffle(URLList); + for (int i = 0; i < URLList.size() && _isRunning; i++) + reseedOne((String) URLList.get(i), echoStatus); + } + + /** + * Fetch a directory listing and then up to 200 routerInfo files in the listing. + * The listing must contain (exactly) strings that match: + * href="routerInfo-{hash}.dat"> + * OR + * HREF="routerInfo-{hash}.dat"> + * and then it fetches the files + * {seedURL}routerInfo-{hash}.dat + * after appending a '/' to seedURL if it doesn't have one. + * Essentially this means that the seedURL must be a directory, it + * can't end with 'index.html', for example. + * + * Jetty directory listings are not compatible, as they look like + * HREF="/full/path/to/routerInfo-... + **/ + private void reseedOne(String seedURL, boolean echoStatus) { + + try { + System.setProperty(PROP_ERROR, ""); + System.setProperty(PROP_STATUS, "Reseeding: fetching seed URL."); + System.err.println("Reseed from " + seedURL); + URL dir = new URL(seedURL); + byte contentRaw[] = readURL(dir); + if (contentRaw == null) { + System.setProperty(PROP_ERROR, + "Last reseed failed fully (failed reading seed URL). " + + RESEED_TIPS); + // Logging deprecated here since attemptFailed() provides better info + _log.debug("Failed reading seed URL: " + seedURL); + return; + } + String content = new String(contentRaw); + Set urls = new HashSet(); + int cur = 0; + int total = 0; + while (total++ < 1000) { + int start = content.indexOf("href=\"routerInfo-", cur); + if (start < 0) { + start = content.indexOf("HREF=\"routerInfo-", cur); + if (start < 0) + break; + } + + int end = content.indexOf(".dat\">", start); + String name = content.substring(start+"href=\"routerInfo-".length(), end); + urls.add(name); + cur = end + 1; + } + if (total <= 0) { + _log.error("Read " + contentRaw.length + " bytes from seed " + seedURL + ", but found no routerInfo URLs."); + System.setProperty(PROP_ERROR, + "Last reseed failed fully (no routerInfo URLs at seed URL). " + + RESEED_TIPS); + return; + } + + List urlList = new ArrayList(urls); + Collections.shuffle(urlList); + int fetched = 0; + int errors = 0; + // 200 max from one URL + for (Iterator iter = urlList.iterator(); iter.hasNext() && fetched < 200; ) { + try { + System.setProperty(PROP_STATUS, + "Reseeding: fetching router info from seed URL (" + + fetched + " successful, " + errors + " errors, " + total + " total)."); + + fetchSeed(seedURL, (String)iter.next()); + fetched++; + if (echoStatus) { + System.out.print("."); + if (fetched % 60 == 0) + System.out.println(); + } + } catch (Exception e) { + errors++; + } + } + System.err.println("Reseed got " + fetched + " router infos from " + seedURL); + + int failPercent = 100 * errors / total; + + // Less than 10% of failures is considered success, + // because some routerInfos will always fail. + if ((failPercent >= 10) && (failPercent < 90)) { + System.setProperty(PROP_ERROR, + "Last reseed failed partly (" + failPercent + "% of " + total + "). " + + RESEED_TIPS); + } + if (failPercent >= 90) { + System.setProperty(PROP_ERROR, + "Last reseed failed (" + failPercent + "% of " + total + "). " + + RESEED_TIPS); + } + if (fetched > 0) + _context.netDb().rescan(); + // Don't go on to the next URL if we have enough + if (fetched >= 100) + _isRunning = false; + } catch (Throwable t) { + System.setProperty(PROP_ERROR, + "Last reseed failed fully (exception caught). " + + RESEED_TIPS); + _log.error("Error reseeding", t); + } + } + + /* Since we don't return a value, we should always throw an exception if something fails. */ + private void fetchSeed(String seedURL, String peer) throws Exception { + URL url = new URL(seedURL + (seedURL.endsWith("/") ? "" : "/") + "routerInfo-" + peer + ".dat"); + + byte data[] = readURL(url); + if (data == null) { + // Logging deprecated here since attemptFailed() provides better info + _log.debug("Failed fetching seed: " + url.toString()); + throw new Exception ("Failed fetching seed."); + } + //System.out.println("read: " + (data != null ? data.length : -1)); + writeSeed(peer, data); + } + + private byte[] readURL(URL url) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(4*1024); + + // Do a non-proxied eepget into our ByteArrayOutputStream with 0 retries + EepGet get = new EepGet( I2PAppContext.getGlobalContext(), false, null, -1, 0, 0, MAX_RESEED_RESPONSE_SIZE, + null, baos, url.toString(), false, null, null); + get.addStatusListener(ReseedRunner.this); + if (get.fetch()) return baos.toByteArray(); else return null; + } + + private void writeSeed(String name, byte data[]) throws Exception { + String dirName = "netDb"; // _context.getProperty("router.networkDatabase.dbDir", "netDb"); + File netDbDir = new File(_context.getRouterDir(), dirName); + if (!netDbDir.exists()) { + boolean ok = netDbDir.mkdirs(); + } + FileOutputStream fos = new FileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat")); + fos.write(data); + fos.close(); + } + + } + +/****** + public static void main(String args[]) { + if ( (args != null) && (args.length == 1) && (!Boolean.valueOf(args[0]).booleanValue()) ) { + System.out.println("Not reseeding, as requested"); + return; // not reseeding on request + } + System.out.println("Reseeding"); + Reseeder reseedHandler = new Reseeder(); + reseedHandler.requestReseed(); + } +******/ +} diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java index 87d13c16e..a1b9d7c2b 100644 --- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java @@ -44,6 +44,7 @@ public class CapacityCalculator extends Calculator { /** the calculator estimates over a 1 hour period */ private static long ESTIMATE_PERIOD = 60*60*1000; + @Override public double calc(PeerProfile profile) { RateStat acceptStat = profile.getTunnelCreateResponseTime(); RateStat rejectStat = profile.getTunnelHistory().getRejectionRate(); diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java index 2c4448be8..b941e6faa 100644 --- a/router/java/src/net/i2p/router/peermanager/DBHistory.java +++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java @@ -165,7 +165,7 @@ public class DBHistory { private final static String NL = System.getProperty("line.separator"); public void store(OutputStream out) throws IOException { - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append(NL); buf.append("#################").append(NL); buf.append("# DB history").append(NL); @@ -186,7 +186,7 @@ public class DBHistory { _invalidReplyRate.store(out, "dbHistory.invalidReplyRate"); } - private void add(StringBuffer buf, String name, long val, String description) { + private void add(StringBuilder buf, String name, long val, String description) { buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL); buf.append("dbHistory.").append(name).append('=').append(val).append(NL).append(NL); } diff --git a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java index 26aa2b911..7fdc5fbce 100644 --- a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java @@ -17,6 +17,7 @@ public class IntegrationCalculator extends Calculator { _log = context.logManager().getLog(IntegrationCalculator.class); } + @Override public double calc(PeerProfile profile) { // give more weight to recent counts long val = profile.getDbIntroduction().getRate(24*60*60*1000l).getCurrentEventCount(); diff --git a/router/java/src/net/i2p/router/peermanager/IsFailingCalculator.java b/router/java/src/net/i2p/router/peermanager/IsFailingCalculator.java deleted file mode 100644 index 1391bd8a1..000000000 --- a/router/java/src/net/i2p/router/peermanager/IsFailingCalculator.java +++ /dev/null @@ -1,82 +0,0 @@ -package net.i2p.router.peermanager; - -import net.i2p.router.RouterContext; -import net.i2p.util.Log; - -/** - * Simple boolean calculation to determine whether the given profile is "failing" - - * meaning we shouldn't bother trying to get them to do something. However, if we - * have a specific need to contact them in particular - e.g. instructions in a garlic - * or leaseSet - we will try. The currently implemented algorithm determines that - * a profile is failing if withing the last few minutes, they've done something bad:
      - *
    • It has a comm error (TCP disconnect, etc) in the last minute or two
    • - *
    • They've failed to respond to a db message in the last minute or two
    • - *
    • They've rejected a tunnel in the last 5 minutes
    • - *
    • They've been unreachable any time in the last 5 minutes
    • - *
    - * - */ -public class IsFailingCalculator extends Calculator { - private Log _log; - private RouterContext _context; - - /** if they haven't b0rked in the last 2 minutes, they're ok */ - private final static long GRACE_PERIOD = 2*60*1000; - - public IsFailingCalculator(RouterContext context) { - _context = context; - _log = context.logManager().getLog(IsFailingCalculator.class); - } - - public boolean calcBoolean(PeerProfile profile) { - // have we failed in the last 119 seconds? - /* - if ( (profile.getCommError().getRate(60*1000).getCurrentEventCount() > 0) || - (profile.getCommError().getRate(60*1000).getLastEventCount() > 0) || - (profile.getCommError().getRate(10*60*1000).getCurrentEventCount() > 0) ) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Peer " + profile.getPeer().toBase64() - + " is failing because it had a comm error recently "); - return true; - } else { - */ - //if ( (profile.getDBHistory().getFailedLookupRate().getRate(60*1000).getCurrentEventCount() > 0) || - // (profile.getDBHistory().getFailedLookupRate().getRate(60*1000).getLastEventCount() > 0) ) { - // // are they overloaded (or disconnected)? - // return true; - //} - - // this doesn't make sense with probabalistic rejections - we should be - // adequately dampening the capacity so these peers aren't queried - - //Rate rejectRate = profile.getTunnelHistory().getRejectionRate().getRate(10*60*1000); - //if (rejectRate.getCurrentEventCount() >= 2) { - // if (_log.shouldLog(Log.DEBUG)) - // _log.debug("Peer " + profile.getPeer().toBase64() - // + " is failing because they rejected some tunnels recently"); - // return true; - //} - - //// - // the right way to behave would be to use some statistical - // analysis on the failure rate, and only mark the peer as failing - // if their rate exceeded the expected rate (mean, median, stddev, etc) - //// - - //Rate failedRate = profile.getTunnelHistory().getFailedRate().getRate(60*1000); - //if (failedRate.getCurrentEventCount() >= 2) { - // if (_log.shouldLog(Log.DEBUG)) - // _log.debug("Peer " + profile.getPeer().toBase64() - // + " is failing because too many of their tunnels failed recently"); - // return true; - //} - - // if they have rejected us saying they're totally broken anytime in the last - // 10 minutes, dont bother 'em - if (profile.getTunnelHistory().getLastRejectedCritical() > _context.clock().now() - 10*60*1000) - return true; - - return false; - //} - } -} diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java index 1c265ee67..41110c306 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerManager.java +++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java @@ -30,6 +30,16 @@ import net.i2p.util.SimpleTimer; /** * Manage the current state of the statistics * + * All the capabilities methods appear to be almost unused - + * TunnelPeerSelector just looks for unreachables, and that's it? + * If so, a lot of this can go away, including the array of 26 ArrayLists, + * and a lot of synchronization on _capabilitiesByPeer. + * + * We don't trust any published capabilities except for 'K' and 'U'. + * This should be cleaned up. + * + * setCapabilities() and removeCapabilities() can just add/remove the profile and that's it. + * */ class PeerManager { private Log _log; @@ -37,7 +47,7 @@ class PeerManager { private ProfileOrganizer _organizer; private ProfilePersistenceHelper _persistenceHelper; private List _peersByCapability[]; - private Map _capabilitiesByPeer; + private final Map _capabilitiesByPeer; public PeerManager(RouterContext context) { _context = context; @@ -51,7 +61,7 @@ class PeerManager { _peersByCapability[i] = new ArrayList(64); loadProfiles(); ////_context.jobQueue().addJob(new EvaluateProfilesJob(_context)); - SimpleScheduler.getInstance().addPeriodicEvent(new Reorg(), 0, 30*1000); + SimpleScheduler.getInstance().addPeriodicEvent(new Reorg(), 0, 45*1000); //_context.jobQueue().addJob(new PersistProfilesJob(_context, this)); } @@ -106,7 +116,14 @@ class PeerManager { case PeerSelectionCriteria.PURPOSE_TEST: // for now, the peers we test will be the reliable ones //_organizer.selectWellIntegratedPeers(criteria.getMinimumRequired(), exclude, curVals); - _organizer.selectNotFailingPeers(criteria.getMinimumRequired(), exclude, peers); + + // The PeerTestJob does only run every 5 minutes, but + // this was helping drive us to connection limits, let's leave the exploration + // to the ExploratoryPeerSelector, which will restrict to connected peers + // when we get close to the limit. So let's stick with connected peers here. + // Todo: what's the point of the PeerTestJob anyway? + //_organizer.selectNotFailingPeers(criteria.getMinimumRequired(), exclude, peers); + _organizer.selectActiveNotFailingPeers(criteria.getMinimumRequired(), exclude, peers); break; case PeerSelectionCriteria.PURPOSE_TUNNEL: // pull all of the fast ones, regardless of how many we diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java index 514a9ae4a..5a5d51eed 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java +++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java @@ -8,6 +8,21 @@ import net.i2p.router.RouterContext; import net.i2p.stat.RateStat; import net.i2p.util.Log; +/** + * Copied from http://www.i2p2.i2p/how_peerselection.html + * + * See also main() below for additional commentary by zzz. + * + * Currently, there is no 'ejection' strategy to get rid of the profiles for peers that + * are no longer active (or when the network consists of thousands of peers, to get rid + * of peers that are performing poorly). However, the size of each profile is fairly small, + * and is unrelated to how much data is collected about the peer, so that a router can + * keep a few thousand active peer profiles before the overhead becomes a serious concern. + * Once it becomes necessary, we can simply compact the poorly performing profiles + * (keeping only the most basic data) and maintain hundreds of thousands of profiles + * in memory. Beyond that size, we can simply eject the peers (e.g. keeping the best 100,000). + */ + public class PeerProfile { private Log _log; private RouterContext _context; @@ -22,25 +37,19 @@ public class PeerProfile { private double _tunnelTestResponseTimeAvg; // periodic rates private RateStat _sendSuccessSize = null; - private RateStat _sendFailureSize = null; private RateStat _receiveSize = null; private RateStat _dbResponseTime = null; private RateStat _tunnelCreateResponseTime = null; private RateStat _tunnelTestResponseTime = null; - private RateStat _tunnelTestResponseTimeSlow = null; - private RateStat _commError = null; private RateStat _dbIntroduction = null; // calculation bonuses private long _speedBonus; - private long _reliabilityBonus; private long _capacityBonus; private long _integrationBonus; // calculation values private double _speedValue; - private double _reliabilityValue; private double _capacityValue; private double _integrationValue; - private double _oldSpeedValue; private boolean _isFailing; // good vs bad behavior private TunnelHistory _tunnelHistory; @@ -57,7 +66,6 @@ public class PeerProfile { _log = context.logManager().getLog(PeerProfile.class); _expanded = false; _speedValue = 0; - _reliabilityValue = 0; _capacityValue = 0; _integrationValue = 0; _isFailing = false; @@ -96,6 +104,11 @@ public class PeerProfile { * given period?) * Also mark active if it is connected, as this will tend to encourage use * of already-connected peers. + * + * Note: this appears to be the only use for these two RateStats. + * + * @param period must be one of the periods in the RateStat constructors below + * (5*60*1000 or 60*60*1000) */ public boolean getIsActive(long period) { if ( (getSendSuccessSize().getRate(period).getCurrentEventCount() > 0) || @@ -139,8 +152,6 @@ public class PeerProfile { /** how large successfully sent messages are, calculated over a 1 minute, 1 hour, and 1 day period */ public RateStat getSendSuccessSize() { return _sendSuccessSize; } - /** how large messages that could not be sent were, calculated over a 1 minute, 1 hour, and 1 day period */ - public RateStat getSendFailureSize() { return _sendFailureSize; } /** how large received messages are, calculated over a 1 minute, 1 hour, and 1 day period */ public RateStat getReceiveSize() { return _receiveSize; } /** how long it takes to get a db response from the peer (in milliseconds), calculated over a 1 minute, 1 hour, and 1 day period */ @@ -149,10 +160,6 @@ public class PeerProfile { public RateStat getTunnelCreateResponseTime() { return _tunnelCreateResponseTime; } /** how long it takes to successfully test a tunnel this peer participates in (in milliseconds), calculated over a 10 minute, 1 hour, and 1 day period */ public RateStat getTunnelTestResponseTime() { return _tunnelTestResponseTime; } - /** how long it takes to successfully test the peer (in milliseconds) when the time exceeds 5s */ - public RateStat getTunnelTestResponseTimeSlow() { return _tunnelTestResponseTimeSlow; } - /** how long between communication errors with the peer (disconnection, etc), calculated over a 1 minute, 1 hour, and 1 day period */ - public RateStat getCommError() { return _commError; } /** how many new peers we get from dbSearchReplyMessages or dbStore messages, calculated over a 1 hour, 1 day, and 1 week period */ public RateStat getDbIntroduction() { return _dbIntroduction; } @@ -164,14 +171,6 @@ public class PeerProfile { public long getSpeedBonus() { return _speedBonus; } public void setSpeedBonus(long bonus) { _speedBonus = bonus; } - /** - * extra factor added to the reliability ranking - this can be updated in the profile - * written to disk to affect how the algorithm ranks reliability. Negative values are - * penalties - */ - public long getReliabilityBonus() { return _reliabilityBonus; } - public void setReliabilityBonus(long bonus) { _reliabilityBonus = bonus; } - /** * extra factor added to the capacity ranking - this can be updated in the profile * written to disk to affect how the algorithm ranks capacity. Negative values are @@ -195,14 +194,6 @@ public class PeerProfile { * */ public double getSpeedValue() { return _speedValue; } - public double getOldSpeedValue() { return _oldSpeedValue; } - /** - * How likely are they to stay up and pass on messages over the next few minutes. - * Positive numbers means more likely, negative numbers means its probably not - * even worth trying. - * - */ - public double getReliabilityValue() { return _reliabilityValue; } /** * How many tunnels do we think this peer can handle over the next hour? * @@ -306,7 +297,7 @@ public class PeerProfile { } if (_log.shouldLog(Log.DEBUG) ) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Updating 1m throughput after ").append(size).append(" to "); for (int i = 0; i < THROUGHPUT_COUNT; i++) buf.append(_peakTunnel1mThroughput[i]).append(','); @@ -315,6 +306,11 @@ public class PeerProfile { } } } + /** + * @return the average of the three fastest one-minute data transfers, on a per-tunnel basis, + * through this peer. Ever. Except that the peak values are cut in half + * once a day by coalesceThroughput(). This seems way too seldom. + */ public double getPeakTunnel1mThroughputKBps() { double rv = 0; for (int i = 0; i < THROUGHPUT_COUNT; i++) @@ -334,13 +330,10 @@ public class PeerProfile { */ public void shrinkProfile() { _sendSuccessSize = null; - _sendFailureSize = null; _receiveSize = null; _dbResponseTime = null; _tunnelCreateResponseTime = null; _tunnelTestResponseTime = null; - _tunnelTestResponseTimeSlow = null; - _commError = null; _dbIntroduction = null; _tunnelHistory = null; _dbHistory = null; @@ -358,21 +351,15 @@ public class PeerProfile { public void expandProfile() { String group = (null == _peer ? "profileUnknown" : _peer.toBase64().substring(0,6)); if (_sendSuccessSize == null) - _sendSuccessSize = new RateStat("sendSuccessSize", "How large successfully sent messages are", group, new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - if (_sendFailureSize == null) - _sendFailureSize = new RateStat("sendFailureSize", "How large messages that could not be sent were", group, new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000 } ); + _sendSuccessSize = new RateStat("sendSuccessSize", "How large successfully sent messages are", group, new long[] { 5*60*1000l, 60*60*1000l }); if (_receiveSize == null) - _receiveSize = new RateStat("receiveSize", "How large received messages are", group, new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000 } ); + _receiveSize = new RateStat("receiveSize", "How large received messages are", group, new long[] { 5*60*1000l, 60*60*1000l } ); if (_dbResponseTime == null) _dbResponseTime = new RateStat("dbResponseTime", "how long it takes to get a db response from the peer (in milliseconds)", group, new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000 } ); if (_tunnelCreateResponseTime == null) _tunnelCreateResponseTime = new RateStat("tunnelCreateResponseTime", "how long it takes to get a tunnel create response from the peer (in milliseconds)", group, new long[] { 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000 } ); if (_tunnelTestResponseTime == null) _tunnelTestResponseTime = new RateStat("tunnelTestResponseTime", "how long it takes to successfully test a tunnel this peer participates in (in milliseconds)", group, new long[] { 10*60*1000l, 30*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 } ); - if (_tunnelTestResponseTimeSlow == null) - _tunnelTestResponseTimeSlow = new RateStat("tunnelTestResponseTimeSlow", "how long it takes to successfully test a peer when the time exceeds 5s", group, new long[] { 10*60*1000l, 30*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000l, }); - if (_commError == null) - _commError = new RateStat("commErrorRate", "how long between communication errors with the peer (e.g. disconnection)", group, new long[] { 60*1000l, 10*60*1000l, 60*60*1000l, 24*60*60*1000 } ); if (_dbIntroduction == null) _dbIntroduction = new RateStat("dbIntroduction", "how many new peers we get from dbSearchReplyMessages or dbStore messages", group, new long[] { 60*60*1000l, 6*60*60*1000l, 24*60*60*1000l }); @@ -382,18 +369,17 @@ public class PeerProfile { _dbHistory = new DBHistory(_context, group); _sendSuccessSize.setStatLog(_context.statManager().getStatLog()); - _sendFailureSize.setStatLog(_context.statManager().getStatLog()); _receiveSize.setStatLog(_context.statManager().getStatLog()); _dbResponseTime.setStatLog(_context.statManager().getStatLog()); _tunnelCreateResponseTime.setStatLog(_context.statManager().getStatLog()); _tunnelTestResponseTime.setStatLog(_context.statManager().getStatLog()); - _tunnelTestResponseTimeSlow.setStatLog(_context.statManager().getStatLog()); - _commError.setStatLog(_context.statManager().getStatLog()); _dbIntroduction.setStatLog(_context.statManager().getStatLog()); _expanded = true; } /** once a day, on average, cut the measured throughtput values in half */ - private static final long DROP_PERIOD_MINUTES = 24*60; + /** let's try once an hour times 3/4 */ + private static final int DROP_PERIOD_MINUTES = 60; + private static final double DEGRADE_FACTOR = 0.75; private long _lastCoalesceDate = System.currentTimeMillis(); private void coalesceThroughput() { long now = System.currentTimeMillis(); @@ -410,46 +396,19 @@ public class PeerProfile { break; } } - - if (false && _log.shouldLog(Log.WARN) ) { - StringBuffer buf = new StringBuffer(128); - buf.append("Updating throughput after ").append(tot).append(" to "); - for (int i = 0; i < THROUGHPUT_COUNT; i++) - buf.append(_peakThroughput[i]).append(','); - buf.append(" for ").append(_peer.toBase64()); - _log.warn(buf.toString()); - } } else { - if (_context.random().nextLong(DROP_PERIOD_MINUTES*2) <= 0) { - for (int i = 0; i < THROUGHPUT_COUNT; i++) - _peakThroughput[i] /= 2; - - if (false && _log.shouldLog(Log.WARN) ) { - StringBuffer buf = new StringBuffer(128); - buf.append("Degrading the throughput measurements to "); - for (int i = 0; i < THROUGHPUT_COUNT; i++) - buf.append(_peakThroughput[i]).append(','); - buf.append(" for ").append(_peer.toBase64()); - _log.warn(buf.toString()); - } + if (_context.random().nextInt(DROP_PERIOD_MINUTES*2) <= 0) { + for (int i = 0; i < THROUGHPUT_COUNT; i++) + _peakThroughput[i] *= DEGRADE_FACTOR; } } // we degrade the tunnel throughput here too, regardless of the current // activity - if (_context.random().nextLong(DROP_PERIOD_MINUTES*2) <= 0) { + if (_context.random().nextInt(DROP_PERIOD_MINUTES*2) <= 0) { for (int i = 0; i < THROUGHPUT_COUNT; i++) { - _peakTunnelThroughput[i] /= 2; - _peakTunnel1mThroughput[i] /= 2; - } - - if (_log.shouldLog(Log.WARN) ) { - StringBuffer buf = new StringBuffer(128); - buf.append("Degrading the tunnel throughput measurements to "); - for (int i = 0; i < THROUGHPUT_COUNT; i++) - buf.append(_peakTunnel1mThroughput[i]).append(','); - buf.append(" for ").append(_peer.toBase64()); - _log.warn(buf.toString()); + _peakTunnelThroughput[i] *= DEGRADE_FACTOR; + _peakTunnel1mThroughput[i] *= DEGRADE_FACTOR; } } _peakThroughputCurrentTotal = 0; @@ -460,40 +419,35 @@ public class PeerProfile { /** update the stats and rates (this should be called once a minute) */ public void coalesceStats() { if (!_expanded) return; - _commError.coalesceStats(); _dbIntroduction.coalesceStats(); _dbResponseTime.coalesceStats(); _receiveSize.coalesceStats(); - _sendFailureSize.coalesceStats(); _sendSuccessSize.coalesceStats(); _tunnelCreateResponseTime.coalesceStats(); _tunnelTestResponseTime.coalesceStats(); - _tunnelTestResponseTimeSlow.coalesceStats(); _dbHistory.coalesceStats(); _tunnelHistory.coalesceStats(); coalesceThroughput(); _speedValue = calculateSpeed(); - _oldSpeedValue = calculateOldSpeed(); - _reliabilityValue = calculateReliability(); _capacityValue = calculateCapacity(); _integrationValue = calculateIntegration(); _isFailing = calculateIsFailing(); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Coalesced: speed [" + _speedValue + "] reliability [" + _reliabilityValue + "] capacity [" + _capacityValue + "] integration [" + _integrationValue + "] failing? [" + _isFailing + "]"); + _log.debug("Coalesced: speed [" + _speedValue + "] capacity [" + _capacityValue + "] integration [" + _integrationValue + "] failing? [" + _isFailing + "]"); } private double calculateSpeed() { return _context.speedCalculator().calc(this); } - private double calculateOldSpeed() { return _context.oldSpeedCalculator().calc(this); } - private double calculateReliability() { return _context.reliabilityCalculator().calc(this); } private double calculateCapacity() { return _context.capacityCalculator().calc(this); } private double calculateIntegration() { return _context.integrationCalculator().calc(this); } - private boolean calculateIsFailing() { return _context.isFailingCalculator().calcBoolean(this); } + private boolean calculateIsFailing() { return false; } void setIsFailing(boolean val) { _isFailing = val; } + @Override public int hashCode() { return (_peer == null ? 0 : _peer.hashCode()); } + @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj.getClass() != PeerProfile.class) return false; @@ -501,15 +455,40 @@ public class PeerProfile { PeerProfile prof = (PeerProfile)obj; return _peer.equals(prof.getPeer()); } + @Override public String toString() { return "Profile: " + getPeer().toBase64(); } /** + * New measurement is 12KB per expanded profile. (2009-03 zzz) + * And nowhere in the code is shrinkProfile() called so + * the size of compact profiles doesn't matter right now. + * This is far bigger than the NetDB entry, which is only about 1.5KB + * now that most of the stats have been removed. + * + * The biggest user in the profile is the Rates. (144 bytes per according to jhat). + * PeerProfile: 9 RateStats, 3-5 Rates each - 35 total + * DBHistory: 2 RateStats, 3 each - 6 total + * TunnelHistory: 4 RateStats, 5 each - 20 total + * --- --------- + * 15 61 total + * *60 bytes *144 bytes + * --- --------- + * 900 bytes 8784 bytes + * + * The RateStat itself is 32 bytes and the Rate[] is 28 so that adds + * about 1KB. + * + * So two obvious things to do are cut out some of the Rates, + * and call shrinkProfile(). + * + * Obsolete calculation follows: + * * Calculate the memory consumption of profiles. Measured to be ~3739 bytes * for an expanded profile, and ~212 bytes for a compacted one. * */ - public static void main2(String args[]) { - RouterContext ctx = new RouterContext(null); + public static void main(String args[]) { + RouterContext ctx = new RouterContext(new net.i2p.router.Router()); testProfileSize(ctx, 100, 0); // 560KB testProfileSize(ctx, 1000, 0); // 3.9MB testProfileSize(ctx, 10000, 0); // 37MB @@ -524,13 +503,13 @@ public class PeerProfile { * PeerProfile [filename]* * */ - public static void main(String args[]) { + public static void main2(String args[]) { RouterContext ctx = new RouterContext(new net.i2p.router.Router()); DecimalFormat fmt = new DecimalFormat("0,000.0"); fmt.setPositivePrefix("+"); ProfilePersistenceHelper helper = new ProfilePersistenceHelper(ctx); try { Thread.sleep(5*1000); } catch (InterruptedException e) {} - StringBuffer buf = new StringBuffer(1024); + StringBuilder buf = new StringBuilder(1024); for (int i = 0; i < args.length; i++) { PeerProfile profile = helper.readProfile(new File(args[i])); if (profile == null) { @@ -540,7 +519,6 @@ public class PeerProfile { //profile.coalesceStats(); buf.append("Peer " + profile.getPeer().toBase64() + ":\t Speed:\t" + fmt.format(profile.calculateSpeed()) - + " Reliability:\t" + fmt.format(profile.calculateReliability()) + " Capacity:\t" + fmt.format(profile.calculateCapacity()) + " Integration:\t" + fmt.format(profile.calculateIntegration()) + " Active?\t" + profile.getIsActive() diff --git a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java index 6c7aef927..58ad94b24 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java +++ b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java @@ -50,9 +50,10 @@ public class PeerTestJob extends JobImpl { /** number of peers to test each round */ private int getTestConcurrency() { return 1; } - public void startTesting(PeerManager manager) { + public void startTesting(PeerManager manager) { // LINT -- Exporting non-public type through public API _manager = manager; _keepTesting = true; + this.getTiming().setStartAfter(getContext().clock().now() + DEFAULT_PEER_TEST_DELAY); getContext().jobQueue().addJob(this); if (_log.shouldLog(Log.INFO)) _log.info("Start testing peers"); @@ -222,8 +223,9 @@ public class PeerTestJob extends JobImpl { return false; } public boolean matchFound() { return _matchFound; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("Test peer ").append(_peer.toBase64().substring(0,4)); buf.append(" with nonce ").append(_nonce); return buf.toString(); diff --git a/router/java/src/net/i2p/router/peermanager/PersistProfileJob.java b/router/java/src/net/i2p/router/peermanager/PersistProfileJob.java deleted file mode 100644 index 3b230fd86..000000000 --- a/router/java/src/net/i2p/router/peermanager/PersistProfileJob.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.i2p.router.peermanager; - -import java.util.Iterator; -import java.util.Set; - -import net.i2p.data.Hash; -import net.i2p.router.JobImpl; -import net.i2p.router.RouterContext; - -class PersistProfileJob extends JobImpl { - private PersistProfilesJob _job; - private Iterator _peers; - public PersistProfileJob(RouterContext enclosingContext, PersistProfilesJob job, Set peers) { - super(enclosingContext); - _peers = peers.iterator(); - _job = job; - } - public void runJob() { - if (_peers.hasNext()) - _job.persist((Hash)_peers.next()); - if (_peers.hasNext()) { - requeue(1000); - } else { - // no more left, requeue up the main persist-em-all job - _job.requeue(); - } - } - public String getName() { return "Persist profile"; } -} diff --git a/router/java/src/net/i2p/router/peermanager/PersistProfilesJob.java b/router/java/src/net/i2p/router/peermanager/PersistProfilesJob.java deleted file mode 100644 index fc137ccc8..000000000 --- a/router/java/src/net/i2p/router/peermanager/PersistProfilesJob.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.i2p.router.peermanager; - -import java.util.Set; - -import net.i2p.data.Hash; -import net.i2p.router.JobImpl; -import net.i2p.router.RouterContext; - -class PersistProfilesJob extends JobImpl { - private PeerManager _mgr; - private final static long PERSIST_DELAY = 10*60*1000; - - public PersistProfilesJob(RouterContext ctx, PeerManager mgr) { - super(ctx); - _mgr = mgr; - getTiming().setStartAfter(getContext().clock().now() + PERSIST_DELAY); - } - - public String getName() { return "Persist profiles"; } - public void runJob() { - Set peers = _mgr.selectPeers(); - getContext().jobQueue().addJob(new PersistProfileJob(getContext(), this, peers)); - } - void persist(Hash peer) { _mgr.storeProfile(peer); } - void requeue() { requeue(PERSIST_DELAY); } -} diff --git a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java index 9e789f9c6..1c40b003d 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java @@ -50,7 +50,6 @@ public class ProfileManagerImpl implements ProfileManager { PeerProfile data = getProfile(peer); if (data == null) return; data.setLastSendFailed(_context.clock().now()); - data.getSendFailureSize().addData(0, 0); // yeah, should be a frequency... } /** @@ -61,7 +60,6 @@ public class ProfileManagerImpl implements ProfileManager { PeerProfile data = getProfile(peer); if (data == null) return; data.setLastSendFailed(_context.clock().now()); - data.getSendFailureSize().addData(0, 0); // yeah, should be a frequency... } /** @@ -74,8 +72,6 @@ public class ProfileManagerImpl implements ProfileManager { PeerProfile data = getProfile(peer); if (data == null) return; data.setLastSendFailed(_context.clock().now()); - data.getSendFailureSize().addData(1, 0); // yeah, should be a frequency... - data.getCommError().addData(1, 0); // see above } /** @@ -125,8 +121,6 @@ public class ProfileManagerImpl implements ProfileManager { if (data == null) return; data.updateTunnelTestTimeAverage(responseTimeMs); data.getTunnelTestResponseTime().addData(responseTimeMs, responseTimeMs); - if (responseTimeMs > getSlowThreshold()) - data.getTunnelTestResponseTimeSlow().addData(responseTimeMs, responseTimeMs); } public void tunnelDataPushed(Hash peer, long rtt, int size) { @@ -310,7 +304,7 @@ public class ProfileManagerImpl implements ProfileManager { PeerProfile prof = getProfile(peer); if (prof == null) continue; - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("status: "); if (_context.profileOrganizer().isFast(peer)) { diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java index b090d6cc7..07d25fce8 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java @@ -19,6 +19,8 @@ import java.util.Properties; import java.util.Random; import java.util.Set; import java.util.TreeSet; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantReadWriteLock; import net.i2p.data.Hash; import net.i2p.data.RouterAddress; @@ -40,17 +42,17 @@ public class ProfileOrganizer { private Log _log; private RouterContext _context; /** H(routerIdentity) to PeerProfile for all peers that are fast and high capacity*/ - private Map _fastPeers; + private Map _fastPeers; /** H(routerIdentity) to PeerProfile for all peers that have high capacities */ - private Map _highCapacityPeers; + private Map _highCapacityPeers; /** H(routerIdentity) to PeerProfile for all peers that well integrated into the network and not failing horribly */ - private Map _wellIntegratedPeers; + private Map _wellIntegratedPeers; /** H(routerIdentity) to PeerProfile for all peers that are not failing horribly */ - private Map _notFailingPeers; + private Map _notFailingPeers; /** H(routerIdnetity), containing elements in _notFailingPeers */ - private List _notFailingPeersList; + private List _notFailingPeersList; /** H(routerIdentity) to PeerProfile for all peers that ARE failing horribly (but that we haven't dropped reference to yet) */ - private Map _failingPeers; + private Map _failingPeers; /** who are we? */ private Hash _us; private ProfilePersistenceHelper _persistenceHelper; @@ -74,6 +76,7 @@ public class ProfileOrganizer { */ public static final String PROP_MINIMUM_FAST_PEERS = "profileOrganizer.minFastPeers"; public static final int DEFAULT_MINIMUM_FAST_PEERS = 8; + private static final int DEFAULT_MAXIMUM_FAST_PEERS = 16; /** * Defines the minimum number of 'high capacity' peers that the organizer should * select when using the mean - if less than this many are available, select the @@ -84,7 +87,7 @@ public class ProfileOrganizer { public static final int DEFAULT_MINIMUM_HIGH_CAPACITY_PEERS = 10; /** synchronized against this lock when updating the tier that peers are located in (and when fetching them from a peer) */ - private Object _reorganizeLock = new Object(); + private final ReentrantReadWriteLock _reorganizeLock = new ReentrantReadWriteLock(true); /** incredibly weak PRNG, just used for shuffling peers. no need to waste the real PRNG on this */ private Random _random = new Random(); @@ -105,13 +108,36 @@ public class ProfileOrganizer { _thresholdIntegrationValue = 0.0d; _persistenceHelper = new ProfilePersistenceHelper(_context); - _context.statManager().createRateStat("peer.profileSortTime", "How long the reorg takes sorting peers", "Peers", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("peer.profileCoalesceTime", "How long the reorg takes coalescing peer stats", "Peers", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("peer.profileThresholdTime", "How long the reorg takes determining the tier thresholds", "Peers", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("peer.profilePlaceTime", "How long the reorg takes placing peers in the tiers", "Peers", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("peer.profileReorgTime", "How long the reorg takes overall", "Peers", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("peer.profileSortTime", "How long the reorg takes sorting peers", "Peers", new long[] { 10*60*1000 }); + _context.statManager().createRateStat("peer.profileCoalesceTime", "How long the reorg takes coalescing peer stats", "Peers", new long[] { 10*60*1000 }); + _context.statManager().createRateStat("peer.profileThresholdTime", "How long the reorg takes determining the tier thresholds", "Peers", new long[] { 10*60*1000 }); + _context.statManager().createRateStat("peer.profilePlaceTime", "How long the reorg takes placing peers in the tiers", "Peers", new long[] { 10*60*1000 }); + _context.statManager().createRateStat("peer.profileReorgTime", "How long the reorg takes overall", "Peers", new long[] { 10*60*1000 }); } + private void getReadLock() { + _reorganizeLock.readLock().lock(); + } + + private void releaseReadLock() { + _reorganizeLock.readLock().unlock(); + } + + /** @return true if the lock was acquired */ + private boolean getWriteLock() { + try { + boolean rv = _reorganizeLock.writeLock().tryLock(5000, TimeUnit.MILLISECONDS); + if (!rv) + _log.error("no lock, size is: " + _reorganizeLock.getQueueLength(), new Exception("rats")); + return rv; + } catch (InterruptedException ie) {} + return false; + } + + private void releaseWriteLock() { + _reorganizeLock.writeLock().unlock(); + } + public void setUs(Hash us) { _us = us; } Hash getUs() { return _us; } @@ -124,42 +150,52 @@ public class ProfileOrganizer { * */ public PeerProfile getProfile(Hash peer) { - synchronized (_reorganizeLock) { + getReadLock(); + try { return locked_getProfile(peer); - } + } finally { releaseReadLock(); } } /** * Add the new profile, returning the old value (or null if no profile existed) * */ - public PeerProfile addProfile(PeerProfile profile) throws IllegalStateException { + public PeerProfile addProfile(PeerProfile profile) { if ( (profile == null) || (profile.getPeer() == null) ) return null; if (_log.shouldLog(Log.DEBUG)) _log.debug("New profile created for " + profile.getPeer().toBase64()); - synchronized (_reorganizeLock) { - PeerProfile old = locked_getProfile(profile.getPeer()); - profile.coalesceStats(); + PeerProfile old = getProfile(profile.getPeer()); + profile.coalesceStats(); + if (!getWriteLock()) + return old; + try { locked_placeProfile(profile); _strictCapacityOrder.add(profile); - return old; - } + } finally { releaseWriteLock(); } + return old; } - public int countFastPeers() { synchronized (_reorganizeLock) { return _fastPeers.size(); } } - public int countHighCapacityPeers() { synchronized (_reorganizeLock) { return _highCapacityPeers.size(); } } - public int countWellIntegratedPeers() { synchronized (_reorganizeLock) { return _wellIntegratedPeers.size(); } } - public int countNotFailingPeers() { synchronized (_reorganizeLock) { return _notFailingPeers.size(); } } - public int countFailingPeers() { synchronized (_reorganizeLock) { return _failingPeers.size(); } } + private int count(Map m) { + getReadLock(); + try { + return m.size(); + } finally { releaseReadLock(); } + } + + public int countFastPeers() { return count(_fastPeers); } + public int countHighCapacityPeers() { return count(_highCapacityPeers); } + public int countWellIntegratedPeers() { return count(_wellIntegratedPeers); } + public int countNotFailingPeers() { return count(_notFailingPeers); } + public int countFailingPeers() { return count(_failingPeers); } public int countActivePeers() { - synchronized (_reorganizeLock) { - int activePeers = 0; - - long hideBefore = _context.clock().now() - 6*60*60*1000; - + int activePeers = 0; + long hideBefore = _context.clock().now() - 6*60*60*1000; + + getReadLock(); + try { for (Iterator iter = _failingPeers.values().iterator(); iter.hasNext(); ) { PeerProfile profile = (PeerProfile)iter.next(); if (profile.getLastSendSuccessful() >= hideBefore) @@ -174,15 +210,21 @@ public class ProfileOrganizer { else if (profile.getLastHeardFrom() >= hideBefore) activePeers++; } - - return activePeers; - } + } finally { releaseReadLock(); } + return activePeers; } - public boolean isFast(Hash peer) { synchronized (_reorganizeLock) { return _fastPeers.containsKey(peer); } } - public boolean isHighCapacity(Hash peer) { synchronized (_reorganizeLock) { return _highCapacityPeers.containsKey(peer); } } - public boolean isWellIntegrated(Hash peer) { synchronized (_reorganizeLock) { return _wellIntegratedPeers.containsKey(peer); } } - public boolean isFailing(Hash peer) { synchronized (_reorganizeLock) { return _failingPeers.containsKey(peer); } } + private boolean isX(Map m, Hash peer) { + getReadLock(); + try { + return m.containsKey(peer); + } finally { releaseReadLock(); } + } + + public boolean isFast(Hash peer) { return isX(_fastPeers, peer); } + public boolean isHighCapacity(Hash peer) { return isX(_highCapacityPeers, peer); } + public boolean isWellIntegrated(Hash peer) { return isX(_wellIntegratedPeers, peer); } + public boolean isFailing(Hash peer) { return isX(_failingPeers, peer); } /** * if a peer sends us more than 5 replies in a searchReply that we cannot @@ -236,9 +278,10 @@ public class ProfileOrganizer { selectFastPeers(howMany, exclude, matches, 0); } public void selectFastPeers(int howMany, Set exclude, Set matches, int mask) { - synchronized (_reorganizeLock) { + getReadLock(); + try { locked_selectPeers(_fastPeers, howMany, exclude, matches, mask); - } + } finally { releaseReadLock(); } if (matches.size() < howMany) { if (_log.shouldLog(Log.INFO)) _log.info("selectFastPeers("+howMany+"), not enough fast (" + matches.size() + ") going on to highCap"); @@ -258,7 +301,8 @@ public class ProfileOrganizer { selectHighCapacityPeers(howMany, exclude, matches, 0); } public void selectHighCapacityPeers(int howMany, Set exclude, Set matches, int mask) { - synchronized (_reorganizeLock) { + getReadLock(); + try { // we only use selectHighCapacityPeers when we are selecting for PURPOSE_TEST // or we are falling back due to _fastPeers being too small, so we can always // exclude the fast peers @@ -269,11 +313,11 @@ public class ProfileOrganizer { exclude.addAll(_fastPeers.keySet()); */ locked_selectPeers(_highCapacityPeers, howMany, exclude, matches, mask); - } + } finally { releaseReadLock(); } if (matches.size() < howMany) { if (_log.shouldLog(Log.INFO)) - _log.info("selectHighCap("+howMany+"), not enough fast (" + matches.size() + ") going on to notFailing"); - selectNotFailingPeers(howMany, exclude, matches, mask); + _log.info("selectHighCap("+howMany+"), not enough highcap (" + matches.size() + ") going on to ANFP2"); + selectActiveNotFailingPeers2(howMany, exclude, matches, mask); } else { if (_log.shouldLog(Log.INFO)) _log.info("selectHighCap("+howMany+"), found enough highCap (" + matches.size() + ")"); @@ -288,9 +332,10 @@ public class ProfileOrganizer { selectWellIntegratedPeers(howMany, exclude, matches, 0); } public void selectWellIntegratedPeers(int howMany, Set exclude, Set matches, int mask) { - synchronized (_reorganizeLock) { + getReadLock(); + try { locked_selectPeers(_wellIntegratedPeers, howMany, exclude, matches, mask); - } + } finally { releaseReadLock(); } if (matches.size() < howMany) { if (_log.shouldLog(Log.INFO)) _log.info("selectWellIntegrated("+howMany+"), not enough integrated (" + matches.size() + ") going on to notFailing"); @@ -330,38 +375,68 @@ public class ProfileOrganizer { selectAllNotFailingPeers(howMany, exclude, matches, onlyNotFailing, mask); return; } + /** * Return a set of Hashes for peers that are both not failing and we're actively * talking with. * + * We use commSystem().isEstablished(), not profile.getIsActive(), as the + * NTCP idle time is now shorter than the 5 minute getIsActive() threshold, + * and we're using this to try and limit connections. + * + * Caution, this does NOT cascade further to non-connected peers, so it should only + * be used when there is a good number of connected peers. + * + * @param exclude non-null + * No mask parameter, to be fixed */ - /* - private void selectActiveNotFailingPeers(int howMany, Set exclude, Set matches) { - if (true) { - selectAllNotFailingPeers(howMany, exclude, matches); - return; - } - // pick out the not-failing peers that we're actively talking with + public void selectActiveNotFailingPeers(int howMany, Set exclude, Set matches) { if (matches.size() < howMany) { - synchronized (_reorganizeLock) { - for (Iterator iter = _notFailingPeers.keySet().iterator(); iter.hasNext(); ) { - Hash peer = (Hash)iter.next(); - if ( (exclude != null) && exclude.contains(peer) ) continue; - if (matches.contains(peer)) continue; - PeerProfile prof = (PeerProfile)_notFailingPeers.get(peer); - if (prof.getIsActive()) - matches.add(peer); - if (matches.size() >= howMany) - return; + getReadLock(); + try { + for (Iterator iter = _notFailingPeers.keySet().iterator(); iter.hasNext(); ) { + Hash peer = iter.next(); + if (!_context.commSystem().isEstablished(peer)) + exclude.add(peer); } - } + locked_selectPeers(_notFailingPeers, howMany, exclude, matches, 0); + } finally { releaseReadLock(); } } - // ok, still not enough, pick out the not-failing peers that we aren't talking with - if (matches.size() < howMany) - selectAllNotFailingPeers(howMany, exclude, matches); - return; } - */ + + /** + * Return a set of Hashes for peers that are both not failing and we're actively + * talking with. + * + * We use commSystem().isEstablished(), not profile.getIsActive(), as the + * NTCP idle time is now shorter than the 5 minute getIsActive() threshold, + * and we're using this to try and limit connections. + * + * This DOES cascade further to non-connected peers. + */ + private void selectActiveNotFailingPeers2(int howMany, Set exclude, Set matches, int mask) { + if (matches.size() < howMany) { + Map activePeers = new HashMap(); + getReadLock(); + try { + for (Iterator> iter = _notFailingPeers.entrySet().iterator(); iter.hasNext(); ) { + Map.Entry e = iter.next(); + if (_context.commSystem().isEstablished(e.getKey())) + activePeers.put(e.getKey(), e.getValue()); + } + locked_selectPeers(activePeers, howMany, exclude, matches, mask); + } finally { releaseReadLock(); } + } + if (matches.size() < howMany) { + if (_log.shouldLog(Log.INFO)) + _log.info("selectANFP2("+howMany+"), not enough ANFP (" + matches.size() + ") going on to notFailing"); + selectNotFailingPeers(howMany, exclude, matches, mask); + } else { + if (_log.shouldLog(Log.INFO)) + _log.info("selectANFP2("+howMany+"), found enough ANFP (" + matches.size() + ")"); + } + } + /** * Return a set of Hashes for peers that are not failing. * @@ -369,13 +444,18 @@ public class ProfileOrganizer { public void selectAllNotFailingPeers(int howMany, Set exclude, Set matches, boolean onlyNotFailing) { selectAllNotFailingPeers(howMany, exclude, matches, onlyNotFailing, 0); } + /** + * @param mask ignored, should call locked_selectPeers, to be fixed + * + */ private void selectAllNotFailingPeers(int howMany, Set exclude, Set matches, boolean onlyNotFailing, int mask) { if (matches.size() < howMany) { int orig = matches.size(); int needed = howMany - orig; int start = 0; List selected = new ArrayList(needed); - synchronized (_reorganizeLock) { + getReadLock(); + try { // we randomize the whole list when rebuilding it, but randomizing // the entire list on each peer selection is a bit crazy start = _context.random().nextInt(_notFailingPeersList.size()); @@ -397,7 +477,7 @@ public class ProfileOrganizer { _log.debug("Not selectable: " + cur.toBase64()); } } - } + } finally { releaseReadLock(); } if (_log.shouldLog(Log.INFO)) _log.info("Selecting all not failing (strict? " + onlyNotFailing + " start=" + start + ") found " + selected.size() + " new peers: " + selected + " all=" + _notFailingPeersList.size() + " strict=" + _strictCapacityOrder.size()); @@ -418,25 +498,27 @@ public class ProfileOrganizer { * */ public void selectFailingPeers(int howMany, Set exclude, Set matches) { - synchronized (_reorganizeLock) { + getReadLock(); + try { locked_selectPeers(_failingPeers, howMany, exclude, matches); - } - return; - } - - /** + } finally { releaseReadLock(); } + return; + } + + /** * Get the peers the transport layer thinks are unreachable, and * add in the peers with the SSU peer testing bug, * and peers requiring introducers. - * - */ + * + */ public List selectPeersLocallyUnreachable() { List n; int count; - synchronized (_reorganizeLock) { + getReadLock(); + try { count = _notFailingPeers.size(); n = new ArrayList(_notFailingPeers.keySet()); - } + } finally { releaseReadLock(); } List l = new ArrayList(count / 4); for (Iterator iter = n.iterator(); iter.hasNext(); ) { Hash peer = (Hash)iter.next(); @@ -459,9 +541,11 @@ public class ProfileOrganizer { l.add(peer); else { RouterAddress ra = info.getTargetAddress("SSU"); - // Definitely don't want peers with no SSU address at all + // peers with no SSU address at all are fine. + // as long as they have NTCP if (ra == null) { - l.add(peer); + if (info.getTargetAddress("NTCP") == null) + l.add(peer); continue; } // This is the quick way of doing UDPAddress.getIntroducerCount() > 0 @@ -472,8 +556,8 @@ public class ProfileOrganizer { } } } - if (_log.shouldLog(Log.INFO)) - _log.info("Unreachable: " + l); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Unreachable: " + l); return l; } @@ -483,7 +567,8 @@ public class ProfileOrganizer { * */ public List selectPeersRecentlyRejecting() { - synchronized (_reorganizeLock) { + getReadLock(); + try { long cutoff = _context.clock().now() - (20*1000); int count = _notFailingPeers.size(); List l = new ArrayList(count / 128); @@ -493,7 +578,7 @@ public class ProfileOrganizer { l.add(prof.getPeer()); } return l; - } + } finally { releaseReadLock(); } } /** @@ -501,16 +586,23 @@ public class ProfileOrganizer { * */ public Set selectAllPeers() { - synchronized (_reorganizeLock) { + getReadLock(); + try { Set allPeers = new HashSet(_failingPeers.size() + _notFailingPeers.size() + _highCapacityPeers.size() + _fastPeers.size()); allPeers.addAll(_failingPeers.keySet()); allPeers.addAll(_notFailingPeers.keySet()); allPeers.addAll(_highCapacityPeers.keySet()); allPeers.addAll(_fastPeers.keySet()); return allPeers; - } + } finally { releaseReadLock(); } } + private static final long MIN_EXPIRE_TIME = 3*60*60*1000; + private static final long MAX_EXPIRE_TIME = 6*60*60*1000; + private static final long ADJUST_EXPIRE_TIME = 60*1000; + private static final int ENOUGH_PROFILES = 600; + private long _currentExpireTime = MAX_EXPIRE_TIME; + /** * Place peers into the correct tier, as well as expand/contract and even drop profiles * according to whatever limits are in place. Peer profiles are not coalesced during @@ -528,12 +620,19 @@ public class ProfileOrganizer { long uptime = _context.router().getUptime(); long expireOlderThan = -1; if (uptime > 60*60*1000) { - // drop profiles that we haven't spoken with in 6 hours - expireOlderThan = _context.clock().now() - 6*60*60*1000; + // dynamically adjust expire time to control memory usage + if (countNotFailingPeers() > ENOUGH_PROFILES) + _currentExpireTime = Math.max(_currentExpireTime - ADJUST_EXPIRE_TIME, MIN_EXPIRE_TIME); + else + _currentExpireTime = Math.min(_currentExpireTime + ADJUST_EXPIRE_TIME, MAX_EXPIRE_TIME); + // drop profiles that we haven't spoken to in a while + expireOlderThan = _context.clock().now() - _currentExpireTime; } + if (!getWriteLock()) + return; long start = System.currentTimeMillis(); - synchronized (_reorganizeLock) { + try { Set allPeers = _strictCapacityOrder; //new HashSet(_failingPeers.size() + _notFailingPeers.size() + _highCapacityPeers.size() + _fastPeers.size()); //allPeers.addAll(_failingPeers.values()); //allPeers.addAll(_notFailingPeers.values()); @@ -557,38 +656,40 @@ public class ProfileOrganizer { } sortTime = System.currentTimeMillis() - sortStart; _strictCapacityOrder = reordered; - + long thresholdStart = System.currentTimeMillis(); locked_calculateThresholds(allPeers); thresholdTime = System.currentTimeMillis()-thresholdStart; - + _failingPeers.clear(); _fastPeers.clear(); _highCapacityPeers.clear(); _notFailingPeers.clear(); _notFailingPeersList.clear(); _wellIntegratedPeers.clear(); - + long placeStart = System.currentTimeMillis(); - + for (Iterator iter = allPeers.iterator(); iter.hasNext(); ) { PeerProfile profile = (PeerProfile)iter.next(); locked_placeProfile(profile); } - + locked_unfailAsNecessary(); locked_promoteFastAsNecessary(); Collections.shuffle(_notFailingPeersList, _context.random()); - - placeTime = System.currentTimeMillis()-placeStart; - if (_log.shouldLog(Log.INFO)) - _log.info("Profiles reorganized. averages: [integration: " + _thresholdIntegrationValue - + ", capacity: " + _thresholdCapacityValue + ", speed: " + _thresholdSpeedValue + "]"); + placeTime = System.currentTimeMillis()-placeStart; + } finally { releaseWriteLock(); } + + + if (_log.shouldLog(Log.INFO)) + _log.info("Profiles reorganized. averages: [integration: " + _thresholdIntegrationValue + + ", capacity: " + _thresholdCapacityValue + ", speed: " + _thresholdSpeedValue + "]"); /***** if (_log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); for (Iterator iter = _strictCapacityOrder.iterator(); iter.hasNext(); ) { PeerProfile prof = (PeerProfile)iter.next(); buf.append('[').append(prof.toString()).append('=').append(prof.getCapacityValue()).append("] "); @@ -597,7 +698,6 @@ public class ProfileOrganizer { _log.debug("fast: " + _fastPeers.values()); } *****/ - } long total = System.currentTimeMillis()-start; _context.statManager().addRateData("peer.profileSortTime", sortTime, profileCount); @@ -899,11 +999,12 @@ public class ProfileOrganizer { all.removeAll(matches); all.remove(_us); Collections.shuffle(all, _random); + Set IPSet = new HashSet(8); for (int i = 0; (matches.size() < howMany) && (i < all.size()); i++) { Hash peer = (Hash)all.get(i); boolean ok = isSelectable(peer); if (ok) { - ok = mask <= 0 || notRestricted(peer, matches, mask); + ok = mask <= 0 || notRestricted(peer, IPSet, mask); if ((!ok) && _log.shouldLog(Log.WARN)) _log.warn("IP restriction prevents " + peer + " from joining " + matches); } @@ -917,79 +1018,69 @@ public class ProfileOrganizer { /** * Does the peer's IP address NOT match the IP address of any peer already in the set, * on any transport, within a given mask? - * mask is 1-4 (number of bytes to match) or 0 to disable - * Perhaps rewrite this to just make a set of all the IP addresses rather than loop. + * @param mask is 1-4 (number of bytes to match) + * @param IPMatches all IPs so far, modified by this routine */ - private boolean notRestricted(Hash peer, Set matches, int mask) { - if (mask <= 0) return true; - if (matches.size() <= 0) return true; - RouterInfo pinfo = _context.netDb().lookupRouterInfoLocally(peer); - if (pinfo == null) return false; - Set paddr = pinfo.getAddresses(); - if (paddr == null || paddr.size() == 0) + private boolean notRestricted(Hash peer, Set IPSet, int mask) { + Set peerIPs = maskedIPSet(peer, mask); + if (containsAny(IPSet, peerIPs)) return false; - List pladdr = new ArrayList(paddr); - List lmatches = new ArrayList(matches); - // for each match - for (int i = 0; i < matches.size(); i++) { - RouterInfo minfo = _context.netDb().lookupRouterInfoLocally((Hash) lmatches.get(i)); - if (minfo == null) continue; - Set maddr = minfo.getAddresses(); - if (maddr == null || maddr.size() == 0) - continue; - List mladdr = new ArrayList(maddr); - String oldphost = null; - // for each peer address - for (int j = 0; j < paddr.size(); j++) { - RouterAddress pa = (RouterAddress) pladdr.get(j); - if (pa == null) continue; - Properties pprops = pa.getOptions(); - if (pprops == null) continue; - String phost = pprops.getProperty("host"); - if (phost == null) continue; - if (oldphost != null && oldphost.equals(phost)) continue; - oldphost = phost; - InetAddress pi; - try { - pi = InetAddress.getByName(phost); - } catch (UnknownHostException uhe) { - continue; - } - if (pi == null) continue; - byte[] pib = pi.getAddress(); - String oldmhost = null; - // for each match address - for (int k = 0; k < maddr.size(); k++) { - RouterAddress ma = (RouterAddress) mladdr.get(k); - if (ma == null) continue; - Properties mprops = ma.getOptions(); - if (mprops == null) continue; - String mhost = mprops.getProperty("host"); - if (mhost == null) continue; - if (oldmhost != null && oldmhost.equals(mhost)) continue; - oldmhost = mhost; - InetAddress mi; - try { - mi = InetAddress.getByName(mhost); - } catch (UnknownHostException uhe) { - continue; - } - if (mi == null) continue; - byte[] mib = mi.getAddress(); - // assume ipv4, compare 1 to 4 bytes - // log.info("Comparing " + pi + " with " + mi); - for (int m = 0; m < mask; m++) { - if (pib[m] != mib[m]) - break; - if (m == mask-1) - return false; // IP match - } - } - } - } + IPSet.addAll(peerIPs); return true; } + /** + * The Set of IPs for this peer, with a given mask. + * Includes the comm system's record of the IP, and all netDb addresses. + * + * @return an opaque set of masked IPs for this peer + */ + private Set maskedIPSet(Hash peer, int mask) { + Set rv = new HashSet(2); + byte[] commIP = _context.commSystem().getIP(peer); + if (commIP != null) + rv.add(maskedIP(commIP, mask)); + RouterInfo pinfo = _context.netDb().lookupRouterInfoLocally(peer); + if (pinfo == null) + return rv; + Set paddr = pinfo.getAddresses(); + if (paddr == null) + return rv; + for (RouterAddress pa : paddr) { + Properties pprops = pa.getOptions(); + if (pprops == null) continue; + String phost = pprops.getProperty("host"); + if (phost == null) continue; + InetAddress pi; + try { + pi = InetAddress.getByName(phost); + } catch (UnknownHostException uhe) { + continue; + } + if (pi == null) continue; + byte[] pib = pi.getAddress(); + rv.add(maskedIP(pib, mask)); + } + return rv; + } + + /** generate an arbitrary unique value for this ip/mask (mask = 1-4) */ + private Integer maskedIP(byte[] ip, int mask) { + int rv = 0; + for (int i = 0; i < mask; i++) + rv = (rv << 8) | (ip[i] & 0xff); + return Integer.valueOf(rv); + } + + /** does a contain any of the elements in b? */ + private boolean containsAny(Set a, Set b) { + for (Object o : b) { + if (a.contains(o)) + return true; + } + return false; + } + public boolean isSelectable(Hash peer) { NetworkDatabaseFacade netDb = _context.netDb(); // the CLI shouldn't depend upon the netDb @@ -1028,7 +1119,7 @@ public class ProfileOrganizer { /** * called after locking the reorganizeLock, place the profile in the appropriate tier. - * This is where we implement the (betterThanAverage ? goToPierX : goToPierY) algorithms + * This is where we implement the (betterThanAverage ? goToTierX : goToTierY) algorithms * */ private void locked_placeProfile(PeerProfile profile) { @@ -1098,10 +1189,14 @@ public class ProfileOrganizer { * This parameter should help deal with a lack of diversity in the tunnels created when some * peers are particularly fast. * + * Increase default by two for every local destination, up to a max. + * * @return minimum number of peers to be placed in the 'fast' group */ protected int getMinimumFastPeers() { - return _context.getProperty(PROP_MINIMUM_FAST_PEERS, DEFAULT_MINIMUM_FAST_PEERS); + int def = Math.min(DEFAULT_MAXIMUM_FAST_PEERS, + (2 *_context.clientManager().listClients().size()) + DEFAULT_MINIMUM_FAST_PEERS - 2); + return _context.getProperty(PROP_MINIMUM_FAST_PEERS, def); } @@ -1153,7 +1248,6 @@ public class ProfileOrganizer { organizer.isHighCapacity(peer) ? "IR " : organizer.isFailing(peer) ? "IX " : "I ") + "]: " + "\t Speed:\t" + fmt.format(profile.getSpeedValue()) - + " Reliability:\t" + fmt.format(profile.getReliabilityValue()) + " Capacity:\t" + fmt.format(profile.getCapacityValue()) + " Integration:\t" + fmt.format(profile.getIntegrationValue()) + " Active?\t" + profile.getIsActive() @@ -1164,7 +1258,6 @@ public class ProfileOrganizer { organizer.isHighCapacity(peer) ? "R " : organizer.isFailing(peer) ? "X " : " ") + "]: " + "\t Speed:\t" + fmt.format(profile.getSpeedValue()) - + " Reliability:\t" + fmt.format(profile.getReliabilityValue()) + " Capacity:\t" + fmt.format(profile.getCapacityValue()) + " Integration:\t" + fmt.format(profile.getIntegrationValue()) + " Active?\t" + profile.getIsActive() diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java index 2671c8be0..65e22814d 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java @@ -3,10 +3,8 @@ package net.i2p.router.peermanager; import java.io.IOException; import java.io.Writer; import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; import java.util.Comparator; import java.util.Iterator; -import java.util.Locale; import java.util.Set; import java.util.TreeSet; @@ -35,7 +33,7 @@ class ProfileOrganizerRenderer { Set peers = _organizer.selectAllPeers(); long now = _context.clock().now(); - long hideBefore = now - 3*60*60*1000; + long hideBefore = now - 2*60*60*1000; TreeSet order = new TreeSet(_comparator); TreeSet integratedPeers = new TreeSet(_comparator); @@ -58,17 +56,18 @@ class ProfileOrganizerRenderer { int reliable = 0; int integrated = 0; int failing = 0; - StringBuffer buf = new StringBuffer(16*1024); + StringBuilder buf = new StringBuilder(16*1024); buf.append("

    Peer Profiles

    \n"); - buf.append(""); + buf.append("

    Showing ").append(order.size()).append(" recent profiles, hiding ").append(peers.size()-order.size()).append(" older profiles

    "); + buf.append("
    "); buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); int prevTier = 1; for (Iterator iter = order.iterator(); iter.hasNext();) { @@ -99,19 +98,9 @@ class ProfileOrganizerRenderer { buf.append("\n"); prevTier = tier; - buf.append(""); - buf.append(""); - buf.append(""); - //buf.append(""); - buf.append("\n"); + buf.append("\n"); buf.append(""); } buf.append("
    Peer (").append(order.size()).append(", hiding ").append(peers.size()-order.size()).append(")Groups (Caps)SpeedCapacityIntegrationFailing? PeerGroups (Caps)SpeedCapacityIntegrationFailing? 

    "); - if (prof.getIsFailing()) { - buf.append("-- ").append(peer.toBase64().substring(0,6)).append(""); - } else { - if (prof.getIsActive()) { - buf.append("++ ").append(peer.toBase64().substring(0,6)).append(""); - } else { - buf.append("   ").append(peer.toBase64().substring(0,6)); - } - } - buf.append(""); + buf.append("
    "); + buf.append(_context.commSystem().renderPeerHTML(peer)); + buf.append(""); switch (tier) { case 1: buf.append("Fast, High Capacity"); break; @@ -148,8 +137,8 @@ class ProfileOrganizerRenderer { buf.append(bonus).append(')'); } buf.append("").append(num(prof.getIntegrationValue())); - buf.append(""); - if (_context.shitlist().isShitlisted(peer)) buf.append("Shitlist"); + buf.append(""); + if (_context.shitlist().isShitlisted(peer)) buf.append("Banned"); if (prof.getIsFailing()) buf.append(" Failing"); if (_context.commSystem().wasUnreachable(peer)) buf.append(" Unreachable"); Rate failed = prof.getTunnelHistory().getFailedRate().getRate(30*60*1000); @@ -161,50 +150,43 @@ class ProfileOrganizerRenderer { buf.append(' ').append(fails).append('/').append(total).append(" Test Fails"); } buf.append(" profile.txt "); - //buf.append(" netDbnetDb"); - buf.append("/profile"); - buf.append("/+-profile"); + buf.append(" +-
    "); buf.append("

    Floodfill and Integrated Peers

    \n"); - buf.append(""); + buf.append("
    "); buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); +// buf.append(""); + buf.append(""); +// buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); +// buf.append(""); + buf.append(""); +// buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); for (Iterator iter = integratedPeers.iterator(); iter.hasNext();) { PeerProfile prof = (PeerProfile)iter.next(); Hash peer = prof.getPeer(); - buf.append(""); - buf.append(""); RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer); if (info != null) buf.append(""); @@ -236,7 +218,11 @@ class ProfileOrganizerRenderer { } buf.append("
    PeerCapsInteg. ValueLast Heard AboutLast Heard FromLast Successful SendLast Failed Send10m Resp. Time1h Resp. Time1d Resp. TimeSuccessful LookupsFailed LookupsNew StoresOld Stores1h Fail Rate1d Fail RatePeerCapsInteg. ValueLast Heard AboutLast Heard FromLast Successful SendLast Good SendLast Failed SendLast Bad Send10m Resp. Time1h Resp. Time1d Resp. TimeSuccessful LookupsGood LookupsFailed LookupsBad LookupsNew StoresOld Stores1h Fail Rate1d Fail Rate
    "); - if (prof.getIsFailing()) { - buf.append("-- ").append(peer.toBase64().substring(0,6)).append(""); - } else { - if (prof.getIsActive()) { - buf.append("++ ").append(peer.toBase64().substring(0,6)).append(""); - } else { - buf.append("   ").append(peer.toBase64().substring(0,6)); - } - } + buf.append("
    "); + buf.append(_context.commSystem().renderPeerHTML(peer)); + buf.append("" + info.getCapabilities() + "
    "); - buf.append("

    Definitions:

      "); + buf.append("

      Thresholds:

      "); + buf.append("Speed: ").append(num(_organizer.getSpeedThreshold())).append(" (").append(fast).append(" fast peers)
      "); + buf.append("Capacity: ").append(num(_organizer.getCapacityThreshold())).append(" (").append(reliable).append(" high capacity peers)
      "); + buf.append("Integration: ").append(num(_organizer.getIntegrationThreshold())).append(" (").append(integrated).append(" well integrated peers)"); + buf.append("

      Definitions:

        "); buf.append("
      • groups: as determined by the profile organizer
      • "); buf.append("
      • caps: capabilities in the netDb, not used to determine profiles
      • "); buf.append("
      • speed: peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel
      • "); @@ -244,13 +230,6 @@ class ProfileOrganizerRenderer { buf.append("
      • integration: how many new peers have they told us about lately?
      • "); buf.append("
      • failing?: is the peer currently swamped (and if possible we should avoid nagging them)?
      • "); buf.append("
      "); - buf.append("Red peers prefixed with '--' means the peer is failing, and blue peers prefixed "); - buf.append("with '++' means we've sent or received a message from them "); - buf.append("in the last five minutes.

      "); - buf.append("

      Thresholds:
      "); - buf.append("Speed: ").append(num(_organizer.getSpeedThreshold())).append(" (").append(fast).append(" fast peers)
      "); - buf.append("Capacity: ").append(num(_organizer.getCapacityThreshold())).append(" (").append(reliable).append(" high capacity peers)
      "); - buf.append("Integration: ").append(num(_organizer.getIntegrationThreshold())).append(" (").append(integrated).append(" well integrated peers)
      "); out.write(buf.toString()); out.flush(); } diff --git a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java index fd88c406b..e7151314e 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java +++ b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java @@ -89,13 +89,12 @@ class ProfilePersistenceHelper { groups = groups + ", well integrated"; } - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append("########################################################################").append(NL); buf.append("# profile for ").append(profile.getPeer().toBase64()).append(NL); if (_us != null) buf.append("# as calculated by ").append(_us.toBase64()).append(NL); buf.append("#").append(NL); - buf.append("# reliability: ").append(profile.getReliabilityValue()).append(NL); buf.append("# capacity: ").append(profile.getCapacityValue()).append(NL); buf.append("# integration: ").append(profile.getIntegrationValue()).append(NL); buf.append("# speedValue: ").append(profile.getSpeedValue()).append(NL); @@ -134,15 +133,12 @@ class ProfilePersistenceHelper { if (profile.getIsExpanded()) { // only write out expanded data if, uh, we've got it - profile.getCommError().store(out, "commError"); profile.getDbIntroduction().store(out, "dbIntroduction"); profile.getDbResponseTime().store(out, "dbResponseTime"); profile.getReceiveSize().store(out, "receiveSize"); - profile.getSendFailureSize().store(out, "sendFailureSize"); profile.getSendSuccessSize().store(out, "sendSuccessSize"); profile.getTunnelCreateResponseTime().store(out, "tunnelCreateResponseTime"); profile.getTunnelTestResponseTime().store(out, "tunnelTestResponseTime"); - profile.getTunnelTestResponseTimeSlow().store(out, "tunnelTestResponseTimeSlow"); } } @@ -217,15 +213,12 @@ class ProfilePersistenceHelper { profile.getTunnelHistory().load(props); profile.getDBHistory().load(props); - profile.getCommError().load(props, "commError", true); profile.getDbIntroduction().load(props, "dbIntroduction", true); profile.getDbResponseTime().load(props, "dbResponseTime", true); profile.getReceiveSize().load(props, "receiveSize", true); - profile.getSendFailureSize().load(props, "sendFailureSize", true); profile.getSendSuccessSize().load(props, "sendSuccessSize", true); profile.getTunnelCreateResponseTime().load(props, "tunnelCreateResponseTime", true); profile.getTunnelTestResponseTime().load(props, "tunnelTestResponseTime", true); - profile.getTunnelTestResponseTimeSlow().load(props, "tunnelTestResponseTimeSlow", true); if (_log.shouldLog(Log.DEBUG)) _log.debug("Loaded the profile for " + peer.toBase64() + " from " + file.getName()); @@ -304,18 +297,8 @@ class ProfilePersistenceHelper { private File getProfileDir() { if (_profileDir == null) { - String dir = null; - if (_context.router() == null) { - dir = _context.getProperty(PROP_PEER_PROFILE_DIR, DEFAULT_PEER_PROFILE_DIR); - } else { - dir = _context.router().getConfigSetting(PROP_PEER_PROFILE_DIR); - if (dir == null) { - _log.info("No peer profile dir specified [" + PROP_PEER_PROFILE_DIR - + "], using [" + DEFAULT_PEER_PROFILE_DIR + "]"); - dir = DEFAULT_PEER_PROFILE_DIR; - } - } - _profileDir = new File(dir); + String dir = _context.getProperty(PROP_PEER_PROFILE_DIR, DEFAULT_PEER_PROFILE_DIR); + _profileDir = new File(_context.getRouterDir(), dir); } return _profileDir; } diff --git a/router/java/src/net/i2p/router/peermanager/ReliabilityCalculator.java b/router/java/src/net/i2p/router/peermanager/ReliabilityCalculator.java deleted file mode 100644 index 674b2fd91..000000000 --- a/router/java/src/net/i2p/router/peermanager/ReliabilityCalculator.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.i2p.router.peermanager; - -import net.i2p.router.RouterContext; -import net.i2p.stat.RateStat; -import net.i2p.util.Log; - -/** - * Determine how reliable the peer is - how likely they'll be able to respond or - * otherwise carry out whatever we ask them to (or even merely be reachable) - * - */ -public class ReliabilityCalculator extends Calculator { - private Log _log; - private RouterContext _context; - - public ReliabilityCalculator(RouterContext context) { - _context = context; - _log = context.logManager().getLog(ReliabilityCalculator.class); - } - - public double calc(PeerProfile profile) { - // if we've never succeeded (even if we've never tried), the reliability is zip - if (profile.getSendSuccessSize().getRate(60*60*1000).getLifetimeEventCount() < 0) - return profile.getReliabilityBonus(); - - long val = 0; - val += profile.getSendSuccessSize().getRate(60*1000).getCurrentEventCount() * 20; - val += profile.getSendSuccessSize().getRate(60*1000).getLastEventCount() * 10; - val += profile.getSendSuccessSize().getRate(60*60*1000).getLastEventCount() * 1; - val += profile.getSendSuccessSize().getRate(60*60*1000).getCurrentEventCount() * 5; - - val += profile.getTunnelCreateResponseTime().getRate(10*60*1000).getLastEventCount() * 5; - val += profile.getTunnelCreateResponseTime().getRate(60*60*1000).getCurrentEventCount(); - val += profile.getTunnelCreateResponseTime().getRate(60*60*1000).getLastEventCount(); - - //val -= profile.getSendFailureSize().getRate(60*1000).getLastEventCount() * 5; - //val -= profile.getSendFailureSize().getRate(60*60*1000).getCurrentEventCount()*2; - //val -= profile.getSendFailureSize().getRate(60*60*1000).getLastEventCount()*2; - - RateStat rejRate = profile.getTunnelHistory().getRejectionRate(); - if (rejRate.getRate(60*1000).getCurrentEventCount() > 0) - val -= 200; - if (rejRate.getRate(60*1000).getLastEventCount() > 0) - val -= 100; - if (rejRate.getRate(10*60*1000).getCurrentEventCount() > 0) - val -= 10; - if (rejRate.getRate(10*60*1000).getCurrentEventCount() > 0) - val -= 5; - - // penalize them heavily for dropping netDb requests (though these could have - // failed due to tunnel timeouts, so don't be too mean) - if (profile.getDBHistory().getFailedLookupRate().getRate(60*1000).getCurrentEventCount() > 0) - val -= 10; - if (profile.getDBHistory().getFailedLookupRate().getRate(60*1000).getLastEventCount() > 0) - val -= 5; - - // scream and shout on network errors - if (profile.getCommError().getRate(60*1000).getCurrentEventCount() > 0) - val -= 200; - if (profile.getCommError().getRate(60*1000).getLastEventCount() > 0) - val -= 200; - - if (profile.getCommError().getRate(60*60*1000).getCurrentEventCount() > 0) - val -= 10; - if (profile.getCommError().getRate(60*60*1000).getLastEventCount() > 0) - val -= 10; - - val -= profile.getCommError().getRate(24*60*60*1000).getCurrentEventCount() * 1; - - //long now = _context.clock().now(); - - long timeSinceRejection = 61*60*1000; // now - profile.getTunnelHistory().getLastRejected(); - if (timeSinceRejection > 60*60*1000) { - // noop. rejection was over 60 minutes ago - } else if (timeSinceRejection > 10*60*1000) { - val -= 10; // 10-60 minutes ago we got a rejection - } else if (timeSinceRejection > 60*1000) { - val -= 50; // 1-10 minutes ago we got a rejection - } else { - val -= 100; // we got a rejection within the last minute - } - - //if ( (profile.getLastSendSuccessful() > 0) && (now - 24*60*60*1000 > profile.getLastSendSuccessful()) ) { - // // we know they're real, but we havent sent them a message successfully in over a day. - // val -= 1000; - //} - - val += profile.getReliabilityBonus(); - return val; - } -} diff --git a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java index a7fc93347..c5ac1c3c5 100644 --- a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java @@ -18,6 +18,7 @@ public class SpeedCalculator extends Calculator { public SpeedCalculator(RouterContext context) { } + @Override public double calc(PeerProfile profile) { // measures 1 minute throughput of individual tunnels double d = (profile.getPeakTunnel1mThroughputKBps()*1024d) + profile.getSpeedBonus(); diff --git a/router/java/src/net/i2p/router/peermanager/StrictSpeedCalculator.java b/router/java/src/net/i2p/router/peermanager/StrictSpeedCalculator.java deleted file mode 100644 index 99453b0ab..000000000 --- a/router/java/src/net/i2p/router/peermanager/StrictSpeedCalculator.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.i2p.router.peermanager; - -import net.i2p.router.RouterContext; -import net.i2p.stat.Rate; -import net.i2p.stat.RateStat; -import net.i2p.util.Log; - -/** - * Simple speed calculator that just counts how many messages go through the - * tunnel. - * - */ -public class StrictSpeedCalculator extends Calculator { - private Log _log; - private RouterContext _context; - - public StrictSpeedCalculator(RouterContext context) { - _context = context; - _log = context.logManager().getLog(StrictSpeedCalculator.class); - } - - public double calc(PeerProfile profile) { - return countSuccesses(profile); - } - private double countSuccesses(PeerProfile profile) { - RateStat success = profile.getTunnelHistory().getProcessSuccessRate(); - RateStat failure = profile.getTunnelHistory().getProcessFailureRate(); - return messagesPerMinute(success, failure); - } - private double messagesPerMinute(RateStat success, RateStat failure) { - double rv = 0.0d; - if (success != null) { - Rate rate = null; - long periods[] = success.getPeriods(); - for (int i = 0; i < periods.length; i++) { - rate = success.getRate(periods[i]); - if ( (rate != null) && (rate.getCurrentTotalValue() > 0) ) - break; - } - - double value = rate.getCurrentTotalValue(); - value += rate.getLastTotalValue(); - rv = value * 10.0d * 60.0d * 1000.0d / (double)rate.getPeriod(); - - // if any of the messages are getting fragmented and cannot be - // handled, penalize like crazy - Rate fail = failure.getRate(rate.getPeriod()); - if (fail.getCurrentTotalValue() > 0) - rv /= fail.getCurrentTotalValue(); - } - return rv; - } - - /* - public double calc(PeerProfile profile) { - double successCount = countSuccesses(profile); - double failureCount = countFailures(profile); - - double rv = successCount - 5*failureCount; - if (rv < 0) - rv = 0; - return rv; - } - private double countSuccesses(PeerProfile profile) { - RateStat success = profile.getTunnelHistory().getProcessSuccessRate(); - return messagesPerMinute(success); - } - private double countFailures(PeerProfile profile) { - RateStat failure = profile.getTunnelHistory().getProcessFailureRate(); - return messagesPerMinute(failure); - } - private double messagesPerMinute(RateStat stat) { - double rv = 0.0d; - if (stat != null) { - Rate rate = null; - long periods[] = stat.getPeriods(); - for (int i = 0; i < periods.length; i++) { - rate = stat.getRate(periods[i]); - if ( (rate != null) && (rate.getCurrentTotalValue() > 0) ) - break; - } - - double value = rate.getCurrentTotalValue(); - value += rate.getLastTotalValue(); - rv = value * 60.0d * 1000.0d / (double)rate.getPeriod(); - } - return rv; - } - */ -} diff --git a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java index 2ea23099d..bdf352501 100644 --- a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java +++ b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java @@ -26,8 +26,6 @@ public class TunnelHistory { private volatile long _lastFailed; private RateStat _rejectRate; private RateStat _failRate; - private RateStat _processSuccessRate; - private RateStat _processFailureRate; private String _statGroup; /** probabalistic tunnel rejection due to a flood of requests */ @@ -47,14 +45,10 @@ public class TunnelHistory { } private void createRates(String statGroup) { - _rejectRate = new RateStat("tunnelHistory.rejectRate", "How often does this peer reject a tunnel request?", statGroup, new long[] { 60*1000l, 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000l }); - _failRate = new RateStat("tunnelHistory.failRate", "How often do tunnels this peer accepts fail?", statGroup, new long[] { 60*1000l, 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000l }); - _processSuccessRate = new RateStat("tunnelHistory.processSuccessRate", "How many messages does a tunnel process?", statGroup, new long[] { 5*60*1000l, 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000l }); - _processFailureRate = new RateStat("tunnelHistory.processfailureRate", "How many messages does a tunnel fail?", statGroup, new long[] { 5*60*1000l, 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000l }); + _rejectRate = new RateStat("tunnelHistory.rejectRate", "How often does this peer reject a tunnel request?", statGroup, new long[] { 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000l }); + _failRate = new RateStat("tunnelHistory.failRate", "How often do tunnels this peer accepts fail?", statGroup, new long[] { 10*60*1000l, 30*60*1000l, 60*60*1000l, 24*60*60*1000l }); _rejectRate.setStatLog(_context.statManager().getStatLog()); _failRate.setStatLog(_context.statManager().getStatLog()); - _processSuccessRate.setStatLog(_context.statManager().getStatLog()); - _processFailureRate.setStatLog(_context.statManager().getStatLog()); } /** total tunnels the peer has agreed to participate in */ @@ -77,10 +71,7 @@ public class TunnelHistory { public long getLastFailed() { return _lastFailed; } public void incrementProcessed(int processedSuccessfully, int failedProcessing) { - if (processedSuccessfully > 0) - _processSuccessRate.addData(processedSuccessfully, 0); - if (failedProcessing > 0) - _processFailureRate.addData(failedProcessing, 0); + // old strict speed calculator } public void incrementAgreedTo() { @@ -129,22 +120,18 @@ public class TunnelHistory { public RateStat getRejectionRate() { return _rejectRate; } public RateStat getFailedRate() { return _failRate; } - public RateStat getProcessSuccessRate() { return _processSuccessRate; } - public RateStat getProcessFailureRate() { return _processFailureRate; } public void coalesceStats() { if (_log.shouldLog(Log.DEBUG)) _log.debug("Coallescing stats"); _rejectRate.coalesceStats(); _failRate.coalesceStats(); - _processFailureRate.coalesceStats(); - _processSuccessRate.coalesceStats(); } private final static String NL = System.getProperty("line.separator"); public void store(OutputStream out) throws IOException { - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append(NL); buf.append("#################").append(NL); buf.append("# Tunnel history").append(NL); @@ -161,11 +148,9 @@ public class TunnelHistory { out.write(buf.toString().getBytes()); _rejectRate.store(out, "tunnelHistory.rejectRate"); _failRate.store(out, "tunnelHistory.failRate"); - _processSuccessRate.store(out, "tunnelHistory.processSuccessRate"); - _processFailureRate.store(out, "tunnelHistory.processFailureRate"); } - private void add(StringBuffer buf, String name, long val, String description) { + private void add(StringBuilder buf, String name, long val, String description) { buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL); buf.append("tunnels.").append(name).append('=').append(val).append(NL).append(NL); } @@ -187,12 +172,6 @@ public class TunnelHistory { _failRate.load(props, "tunnelHistory.failRate", true); if (_log.shouldLog(Log.DEBUG)) _log.debug("Loading tunnelHistory.failRate"); - _processFailureRate.load(props, "tunnelHistory.processFailureRate", true); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Loading tunnelHistory.processFailureRate"); - _processSuccessRate.load(props, "tunnelHistory.processSuccessRate", true); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Loading tunnelHistory.processSuccessRate"); } catch (IllegalArgumentException iae) { _log.warn("TunnelHistory rates are corrupt, resetting", iae); createRates(_statGroup); diff --git a/router/java/src/net/i2p/router/startup/ClientAppConfig.java b/router/java/src/net/i2p/router/startup/ClientAppConfig.java index 316c0b500..70d61f346 100644 --- a/router/java/src/net/i2p/router/startup/ClientAppConfig.java +++ b/router/java/src/net/i2p/router/startup/ClientAppConfig.java @@ -43,15 +43,19 @@ public class ClientAppConfig { Properties rv = new Properties(); String clientConfigFile = ctx.getProperty(PROP_CLIENT_CONFIG_FILENAME, DEFAULT_CLIENT_CONFIG_FILENAME); File cfgFile = new File(clientConfigFile); + if (!cfgFile.isAbsolute()) + cfgFile = new File(ctx.getConfigDir(), clientConfigFile); // fall back to use router.config's clientApp.* lines - if (!cfgFile.exists()) + if (!cfgFile.exists()) { + System.out.println("Warning - No client config file " + cfgFile.getAbsolutePath()); return ctx.router().getConfigMap(); + } try { DataHelper.loadProps(rv, cfgFile); } catch (IOException ioe) { - // _log.warn("Error loading the client app properties from " + cfgFile.getName(), ioe); + System.out.println("Error loading the client app properties from " + cfgFile.getAbsolutePath() + ' ' + ioe); } return rv; @@ -91,10 +95,13 @@ public class ClientAppConfig { public static void writeClientAppConfig(RouterContext ctx, List apps) { String clientConfigFile = ctx.getProperty(PROP_CLIENT_CONFIG_FILENAME, DEFAULT_CLIENT_CONFIG_FILENAME); + File cfgFile = new File(clientConfigFile); + if (!cfgFile.isAbsolute()) + cfgFile = new File(ctx.getConfigDir(), clientConfigFile); FileOutputStream fos = null; try { - fos = new FileOutputStream(clientConfigFile); - StringBuffer buf = new StringBuffer(2048); + fos = new FileOutputStream(cfgFile); + StringBuilder buf = new StringBuilder(2048); for(int i = 0; i < apps.size(); i++) { ClientAppConfig app = (ClientAppConfig) apps.get(i); buf.append(PREFIX).append(i).append(".main=").append(app.className).append("\n"); diff --git a/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java b/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java index 92b176c30..979cefa78 100644 --- a/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java @@ -8,6 +8,7 @@ package net.i2p.router.startup; * */ +import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashSet; @@ -76,16 +77,14 @@ public class CreateRouterInfoJob extends JobImpl { info.sign(signingPrivKey); - String infoFilename = getContext().router().getConfigSetting(Router.PROP_INFO_FILENAME); - if (infoFilename == null) - infoFilename = Router.PROP_INFO_FILENAME_DEFAULT; - fos1 = new FileOutputStream(infoFilename); + String infoFilename = getContext().getProperty(Router.PROP_INFO_FILENAME, Router.PROP_INFO_FILENAME_DEFAULT); + File ifile = new File(getContext().getRouterDir(), infoFilename); + fos1 = new FileOutputStream(ifile); info.writeBytes(fos1); - String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME); - if (keyFilename == null) - keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT; - fos2 = new FileOutputStream(keyFilename); + String keyFilename = getContext().getProperty(Router.PROP_KEYS_FILENAME, Router.PROP_KEYS_FILENAME_DEFAULT); + File kfile = new File(getContext().getRouterDir(), keyFilename); + fos2 = new FileOutputStream(kfile); privkey.writeBytes(fos2); signingPrivKey.writeBytes(fos2); pubkey.writeBytes(fos2); @@ -96,7 +95,7 @@ public class CreateRouterInfoJob extends JobImpl { getContext().keyManager().setPrivateKey(privkey); getContext().keyManager().setPublicKey(pubkey); - _log.info("Router info created and stored at " + infoFilename + " with private keys stored at " + keyFilename + " [" + info + "]"); + _log.info("Router info created and stored at " + ifile.getAbsolutePath() + " with private keys stored at " + kfile.getAbsolutePath() + " [" + info + "]"); } catch (DataFormatException dfe) { _log.error("Error building the new router information", dfe); } catch (IOException ioe) { diff --git a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java index 0770241d6..0f86f5b61 100644 --- a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java +++ b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java @@ -29,6 +29,11 @@ public class LoadClientAppsJob extends JobImpl { _loaded = true; } List apps = ClientAppConfig.getClientApps(getContext()); + if (apps.size() <= 0) { + _log.error("Warning - No client apps or router console configured - we are just a router"); + System.err.println("Warning - No client apps or router console configured - we are just a router"); + return; + } for(int i = 0; i < apps.size(); i++) { ClientAppConfig app = (ClientAppConfig) apps.get(i); if (app.disabled) @@ -64,7 +69,7 @@ public class LoadClientAppsJob extends JobImpl { List argList = new ArrayList(4); if (args != null) { char data[] = args.toCharArray(); - StringBuffer buf = new StringBuffer(32); + StringBuilder buf = new StringBuilder(32); boolean isQuoted = false; for (int i = 0; i < data.length; i++) { switch (data[i]) { @@ -74,7 +79,7 @@ public class LoadClientAppsJob extends JobImpl { String str = buf.toString().trim(); if (str.length() > 0) argList.add(str); - buf = new StringBuffer(32); + buf = new StringBuilder(32); } else { isQuoted = true; } @@ -89,7 +94,7 @@ public class LoadClientAppsJob extends JobImpl { String str = buf.toString().trim(); if (str.length() > 0) argList.add(str); - buf = new StringBuffer(32); + buf = new StringBuilder(32); } break; default: diff --git a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java index 0374922af..f3428c447 100644 --- a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java @@ -51,21 +51,17 @@ public class LoadRouterInfoJob extends JobImpl { } private void loadRouterInfo() { - String routerInfoFile = getContext().router().getConfigSetting(Router.PROP_INFO_FILENAME); - if (routerInfoFile == null) - routerInfoFile = Router.PROP_INFO_FILENAME_DEFAULT; + String routerInfoFile = getContext().getProperty(Router.PROP_INFO_FILENAME, Router.PROP_INFO_FILENAME_DEFAULT); RouterInfo info = null; boolean failedRead = false; - String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME); - if (keyFilename == null) - keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT; + String keyFilename = getContext().getProperty(Router.PROP_KEYS_FILENAME, Router.PROP_KEYS_FILENAME_DEFAULT); - File rif = new File(routerInfoFile); + File rif = new File(getContext().getRouterDir(), routerInfoFile); if (rif.exists()) _infoExists = true; - File rkf = new File(keyFilename); + File rkf = new File(getContext().getRouterDir(), keyFilename); if (rkf.exists()) _keysExist = true; @@ -98,14 +94,14 @@ public class LoadRouterInfoJob extends JobImpl { _us = info; } catch (IOException ioe) { - _log.error("Error reading the router info from " + routerInfoFile + " and the keys from " + keyFilename, ioe); + _log.error("Error reading the router info from " + rif.getAbsolutePath() + " and the keys from " + rkf.getAbsolutePath(), ioe); _us = null; rif.delete(); rkf.delete(); _infoExists = false; _keysExist = false; } catch (DataFormatException dfe) { - _log.error("Corrupt router info or keys at " + routerInfoFile + " / " + keyFilename, dfe); + _log.error("Corrupt router info or keys at " + rif.getAbsolutePath() + " / " + rkf.getAbsolutePath(), dfe); _us = null; rif.delete(); rkf.delete(); diff --git a/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java b/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java index 967bc7a79..fda82de8e 100644 --- a/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java @@ -57,18 +57,11 @@ public class RebuildRouterInfoJob extends JobImpl { public void runJob() { _log.debug("Testing to rebuild router info"); - String infoFile = getContext().router().getConfigSetting(Router.PROP_INFO_FILENAME); - if (infoFile == null) { - _log.debug("Info filename not configured, defaulting to " + Router.PROP_INFO_FILENAME_DEFAULT); - infoFile = Router.PROP_INFO_FILENAME_DEFAULT; - } + String infoFile = getContext().getProperty(Router.PROP_INFO_FILENAME, Router.PROP_INFO_FILENAME_DEFAULT); + File info = new File(getContext().getRouterDir(), infoFile); + String keyFilename = getContext().getProperty(Router.PROP_KEYS_FILENAME, Router.PROP_KEYS_FILENAME_DEFAULT); + File keyFile = new File(getContext().getRouterDir(), keyFilename); - String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME); - if (keyFilename == null) - keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT; - File keyFile = new File(keyFilename); - - File info = new File(infoFile); if (!info.exists() || !keyFile.exists()) { _log.info("Router info file [" + info.getAbsolutePath() + "] or private key file [" + keyFile.getAbsolutePath() + "] deleted, rebuilding"); rebuildRouterInfo(); @@ -86,14 +79,10 @@ public class RebuildRouterInfoJob extends JobImpl { _log.debug("Rebuilding the new router info"); boolean fullRebuild = false; RouterInfo info = null; - String infoFilename = getContext().router().getConfigSetting(Router.PROP_INFO_FILENAME); - if (infoFilename == null) - infoFilename = Router.PROP_INFO_FILENAME_DEFAULT; - - String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME); - if (keyFilename == null) - keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT; - File keyFile = new File(keyFilename); + String infoFilename = getContext().getProperty(Router.PROP_INFO_FILENAME, Router.PROP_INFO_FILENAME_DEFAULT); + File infoFile = new File(getContext().getRouterDir(), infoFilename); + String keyFilename = getContext().getProperty(Router.PROP_KEYS_FILENAME, Router.PROP_KEYS_FILENAME_DEFAULT); + File keyFile = new File(getContext().getRouterDir(), keyFilename); if (keyFile.exists()) { // ok, no need to rebuild a brand new identity, just update what we can @@ -146,7 +135,7 @@ public class RebuildRouterInfoJob extends JobImpl { FileOutputStream fos = null; try { - fos = new FileOutputStream(infoFilename); + fos = new FileOutputStream(infoFile); info.writeBytes(fos); } catch (DataFormatException dfe) { _log.error("Error rebuilding the router information", dfe); diff --git a/router/java/src/net/i2p/router/startup/WorkingDir.java b/router/java/src/net/i2p/router/startup/WorkingDir.java new file mode 100644 index 000000000..e124727d9 --- /dev/null +++ b/router/java/src/net/i2p/router/startup/WorkingDir.java @@ -0,0 +1,328 @@ +package net.i2p.router.startup; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Properties; + +import net.i2p.data.DataHelper; + +/** + * Get a working directory for i2p. + * + * For the location, first try the system property i2p.dir.config + * Next try $HOME/.i2p on linux or %APPDATA%\I2P on Windows. + * + * If the dir exists, return it. + * Otherwise, attempt to create it, and copy files from the base directory. + * To successfully copy, the base install dir must be the system property i2p.dir.base + * or else must be in $CWD. + * + * If I2P was run from the install directory in the past, + * and migrateOldData = true, copy the + * necessary data files (except i2psnark/) over to the new working directory. + * + * Otherwise, just copy over a limited number of files over. + * + * Do not ever copy or move the old i2psnark/ directory, as if the + * old and new locations are on different file systems, this could + * be quite slow. + * + * Modify some files while copying, see methods below. + * + * After migration, the router will run using the new directory. + * The wrapper, however, must be stopped and restarted from the new script - until then, + * it will continue to write to wrapper.log* in the old directory. + * + * @param whether to copy all data over from an existing install + */ +public class WorkingDir { + + private final static String PROP_BASE_DIR = "i2p.dir.base"; + private final static String PROP_WORKING_DIR = "i2p.dir.config"; + private final static String WORKING_DIR_DEFAULT_WINDOWS = "I2P"; + private final static String WORKING_DIR_DEFAULT = ".i2p"; + + /** + * Only call this once on router invocation. + * Caller should store the return value for future reference. + */ + public static String getWorkingDir(Properties envProps, boolean migrateOldConfig) { + String dir = null; + if (envProps != null) + dir = envProps.getProperty(PROP_WORKING_DIR); + if (dir == null) + dir = System.getProperty(PROP_WORKING_DIR); + boolean isWindows = System.getProperty("os.name").startsWith("Win"); + File dirf = null; + if (dir != null) { + dirf = new File(dir); + } else { + String home = System.getProperty("user.home"); + if (isWindows) { + String appdata = System.getenv("APPDATA"); + if (appdata != null) + home = appdata; + dirf = new File(home, WORKING_DIR_DEFAULT_WINDOWS); + } else { + dirf = new File(home, WORKING_DIR_DEFAULT); + } + } + + // where we are now + String cwd = null; + if (envProps != null) + cwd = envProps.getProperty(PROP_BASE_DIR); + if (cwd == null) { + cwd = System.getProperty(PROP_BASE_DIR); + if (cwd == null) + cwd = System.getProperty("user.dir"); + } + + // Check for a hosts.txt file, if it exists then I2P is there + File oldDirf = new File(cwd); + File test = new File(oldDirf, "hosts.txt"); + if (!test.exists()) { + System.err.println("ERROR - Cannot find I2P installation in " + cwd + + " - Will probably be just a router with no apps or console at all!"); + // until we move reseeding from the console to the router, we + // won't be able to reseed, so we are probably doomed + return cwd; + } + + // apparently configured for "portable" ? + try { + if (oldDirf.getCanonicalPath().equals(dirf.getCanonicalPath())) + return cwd; + } catch (IOException ioe) {} + + // where we want to go + String rv = dirf.getAbsolutePath(); + if (dirf.exists()) { + if (dirf.isDirectory()) + return rv; // all is good, we found the user directory + System.err.println("Wanted to use " + rv + " for a working directory but it is not a directory"); + return cwd; + } + // Check for a router.keys file or logs dir, if either exists it's an old install, + // and only migrate the data files if told to do so + // (router.keys could be deleted later by a killkeys()) + test = new File(oldDirf, "router.keys"); + boolean oldInstall = test.exists(); + if (!oldInstall) { + test = new File(oldDirf, "logs"); + oldInstall = test.exists(); + } + // keep everything where it is, in one place... + if (oldInstall && !migrateOldConfig) + return cwd; + boolean migrateOldData = false; // this is a terrible idea + + if (!dirf.mkdir()) { + System.err.println("Wanted to use " + rv + " for a working directory but could not create it"); + return cwd; + } + + // Do the copying + if (migrateOldData) + System.err.println("Migrating data files to new user directory " + rv); + else + System.err.println("Setting up new user directory " + rv); + boolean success = migrate(MIGRATE_BASE, oldDirf, dirf); + // this one must be after MIGRATE_BASE + success &= migrateJettyXml(oldDirf, dirf); + success &= migrateClientsConfig(oldDirf, dirf); + success &= copy(new File(oldDirf, "docs/news.xml"), new File(dirf, "docs")); + + // Report success or failure + if (success) { + System.err.println("Successfully copied data files to new user directory " + rv); + return rv; + } else { + System.err.println("FAILED copy of some or all data files to new directory " + rv); + System.err.println("Check logs for details"); + System.err.println("Continung to use data files in old directory " + cwd); + return cwd; + } + } + + /** + * files and directories from the base install to copy over + * None of these should be included in i2pupdate.zip + * + * The user should not delete these in the old location, leave them as templates for new users + */ + private static final String MIGRATE_BASE = + // base install - dirs + // We don't currently have a default addressbook/ in the base distribution, + // but distros might put one in + "addressbook,eepsite," + + // base install - files + // We don't currently have a default router.config or logger.config in the base distribution, + // but distros might put one in + "blocklist.txt,hosts.txt,i2psnark.config,i2ptunnel.config,jetty-i2psnark.xml," + + "logger.config,router.config,systray.config"; + + private static boolean migrate(String list, File olddir, File todir) { + boolean rv = true; + String files[] = list.split(","); + for (int i = 0; i < files.length; i++) { + File from = new File(olddir, files[i]); + if (!copy(from, todir)) { + System.err.println("Error copying " + from.getAbsolutePath()); + rv = false; + } + } + return rv; + } + + /** + * Copy over the clients.config file with modifications + */ + private static boolean migrateClientsConfig(File olddir, File todir) { + File oldFile = new File(olddir, "clients.config"); + File newFile = new File(todir, "clients.config"); + FileInputStream in = null; + PrintWriter out = null; + try { + in = new FileInputStream(oldFile); + out = new PrintWriter(new BufferedWriter(new FileWriter(newFile))); + out.println("# Modified by I2P User dir migration script"); + String s = null; + while ((s = DataHelper.readLine(in)) != null) { + if (s.endsWith("=\"eepsite/jetty.xml\"")) { + s = s.replace("=\"eepsite/jetty.xml\"", "=\"" + todir.getAbsolutePath() + + File.separatorChar + "eepsite" + + File.separatorChar + "jetty.xml\""); + } + out.println(s); + } + System.err.println("Copied clients.config with modifications"); + return true; + } catch (IOException ioe) { + if (in != null) { + System.err.println("FAILED copy clients.config"); + return false; + } + return false; + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + if (out != null) out.close(); + } + } + + /** + * Copy over the jetty.xml file with modifications + * It was already copied over once in migrate(), throw that out and + * do it again with modifications. + */ + private static boolean migrateJettyXml(File olddir, File todir) { + File eepsite1 = new File(olddir, "eepsite"); + File oldFile = new File(eepsite1, "jetty.xml"); + File eepsite2 = new File(todir, "eepsite"); + File newFile = new File(eepsite2, "jetty.xml"); + FileInputStream in = null; + PrintWriter out = null; + try { + in = new FileInputStream(oldFile); + out = new PrintWriter(new BufferedWriter(new FileWriter(newFile))); + String s = null; + while ((s = DataHelper.readLine(in)) != null) { + if (s.indexOf("./eepsite/") >= 0) { + s = s.replace("./eepsite/", todir.getAbsolutePath() + File.separatorChar + "eepsite" + File.separatorChar); + } + out.println(s); + } + out.println(""); + System.err.println("Copied jetty.xml with modifications"); + return true; + } catch (IOException ioe) { + if (in != null) { + System.err.println("FAILED copy jetty.xml"); + return false; + } + return false; + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + if (out != null) out.close(); + } + } + + /** + * Recursive copy a file or dir to a dir + * + * @param src file or directory, need not exist + * @param targetDir the directory to copy to, will be created if it doesn't exist + * @return true for success OR if src does not exist + */ + public static final boolean copy(File src, File targetDir) { + if (!src.exists()) + return true; + if (!targetDir.exists()) { + if (!targetDir.mkdir()) { + System.err.println("FAILED copy " + src.getPath()); + return false; + } + System.err.println("Created " + targetDir.getPath()); + } + File targetFile = new File(targetDir, src.getName()); + if (!src.isDirectory()) + return copyFile(src, targetFile); + File children[] = src.listFiles(); + if (children == null) { + System.err.println("FAILED copy " + src.getPath()); + return false; + } + // make it here so even empty dirs get copied + if (!targetFile.exists()) { + if (!targetFile.mkdir()) { + System.err.println("FAILED copy " + src.getPath()); + return false; + } + System.err.println("Created " + targetFile.getPath()); + } + boolean rv = true; + for (int i = 0; i < children.length; i++) { + rv &= copy(children[i], targetFile); + } + return rv; + } + + /** + * @param src not a directory, must exist + * @param dst not a directory, will be overwritten if existing + * @return true if it was copied successfully + */ + public static boolean copyFile(File src, File dst) { + if (!src.exists()) return false; + boolean rv = true; + + byte buf[] = new byte[4096]; + FileInputStream in = null; + FileOutputStream out = null; + try { + in = new FileInputStream(src); + out = new FileOutputStream(dst); + + int read = 0; + while ( (read = in.read(buf)) != -1) + out.write(buf, 0, read); + + System.err.println("Copied " + src.getPath()); + } catch (IOException ioe) { + System.err.println("FAILED copy " + src.getPath()); + rv = false; + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + if (out != null) try { out.close(); } catch (IOException ioe) {} + } + if (rv) + dst.setLastModified(src.lastModified()); + return rv; + } +} diff --git a/router/java/src/net/i2p/router/transport/Addresses.java b/router/java/src/net/i2p/router/transport/Addresses.java new file mode 100644 index 000000000..c8c2b6518 --- /dev/null +++ b/router/java/src/net/i2p/router/transport/Addresses.java @@ -0,0 +1,82 @@ +package net.i2p.router.transport; + +/* + * public domain + */ + +import java.net.InetAddress; +import java.net.Inet4Address; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; + + +/** + * Get the local addresses + * + * @author zzz + */ +public class Addresses { + + /** return the first non-local address it finds, or null */ + public static String getAnyAddress() { + String[] a = getAddresses(); + if (a.length > 0) + return a[0]; + return null; + } + + /** + * Return an array of all addresses, excluding + * IPv6, local, broadcast, multicast, etc. + */ + public static String[] getAddresses() { + Set rv = new HashSet(4); + try { + InetAddress localhost = InetAddress.getLocalHost(); + InetAddress[] allMyIps = InetAddress.getAllByName(localhost.getCanonicalHostName()); + if (allMyIps != null) { + for (int i = 0; i < allMyIps.length; i++) + add(rv, allMyIps[i]); + } + } catch (UnknownHostException e) {} + + try { + for(Enumeration ifcs = NetworkInterface.getNetworkInterfaces(); ifcs.hasMoreElements();) { + NetworkInterface ifc = ifcs.nextElement(); + for(Enumeration addrs = ifc.getInetAddresses(); addrs.hasMoreElements();) { + InetAddress addr = addrs.nextElement(); + add(rv, addr); + } + } + } catch (SocketException e) {} + + String[] rva = rv.toArray(new String[rv.size()]); + Arrays.sort(rva); + return rva; + } + + private static void add(Set set, InetAddress ia) { + if (ia.isAnyLocalAddress() || + ia.isLinkLocalAddress() || + ia.isLoopbackAddress() || + ia.isMulticastAddress() || + ia.isSiteLocalAddress() || + !(ia instanceof Inet4Address)) { +// System.err.println("Skipping: " + ia.getHostAddress()); + return; + } + String ip = ia.getHostAddress(); + set.add(ip); + } + + public static void main(String[] args) { + String[] a = getAddresses(); + for (String s : a) + System.err.println("Address: " + s); + } +} diff --git a/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java b/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java index ffd041019..f47394eff 100644 --- a/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java +++ b/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java @@ -41,6 +41,7 @@ public class BandwidthLimitedInputStream extends FilterInputStream { _log = context.logManager().getLog(BandwidthLimitedInputStream.class); } + @Override public int read() throws IOException { if (_pullFromOutbound) _currentRequest = _context.bandwidthLimiter().requestOutbound(1, _peerSource); @@ -56,10 +57,12 @@ public class BandwidthLimitedInputStream extends FilterInputStream { return in.read(); } + @Override public int read(byte dest[]) throws IOException { return read(dest, 0, dest.length); } + @Override public int read(byte dest[], int off, int len) throws IOException { int read = in.read(dest, off, len); if (read == -1) return -1; @@ -84,6 +87,7 @@ public class BandwidthLimitedInputStream extends FilterInputStream { } return read; } + @Override public long skip(long numBytes) throws IOException { long skip = in.skip(numBytes); @@ -105,6 +109,7 @@ public class BandwidthLimitedInputStream extends FilterInputStream { return skip; } + @Override public void close() throws IOException { synchronized (this) { if (_currentRequest != null) diff --git a/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java b/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java index df37d9514..0327fd25e 100644 --- a/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java +++ b/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java @@ -37,6 +37,7 @@ public class BandwidthLimitedOutputStream extends FilterOutputStream { public FIFOBandwidthLimiter.Request getCurrentRequest() { return _currentRequest; } + @Override public void write(int val) throws IOException { if (_log.shouldLog(Log.DEBUG)) _log.debug("Writing a single byte!", new Exception("Single byte from...")); @@ -49,9 +50,11 @@ public class BandwidthLimitedOutputStream extends FilterOutputStream { _log.warn("Waiting to write a byte took too long [" + waited + "ms"); out.write(val); } + @Override public void write(byte src[]) throws IOException { write(src, 0, src.length); } + @Override public void write(byte src[], int off, int len) throws IOException { if (_log.shouldLog(Log.DEBUG)) _log.debug("Writing " + len + " bytes"); @@ -83,6 +86,7 @@ public class BandwidthLimitedOutputStream extends FilterOutputStream { } } + @Override public void close() throws IOException { synchronized (this) { if (_currentRequest != null) diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index c94178004..188eb75c3 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -13,6 +13,7 @@ import java.io.Writer; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; @@ -21,23 +22,29 @@ import java.util.Vector; import net.i2p.data.Hash; import net.i2p.data.RouterAddress; +import net.i2p.data.RouterInfo; import net.i2p.router.CommSystemFacade; import net.i2p.router.OutNetMessage; import net.i2p.router.RouterContext; import net.i2p.router.transport.ntcp.NTCPAddress; import net.i2p.router.transport.ntcp.NTCPTransport; import net.i2p.router.transport.udp.UDPAddress; +import net.i2p.router.transport.udp.UDPTransport; import net.i2p.util.Log; +import net.i2p.util.SimpleScheduler; +import net.i2p.util.SimpleTimer; public class CommSystemFacadeImpl extends CommSystemFacade { private Log _log; private RouterContext _context; private TransportManager _manager; + private GeoIP _geoIP; public CommSystemFacadeImpl(RouterContext context) { _context = context; _log = _context.logManager().getLog(CommSystemFacadeImpl.class); _manager = null; + startGeoIP(); } public void startup() { @@ -58,14 +65,22 @@ public class CommSystemFacadeImpl extends CommSystemFacade { _manager.restart(); } + @Override public int countActivePeers() { return (_manager == null ? 0 : _manager.countActivePeers()); } + @Override public int countActiveSendPeers() { return (_manager == null ? 0 : _manager.countActiveSendPeers()); } - public boolean haveCapacity() { return (_manager == null ? false : _manager.haveCapacity()); } + @Override + public boolean haveInboundCapacity(int pct) { return (_manager == null ? false : _manager.haveInboundCapacity(pct)); } + @Override + public boolean haveOutboundCapacity(int pct) { return (_manager == null ? false : _manager.haveOutboundCapacity(pct)); } + @Override + public boolean haveHighOutboundCapacity() { return (_manager == null ? false : _manager.haveHighOutboundCapacity()); } /** * Framed average clock skew of connected peers in seconds, or null if we cannot answer. * Average is calculated over the middle "percentToInclude" peers. */ + @Override public Long getFramedAveragePeerClockSkew(int percentToInclude) { if (_manager == null) { if (_log.shouldLog(Log.INFO)) @@ -115,39 +130,52 @@ public class CommSystemFacadeImpl extends CommSystemFacade { } int getTransportCount() { return _manager.getTransportCount(); } + /** Send the message out */ public void processMessage(OutNetMessage msg) { //GetBidsJob j = new GetBidsJob(_context, this, msg); //j.runJob(); GetBidsJob.getBids(_context, this, msg); } + @Override public boolean isBacklogged(Hash dest) { return _manager.isBacklogged(dest); } + @Override public boolean isEstablished(Hash dest) { return _manager.isEstablished(dest); } + @Override public boolean wasUnreachable(Hash dest) { return _manager.wasUnreachable(dest); } + public byte[] getIP(Hash dest) { + return _manager.getIP(dest); + } + + @Override public List getMostRecentErrorMessages() { return _manager.getMostRecentErrorMessages(); } + @Override public short getReachabilityStatus() { - if (_manager == null) return CommSystemFacade.STATUS_UNKNOWN; - if (_context.router().isHidden()) return CommSystemFacade.STATUS_OK; + if (_manager == null) return STATUS_UNKNOWN; + if (_context.router().isHidden()) return STATUS_OK; return _manager.getReachabilityStatus(); } + @Override public void recheckReachability() { _manager.recheckReachability(); } + @Override public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException { _manager.renderStatusHTML(out, urlBase, sortFlags); } + @Override public Set createAddresses() { Map addresses = null; boolean newCreated = false; @@ -174,15 +202,19 @@ public class CommSystemFacadeImpl extends CommSystemFacade { public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname"; public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port"; - public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoip"; - public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoport"; + public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport"; + public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip"; + /** + * This only creates an address if the hostname AND port are set in router.config, + * which should be rare. + * Otherwise, notifyReplaceAddress() below takes care of it. + * Note this is called both from above and from NTCPTransport.startListening() + * + * This should really be moved to ntcp/NTCPTransport.java, why is it here? + */ public static RouterAddress createNTCPAddress(RouterContext ctx) { if (!TransportManager.enableNTCP(ctx)) return null; - RouterAddress addr = new RouterAddress(); - addr.setCost(10); - addr.setExpiration(null); - Properties props = new Properties(); String name = ctx.router().getConfigSetting(PROP_I2NP_NTCP_HOSTNAME); String port = ctx.router().getConfigSetting(PROP_I2NP_NTCP_PORT); /* @@ -205,12 +237,16 @@ public class CommSystemFacadeImpl extends CommSystemFacade { } catch (NumberFormatException nfe) { return null; } + Properties props = new Properties(); props.setProperty(NTCPAddress.PROP_HOST, name); props.setProperty(NTCPAddress.PROP_PORT, port); + RouterAddress addr = new RouterAddress(); + addr.setCost(10); + addr.setExpiration(null); addr.setOptions(props); addr.setTransportStyle(NTCPTransport.STYLE); //if (isNew) { - if (false) return null; + // why save the same thing? ctx.router().setConfigSetting(PROP_I2NP_NTCP_HOSTNAME, name); ctx.router().setConfigSetting(PROP_I2NP_NTCP_PORT, port); ctx.router().saveConfig(); @@ -220,11 +256,13 @@ public class CommSystemFacadeImpl extends CommSystemFacade { /** * UDP changed addresses, tell NTCP and restart + * This should really be moved to ntcp/NTCPTransport.java, why is it here? */ + @Override public void notifyReplaceAddress(RouterAddress UDPAddr) { if (UDPAddr == null) return; - NTCPTransport t = (NTCPTransport) _manager.getNTCPTransport(); + NTCPTransport t = (NTCPTransport) _manager.getTransport(NTCPTransport.STYLE); if (t == null) return; Properties UDPProps = UDPAddr.getOptions(); @@ -232,7 +270,8 @@ public class CommSystemFacadeImpl extends CommSystemFacade { return; Properties newProps; RouterAddress oldAddr = t.getCurrentAddress(); - //_log.warn("Changing NTCP Address? was " + oldAddr); + if (_log.shouldLog(Log.INFO)) + _log.info("Changing NTCP Address? was " + oldAddr); RouterAddress newAddr = oldAddr; if (newAddr == null) { newAddr = new RouterAddress(); @@ -247,24 +286,51 @@ public class CommSystemFacadeImpl extends CommSystemFacade { } boolean changed = false; + + // Auto Port Setting + // old behavior (<= 0.7.3): auto-port defaults to false, and true trumps explicit setting + // new behavior (>= 0.7.4): auto-port defaults to true, but explicit setting trumps auto String oport = newProps.getProperty(NTCPAddress.PROP_PORT); - String enabled = _context.getProperty(PROP_I2NP_NTCP_AUTO_PORT, "false"); - if ( (enabled != null) && ("true".equalsIgnoreCase(enabled)) ) { - String nport = UDPProps.getProperty(UDPAddress.PROP_PORT); - if (nport == null || nport.length() <= 0) - return; - if (oport == null || ! oport.equals(nport)) { - newProps.setProperty(NTCPAddress.PROP_PORT, nport); - changed = true; - } - } else if (oport == null || oport.length() <= 0) { + String nport = null; + String cport = _context.getProperty(PROP_I2NP_NTCP_PORT); + if (cport != null && cport.length() > 0) { + nport = cport; + } else if (Boolean.valueOf(_context.getProperty(PROP_I2NP_NTCP_AUTO_PORT, "true")).booleanValue()) { + nport = UDPProps.getProperty(UDPAddress.PROP_PORT); + } + if (_log.shouldLog(Log.INFO)) + _log.info("old: " + oport + " config: " + cport + " new: " + nport); + if (nport == null || nport.length() <= 0) return; + if (oport == null || ! oport.equals(nport)) { + newProps.setProperty(NTCPAddress.PROP_PORT, nport); + changed = true; } + // Auto IP Setting + // old behavior (<= 0.7.3): auto-ip defaults to false, and trumps configured hostname, + // and ignores reachability status - leading to + // "firewalled with inbound TCP enabled" warnings. + // new behavior (>= 0.7.4): auto-ip defaults to true, and explicit setting trumps auto, + // and only takes effect if reachability is OK. + // And new "always" setting ignores reachability status, like + // "true" was in 0.7.3 String ohost = newProps.getProperty(NTCPAddress.PROP_HOST); - enabled = _context.getProperty(PROP_I2NP_NTCP_AUTO_IP, "false"); - if ( (enabled != null) && ("true".equalsIgnoreCase(enabled)) ) { + String enabled = _context.getProperty(PROP_I2NP_NTCP_AUTO_IP, "true"); + String name = _context.getProperty(PROP_I2NP_NTCP_HOSTNAME); + if (name != null && name.length() > 0) + enabled = "false"; + Transport udp = _manager.getTransport(UDPTransport.STYLE); + short status = STATUS_UNKNOWN; + if (udp != null) + status = udp.getReachabilityStatus(); + if (_log.shouldLog(Log.INFO)) + _log.info("old: " + ohost + " config: " + name + " auto: " + enabled + " status: " + status); + if (enabled.equalsIgnoreCase("always") || + (enabled.equalsIgnoreCase("true") && status == STATUS_OK)) { String nhost = UDPProps.getProperty(UDPAddress.PROP_HOST); + if (_log.shouldLog(Log.INFO)) + _log.info("old: " + ohost + " config: " + name + " new: " + nhost); if (nhost == null || nhost.length() <= 0) return; if (ohost == null || ! ohost.equalsIgnoreCase(nhost)) { @@ -273,18 +339,33 @@ public class CommSystemFacadeImpl extends CommSystemFacade { } } else if (ohost == null || ohost.length() <= 0) { return; + } else if (enabled.equalsIgnoreCase("true") && status != STATUS_OK) { + // UDP transitioned to not-OK, turn off NTCP address + // This will commonly happen at startup if we were initially OK + // because UPnP was successful, but a subsequent SSU Peer Test determines + // we are still firewalled (SW firewall, bad UPnP indication, etc.) + if (_log.shouldLog(Log.INFO)) + _log.info("old: " + ohost + " config: " + name + " new: null"); + newAddr = null; + changed = true; } if (!changed) { - //_log.warn("No change to NTCP Address"); + _log.warn("No change to NTCP Address"); return; } // stopListening stops the pumper, readers, and writers, so required even if // oldAddr == null since startListening starts them all again + // + // really need to fix this so that we can change or create an inbound address + // without tearing down everything + // Especially on disabling the address, we shouldn't tear everything down. + // _log.warn("Halting NTCP to change address"); t.stopListening(); - newAddr.setOptions(newProps); + if (newAddr != null) + newAddr.setOptions(newProps); // Wait for NTCP Pumper to stop so we don't end up with two... while (t.isAlive()) { try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} @@ -294,4 +375,110 @@ public class CommSystemFacadeImpl extends CommSystemFacade { return; } + /* + * GeoIP stuff + * + * This is only used in the router console for now, but we put it here because + * 1) it's a lot easier, and 2) we could use it in the future for peer selection, + * tunnel selection, shitlisting, etc. + */ + + /* We hope the routerinfos are read in and things have settled down by now, but it's not required to be so */ + private static final int START_DELAY = 5*60*1000; + private static final int LOOKUP_TIME = 30*60*1000; + private void startGeoIP() { + _geoIP = new GeoIP(_context); + SimpleScheduler.getInstance().addEvent(new QueueAll(), START_DELAY); + } + + /** + * Collect the IPs for all routers in the DB, and queue them for lookup, + * then fire off the periodic lookup task for the first time. + */ + private class QueueAll implements SimpleTimer.TimedEvent { + public void timeReached() { + for (Iterator iter = _context.netDb().getAllRouters().iterator(); iter.hasNext(); ) { + RouterInfo ri = _context.netDb().lookupRouterInfoLocally(iter.next()); + if (ri == null) + continue; + String host = getIPString(ri); + if (host == null) + continue; + _geoIP.add(host); + } + SimpleScheduler.getInstance().addPeriodicEvent(new Lookup(), 5000, LOOKUP_TIME); + } + } + + private class Lookup implements SimpleTimer.TimedEvent { + public void timeReached() { + _geoIP.blockingLookup(); + } + } + + public void queueLookup(byte[] ip) { + _geoIP.add(ip); + } + + /** + * Uses the transport IP first because that lookup is fast, + * then the SSU IP from the netDb. + * + * @return two-letter lower-case country code or null + */ + public String getCountry(Hash peer) { + byte[] ip = TransportImpl.getIP(peer); + if (ip != null) + return _geoIP.get(ip); + RouterInfo ri = _context.netDb().lookupRouterInfoLocally(peer); + if (ri == null) + return null; + String s = getIPString(ri); + if (s != null) + return _geoIP.get(s); + return null; + } + + private String getIPString(RouterInfo ri) { + // use SSU only, it is likely to be an IP not a hostname, + // we don't want to generate a lot of DNS queries at startup + RouterAddress ra = ri.getTargetAddress("SSU"); + if (ra == null) + return null; + Properties props = ra.getOptions(); + if (props == null) + return null; + return props.getProperty("host"); + } + + /** full name for a country code, or the code if we don't know the name */ + public String getCountryName(String c) { + if (_geoIP == null) + return c; + String n = _geoIP.fullName(c); + if (n == null) + return c; + return n; + } + + /** Provide a consistent "look" for displaying router IDs in the console */ + public String renderPeerHTML(Hash peer) { + String h = peer.toBase64().substring(0, 4); + StringBuilder buf = new StringBuilder(128); + String c = getCountry(peer); + if (c != null) { + buf.append("\"").append(c.toUpperCase()).append("\" "); + } + buf.append(""); + boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; + if (found) + buf.append(""); + buf.append(h); + if (found) + buf.append(""); + buf.append(""); + return buf.toString(); + } } diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java index 86ba394e4..11d364191 100644 --- a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java +++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java @@ -12,8 +12,8 @@ import net.i2p.util.Log; public class FIFOBandwidthLimiter { private Log _log; private I2PAppContext _context; - private List _pendingInboundRequests; - private List _pendingOutboundRequests; + private final List _pendingInboundRequests; + private final List _pendingOutboundRequests; /** how many bytes we can consume for inbound transmission immediately */ private volatile int _availableInbound; /** how many bytes we can consume for outbound transmission immediately */ @@ -54,7 +54,7 @@ public class FIFOBandwidthLimiter { private static int __id = 0; - static long now() { + public /* static */ long now() { // dont use the clock().now(), since that may jump return System.currentTimeMillis(); } @@ -199,8 +199,8 @@ public class FIFOBandwidthLimiter { void setInboundBurstBytes(int bytes) { _maxInboundBurst = bytes; } void setOutboundBurstBytes(int bytes) { _maxOutboundBurst = bytes; } - StringBuffer getStatus() { - StringBuffer rv = new StringBuffer(64); + StringBuilder getStatus() { + StringBuilder rv = new StringBuilder(64); rv.append("Available: ").append(_availableInbound).append('/').append(_availableOutbound).append(' '); rv.append("Max: ").append(_maxInbound).append('/').append(_maxOutbound).append(' '); rv.append("Burst: ").append(_unavailableInboundBurst).append('/').append(_unavailableOutboundBurst).append(' '); @@ -618,9 +618,9 @@ public class FIFOBandwidthLimiter { public void renderStatusHTML(Writer out) throws IOException { long now = now(); - StringBuffer buf = new StringBuffer(4096); - buf.append("
      Limiter status: ").append(getStatus().toString()).append("
      \n"); - buf.append("Pending bandwidth requests:

        "); + StringBuilder buf = new StringBuilder(4096); + buf.append("

        Limiter Status:

        ").append(getStatus().toString()).append("\n"); + buf.append("

        Pending bandwidth requests:

          "); buf.append("
        • Inbound requests:
            "); synchronized (_pendingInboundRequests) { for (int i = 0; i < _pendingInboundRequests.size(); i++) { @@ -643,7 +643,7 @@ public class FIFOBandwidthLimiter { buf.append("ms ago\n"); } } - buf.append("
        \n"); + buf.append("


      \n"); out.write(buf.toString()); out.flush(); } @@ -769,6 +769,7 @@ public class FIFOBandwidthLimiter { } public void attach(Object obj) { _attachment = obj; } public Object attachment() { return _attachment; } + @Override public String toString() { return getRequestName(); } } diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java index d4bdfea85..b24d79a11 100644 --- a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java +++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java @@ -33,11 +33,17 @@ public class FIFOBandwidthRefiller implements Runnable { public static final String PROP_OUTBOUND_BANDWIDTH_PEAK = "i2np.bandwidth.outboundBurstKBytes"; //public static final String PROP_REPLENISH_FREQUENCY = "i2np.bandwidth.replenishFrequencyMs"; - // no longer allow unlimited bandwidth - the user must specify a value, and if they do not, it is 32/16KBps - public static final int DEFAULT_INBOUND_BANDWIDTH = 48; - public static final int DEFAULT_OUTBOUND_BANDWIDTH = 24; - public static final int DEFAULT_INBOUND_BURST_BANDWIDTH = 64; - public static final int DEFAULT_OUTBOUND_BURST_BANDWIDTH = 32; + // no longer allow unlimited bandwidth - the user must specify a value, else use defaults below (KBps) + public static final int DEFAULT_INBOUND_BANDWIDTH = 96; + /** + * Caution, do not make DEFAULT_OUTBOUND_BANDWIDTH * DEFAULT_SHARE_PCT > 32 + * without thinking about the implications (default connection limits, for example) + * of moving the default bandwidth class from L to M, or maybe + * adjusting bandwidth class boundaries. + */ + public static final int DEFAULT_OUTBOUND_BANDWIDTH = 40; + public static final int DEFAULT_INBOUND_BURST_BANDWIDTH = 80; + public static final int DEFAULT_OUTBOUND_BURST_BANDWIDTH = 40; public static final int DEFAULT_BURST_SECONDS = 60; diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java new file mode 100644 index 000000000..93ddfe215 --- /dev/null +++ b/router/java/src/net/i2p/router/transport/GeoIP.java @@ -0,0 +1,331 @@ +package net.i2p.router.transport; +/* + * free (adj.): unencumbered; not under the control of others + * Use at your own risk. + */ + +import java.io.IOException; +import java.io.File; +import java.io.FileInputStream; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +import net.i2p.data.DataHelper; +import net.i2p.router.RouterContext; +import net.i2p.util.ConcurrentHashSet; +import net.i2p.util.Log; + +/** + * Manage geoip lookup in a file with the Tor geoip format. + * + * The lookup is expensive, so a lookup is queued with add(). + * The actual lookup of multiple IPs is fired with lookup(). + * To get a country for an IP, use get() which returns a lower-case, + * generally two-letter country code or null. + * + * Everything here uses longs, since Java is signed-only, the file is + * sorted by unsigned, and we don't store the table in memory + * (unlike in Blocklist.java, where it's in-memory so we want to be + * space-efficient) + * + * @author zzz + */ +public class GeoIP { + private Log _log; + private RouterContext _context; + private final Map _codeToName; + private final Map _IPToCountry; + private final Set _pendingSearch; + private final Set _notFound; + private final AtomicBoolean _lock; + + public GeoIP(RouterContext context) { + _context = context; + _log = context.logManager().getLog(GeoIP.class); + _codeToName = new ConcurrentHashMap(); + _IPToCountry = new ConcurrentHashMap(); + _pendingSearch = new ConcurrentHashSet(); + _notFound = new ConcurrentHashSet(); + _lock = new AtomicBoolean(); + readCountryFile(); + } + + static final String PROP_GEOIP_ENABLED = "routerconsole.geoip.enable"; + static final String GEOIP_DIR_DEFAULT = "geoip"; + static final String GEOIP_FILE_DEFAULT = "geoip.txt"; + static final String COUNTRY_FILE_DEFAULT = "countries.txt"; + public static final String PROP_IP_COUNTRY = "i2np.lastCountry"; + + /** + * Fire off a thread to lookup all pending IPs. + * There is no indication of completion. + * Results will be added to the table and available via get() after completion. + */ +/****** + public void lookup() { + if (! Boolean.valueOf(_context.getProperty(PROP_GEOIP_ENABLED, "true")).booleanValue()) { + _pendingSearch.clear(); + return; + } + Thread t = new Thread(new LookupJob()); + t.start(); + } +******/ + + /** + * Blocking lookup of all pending IPs. + * Results will be added to the table and available via get() after completion. + */ + public void blockingLookup() { + if (! Boolean.valueOf(_context.getProperty(PROP_GEOIP_ENABLED, "true")).booleanValue()) { + _pendingSearch.clear(); + return; + } + LookupJob j = new LookupJob(); + j.run(); + updateOurCountry(); + } + + private class LookupJob implements Runnable { + public void run() { + if (_lock.getAndSet(true)) + return; + Long[] search = _pendingSearch.toArray(new Long[_pendingSearch.size()]); + if (search.length <= 0) + return; + _pendingSearch.clear(); + Arrays.sort(search); + String[] countries = readGeoIPFile(search); + + for (int i = 0; i < countries.length; i++) { + if (countries[i] != null) + _IPToCountry.put(search[i], countries[i]); + else + _notFound.add(search[i]); + } + _lock.set(false); + } + } + + /** + * Read in and parse the country file. + * The file need not be sorted. + * + * Acceptable formats: + * #comment (# must be in column 1) + * code,full name + * + * Example: + * US,UNITED STATES + * + * To create: + * wget http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip + * unzip ip-to-country.csv.zip + * cut -d, -f3,5 < ip-to-country.csv|sed 's/"//g' | sort | uniq > countries.txt + * + */ + private void readCountryFile() { + File GeoFile = new File(_context.getBaseDir(), GEOIP_DIR_DEFAULT); + GeoFile = new File(GeoFile, COUNTRY_FILE_DEFAULT); + if (GeoFile == null || (!GeoFile.exists())) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Country file not found: " + GeoFile.getAbsolutePath()); + return; + } + FileInputStream in = null; + try { + in = new FileInputStream(GeoFile); + StringBuilder buf = new StringBuilder(128); + while (DataHelper.readLine(in, buf)) { + try { + if (buf.charAt(0) == '#') { + buf.setLength(0); + continue; + } + String[] s = buf.toString().split(","); + // todo convert name to mixed upper/lower case + _codeToName.put(s[0].toLowerCase(), s[1]); + } catch (IndexOutOfBoundsException ioobe) { + } + buf.setLength(0); + } + } catch (IOException ioe) { + if (_log.shouldLog(Log.ERROR)) + _log.error("Error reading the Country File", ioe); + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + } + } + + /** + * Read in and parse the geoip file. + * The geoip file must be sorted, and may not contain overlapping entries. + * + * Acceptable formats (IPV4 only): + * #comment (# must be in column 1) + * integer IP,integer IP, country code + * + * Example: + * 121195296,121195327,IT + * + * This is identical to the Tor geoip file, which can be found in + * src/config/geoip in their distribution, or /usr/local/lib/share/tor/geoip + * in their installation. + * Thanks to Tor for finding a source for the data, and the format script. + * + * To create: + * wget http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip + * unzip ip-to-country.csv.zip + * cut -d, -f0-3 < ip-to-country.csv|sed 's/"//g' > geoip.txt + * + * @param search a sorted array of IPs to search + * @return an array of country codes, same order as the search param, + * or a zero-length array on failure + * + */ + private String[] readGeoIPFile(Long[] search) { + File GeoFile = new File(_context.getBaseDir(), GEOIP_DIR_DEFAULT); + GeoFile = new File(GeoFile, GEOIP_FILE_DEFAULT); + if (GeoFile == null || (!GeoFile.exists())) { + if (_log.shouldLog(Log.WARN)) + _log.warn("GeoIP file not found: " + GeoFile.getAbsolutePath()); + return new String[0]; + } + String[] rv = new String[search.length]; + int idx = 0; + long start = _context.clock().now(); + FileInputStream in = null; + try { + in = new FileInputStream(GeoFile); + StringBuilder buf = new StringBuilder(128); + while (DataHelper.readLine(in, buf) && idx < search.length) { + try { + if (buf.charAt(0) == '#') { + buf.setLength(0); + continue; + } + String[] s = buf.toString().split(","); + long ip1 = Long.parseLong(s[0]); + long ip2 = Long.parseLong(s[1]); + while (idx < search.length && search[idx].longValue() < ip1) { + idx++; + } + while (idx < search.length && search[idx].longValue() >= ip1 && search[idx].longValue() <= ip2) { + rv[idx++] = s[2].toLowerCase(); + } + } catch (IndexOutOfBoundsException ioobe) { + } catch (NumberFormatException nfe) { + } + buf.setLength(0); + } + } catch (IOException ioe) { + if (_log.shouldLog(Log.ERROR)) + _log.error("Error reading the GeoFile", ioe); + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} + } + + if (_log.shouldLog(Log.WARN)) { + _log.warn("GeoIP processing finished, time: " + (_context.clock().now() - start)); + } + return rv; + } + + /** + * Put our country code in the config, where others (such as Timestamper) can get it, + * and it will be there next time at startup. + */ + private void updateOurCountry() { + String oldCountry = _context.router().getConfigSetting(PROP_IP_COUNTRY); + String country = _context.commSystem().getCountry(_context.routerHash()); + if (country != null && !country.equals(oldCountry)) { + _context.router().setConfigSetting(PROP_IP_COUNTRY, country); + _context.router().saveConfig(); + } + } + + /** + * Add to the list needing lookup + */ + public void add(String ip) { + InetAddress pi; + try { + pi = InetAddress.getByName(ip); + } catch (UnknownHostException uhe) { + return; + } + if (pi == null) return; + byte[] pib = pi.getAddress(); + add(pib); + } + + public void add(byte ip[]) { + if (ip.length != 4) + return; + add(toLong(ip)); + } + + private void add(long ip) { + Long li = Long.valueOf(ip); + if (!(_IPToCountry.containsKey(li) || _notFound.contains(li))) + _pendingSearch.add(li); + } + + /** + * Get the country for an IP + * @return lower-case code, generally two letters. + */ + public String get(String ip) { + InetAddress pi; + try { + pi = InetAddress.getByName(ip); + } catch (UnknownHostException uhe) { + return null; + } + if (pi == null) return null; + byte[] pib = pi.getAddress(); + return get(pib); + } + + public String get(byte ip[]) { + if (ip.length != 4) + return null; + return get(toLong(ip)); + } + + private String get(long ip) { + return _IPToCountry.get(Long.valueOf(ip)); + } + + private static long toLong(byte ip[]) { + int rv = 0; + for (int i = 0; i < 4; i++) + rv |= (ip[i] & 0xff) << ((3-i)*8); + return ((long) rv) & 0xffffffffl; + } + + public String fullName(String code) { + return _codeToName.get(code); + } + +/*** doesn't work since switched to RouterContext above + public static void main(String args[]) { + GeoIP g = new GeoIP(new I2PAppContext()); + String tests[] = {"0.0.0.0", "0.0.0.1", "0.0.0.2", "0.0.0.255", "1.0.0.0", + "94.3.3.3", "77.1.2.3", "127.0.0.0", "127.127.127.127", "128.0.0.0", + "89.8.9.3", "72.5.6.8", "217.4.9.7", "175.107.027.107", "135.6.5.2", + "129.1.2.3", "255.255.255.254", "255.255.255.255"}; + for (int i = 0; i < tests.length; i++) + g.add(tests[i]); + g.blockingLookup(); + for (int i = 0; i < tests.length; i++) + System.out.println(tests[i] + " : " + g.get(tests[i])); + + } +***/ +} diff --git a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java index c5ca48f57..17108a8e8 100644 --- a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java +++ b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java @@ -30,11 +30,11 @@ import net.i2p.util.SimpleTimer; public class OutboundMessageRegistry { private Log _log; /** list of currently active MessageSelector instances */ - private List _selectors; + private final List _selectors; /** map of active MessageSelector to either an OutNetMessage or a List of OutNetMessages causing it (for quick removal) */ - private Map _selectorToMessage; + private final Map _selectorToMessage; /** set of active OutNetMessage (for quick removal and selector fetching) */ - private Set _activeMessages; + private final Set _activeMessages; private CleanupTask _cleanupTask; private RouterContext _context; diff --git a/router/java/src/net/i2p/router/transport/Transport.java b/router/java/src/net/i2p/router/transport/Transport.java index f95d2dc8f..339c33f7b 100644 --- a/router/java/src/net/i2p/router/transport/Transport.java +++ b/router/java/src/net/i2p/router/transport/Transport.java @@ -35,12 +35,20 @@ public interface Transport { public RouterAddress startListening(); public void stopListening(); public RouterAddress getCurrentAddress(); + public static final String SOURCE_UPNP = "upnp"; + public static final String SOURCE_INTERFACE = "local"; + public static final String SOURCE_CONFIG = "config"; // unused + public void externalAddressReceived(String source, byte[] ip, int port); + public void forwardPortStatus(int port, boolean success, String reason); + public int getRequestedPort(); public void setListener(TransportEventListener listener); public String getStyle(); + public int countPeers(); public int countActivePeers(); public int countActiveSendPeers(); public boolean haveCapacity(); + public boolean haveCapacity(int pct); public Vector getClockSkews(); public List getMostRecentErrorMessages(); diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index f9ac683b6..29318bb60 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -1,9 +1,9 @@ package net.i2p.router.transport; /* * free (adj.): unencumbered; not under the control of others - * Written by jrandom in 2003 and released into the public domain - * with no warranty of any kind, either expressed or implied. - * It probably won't make your computer catch on fire, or eat + * Written by jrandom in 2003 and released into the public domain + * with no warranty of any kind, either expressed or implied. + * It probably won't make your computer catch on fire, or eat * your children, but it might. Use at your own risk. * */ @@ -14,12 +14,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.Hash; import net.i2p.data.RouterAddress; @@ -34,7 +34,10 @@ import net.i2p.router.OutNetMessage; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; +import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; +import net.i2p.util.SimpleScheduler; +import net.i2p.util.SimpleTimer; /** * Defines a way to send a message to another peer and start listening for messages @@ -44,11 +47,13 @@ public abstract class TransportImpl implements Transport { private Log _log; private TransportEventListener _listener; private RouterAddress _currentAddress; - private List _sendPool; + private final List _sendPool; protected RouterContext _context; /** map from routerIdentHash to timestamp (Long) that the peer was last unreachable */ - private Map _unreachableEntries; - private Set _wasUnreachableEntries; + private final Map _unreachableEntries; + private Set _wasUnreachableEntries; + /** global router ident -> IP */ + private static Map _IPMap = new ConcurrentHashMap(128); /** * Initialize the new transport @@ -57,7 +62,7 @@ public abstract class TransportImpl implements Transport { public TransportImpl(RouterContext context) { _context = context; _log = _context.logManager().getLog(TransportImpl.class); - + _context.statManager().createRateStat("transport.sendMessageFailureLifetime", "How long the lifetime of messages that fail are?", "Transport", new long[] { 60*1000l, 10*60*1000l, 60*60*1000l, 24*60*60*1000l }); _context.statManager().createRateStat("transport.sendMessageSize", "How large are the messages sent?", "Transport", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); _context.statManager().createRateStat("transport.receiveMessageSize", "How large are the messages received?", "Transport", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); @@ -67,13 +72,19 @@ public abstract class TransportImpl implements Transport { _context.statManager().createRateStat("transport.expiredOnQueueLifetime", "How long a message that expires on our outbound queue is processed", "Transport", new long[] { 60*1000l, 10*60*1000l, 60*60*1000l, 24*60*60*1000l } ); _sendPool = new ArrayList(16); _unreachableEntries = new HashMap(16); - _wasUnreachableEntries = new HashSet(16); + _wasUnreachableEntries = new ConcurrentHashSet(16); _currentAddress = null; + SimpleScheduler.getInstance().addPeriodicEvent(new CleanupUnreachable(), 2 * UNREACHABLE_PERIOD, UNREACHABLE_PERIOD / 2); } - + /** - * How many peers can we talk to right now? - * + * How many peers are we connected to? + * For NTCP, this is the same as active, + * but SSU actually looks at idle time for countActivePeers() + */ + public int countPeers() { return countActivePeers(); } + /** + * How many peers active in the last few minutes? */ public int countActivePeers() { return 0; } /** @@ -100,25 +111,36 @@ public abstract class TransportImpl implements Transport { ! ((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) def = MAX_CONNECTION_FACTOR * (1 + bw - Router.CAPABILITY_BW12); } + // increase limit for SSU, for now + if (style.equals("udp")) + def = def * 3 / 2; return _context.getProperty("i2np." + style + ".maxConnections", def); } + private static final int DEFAULT_CAPACITY_PCT = 75; /** * Can we initiate or accept a connection to another peer, saving some margin */ - public boolean haveCapacity() { return true; } - + public boolean haveCapacity() { + return haveCapacity(DEFAULT_CAPACITY_PCT); + } + + /** @param pct are we under x% 0-100 */ + public boolean haveCapacity(int pct) { + return countPeers() < getMaxConnections() * pct / 100; + } + /** * Return our peer clock skews on a transport. * Vector composed of Long, each element representing a peer skew in seconds. * Dummy version. Transports override it. */ public Vector getClockSkews() { return new Vector(); } - + public List getMostRecentErrorMessages() { return Collections.EMPTY_LIST; } /** * Nonblocking call to pull the next outbound message - * off the queue. + * off the queue. * * @return the next message or null if none are available */ @@ -131,7 +153,7 @@ public abstract class TransportImpl implements Transport { msg.beginSend(); return msg; } - + /** * The transport is done sending this message * @@ -163,7 +185,7 @@ public abstract class TransportImpl implements Transport { } /** * The transport is done sending this message. This is the method that actually - * does all of the cleanup - firing off jobs, requeueing, updating stats, etc. + * does all of the cleanup - firing off jobs, requeueing, updating stats, etc. * * @param msg message in question * @param sendSuccessful true if the peer received it @@ -176,64 +198,64 @@ public abstract class TransportImpl implements Transport { msg.timestamp("afterSend(successful)"); else msg.timestamp("afterSend(failed)"); - + if (!sendSuccessful) msg.transportFailed(getStyle()); if (msToSend > 1000) { if (_log.shouldLog(Log.WARN)) - _log.warn("afterSend slow: [success=" + sendSuccessful + "] " + msg.getMessageSize() + "byte " - + msg.getMessageType() + " " + msg.getMessageId() + " to " - + msg.getTarget().getIdentity().calculateHash().toBase64().substring(0,6) + " took " + msToSend + _log.warn("afterSend slow: [success=" + sendSuccessful + "] " + msg.getMessageSize() + "byte " + + msg.getMessageType() + " " + msg.getMessageId() + " to " + + msg.getTarget().getIdentity().calculateHash().toBase64().substring(0,6) + " took " + msToSend + "/" + msg.getTransmissionTime()); } - //if (true) + //if (true) // _log.error("(not error) I2NP message sent? " + sendSuccessful + " " + msg.getMessageId() + " after " + msToSend + "/" + msg.getTransmissionTime()); - + long lifetime = msg.getLifetime(); if (lifetime > 3000) { int level = Log.WARN; if (!sendSuccessful) level = Log.INFO; if (_log.shouldLog(level)) - _log.log(level, "afterSend slow (" + lifetime + "/" + msToSend + "/" + msg.getTransmissionTime() + "): [success=" + sendSuccessful + "]" + msg.getMessageSize() + "byte " - + msg.getMessageType() + " " + msg.getMessageId() + " from " + _context.routerHash().toBase64().substring(0,6) + _log.log(level, "afterSend slow (" + lifetime + "/" + msToSend + "/" + msg.getTransmissionTime() + "): [success=" + sendSuccessful + "]" + msg.getMessageSize() + "byte " + + msg.getMessageType() + " " + msg.getMessageId() + " from " + _context.routerHash().toBase64().substring(0,6) + " to " + msg.getTarget().getIdentity().calculateHash().toBase64().substring(0,6) + ": " + msg.toString()); } else { if (_log.shouldLog(Log.INFO)) - _log.info("afterSend: [success=" + sendSuccessful + "]" + msg.getMessageSize() + "byte " - + msg.getMessageType() + " " + msg.getMessageId() + " from " + _context.routerHash().toBase64().substring(0,6) + _log.info("afterSend: [success=" + sendSuccessful + "]" + msg.getMessageSize() + "byte " + + msg.getMessageType() + " " + msg.getMessageId() + " from " + _context.routerHash().toBase64().substring(0,6) + " to " + msg.getTarget().getIdentity().calculateHash().toBase64().substring(0,6) + "\n" + msg.toString()); } if (sendSuccessful) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Send message " + msg.getMessageType() + " to " - + msg.getTarget().getIdentity().getHash().toBase64() + " with transport " + _log.debug("Send message " + msg.getMessageType() + " to " + + msg.getTarget().getIdentity().getHash().toBase64() + " with transport " + getStyle() + " successfully"); Job j = msg.getOnSendJob(); - if (j != null) + if (j != null) _context.jobQueue().addJob(j); log = true; msg.discardData(); } else { if (_log.shouldLog(Log.INFO)) - _log.info("Failed to send message " + msg.getMessageType() - + " to " + msg.getTarget().getIdentity().getHash().toBase64() + _log.info("Failed to send message " + msg.getMessageType() + + " to " + msg.getTarget().getIdentity().getHash().toBase64() + " with transport " + getStyle() + " (details: " + msg + ")"); if (msg.getExpiration() < _context.clock().now()) _context.statManager().addRateData("transport.expiredOnQueueLifetime", lifetime, lifetime); - + if (allowRequeue) { - if ( ( (msg.getExpiration() <= 0) || (msg.getExpiration() > _context.clock().now()) ) + if ( ( (msg.getExpiration() <= 0) || (msg.getExpiration() > _context.clock().now()) ) && (msg.getMessage() != null) ) { // this may not be the last transport available - keep going _context.outNetMessagePool().add(msg); // don't discard the data yet! } else { if (_log.shouldLog(Log.INFO)) - _log.info("No more time left (" + new Date(msg.getExpiration()) - + ", expiring without sending successfully the " + _log.info("No more time left (" + new Date(msg.getExpiration()) + + ", expiring without sending successfully the " + msg.getMessageType()); if (msg.getOnFailedSendJob() != null) _context.jobQueue().addJob(msg.getOnFailedSendJob()); @@ -247,8 +269,8 @@ public abstract class TransportImpl implements Transport { } else { MessageSelector selector = msg.getReplySelector(); if (_log.shouldLog(Log.INFO)) - _log.info("Failed and no requeue allowed for a " - + msg.getMessageSize() + " byte " + _log.info("Failed and no requeue allowed for a " + + msg.getMessageSize() + " byte " + msg.getMessageType() + " message with selector " + selector, new Exception("fail cause")); if (msg.getOnFailedSendJob() != null) _context.jobQueue().addJob(msg.getOnFailedSendJob()); @@ -265,9 +287,9 @@ public abstract class TransportImpl implements Transport { String type = msg.getMessageType(); // the udp transport logs some further details /* - _context.messageHistory().sendMessage(type, msg.getMessageId(), + _context.messageHistory().sendMessage(type, msg.getMessageId(), msg.getExpiration(), - msg.getTarget().getIdentity().getHash(), + msg.getTarget().getIdentity().getHash(), sendSuccessful); */ } @@ -277,23 +299,23 @@ public abstract class TransportImpl implements Transport { long allTime = now - msg.getCreated(); if (allTime > 5*1000) { if (_log.shouldLog(Log.INFO)) - _log.info("Took too long from preperation to afterSend(ok? " + sendSuccessful - + "): " + allTime + "ms/" + sendTime + "ms after failing on: " + _log.info("Took too long from preperation to afterSend(ok? " + sendSuccessful + + "): " + allTime + "ms/" + sendTime + "ms after failing on: " + msg.getFailedTransports() + " and succeeding on " + getStyle()); if ( (allTime > 60*1000) && (sendSuccessful) ) { // WTF!!@# if (_log.shouldLog(Log.WARN)) - _log.warn("WTF, more than a minute slow? " + msg.getMessageType() - + " of id " + msg.getMessageId() + " (send begin on " - + new Date(msg.getSendBegin()) + " / created on " + _log.warn("WTF, more than a minute slow? " + msg.getMessageType() + + " of id " + msg.getMessageId() + " (send begin on " + + new Date(msg.getSendBegin()) + " / created on " + new Date(msg.getCreated()) + "): " + msg, msg.getCreatedBy()); - _context.messageHistory().messageProcessingError(msg.getMessageId(), - msg.getMessageType(), + _context.messageHistory().messageProcessingError(msg.getMessageId(), + msg.getMessageType(), "Took too long to send [" + allTime + "ms]"); } } - + if (sendSuccessful) { _context.statManager().addRateData("transport.sendProcessingTime", lifetime, lifetime); _context.profileManager().messageSent(msg.getTarget().getIdentity().getHash(), getStyle(), sendTime, msg.getMessageSize()); @@ -303,7 +325,7 @@ public abstract class TransportImpl implements Transport { _context.statManager().addRateData("transport.sendMessageFailureLifetime", lifetime, lifetime); } } - + /** * Asynchronously send the message as requested in the message and, if the * send is successful, queue up any msg.getOnSendJob job, and register it @@ -319,14 +341,14 @@ public abstract class TransportImpl implements Transport { } boolean duplicate = false; synchronized (_sendPool) { - if (_sendPool.contains(msg)) + if (_sendPool.contains(msg)) duplicate = true; else _sendPool.add(msg); } if (duplicate) { if (_log.shouldLog(Log.ERROR)) - _log.error("Message already is in the queue? wtf. msg = " + msg, + _log.error("Message already is in the queue? wtf. msg = " + msg, new Exception("wtf, requeued?")); } @@ -342,20 +364,20 @@ public abstract class TransportImpl implements Transport { * and it should not block */ protected abstract void outboundMessageReady(); - + /** * Message received from the I2NPMessageReader - send it to the listener * */ public void messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived) { - //if (true) + //if (true) // _log.error("(not error) I2NP message received: " + inMsg.getUniqueId() + " after " + msToReceive); - + int level = Log.INFO; if (msToReceive > 5000) level = Log.WARN; if (_log.shouldLog(level)) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Message received: ").append(inMsg.getClass().getName()); buf.append(" / ").append(inMsg.getUniqueId()); buf.append(" in ").append(msToReceive).append("ms containing "); @@ -381,7 +403,7 @@ public abstract class TransportImpl implements Transport { _context.profileManager().messageReceived(remoteIdentHash, getStyle(), msToReceive, bytesReceived); _context.statManager().addRateData("transport.receiveMessageSize", bytesReceived, msToReceive); } - + _context.statManager().addRateData("transport.receiveMessageTime", msToReceive, msToReceive); if (msToReceive > 1000) { _context.statManager().addRateData("transport.receiveMessageTimeSlow", msToReceive, msToReceive); @@ -390,7 +412,7 @@ public abstract class TransportImpl implements Transport { //// this functionality is built into the InNetMessagePool //String type = inMsg.getClass().getName(); //MessageHistory.getInstance().receiveMessage(type, inMsg.getUniqueId(), inMsg.getMessageExpiration(), remoteIdentHash, true); - + if (_listener != null) { _listener.messageReceived(inMsg, remoteIdent, remoteIdentHash); } else { @@ -398,9 +420,9 @@ public abstract class TransportImpl implements Transport { _log.error("WTF! Null listener! this = " + toString(), new Exception("Null listener")); } } - + /** What addresses are we currently listening to? */ - public RouterAddress getCurrentAddress() { + public RouterAddress getCurrentAddress() { return _currentAddress; } /** @@ -415,19 +437,51 @@ public abstract class TransportImpl implements Transport { if ("SSU".equals(getStyle())) _context.commSystem().notifyReplaceAddress(address); } - + + /** + * Notify a transport of an external address change. + * This may be from a local interface, UPnP, a config change, etc. + * This should not be called if the ip didn't change + * (from that source's point of view), or is a local address, + * or if the ip is IPv6, but the transport should check anyway. + * The transport should also do its own checking on whether to accept + * notifications from this source. + * + * This can be called before startListening() to set an initial address, + * or after the transport is running. + * + * @param source defined in Transport.java + * @param ip typ. IPv4 non-local + * @param port 0 for unknown or unchanged + */ + public void externalAddressReceived(String source, byte[] ip, int port) {} + + /** + * Notify a transport of the results of trying to forward a port + */ + public void forwardPortStatus(int port, boolean success, String reason) {} + + /** + * What port would the transport like to have forwarded by UPnP. + * This can't be passed via getCurrentAddress(), as we have to open the port + * before we can publish the address. + * + * @return port or -1 for none or 0 for any + */ + public int getRequestedPort() { return -1; } + /** Who to notify on message availability */ public void setListener(TransportEventListener listener) { _listener = listener; } /** Make this stuff pretty (only used in the old console) */ public void renderStatusHTML(Writer out) throws IOException {} public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException { renderStatusHTML(out); } - + public RouterContext getContext() { return _context; } public short getReachabilityStatus() { return CommSystemFacade.STATUS_UNKNOWN; } public void recheckReachability() {} public boolean isBacklogged(Hash dest) { return false; } public boolean isEstablished(Hash dest) { return false; } - + private static final long UNREACHABLE_PERIOD = 5*60*1000; public boolean isUnreachable(Hash peer) { long now = _context.clock().now(); @@ -461,13 +515,10 @@ public abstract class TransportImpl implements Transport { if (!isInbound) markWasUnreachable(peer, false); } - private class CleanupUnreachable extends JobImpl { - public CleanupUnreachable(RouterContext ctx) { - super(ctx); - } - public String getName() { return "Cleanup " + getStyle() + " unreachable list"; } - public void runJob() { - long now = getContext().clock().now(); + + private class CleanupUnreachable implements SimpleTimer.TimedEvent { + public void timeReached() { + long now = _context.clock().now(); synchronized (_unreachableEntries) { for (Iterator iter = _unreachableEntries.keySet().iterator(); iter.hasNext(); ) { Hash peer = (Hash)iter.next(); @@ -476,7 +527,6 @@ public abstract class TransportImpl implements Transport { iter.remove(); } } - requeue(60*1000); } } @@ -485,10 +535,8 @@ public abstract class TransportImpl implements Transport { * This is NOT reset if the peer contacts us and it is never expired. */ public boolean wasUnreachable(Hash peer) { - synchronized (_wasUnreachableEntries) { - if (_wasUnreachableEntries.contains(peer)) - return true; - } + if (_wasUnreachableEntries.contains(peer)) + return true; RouterInfo ri = _context.netDb().lookupRouterInfoLocally(peer); if (ri == null) return false; @@ -498,25 +546,33 @@ public abstract class TransportImpl implements Transport { * Maintain the WasUnreachable list */ public void markWasUnreachable(Hash peer, boolean yes) { - synchronized (_wasUnreachableEntries) { - if (yes) - _wasUnreachableEntries.add(peer); - else - _wasUnreachableEntries.remove(peer); - } + if (yes) + _wasUnreachableEntries.add(peer); + else + _wasUnreachableEntries.remove(peer); if (_log.shouldLog(Log.WARN)) _log.warn(this.getStyle() + " setting wasUnreachable to " + yes + " for " + peer); } + public void setIP(Hash peer, byte[] ip) { + _IPMap.put(peer, ip); + _context.commSystem().queueLookup(ip); + } + + public static byte[] getIP(Hash peer) { + return _IPMap.get(peer); + } + public static boolean isPubliclyRoutable(byte addr[]) { if (addr.length == 4) { if ((addr[0]&0xFF) == 127) return false; - if ((addr[0]&0xFF) == 10) return false; + if ((addr[0]&0xFF) == 10) return false; if ( ((addr[0]&0xFF) == 172) && ((addr[1]&0xFF) >= 16) && ((addr[1]&0xFF) <= 31) ) return false; if ( ((addr[0]&0xFF) == 192) && ((addr[1]&0xFF) == 168) ) return false; if ((addr[0]&0xFF) >= 224) return false; // no multicast if ((addr[0]&0xFF) == 0) return false; if ( ((addr[0]&0xFF) == 169) && ((addr[1]&0xFF) == 254) ) return false; + if ((addr[0]&0xFF) == 5) return false; // Hamachi return true; // or at least possible to be true } else if (addr.length == 16) { return false; diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index 0b7d8d547..98158054f 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -10,12 +10,15 @@ package net.i2p.router.transport; import java.io.IOException; import java.io.Writer; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import java.util.TreeMap; import java.util.Vector; @@ -33,14 +36,16 @@ import net.i2p.util.Log; public class TransportManager implements TransportEventListener { private Log _log; - private List _transports; + private List _transports; private RouterContext _context; private UPnPManager _upnpManager; - private final static String PROP_ENABLE_UDP = "i2np.udp.enable"; - private final static String PROP_ENABLE_NTCP = "i2np.ntcp.enable"; - private final static String DEFAULT_ENABLE_NTCP = "true"; - private final static String DEFAULT_ENABLE_UDP = "true"; + public final static String PROP_ENABLE_UDP = "i2np.udp.enable"; + public final static String PROP_ENABLE_NTCP = "i2np.ntcp.enable"; + public final static String DEFAULT_ENABLE_NTCP = "true"; + public final static String DEFAULT_ENABLE_UDP = "true"; + /** default true */ + public final static String PROP_ENABLE_UPNP = "i2np.upnp.enable"; public TransportManager(RouterContext context) { _context = context; @@ -52,7 +57,8 @@ public class TransportManager implements TransportEventListener { _context.statManager().createRateStat("transport.bidFailNoTransports", "Could not attempt to bid on message, as none of the transports could attempt it", "Transport", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); _context.statManager().createRateStat("transport.bidFailAllTransports", "Could not attempt to bid on message, as all of the transports had failed", "Transport", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); _transports = new ArrayList(); - _upnpManager = new UPnPManager(context); + if (Boolean.valueOf(_context.getProperty(PROP_ENABLE_UPNP, "true")).booleanValue()) + _upnpManager = new UPnPManager(context, this); } public void addTransport(Transport transport) { @@ -73,14 +79,11 @@ public class TransportManager implements TransportEventListener { enableUDP = DEFAULT_ENABLE_UDP; if ("true".equalsIgnoreCase(enableUDP)) { UDPTransport udp = new UDPTransport(_context); - udp.setListener(this); - _transports.add(udp); - } - if (enableNTCP(_context)) { - NTCPTransport ntcp = new NTCPTransport(_context); - ntcp.setListener(this); - _transports.add(ntcp); + addTransport(udp); + initializeAddress(udp); } + if (enableNTCP(_context)) + addTransport(new NTCPTransport(_context)); if (_transports.size() <= 0) _log.log(Log.CRIT, "No transports are enabled"); } @@ -92,15 +95,59 @@ public class TransportManager implements TransportEventListener { return "true".equalsIgnoreCase(enableNTCP); } + private static void initializeAddress(Transport t) { + String ips = Addresses.getAnyAddress(); + if (ips == null) + return; + InetAddress ia = null; + try { + ia = InetAddress.getByName(ips); + } catch (UnknownHostException e) {return;} + if (ia == null) + return; + byte[] ip = ia.getAddress(); + t.externalAddressReceived(Transport.SOURCE_INTERFACE, ip, 0); + } + + /** + * callback from UPnP + * Only tell SSU, it will tell NTCP + * + */ + public void externalAddressReceived(String source, byte[] ip, int port) { + Transport t = getTransport(UDPTransport.STYLE); + if (t != null) + t.externalAddressReceived(source, ip, port); + } + + /** + * callback from UPnP + * + */ + public void forwardPortStatus(String style, int port, boolean success, String reason) { + Transport t = getTransport(style); + if (t != null) + t.forwardPortStatus(port, success, reason); + } + public void startListening() { - _upnpManager.start(); + // For now, only start UPnP if we have no publicly-routable addresses + // so we don't open the listener ports to the world. + // Maybe we need a config option to force on? Probably not. + // What firewall supports UPnP and is configured with a public address on the LAN side? + // Unlikely. + if (_upnpManager != null && Addresses.getAnyAddress() == null) + _upnpManager.start(); configTransports(); _log.debug("Starting up the transport manager"); for (int i = 0; i < _transports.size(); i++) { Transport t = (Transport)_transports.get(i); RouterAddress addr = t.startListening(); - _log.debug("Transport " + i + " (" + t.getStyle() + ") started"); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Transport " + i + " (" + t.getStyle() + ") started"); } + // kick UPnP - Do this to get the ports opened even before UDP registers an address + transportAddressChanged(); _log.debug("Done start listening on transports"); _context.router().rebuildRouterInfo(); } @@ -112,17 +159,18 @@ public class TransportManager implements TransportEventListener { } public void stopListening() { - _upnpManager.stop(); + if (_upnpManager != null) + _upnpManager.stop(); for (int i = 0; i < _transports.size(); i++) { ((Transport)_transports.get(i)).stopListening(); } _transports.clear(); } - public Transport getNTCPTransport() { + public Transport getTransport(String style) { for (int i = 0; i < _transports.size(); i++) { Transport t = (Transport)_transports.get(i); - if("NTCP".equals(t.getStyle())) + if(style.equals(t.getStyle())) return t; } return null; @@ -156,13 +204,43 @@ public class TransportManager implements TransportEventListener { } /** - * Is at least one transport below its connection limit + some margin + * Is at least one transport below its outbound connection limit + some margin * Use for throttling in the router. - * Perhaps we should just use SSU? + * + * @param pct percent of limit 0-100 */ - public boolean haveCapacity() { + public boolean haveOutboundCapacity(int pct) { for (int i = 0; i < _transports.size(); i++) { - if (((Transport)_transports.get(i)).haveCapacity()) + if (((Transport)_transports.get(i)).haveCapacity(pct)) + return true; + } + return false; + } + + private static final int HIGH_CAPACITY_PCT = 50; + /** + * Are all transports well below their outbound connection limit + * Use for throttling in the router. + */ + public boolean haveHighOutboundCapacity() { + if (_transports.size() <= 0) + return false; + for (int i = 0; i < _transports.size(); i++) { + if (!((Transport)_transports.get(i)).haveCapacity(HIGH_CAPACITY_PCT)) + return false; + } + return true; + } + + /** + * Is at least one transport below its inbound connection limit + some margin + * Use for throttling in the router. + * + * @param pct percent of limit 0-100 + */ + public boolean haveInboundCapacity(int pct) { + for (int i = 0; i < _transports.size(); i++) { + if (_transports.get(i).getCurrentAddress() != null && _transports.get(i).haveCapacity(pct)) return true; } return false; @@ -185,15 +263,15 @@ public class TransportManager implements TransportEventListener { return skews; } + /** @return the best status of any transport */ public short getReachabilityStatus() { - if (_transports.size() <= 0) return CommSystemFacade.STATUS_UNKNOWN; - short status[] = new short[_transports.size()]; - for (int i = 0; i < _transports.size(); i++) { - status[i] = ((Transport)_transports.get(i)).getReachabilityStatus(); + short rv = CommSystemFacade.STATUS_UNKNOWN; + for (Transport t : _transports) { + short s = t.getReachabilityStatus(); + if (s < rv) + rv = s; } - // the values for the statuses are increasing for their 'badness' - Arrays.sort(status); - return status[0]; + return rv; } public void recheckReachability() { @@ -233,16 +311,60 @@ public class TransportManager implements TransportEventListener { return true; } - Map getAddresses() { - Map rv = new HashMap(_transports.size()); - for (int i = 0; i < _transports.size(); i++) { - Transport t = (Transport)_transports.get(i); + /** + * IP of the peer from the last connection (in or out, any transport). + * This may be different from that advertised in the netDb, + * as the peer may be hidden, or connect from a different IP, or + * change his netDb later, in an attempt to avoid restrictions. + * + * For blocking purposes, etc. it's worth checking both + * the netDb addresses and this address. + */ + public byte[] getIP(Hash dest) { + return TransportImpl.getIP(dest); + } + + public Map getAddresses() { + Map rv = new HashMap(_transports.size()); + for (Transport t : _transports) { if (t.getCurrentAddress() != null) rv.put(t.getStyle(), t.getCurrentAddress()); } return rv; } + /** + * Include the published port, or the requested port, for each transport + * which we will pass along to UPnP + */ + private Map getPorts() { + Map rv = new HashMap(_transports.size()); + for (Transport t : _transports) { + int port = t.getRequestedPort(); + if (t.getCurrentAddress() != null) { + Properties opts = t.getCurrentAddress().getOptions(); + if (opts != null) { + String s = opts.getProperty("port"); + if (s != null) { + try { + port = Integer.parseInt(s); + } catch (NumberFormatException nfe) {} + } + } + } + // Use UDP port for NTCP too - see comment in NTCPTransport.getRequestedPort() for why this is here + if (t.getStyle().equals(NTCPTransport.STYLE) && port <= 0 && + Boolean.valueOf(_context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_PORT)).booleanValue()) { + Transport udp = getTransport(UDPTransport.STYLE); + if (udp != null) + port = t.getRequestedPort(); + } + if (port > 0) + rv.put(t.getStyle(), Integer.valueOf(port)); + } + return rv; + } + public TransportBid getBid(OutNetMessage msg) { List bids = getBids(msg); if ( (bids == null) || (bids.size() <= 0) ) @@ -346,7 +468,8 @@ public class TransportManager implements TransportEventListener { } public void transportAddressChanged() { - _upnpManager.update(getAddresses()); + if (_upnpManager != null) + _upnpManager.update(getPorts()); } public List getMostRecentErrorMessages() { @@ -368,8 +491,8 @@ public class TransportManager implements TransportEventListener { Transport t= (Transport)iter.next(); t.renderStatusHTML(out, urlBase, sortFlags); } - StringBuffer buf = new StringBuffer(4*1024); - buf.append("Listening on:
      \n");
      +        StringBuilder buf = new StringBuilder(4*1024);
      +        buf.append("

      Router Transport Addresses:

      \n");
               for (int i = 0; i < _transports.size(); i++) {
                   Transport t = (Transport)_transports.get(i);
                   if (t.getCurrentAddress() != null)
      @@ -379,6 +502,9 @@ public class TransportManager implements TransportEventListener {
               }
               buf.append("
      \n"); out.write(buf.toString()); + if (_upnpManager != null) + out.write(_upnpManager.renderStatusHTML()); + buf.append("

      \n"); out.flush(); } } diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java index aef65adc5..841121f75 100644 --- a/router/java/src/net/i2p/router/transport/UPnP.java +++ b/router/java/src/net/i2p/router/transport/UPnP.java @@ -12,7 +12,6 @@ import java.util.Set; import net.i2p.util.Log; import net.i2p.I2PAppContext; -import net.i2p.router.RouterContext; import org.cybergarage.upnp.Action; import org.cybergarage.upnp.ActionList; @@ -26,6 +25,7 @@ import org.cybergarage.upnp.ServiceList; import org.cybergarage.upnp.ServiceStateTable; import org.cybergarage.upnp.StateVariable; import org.cybergarage.upnp.device.DeviceChangeListener; +import org.cybergarage.upnp.event.EventListener; import org.freenetproject.DetectedIP; import org.freenetproject.ForwardPort; import org.freenetproject.ForwardPortCallback; @@ -47,14 +47,16 @@ import org.freenetproject.ForwardPortStatus; * * some code has been borrowed from Limewire : @see com.limegroup.gnutella.UPnPManager * - * @see http://www.upnp.org/ - * @see http://en.wikipedia.org/wiki/Universal_Plug_and_Play - * + * @see "http://www.upnp.org/" + * @see "http://en.wikipedia.org/wiki/Universal_Plug_and_Play" + */ + +/* * TODO: Support multiple IGDs ? * TODO: Advertise the node like the MDNS plugin does * TODO: Implement EventListener and react on ip-change */ -public class UPnP extends ControlPoint implements DeviceChangeListener { +public class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { private Log _log; private I2PAppContext _context; @@ -87,13 +89,15 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { addDeviceChangeListener(this); } - public void runPlugin() { - super.start(); + public boolean runPlugin() { + return super.start(); } public void terminate() { unregisterPortMappings(); super.stop(); + _router = null; + _service = null; } public DetectedIP[] getAddress() { @@ -108,11 +112,17 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { DetectedIP result = null; final String natAddress = getNATAddress(); + if (natAddress == null || natAddress.length() <= 0) { + _log.warn("No external address returned"); + return null; + } try { InetAddress detectedIP = InetAddress.getByName(natAddress); + short status = DetectedIP.NOT_SUPPORTED; thinksWeAreDoubleNatted = !TransportImpl.isPubliclyRoutable(detectedIP.getAddress()); // If we have forwarded a port AND we don't have a private address + _log.warn("NATAddress: \"" + natAddress + "\" detectedIP: " + detectedIP + " double? " + thinksWeAreDoubleNatted); if((portsForwarded.size() > 1) && (!thinksWeAreDoubleNatted)) status = DetectedIP.FULL_INTERNET; @@ -134,10 +144,13 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { return; } } - if(!ROUTER_DEVICE.equals(dev.getDeviceType()) || !dev.isRootDevice()) - return; // Silently ignore non-IGD devices - else if(isNATPresent()) { - _log.error("We got a second IGD on the network! the plugin doesn't handle that: let's disable it."); + if(!ROUTER_DEVICE.equals(dev.getDeviceType()) || !dev.isRootDevice()) { + _log.warn("UP&P non-IGD device found, ignoring : " + dev.getFriendlyName()); + return; // ignore non-IGD devices + } else if(isNATPresent()) { + // maybe we should see if the old one went away before ignoring the new one? + _log.warn("UP&P ignoring additional IGD device found: " + dev.getFriendlyName() + " UDN: " + dev.getUDN()); + /********** seems a little drastic isDisabled = true; synchronized(lock) { @@ -146,24 +159,28 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { } stop(); + **************/ return; } - _log.warn("UP&P IGD found : " + dev.getFriendlyName()); + _log.warn("UP&P IGD found : " + dev.getFriendlyName() + " UDN: " + dev.getUDN() + " lease time: " + dev.getLeaseTime()); synchronized(lock) { _router = dev; } discoverService(); // We have found the device we need: stop the listener thread - stop(); + /// No, let's stick around to get notifications + //stop(); synchronized(lock) { + /// we should look for the next one if(_service == null) { _log.error("The IGD device we got isn't suiting our needs, let's disable the plugin"); isDisabled = true; _router = null; return; } + subscribe(_service); } registerPortMappings(); } @@ -226,21 +243,41 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { public void unregisterPortMappings() { Set ports; synchronized(lock) { - ports = portsForwarded; + ports = new HashSet(portsForwarded); } this.unregisterPorts(ports); } public void deviceRemoved(Device dev ){ + _log.warn("UP&P device removed : " + dev.getFriendlyName() + " UDN: " + dev.getUDN()); synchronized (lock) { if(_router == null) return; - if(_router.equals(dev)) { + // I2P this wasn't working + //if(_router.equals(dev)) { + if(ROUTER_DEVICE.equals(dev.getDeviceType()) && + dev.isRootDevice() && + stringEquals(_router.getFriendlyName(), dev.getFriendlyName()) && + stringEquals(_router.getUDN(), dev.getUDN())) { + _log.warn("UP&P IGD device removed : " + dev.getFriendlyName()); _router = null; _service = null; } } } + /** event callback - unused for now - how many devices support events? */ + public void eventNotifyReceived(String uuid, long seq, String varName, String value) { + if (_log.shouldLog(Log.WARN)) + _log.error("Event: " + uuid + ' ' + seq + ' ' + varName + '=' + value); + } + + /** compare two strings, either of which could be null */ + private static boolean stringEquals(String a, String b) { + if (a != null) + return a.equals(b); + return b == null; + } + /** * @return whether we are behind an UPnP-enabled NAT/router */ @@ -260,13 +297,17 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { if(getIP == null || !getIP.postControlAction()) return null; - return (getIP.getOutputArgumentList().getArgument("NewExternalIPAddress")).getValue(); + String rv = (getIP.getOutputArgumentList().getArgument("NewExternalIPAddress")).getValue(); + // I2P some devices return 0.0.0.0 when not connected + if ("0.0.0.0".equals(rv)) + return null; + return rv; } /** * @return the reported upstream bit rate in bits per second. -1 if it's not available. Blocking. */ - public int getUpstramMaxBitRate() { + public int getUpstreamMaxBitRate() { if(!isNATPresent() || thinksWeAreDoubleNatted) return -1; @@ -291,6 +332,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { return Integer.valueOf(getIP.getOutputArgumentList().getArgument("NewDownstreamMaxBitRate").getValue()); } +/*** private void listStateTable(Service serv, StringBuilder sb) { ServiceStateTable table = serv.getServiceStateTable(); sb.append("
      "); @@ -320,136 +362,143 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { sb.append("
      "); } } +***/ - private String toString(String action, String Argument, Service serv) { - Action getIP = serv.getAction(action); - if(getIP == null || !getIP.postControlAction()) - return null; - - Argument ret = getIP.getOutputArgumentList().getArgument(Argument); - return ret.getValue(); + /** + * A blocking toString(). That's interesting. + * Cache the last ArgumentList to speed it up some. + * Count on listSubServices() to call multiple combinations of arguments + * so we don't get old data. + */ + private String _lastAction; + private Service _lastService; + private ArgumentList _lastArgumentList; + private Object toStringLock = new Object(); + private String toString(String action, String arg, Service serv) { + synchronized(toStringLock) { + if ((!action.equals(_lastAction)) || + (!serv.equals(_lastService)) || + _lastArgumentList == null) { + Action getIP = serv.getAction(action); + if(getIP == null || !getIP.postControlAction()) { + _lastAction = null; + return null; + } + _lastAction = action; + _lastService = serv; + _lastArgumentList = getIP.getOutputArgumentList(); + } + return _lastArgumentList.getArgument(arg).getValue(); + } } // TODO: extend it! RTFM private void listSubServices(Device dev, StringBuilder sb) { ServiceList sl = dev.getServiceList(); + if (sl.size() <= 0) + return; + sb.append("
        \n"); for(int i=0; iservice ("+i+") : "+serv.getServiceType()+"
        "); + sb.append("
      • Service: "); if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){ - sb.append("WANCommonInterfaceConfig"); - sb.append(" status: " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); - sb.append(" type: " + toString("GetCommonLinkProperties", "NewWANAccessType", serv)); - sb.append(" upstream: " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); - sb.append(" downstream: " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "
        "); + sb.append("WAN Common Interface Config
          "); + sb.append("
        • Status: " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); + sb.append("
        • Type: " + toString("GetCommonLinkProperties", "NewWANAccessType", serv)); + sb.append("
        • Upstream: " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); + sb.append("
        • Downstream: " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "
          "); }else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){ - sb.append("WANPPPConnection"); - sb.append(" status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); - sb.append(" type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append(" upstream: " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); - sb.append(" downstream: " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "
          "); - sb.append(" external IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
          "); + sb.append("WAN PPP Connection
            "); + sb.append("
          • Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); + sb.append("
          • Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); + sb.append("
          • Upstream: " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); + sb.append("
          • Downstream: " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "
            "); + sb.append("
          • External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
            "); }else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){ - sb.append("Layer3Forwarding"); - sb.append("DefaultConnectionService: " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)); + sb.append("Layer 3 Forwarding
              "); + sb.append("
            • Default Connection Service: " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)); }else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){ - sb.append("WANIPConnection"); - sb.append(" status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); - sb.append(" type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append(" external IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
              "); + sb.append("WAN IP Connection
                "); + sb.append("
              • Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); + sb.append("
              • Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); + sb.append("
              • External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
                "); }else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){ - sb.append("WANEthernetLinkConfig"); - sb.append(" status: " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "
                "); + sb.append("WAN Ethernet Link Config
                  "); + sb.append("
                1. Status: " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "
                  "); }else - sb.append("~~~~~~~ "+serv.getServiceType()); - listActions(serv, sb); - listStateTable(serv, sb); - sb.append(""); + sb.append("~~~~~~~ "+serv.getServiceType() + "
                    "); + //listActions(serv, sb); + //listStateTable(serv, sb); + sb.append("
                  \n"); } + sb.append("
              \n"); } private void listSubDev(String prefix, Device dev, StringBuilder sb){ - sb.append("

              Device : "+dev.getFriendlyName()+" - "+ dev.getDeviceType()+"
              "); + if (prefix == null) + sb.append("Device: "); + else + sb.append("

            • Subdevice: "); + sb.append(dev.getFriendlyName()); listSubServices(dev, sb); DeviceList dl = dev.getDeviceList(); + if (dl.size() <= 0) + return; + sb.append("
                \n"); for(int j=0; j"); listSubDev(dev.getFriendlyName(), subDev, sb); - sb.append(""); } - sb.append("

                "); + sb.append("
              \n"); } -/***** - public String handleHTTPGet(HTTPRequest request) throws PluginHTTPException { - if(request.isParameterSet("getDeviceCapabilities")) { - final StringBuilder sb = new StringBuilder(); - sb.append("UPnP report"); - listSubDev("WANDevice", _router, sb); - sb.append(""); + /** warning - slow */ + public String renderStatusHTML() { + final StringBuilder sb = new StringBuilder(); + sb.append("UPnP Status:
              "); + + if(isDisabled) { + sb.append("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?"); + return sb.toString(); + } else if(!isNATPresent()) { + sb.append("UPnP has not found any UPnP-aware, compatible device on your LAN."); return sb.toString(); } - HTMLNode pageNode = pr.getPageMaker().getPageNode("UP&P plugin configuration page", false, null); - HTMLNode contentNode = pr.getPageMaker().getContentNode(pageNode); - - if(isDisabled) { - HTMLNode disabledInfobox = contentNode.addChild("div", "class", "infobox infobox-error"); - HTMLNode disabledInfoboxHeader = disabledInfobox.addChild("div", "class", "infobox-header"); - HTMLNode disabledInfoboxContent = disabledInfobox.addChild("div", "class", "infobox-content"); - - disabledInfoboxHeader.addChild("#", "UP&P plugin report"); - disabledInfoboxContent.addChild("#", "The plugin has been disabled; Do you have more than one UP&P IGD on your LAN ?"); - return pageNode.generate(); - } else if(!isNATPresent()) { - HTMLNode notFoundInfobox = contentNode.addChild("div", "class", "infobox infobox-warning"); - HTMLNode notFoundInfoboxHeader = notFoundInfobox.addChild("div", "class", "infobox-header"); - HTMLNode notFoundInfoboxContent = notFoundInfobox.addChild("div", "class", "infobox-content"); - - notFoundInfoboxHeader.addChild("#", "UP&P plugin report"); - notFoundInfoboxContent.addChild("#", "The plugin hasn't found any UP&P aware, compatible device on your LAN."); - return pageNode.generate(); - } - - HTMLNode foundInfobox = contentNode.addChild("div", "class", "infobox infobox-normal"); - HTMLNode foundInfoboxHeader = foundInfobox.addChild("div", "class", "infobox-header"); - HTMLNode foundInfoboxContent = foundInfobox.addChild("div", "class", "infobox-content"); - // FIXME L10n! - foundInfoboxHeader.addChild("#", "UP&P plugin report"); - foundInfoboxContent.addChild("p", "The following device has been found : ").addChild("a", "href", "?getDeviceCapabilities").addChild("#", _router.getFriendlyName()); - foundInfoboxContent.addChild("p", "Our current external ip address is : " + getNATAddress()); + sb.append("

              Found "); + listSubDev(null, _router, sb); + String addr = getNATAddress(); + if (addr != null) + sb.append("
              The current external IP address reported by UPnP is " + addr); + else + sb.append("
              The current external IP address is not available."); int downstreamMaxBitRate = getDownstreamMaxBitRate(); - int upstreamMaxBitRate = getUpstramMaxBitRate(); + int upstreamMaxBitRate = getUpstreamMaxBitRate(); if(downstreamMaxBitRate > 0) - foundInfoboxContent.addChild("p", "Our reported max downstream bit rate is : " + getDownstreamMaxBitRate()+ " bits/sec"); + sb.append("
              UPnP reports the max downstream bit rate is : " + downstreamMaxBitRate+ " bits/sec\n"); if(upstreamMaxBitRate > 0) - foundInfoboxContent.addChild("p", "Our reported max upstream bit rate is : " + getUpstramMaxBitRate()+ " bits/sec"); + sb.append("
              UPnP reports the max upstream bit rate is : " + upstreamMaxBitRate+ " bits/sec\n"); synchronized(lock) { if(portsToForward != null) { for(ForwardPort port : portsToForward) { - if(portsForwarded.contains(port)) { - foundInfoboxContent.addChild("p", "The "+port.name+" port "+port.portNumber+" / "+port.protocol+" has been forwarded successfully."); - } else { - foundInfoboxContent.addChild("p", "The "+port.name+" port "+port.portNumber+" / "+port.protocol+" has not been forwarded."); - } + sb.append("
              " + protoToString(port.protocol) + " port " + port.portNumber + " for " + port.name); + if(portsForwarded.contains(port)) + sb.append(" has been forwarded successfully by UPnP.\n"); + else + sb.append(" has not been forwarded by UPnP.\n"); } } } - return pageNode.generate(); + sb.append("

              "); + return sb.toString(); } - - public String handleHTTPPost(HTTPRequest request) throws PluginHTTPException { - return null; - } -***/ + /** blocking */ private boolean addMapping(String protocol, int port, String description, ForwardPort fp) { if(isDisabled || !isNATPresent() || _router == null) { _log.error("Can't addMapping: " + isDisabled + " " + isNATPresent() + " " + _router); @@ -457,8 +506,8 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { } // Just in case... - // this confuses my linksys - zzz - // removeMapping(protocol, port, fp, true); + // this confuses my linksys? - zzz + removeMapping(protocol, port, fp, true); Action add = _service.getAction("AddPortMapping"); if(add == null) { @@ -484,6 +533,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { } else return false; } + /** blocking */ private boolean removeMapping(String protocol, int port, ForwardPort fp, boolean noLog) { if(isDisabled || !isNATPresent()) return false; @@ -508,6 +558,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { return retval; } + /** non-blocking */ public void onChangePublicPorts(Set ports, ForwardPortCallback cb) { Set portsToDumpNow = null; Set portsToForwardNow = null; @@ -530,7 +581,9 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { // Ports in ports but not in portsToForwardNow we must forward // Ports in portsToForwardNow but not in ports we must dump for(ForwardPort port: ports) { - if(portsToForward.contains(port)) { + //if(portsToForward.contains(port)) { + // If not in portsForwarded, it wasn't successful, try again + if(portsForwarded.contains(port)) { // We have forwarded it, and it should be forwarded, cool. } else { // Needs forwarding @@ -557,45 +610,86 @@ public class UPnP extends ControlPoint implements DeviceChangeListener { registerPorts(portsToForwardNow); } + private static String protoToString(int p) { + if(p == ForwardPort.PROTOCOL_UDP_IPV4) + return "UDP"; + if(p == ForwardPort.PROTOCOL_TCP_IPV4) + return "TCP"; + return "?"; + } + + private static int __id = 0; + + /** + * postControlAction() can take many seconds, especially if it's failing, + * and onChangePublicPorts() may be called from threads we don't want to slow down, + * so throw this in a thread. + */ private void registerPorts(Set portsToForwardNow) { - for(ForwardPort port : portsToForwardNow) { - String proto; - if(port.protocol == ForwardPort.PROTOCOL_UDP_IPV4) - proto = "UDP"; - else if(port.protocol == ForwardPort.PROTOCOL_TCP_IPV4) - proto = "TCP"; - else { - HashMap map = new HashMap(); - map.put(port, new ForwardPortStatus(ForwardPortStatus.DEFINITE_FAILURE, "Protocol not supported", port.portNumber)); - forwardCallback.portForwardStatus(map); - continue; - } - if(tryAddMapping(proto, port.portNumber, port.name, port)) { - HashMap map = new HashMap(); - map.put(port, new ForwardPortStatus(ForwardPortStatus.MAYBE_SUCCESS, "Port apparently forwarded by UPnP", port.portNumber)); - forwardCallback.portForwardStatus(map); - continue; - } else { - HashMap map = new HashMap(); - map.put(port, new ForwardPortStatus(ForwardPortStatus.PROBABLE_FAILURE, "UPnP port forwarding apparently failed", port.portNumber)); - forwardCallback.portForwardStatus(map); - continue; + Thread t = new Thread(new RegisterPortsThread(portsToForwardNow)); + t.setName("UPnP Port Opener " + (++__id)); + t.setDaemon(true); + t.start(); + } + + private class RegisterPortsThread implements Runnable { + private Set portsToForwardNow; + + public RegisterPortsThread(Set ports) { + portsToForwardNow = ports; + } + + public void run() { + for(ForwardPort port : portsToForwardNow) { + String proto = protoToString(port.protocol); + if (proto.length() <= 1) { + HashMap map = new HashMap(); + map.put(port, new ForwardPortStatus(ForwardPortStatus.DEFINITE_FAILURE, "Protocol not supported", port.portNumber)); + forwardCallback.portForwardStatus(map); + continue; + } + if(tryAddMapping(proto, port.portNumber, port.name, port)) { + HashMap map = new HashMap(); + map.put(port, new ForwardPortStatus(ForwardPortStatus.MAYBE_SUCCESS, "Port apparently forwarded by UPnP", port.portNumber)); + forwardCallback.portForwardStatus(map); + continue; + } else { + HashMap map = new HashMap(); + map.put(port, new ForwardPortStatus(ForwardPortStatus.PROBABLE_FAILURE, "UPnP port forwarding apparently failed", port.portNumber)); + forwardCallback.portForwardStatus(map); + continue; + } } } } + /** + * postControlAction() can take many seconds, especially if it's failing, + * and onChangePublicPorts() may be called from threads we don't want to slow down, + * so throw this in a thread. + */ private void unregisterPorts(Set portsToForwardNow) { - for(ForwardPort port : portsToForwardNow) { - String proto; - if(port.protocol == ForwardPort.PROTOCOL_UDP_IPV4) - proto = "UDP"; - else if(port.protocol == ForwardPort.PROTOCOL_TCP_IPV4) - proto = "TCP"; - else { - // Ignore, we've already complained about it - continue; + Thread t = new Thread(new UnregisterPortsThread(portsToForwardNow)); + t.setName("UPnP Port Opener " + (++__id)); + t.setDaemon(true); + t.start(); + } + + private class UnregisterPortsThread implements Runnable { + private Set portsToForwardNow; + + public UnregisterPortsThread(Set ports) { + portsToForwardNow = ports; + } + + public void run() { + for(ForwardPort port : portsToForwardNow) { + String proto = protoToString(port.protocol); + if (proto.length() <= 1) + // Ignore, we've already complained about it + continue; + removeMapping(proto, port.portNumber, port, false); } - removeMapping(proto, port.portNumber, port, false); } } diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index 4deaebc4d..ff96abd38 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -4,9 +4,9 @@ package net.i2p.router.transport; * public domain */ +import java.net.InetAddress; import java.util.HashSet; import java.util.Map; -import java.util.Properties; import java.util.Set; import net.i2p.data.RouterAddress; @@ -23,10 +23,6 @@ import org.freenetproject.ForwardPortStatus; * Bridge from the I2P RouterAddress data structure to * the freenet data structures * - * No disable option yet. - * UPnP listens on ports 1900, 8008, and 8058 - no config option yet. - * No routerconsole support yet. - * * @author zzz */ public class UPnPManager { @@ -34,51 +30,66 @@ public class UPnPManager { private RouterContext _context; private UPnP _upnp; private UPnPCallback _upnpCallback; - private boolean _isRunning; + private volatile boolean _isRunning; + private InetAddress _detectedAddress; + private TransportManager _manager; + /** + * This is the TCP HTTP Event listener + * We move these so we don't conflict with other users of the same upnp library + * UPnP also binds to port 1900 UDP for multicast reception - this cannot be changed. + */ + private static final String PROP_HTTP_PORT = "i2np.upnp.HTTPPort"; + private static final int DEFAULT_HTTP_PORT = 7652; + /** this is the UDP SSDP Search reply listener */ + private static final String PROP_SSDP_PORT = "i2np.upnp.SSDPPort"; + private static final int DEFAULT_SSDP_PORT = 7653; - public UPnPManager(RouterContext context) { + public UPnPManager(RouterContext context, TransportManager manager) { _context = context; + _manager = manager; _log = _context.logManager().getLog(UPnPManager.class); + // UPnP wants to bind to IPv6 link local interfaces by default, but what UPnP router + // is going to want to talk IPv6 anyway? Just make it easy and force IPv4 only + org.cybergarage.upnp.UPnP.setEnable(org.cybergarage.upnp.UPnP.USE_ONLY_IPV4_ADDR); + // set up logging in the UPnP package + Debug.initialize(context); _upnp = new UPnP(context); + _upnp.setHTTPPort(_context.getProperty(PROP_HTTP_PORT, DEFAULT_HTTP_PORT)); + _upnp.setSSDPPort(_context.getProperty(PROP_SSDP_PORT, DEFAULT_SSDP_PORT)); _upnpCallback = new UPnPCallback(); _isRunning = false; } public synchronized void start() { - _log.error("UPnP Start"); - Debug.on(); // UPnP stuff -> wrapper log if (!_isRunning) - _upnp.runPlugin(); - _isRunning = true; + _isRunning = _upnp.runPlugin(); + if (!_isRunning) + _log.error("UPnP start failed - port conflict?"); } public synchronized void stop() { - _log.error("UPnP Stop"); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("UPnP Stop"); if (_isRunning) _upnp.terminate(); _isRunning = false; + _detectedAddress = null; } - /** call when the ports might have changed */ - public void update(Map addresses) { - _log.error("UPnP Update:"); + /** + * Call when the ports might have changed + * The transports can call this pretty quickly at startup, + * which can have multiple UPnP threads running at once, but + * that should be ok. + */ + public void update(Map ports) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("UPnP Update:"); if (!_isRunning) return; - Set forwards = new HashSet(addresses.size()); - for (String style : addresses.keySet()) { - RouterAddress ra = addresses.get(style); - if (ra == null) - continue; - Properties opts = ra.getOptions(); - if (opts == null) - continue; - String s = opts.getProperty("port"); - if (s == null) - continue; - int port = -1; - try { - port = Integer.parseInt(s); - } catch (NumberFormatException nfe) { continue; } + Set forwards = new HashSet(ports.size()); + for (String style : ports.keySet()) { + int port = ports.get(style).intValue(); int protocol = -1; if ("SSU".equals(style)) protocol = ForwardPort.PROTOCOL_UDP_IPV4; @@ -86,30 +97,67 @@ public class UPnPManager { protocol = ForwardPort.PROTOCOL_TCP_IPV4; else continue; - _log.error("Adding: " + style + " " + port); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Adding: " + style + " " + port); ForwardPort fp = new ForwardPort(style, false, protocol, port); forwards.add(fp); } + // non-blocking _upnp.onChangePublicPorts(forwards, _upnpCallback); } - /** just logs for now */ + /** + * This is the callback from UPnP. + * It calls the TransportManager callbacks. + */ private class UPnPCallback implements ForwardPortCallback { /** Called to indicate status on one or more forwarded ports. */ public void portForwardStatus(Map statuses) { - _log.error("UPnP Callback:"); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("UPnP Callback:"); - DetectedIP[] ips = _upnp.getAddress(); - for (DetectedIP ip : ips) { - _log.error("External address: " + ip.publicAddress + " type: " + ip.natType); - } + DetectedIP[] ips = _upnp.getAddress(); + byte[] detected = null; + if (ips != null) { + for (DetectedIP ip : ips) { + // store the first public one and tell the transport manager if it changed + if (TransportImpl.isPubliclyRoutable(ip.publicAddress.getAddress())) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("External address: " + ip.publicAddress + " type: " + ip.natType); + if (!ip.publicAddress.equals(_detectedAddress)) { + _detectedAddress = ip.publicAddress; + _manager.externalAddressReceived(Transport.SOURCE_UPNP, _detectedAddress.getAddress(), 0); + } + break; + } + } + } else { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("No external address returned"); + } - for (ForwardPort fp : statuses.keySet()) { - ForwardPortStatus fps = statuses.get(fp); - _log.error(fp.name + " " + fp.protocol + " " + fp.portNumber + - " status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort); - } - } + for (ForwardPort fp : statuses.keySet()) { + ForwardPortStatus fps = statuses.get(fp); + if (_log.shouldLog(Log.DEBUG)) + _log.debug(fp.name + " " + fp.protocol + " " + fp.portNumber + + " status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort); + String style; + if (fp.protocol == ForwardPort.PROTOCOL_UDP_IPV4) + style = "SSU"; + else if (fp.protocol == ForwardPort.PROTOCOL_TCP_IPV4) + style = "NTCP"; + else + continue; + boolean success = fps.status >= ForwardPortStatus.MAYBE_SUCCESS; + _manager.forwardPortStatus(style, fp.portNumber, success, fps.reasonString); + } + } + } + + public String renderStatusHTML() { + if (!_isRunning) + return "UPnP is not enabled\n"; + return _upnp.renderStatusHTML(); } } diff --git a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java index d18cc1ad3..89d1cf85b 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java @@ -45,7 +45,7 @@ import net.i2p.util.Log; public class EstablishState { private RouterContext _context; private Log _log; - + // bob receives (and alice sends) private byte _X[]; private byte _hX_xor_bobIdentHash[]; @@ -60,28 +60,28 @@ public class EstablishState { private transient long _tsB; private transient long _tsA; private transient byte _e_bobSig[]; - + /** previously received encrypted block (or the IV) */ private byte _prevEncrypted[]; /** current encrypted block we are reading */ private byte _curEncrypted[]; /** - * next index in _curEncrypted to write to (equals _curEncrypted length if the block is + * next index in _curEncrypted to write to (equals _curEncrypted length if the block is * ready to decrypt) */ private int _curEncryptedOffset; /** decryption buffer */ private byte _curDecrypted[]; - + /** bytes received so far */ private int _received; /** bytes sent so far */ private int _sent; - + private byte _extra[]; - + private DHSessionKeyBuilder _dh; - + private NTCPTransport _transport; private NTCPConnection _con; private boolean _corrupt; @@ -92,7 +92,7 @@ public class EstablishState { private boolean _verified; private boolean _confirmWritten; private boolean _failedBySkew; - + public EstablishState(RouterContext ctx, NTCPTransport transport, NTCPConnection con) { _context = ctx; _log = ctx.logManager().getLog(getClass()); @@ -113,15 +113,15 @@ public class EstablishState { byte hx[] = ctx.sha().calculateHash(_X).getData(); DataHelper.xor(hx, 0, con.getRemotePeer().calculateHash().getData(), 0, _hX_xor_bobIdentHash, 0, hx.length); } - + _prevEncrypted = new byte[16]; _curEncrypted = new byte[16]; _curEncryptedOffset = 0; _curDecrypted = new byte[16]; - + _received = 0; } - + /** * parse the contents of the buffer as part of the handshake. if the * handshake is completed and there is more data remaining, the buffer is @@ -133,7 +133,7 @@ public class EstablishState { throw new IllegalStateException(prefix() + "received after completion [corrupt?" + _corrupt + " verified? " + _verified + "] on " + _con); if (!src.hasRemaining()) return; // nothing to receive - + if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix()+"receive " + src); if (_con.isInbound()) @@ -141,15 +141,15 @@ public class EstablishState { else receiveOutbound(src); } - + /** * we have written all of the data required to confirm the connection * establishment */ public boolean confirmWritten() { return _confirmWritten; } - + public boolean getFailedBySkew() { return _failedBySkew; } - + /** we are Bob, so receive these bytes as part of an inbound connection */ private void receiveInbound(ByteBuffer src) { if (_log.shouldLog(Log.DEBUG)) @@ -178,7 +178,7 @@ public class EstablishState { if (_dh.getSessionKey() == null) { if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix()+"Enough data for a DH received"); - + // first verify that Alice knows who she is trying to talk with and that the X // isn't corrupt Hash hX = _context.sha().calculateHash(_X); @@ -201,7 +201,7 @@ public class EstablishState { System.arraycopy(realXor, 16, _prevEncrypted, 0, _prevEncrypted.length); if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix()+"DH session key calculated (" + _dh.getSessionKey().toBase64() + ")"); - + // now prepare our response: Y+E(H(X+Y)+tsB+padding, sk, Y[239:255]) _Y = _dh.getMyPublicValueBytes(); byte xy[] = new byte[_X.length+_Y.length]; @@ -233,7 +233,7 @@ public class EstablishState { byte write[] = new byte[_Y.length + _e_hXY_tsB.length]; System.arraycopy(_Y, 0, write, 0, _Y.length); System.arraycopy(_e_hXY_tsB, 0, write, _Y.length, _e_hXY_tsB.length); - + // ok, now that is prepared, we want to actually send it, so make sure we are up for writing _transport.getPumper().wantsWrite(_con, write); if (!src.hasRemaining()) return; @@ -243,7 +243,7 @@ public class EstablishState { return; } } - + // ok, we are onto the encrypted area while (src.hasRemaining() && !_corrupt) { if (_log.shouldLog(Log.DEBUG)) @@ -256,12 +256,12 @@ public class EstablishState { _context.aes().decrypt(_curEncrypted, 0, _curDecrypted, 0, _dh.getSessionKey(), _prevEncrypted, 0, _curEncrypted.length); //if (_log.shouldLog(Log.DEBUG)) // _log.debug(prefix()+"full block read and decrypted: " + Base64.encode(_curDecrypted)); - + byte swap[] = new byte[16]; _prevEncrypted = _curEncrypted; _curEncrypted = swap; _curEncryptedOffset = 0; - + if (_aliceIdentSize <= 0) { // we are on the first decrypted block _aliceIdentSize = (int)DataHelper.fromLong(_curDecrypted, 0, 2); _sz_aliceIdent_tsA_padding_aliceSigSize = 2 + _aliceIdentSize + 4 + Signature.SIGNATURE_BYTES; @@ -292,8 +292,8 @@ public class EstablishState { if (!_corrupt && _verified && src.hasRemaining()) prepareExtra(src); if (_log.shouldLog(Log.DEBUG)) - _log.debug(prefix()+"verifying size (sz=" + _sz_aliceIdent_tsA_padding_aliceSig.size() - + " expected=" + _sz_aliceIdent_tsA_padding_aliceSigSize + _log.debug(prefix()+"verifying size (sz=" + _sz_aliceIdent_tsA_padding_aliceSig.size() + + " expected=" + _sz_aliceIdent_tsA_padding_aliceSigSize + " corrupt=" + _corrupt + " verified=" + _verified + " extra=" + (_extra != null ? _extra.length : 0) + ")"); return; @@ -310,11 +310,11 @@ public class EstablishState { _log.debug(prefix()+"done with the data, not yet complete or corrupt"); } } - + /** we are Alice, so receive these bytes as part of an outbound connection */ private void receiveOutbound(ByteBuffer src) { if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix()+"Receive outbound " + src + " received=" + _received); - + // recv Y+E(H(X+Y)+tsB, sk, Y[239:255]) while (_received < _Y.length && src.hasRemaining()) { byte c = src.get(); @@ -361,7 +361,7 @@ public class EstablishState { _tsA = _context.clock().now()/1000; // our (Alice's) timestamp in seconds if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix()+"h(X+Y) is correct, tsA-tsB=" + (_tsA-_tsB)); - + // the skew is not authenticated yet, but it is certainly fatal to // the establishment, so fail hard if appropriate long diff = 1000*Math.abs(_tsA-_tsB); @@ -374,7 +374,7 @@ public class EstablishState { } else if (_log.shouldLog(Log.DEBUG)) { _log.debug(prefix()+"Clock skew: " + diff + " ms"); } - + // now prepare and send our response // send E(#+Alice.identity+tsA+padding+S(X+Y+Bob.identHash+tsA+tsB), sk, hX_xor_Bob.identHash[16:31]) int sigSize = _X.length+_Y.length+Hash.HASH_LENGTH+4+4;//+12; @@ -390,11 +390,11 @@ public class EstablishState { //_context.random().nextBytes(sigPad); //System.arraycopy(sigPad, 0, preSign, _X.length+_Y.length+Hash.HASH_LENGTH+4+4, padSig); Signature sig = _context.dsa().sign(preSign, _context.keyManager().getSigningPrivateKey()); - + //if (_log.shouldLog(Log.DEBUG)) { // _log.debug(prefix()+"signing " + Base64.encode(preSign)); //} - + byte ident[] = _context.router().getRouterInfo().getIdentity().toByteArray(); int min = 2+ident.length+4+Signature.SIGNATURE_BYTES; int rem = min % 16; @@ -409,10 +409,10 @@ public class EstablishState { _context.random().nextBytes(pad); System.arraycopy(pad, 0, preEncrypt, 2+ident.length+4, padding); System.arraycopy(sig.getData(), 0, preEncrypt, 2+ident.length+4+padding, Signature.SIGNATURE_BYTES); - + _prevEncrypted = new byte[preEncrypt.length]; _context.aes().encrypt(preEncrypt, 0, _prevEncrypted, 0, _dh.getSessionKey(), _hX_xor_bobIdentHash, _hX_xor_bobIdentHash.length-16, preEncrypt.length); - + if (_log.shouldLog(Log.DEBUG)) { //_log.debug(prefix() + "unencrypted response to Bob: " + Base64.encode(preEncrypt)); //_log.debug(prefix() + "encrypted response to Bob: " + Base64.encode(_prevEncrypted)); @@ -423,7 +423,7 @@ public class EstablishState { } if (_received >= _Y.length + _e_hXY_tsB.length && src.hasRemaining()) { // we are receiving their confirmation - + // recv E(S(X+Y+Alice.identHash+tsA+tsB)+padding, sk, prev) int off = 0; if (_e_bobSig == null) { @@ -439,7 +439,7 @@ public class EstablishState { if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix()+"recv bobSig received=" + _received); _e_bobSig[off++] = src.get(); _received++; - + if (off >= _e_bobSig.length) { //if (_log.shouldLog(Log.DEBUG)) // _log.debug(prefix() + "received E(S(X+Y+Alice.identHash+tsA+tsB)+padding, sk, prev): " + Base64.encode(_e_bobSig)); @@ -449,7 +449,7 @@ public class EstablishState { byte bobSigData[] = new byte[Signature.SIGNATURE_BYTES]; System.arraycopy(bobSig, 0, bobSigData, 0, Signature.SIGNATURE_BYTES); Signature sig = new Signature(bobSigData); - + byte toVerify[] = new byte[_X.length+_Y.length+Hash.HASH_LENGTH+4+4]; int voff = 0; System.arraycopy(_X, 0, toVerify, voff, _X.length); voff += _X.length; @@ -457,12 +457,11 @@ public class EstablishState { System.arraycopy(_context.routerHash().getData(), 0, toVerify, voff, Hash.HASH_LENGTH); voff += Hash.HASH_LENGTH; DataHelper.toLong(toVerify, voff, 4, _tsA); voff += 4; DataHelper.toLong(toVerify, voff, 4, _tsB); voff += 4; - + _verified = _context.dsa().verifySignature(sig, toVerify, _con.getRemotePeer().getSigningPublicKey()); if (!_verified) { _context.statManager().addRateData("ntcp.invalidSignature", 1, 0); fail("Signature was invalid - attempt to spoof " + _con.getRemotePeer().calculateHash().toBase64() + "?"); - return; } else { if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix() + "signature verified from Bob. done!"); @@ -472,18 +471,22 @@ public class EstablishState { byte nextReadIV[] = new byte[16]; System.arraycopy(_e_bobSig, _e_bobSig.length-16, nextReadIV, 0, nextReadIV.length); _con.finishOutboundEstablishment(_dh.getSessionKey(), (_tsA-_tsB), nextWriteIV, nextReadIV); // skew in seconds - return; + // if socket gets closed this will be null - prevent NPE + InetAddress ia = _con.getChannel().socket().getInetAddress(); + if (ia != null) + _transport.setIP(_con.getRemotePeer().calculateHash(), ia.getAddress()); } + return; } } } } - + /** did the handshake fail for some reason? */ public boolean isCorrupt() { return _err != null; } /** @return is the handshake complete and valid? */ public boolean isComplete() { return _verified; } - + /** * we are establishing an outbound connection, so prepare ourselves by * queueing up the write of the first part of the handshake @@ -501,10 +504,10 @@ public class EstablishState { _log.debug(prefix()+"prepare outbound with received=" + _received); } } - + /** * make sure the signatures are correct, and if they are, update the - * NIOConnection with the session key / peer ident / clock skew / iv. + * NIOConnection with the session key / peer ident / clock skew / iv. * The NIOConnection itself is responsible for registering with the * transport */ @@ -513,10 +516,10 @@ public class EstablishState { byte b[] = _sz_aliceIdent_tsA_padding_aliceSig.toByteArray(); //if (_log.shouldLog(Log.DEBUG)) // _log.debug(prefix()+"decrypted sz(etc) data: " + Base64.encode(b)); - + try { RouterIdentity alice = new RouterIdentity(); - int sz = (int)DataHelper.fromLong(b, 0, 2); + int sz = (int)DataHelper.fromLong(b, 0, 2); // TO-DO: Hey zzz... Throws an NPE for me... see below, for my "quick fix", need to find out the real reason if ( (sz <= 0) || (sz > b.length-2-4-Signature.SIGNATURE_BYTES) ) { _context.statManager().addRateData("ntcp.invalidInboundSize", sz, 0); fail("size is invalid", new Exception("size is " + sz)); @@ -526,7 +529,7 @@ public class EstablishState { System.arraycopy(b, 2, aliceData, 0, sz); alice.fromByteArray(aliceData); long tsA = DataHelper.fromLong(b, 2+sz, 4); - + ByteArrayOutputStream baos = new ByteArrayOutputStream(768); baos.write(_X); baos.write(_Y); @@ -534,7 +537,7 @@ public class EstablishState { baos.write(DataHelper.toLong(4, tsA)); baos.write(DataHelper.toLong(4, _tsB)); //baos.write(b, 2+sz+4, b.length-2-sz-4-Signature.SIGNATURE_BYTES); - + byte toVerify[] = baos.toByteArray(); if (_log.shouldLog(Log.DEBUG)) { _log.debug(prefix()+"checking " + Base64.encode(toVerify, 0, 16)); @@ -546,18 +549,24 @@ public class EstablishState { Signature sig = new Signature(s); _verified = _context.dsa().verifySignature(sig, toVerify, alice.getSigningPublicKey()); if (_verified) { + // get inet-addr + InetAddress addr = this._con.getChannel().socket().getInetAddress(); + byte[] ip = (addr == null) ? null : addr.getAddress(); if (_context.shitlist().isShitlistedForever(alice.calculateHash())) { if (_log.shouldLog(Log.WARN)) _log.warn("Dropping inbound connection from permanently shitlisted peer: " + alice.calculateHash().toBase64()); // So next time we will not accept the con from this IP, // rather than doing the whole handshake - _context.blocklist().add(_con.getChannel().socket().getInetAddress().getAddress()); + if(ip != null) + _context.blocklist().add(ip); fail("Peer is shitlisted forever: " + alice.calculateHash().toBase64()); return; } + if(ip != null) + _transport.setIP(alice.calculateHash(), ip); if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix() + "verification successful for " + _con); - + long diff = 1000*Math.abs(tsA-_tsB); if (diff >= Router.CLOCK_FUDGE_FACTOR) { _context.statManager().addRateData("ntcp.invalidInboundSkew", diff, 0); @@ -588,9 +597,11 @@ public class EstablishState { } catch (DataFormatException dfe) { _context.statManager().addRateData("ntcp.invalidInboundDFE", 1, 0); fail("Error verifying peer", dfe); + } catch(NullPointerException npe) { + fail("Error verifying peer", npe); // TO-DO: zzz This is that quick-fix. -- Sponge } } - + private void sendInboundConfirm(RouterIdentity alice, long tsA) { // send Alice E(S(X+Y+Alice.identHash+tsA+tsB), sk, prev) byte toSign[] = new byte[256+256+32+4+4]; @@ -601,7 +612,7 @@ public class EstablishState { System.arraycopy(h.getData(), 0, toSign, off, 32); off += 32; DataHelper.toLong(toSign, off, 4, tsA); off += 4; DataHelper.toLong(toSign, off, 4, _tsB); off += 4; - + Signature sig = _context.dsa().sign(toSign, _context.keyManager().getSigningPrivateKey()); byte preSig[] = new byte[Signature.SIGNATURE_BYTES+8]; byte pad[] = new byte[8]; @@ -610,12 +621,12 @@ public class EstablishState { System.arraycopy(pad, 0, preSig, Signature.SIGNATURE_BYTES, pad.length); _e_bobSig = new byte[preSig.length]; _context.aes().encrypt(preSig, 0, _e_bobSig, 0, _dh.getSessionKey(), _e_hXY_tsB, _e_hXY_tsB.length-16, _e_bobSig.length); - + if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix() + "Sending encrypted inbound confirmation"); _transport.getPumper().wantsWrite(_con, _e_bobSig); } - + /** anything left over in the byte buffer after verification is extra */ private void prepareExtra(ByteBuffer buf) { int remaining = buf.remaining(); @@ -627,13 +638,13 @@ public class EstablishState { if (_log.shouldLog(Log.DEBUG)) _log.debug(prefix() + "prepare extra " + remaining + " (total received: " + _received + ")"); } - + /** * if complete, this will contain any bytes received as part of the * handshake that were after the actual handshake. This may return null. */ public byte[] getExtraBytes() { return _extra; } - + private void fail(String reason) { fail(reason, null); } private void fail(String reason, Exception e) { fail(reason, e, false); } private void fail(String reason, Exception e, boolean bySkew) { @@ -644,13 +655,14 @@ public class EstablishState { if (_log.shouldLog(Log.WARN)) _log.warn(prefix()+"Failed to establish: " + _err, e); } - + public String getError() { return _err; } public Exception getException() { return _e; } - + private String prefix() { return toString(); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("est").append(System.identityHashCode(this)); if (_con.isInbound()) buf.append(" inbound"); else buf.append(" outbound"); @@ -660,7 +672,7 @@ public class EstablishState { buf.append(": "); return buf.toString(); } - + /** * a check info connection will receive 256 bytes containing: * - 32 bytes of uninterpreted, ignored data @@ -694,7 +706,7 @@ public class EstablishState { off += 4; long skewSeconds = (ctx.clock().now()/1000)-now; if (log.shouldLog(Log.INFO)) - log.info("Check info received: our IP: " + ourIP + " our port: " + port + log.info("Check info received: our IP: " + ourIP + " our port: " + port + " skew: " + skewSeconds + " s"); } catch (UnknownHostException uhe) { // ipSize is invalid @@ -708,7 +720,7 @@ public class EstablishState { return false; } } - + public static void checkHost(String args[]) { if (args.length != 3) { System.err.println("Usage: EstablishState ipOrHostname portNum peerHashBase64"); @@ -737,7 +749,7 @@ public class EstablishState { Hash h = ctx.sha().calculateHash(toSend, 32, toSend.length-32-32); DataHelper.xor(peer, 0, h.getData(), 0, toSend, toSend.length-32, peer.length); System.out.println("check hash: " + h.toBase64()); - + out.write(toSend); out.flush(); try { Thread.sleep(1000); } catch (InterruptedException ie) {} @@ -746,7 +758,7 @@ public class EstablishState { e.printStackTrace(); } } - + public static void main(String args[]) { if (args.length == 3) { checkHost(args); @@ -771,7 +783,7 @@ public class EstablishState { out.write(hx_xor_bih); out.flush(); // DONE SENDING X+(H(X) xor Bob.identHash)-----------------------------> - + // NOW READ Y+E(H(X+Y)+tsB+padding, sk, Y[239:255]) InputStream in = s.getInputStream(); byte toRead[] = new byte[256+(32+4+12)]; @@ -799,9 +811,9 @@ public class EstablishState { System.out.println("encrypted H(X+Y)+tsB+padding: " + Base64.encode(toRead, Y.length, toRead.length-Y.length)); System.out.println("unencrypted H(X+Y)+tsB+padding: " + Base64.encode(decrypted)); long tsB = DataHelper.fromLong(decrypted, 32, 4); - + //try { Thread.sleep(40*1000); } catch (InterruptedException ie) {} - + RouterIdentity alice = new RouterIdentity(); Object k[] = ctx.keyGenerator().generatePKIKeypair(); PublicKey pub = (PublicKey)k[0]; @@ -812,16 +824,16 @@ public class EstablishState { alice.setCertificate(new Certificate(Certificate.CERTIFICATE_TYPE_NULL, null)); alice.setPublicKey(pub); alice.setSigningPublicKey(spub); - + // SEND E(#+Alice.identity+tsA+padding+S(X+Y+Bob.identHash+tsA+tsB+padding), sk, hX_xor_Bob.identHash[16:31])---> - + ByteArrayOutputStream baos = new ByteArrayOutputStream(512); byte aliceb[] = alice.toByteArray(); long tsA = ctx.clock().now()/1000l; baos.write(DataHelper.toLong(2, aliceb.length)); baos.write(aliceb); baos.write(DataHelper.toLong(4, tsA)); - + int base = baos.size() + Signature.SIGNATURE_BYTES; int rem = base % 16; int padding = 0; @@ -831,7 +843,7 @@ public class EstablishState { ctx.random().nextBytes(pad); baos.write(pad); base += padding; - + ByteArrayOutputStream sbaos = new ByteArrayOutputStream(512); sbaos.write(X); sbaos.write(Y); @@ -841,21 +853,21 @@ public class EstablishState { //sbaos.write(pad); Signature sig = ctx.dsa().sign(sbaos.toByteArray(), spriv); baos.write(sig.toByteArray()); - + byte unencrypted[] = baos.toByteArray(); byte toWrite[] = new byte[unencrypted.length]; System.out.println("unencrypted.length = " + unencrypted.length + " alice.size = " + aliceb.length + " padding = " + padding + " base = " + base); ctx.aes().encrypt(unencrypted, 0, toWrite, 0, dh.getSessionKey(), hx_xor_bih, 16, unencrypted.length); - + out.write(toWrite); out.flush(); - + System.out.println("unencrypted: " + Base64.encode(unencrypted)); System.out.println("encrypted: " + Base64.encode(toWrite)); System.out.println("Local peer: " + alice.calculateHash().toBase64()); // now check bob's signature - + SigningPublicKey bobPubKey = null; try { RouterInfo info = new RouterInfo(); @@ -865,9 +877,9 @@ public class EstablishState { e.printStackTrace(); return; } - + System.out.println("Reading in bob's sig"); - + byte bobRead[] = new byte[48]; read = 0; while (read < bobRead.length) { @@ -883,7 +895,7 @@ public class EstablishState { byte bobSigData[] = new byte[Signature.SIGNATURE_BYTES]; System.arraycopy(preSig, 0, bobSigData, 0, Signature.SIGNATURE_BYTES); // ignore the padding System.out.println("Bob's sig: " + Base64.encode(bobSigData)); - + byte signed[] = new byte[256+256+32+4+4]; int off = 0; System.arraycopy(X, 0, signed, off, 256); off += 256; @@ -895,18 +907,18 @@ public class EstablishState { Signature bobSig = new Signature(bobSigData); boolean ok = ctx.dsa().verifySignature(bobSig, signed, bobPubKey); - + System.out.println("bob's sig matches? " + ok); - + try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} byte fakeI2NPbuf[] = new byte[128]; ctx.random().nextBytes(fakeI2NPbuf); out.write(fakeI2NPbuf); out.flush(); - + try { Thread.sleep(30*1000); } catch (InterruptedException ie) {} s.close(); - } catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java index 9c75f5328..89c12250c 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java @@ -31,13 +31,13 @@ import net.i2p.util.Log; public class EventPumper implements Runnable { private RouterContext _context; private Log _log; - private boolean _alive; + private volatile boolean _alive; private Selector _selector; - private List _bufCache; - private List _wantsRead; - private List _wantsWrite; - private List _wantsRegister; - private List _wantsConRegister; + private final List _bufCache; + private final List _wantsRead = new ArrayList(16); + private final List _wantsWrite = new ArrayList(4); + private final List _wantsRegister = new ArrayList(1); + private final List _wantsConRegister = new ArrayList(4); private NTCPTransport _transport; private long _expireIdleWriteTime; @@ -51,7 +51,8 @@ public class EventPumper implements Runnable { * the time to iterate across them to check a few flags shouldn't be a problem. */ private static final long FAILSAFE_ITERATION_FREQ = 2*1000l; - private static final long MIN_EXPIRE_IDLE_TIME = 5*60*1000l; + /** tunnel test is every 30-60s, so this should be longer than, say, 3*45s to allow for drops */ + private static final long MIN_EXPIRE_IDLE_TIME = 3*60*1000l; private static final long MAX_EXPIRE_IDLE_TIME = 15*60*1000l; public EventPumper(RouterContext ctx, NTCPTransport transport) { @@ -63,25 +64,28 @@ public class EventPumper implements Runnable { _expireIdleWriteTime = MAX_EXPIRE_IDLE_TIME; } - public void startPumping() { + public synchronized void startPumping() { if (_log.shouldLog(Log.INFO)) _log.info("Starting pumper"); - _alive = true; - _wantsRead = new ArrayList(16); - _wantsWrite = new ArrayList(4); - _wantsRegister = new ArrayList(1); - _wantsConRegister = new ArrayList(4); +// _wantsRead = new ArrayList(16); +// _wantsWrite = new ArrayList(4); +// _wantsRegister = new ArrayList(1); +// _wantsConRegister = new ArrayList(4); try { _selector = Selector.open(); + _alive = true; + new I2PThread(this, "NTCP Pumper", true).start(); } catch (IOException ioe) { - _log.error("Error opening the selector", ioe); + _log.log(Log.CRIT, "Error opening the NTCP selector", ioe); + } catch (java.lang.InternalError jlie) { + // "unable to get address of epoll functions, pre-2.6 kernel?" + _log.log(Log.CRIT, "Error opening the NTCP selector", jlie); } - new I2PThread(this, "NTCP Pumper", true).start(); } - public void stopPumping() { + public synchronized void stopPumping() { _alive = false; - if (_selector.isOpen()) + if (_selector != null && _selector.isOpen()) _selector.wakeup(); } diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java index 71d395e5f..860634d8f 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java @@ -124,8 +124,10 @@ public class NTCPAddress { } } + @Override public String toString() { return _host + ":" + _port; } + @Override public int hashCode() { int rv = 0; rv += _port; @@ -136,6 +138,7 @@ public class NTCPAddress { return rv; } + @Override public boolean equals(Object val) { if ( (val != null) && (val instanceof NTCPAddress) ) { NTCPAddress addr = (NTCPAddress)val; diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java index 5610d62e1..e30783768 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -56,13 +56,13 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { private SocketChannel _chan; private SelectionKey _conKey; /** list of ByteBuffer containing data we have read and are ready to process, oldest first */ - private List _readBufs; + private final List _readBufs; /** * list of ByteBuffers containing fully populated and encrypted data, ready to write, * and already cleared through the bandwidth limiter. */ - private List _writeBufs; - private List _bwRequests; + private final List _writeBufs; + private final List _bwRequests; private boolean _established; private long _establishedOn; private EstablishState _establishState; @@ -75,7 +75,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { /** * pending unprepared OutNetMessage instances */ - private List _outbound; + private final List _outbound; /** current prepared OutNetMessage, or null */ private OutNetMessage _currentOutbound; private SessionKey _sessionKey; @@ -96,14 +96,24 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { private long _created; private long _nextMetaTime; /** unencrypted outbound metadata buffer */ - private byte _meta[] = new byte[16]; + private final byte _meta[] = new byte[16]; private boolean _sendingMeta; /** how many consecutive sends were failed due to (estimated) send queue time */ private int _consecutiveBacklog; private long _nextInfoTime; private static final int META_FREQUENCY = 10*60*1000; - private static final int INFO_FREQUENCY = 6*60*60*1000; + /** how often we send our routerinfo unsolicited */ + private static final int INFO_FREQUENCY = 90*60*1000; + /** + * Why this is 16K, and where it is documented, good question? + * We claim we can do 32K datagrams so this is a problem. + * Needs to be fixed. But SSU can handle it? + * In the meantime, don't let the transport bid on big messages. + */ + public static final int BUFFER_SIZE = 16*1024; + /** 2 bytes for length and 4 for CRC */ + public static final int MAX_MSG_SIZE = BUFFER_SIZE - (2 + 4); /** * Create an inbound connected (though not established) NTCP connection @@ -191,7 +201,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { _transport.inboundEstablished(this); _establishState = null; _nextMetaTime = System.currentTimeMillis() + _context.random().nextInt(META_FREQUENCY); - _nextInfoTime = System.currentTimeMillis() + INFO_FREQUENCY + _context.random().nextInt(INFO_FREQUENCY); + _nextInfoTime = System.currentTimeMillis() + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); } public long getClockSkew() { return _clockSkew; } public long getUptime() { @@ -361,7 +371,8 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { _context.statManager().addRateData("ntcp.infoMessageEnqueued", 1, 0); send(infoMsg); - enqueueFloodfillMessage(target); + // See comment below + //enqueueFloodfillMessage(target); } else { if (_isInbound) { // ok, we shouldn't have enqueued it yet, as we havent received their info @@ -371,12 +382,18 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { } } - private static final int PEERS_TO_FLOOD = 3; + //private static final int PEERS_TO_FLOOD = 3; /** * to prevent people from losing track of the floodfill peers completely, lets periodically * send those we are connected to references to the floodfill peers that we know + * + * Do we really need this anymore??? Peers shouldn't lose track anymore, and if they do, + * FloodOnlyLookupJob should recover. + * The bandwidth isn't so much, but it is a lot of extra data at connection startup, which + * hurts latency of new connections. */ +/********** private void enqueueFloodfillMessage(RouterInfo target) { FloodfillNetworkDatabaseFacade fac = (FloodfillNetworkDatabaseFacade)_context.netDb(); List peers = fac.getFloodfillPeers(); @@ -389,6 +406,8 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { continue; RouterInfo info = fac.lookupRouterInfoLocally(peer); + if (info == null) + continue; OutNetMessage infoMsg = new OutNetMessage(_context); infoMsg.setExpiration(_context.clock().now()+10*1000); @@ -403,6 +422,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { send(infoMsg); } } +***********/ /** * @param clockSkew alice's clock minus bob's clock in seconds (may be negative, obviously, but |val| should @@ -428,7 +448,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { msgs = (_outbound.size() > 0); } _nextMetaTime = System.currentTimeMillis() + _context.random().nextInt(META_FREQUENCY); - _nextInfoTime = System.currentTimeMillis() + INFO_FREQUENCY + _context.random().nextInt(INFO_FREQUENCY); + _nextInfoTime = System.currentTimeMillis() + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); if (msgs) _transport.getWriter().wantsWrite(this, "outbound established"); } @@ -454,11 +474,12 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { * */ synchronized void prepareNextWrite() { - if (FAST_LARGE) + //if (FAST_LARGE) prepareNextWriteFast(); - else - prepareNextWriteSmall(); + //else + // prepareNextWriteSmall(); } +/********** nobody's tried this one in years private void prepareNextWriteSmall() { if (_log.shouldLog(Log.DEBUG)) _log.debug("prepare next write w/ isInbound? " + _isInbound + " established? " + _established); @@ -552,9 +573,10 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { // the floodfill netDb servers, but they may...) if (_nextInfoTime <= System.currentTimeMillis()) { enqueueInfoMessage(); - _nextInfoTime = System.currentTimeMillis() + INFO_FREQUENCY + _context.random().nextInt(INFO_FREQUENCY); + _nextInfoTime = System.currentTimeMillis() + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); } } +**********/ /** * prepare the next i2np message for transmission. this should be run from @@ -636,7 +658,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { if (_nextInfoTime <= System.currentTimeMillis()) { // perhaps this should check to see if we are bw throttled, etc? enqueueInfoMessage(); - _nextInfoTime = System.currentTimeMillis() + INFO_FREQUENCY + _context.random().nextInt(INFO_FREQUENCY); + _nextInfoTime = System.currentTimeMillis() + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); } } @@ -695,7 +717,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { private static int NUM_PREP_BUFS = 5; private static int __liveBufs = 0; private static int __consecutiveExtra; - private static List _bufs = new ArrayList(NUM_PREP_BUFS); + private final static List _bufs = new ArrayList(NUM_PREP_BUFS); private PrepBuffer acquireBuf() { synchronized (_bufs) { if (_bufs.size() > 0) { @@ -1016,7 +1038,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { _curReadState.receiveBlock(_decryptBlockBuf); if (_curReadState.getSize() > 16*1024) { if (_log.shouldLog(Log.ERROR)) - _log.error("i2np message more than 16KB? nuh uh: " + _curReadState.getSize()); + _log.error("I2NP message too big - size: " + _curReadState.getSize() + " Dropping " + toString()); _context.statManager().addRateData("ntcp.corruptTooLargeI2NP", _curReadState.getSize(), getUptime()); close(); return false; @@ -1084,11 +1106,17 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { // enqueueInfoMessage(); // this often? } + @Override public int hashCode() { return System.identityHashCode(this); } - public boolean equals(Object obj) { return obj == this; } + @Override + public boolean equals(Object obj) { + if(obj == null) return false; + if(obj.getClass() != NTCPConnection.class) return false; + return obj == this; + } - private static List _i2npHandlers = new ArrayList(4); - private static I2NPMessageHandler acquireHandler(RouterContext ctx) { + private final static List _i2npHandlers = new ArrayList(4); + private final static I2NPMessageHandler acquireHandler(RouterContext ctx) { I2NPMessageHandler rv = null; synchronized (_i2npHandlers) { if (_i2npHandlers.size() > 0) @@ -1118,7 +1146,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { } private static int MAX_DATA_READ_BUFS = 16; - private static List _dataReadBufs = new ArrayList(16); + private final static List _dataReadBufs = new ArrayList(16); private static DataBuf acquireReadBuf() { synchronized (_dataReadBufs) { if (_dataReadBufs.size() > 0) @@ -1280,6 +1308,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { } } + @Override public String toString() { return "NTCP Connection to " + (_remotePeer == null ? "unknown " : _remotePeer.calculateHash().toBase64().substring(0,6)) + diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java index 8d19c6249..207db4c3c 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java @@ -42,7 +42,8 @@ public class NTCPSendFinisher { } public void stop() { - _executor.shutdownNow(); + if (_executor != null) + _executor.shutdownNow(); } public void add(OutNetMessage msg) { diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index 2d5df4be0..b21156f1c 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -20,6 +20,7 @@ import net.i2p.data.Hash; import net.i2p.data.RouterAddress; import net.i2p.data.RouterIdentity; import net.i2p.data.RouterInfo; +import net.i2p.router.CommSystemFacade; import net.i2p.router.OutNetMessage; import net.i2p.router.RouterContext; import net.i2p.router.transport.CommSystemFacadeImpl; @@ -35,9 +36,11 @@ public class NTCPTransport extends TransportImpl { private Log _log; private SharedBid _fastBid; private SharedBid _slowBid; + /** save some conns for inbound */ + private SharedBid _nearCapacityBid; private SharedBid _transientFail; - private Object _conLock; - private Map _conByIdent; + private final Object _conLock; + private Map _conByIdent; private NTCPAddress _myAddress; private EventPumper _pumper; private Reader _reader; @@ -46,94 +49,97 @@ public class NTCPTransport extends TransportImpl { * list of NTCPConnection of connections not yet established that we * want to remove on establishment or close on timeout */ - private List _establishing; + private final List _establishing; private List _sent; private NTCPSendFinisher _finisher; - + private static final long[] RATES = { 10*60*1000 }; + public NTCPTransport(RouterContext ctx) { super(ctx); - + _log = ctx.logManager().getLog(getClass()); - _context.statManager().createRateStat("ntcp.sendTime", "Total message lifetime when sent completely", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.transmitTime", "How long after message preparation before the message was fully sent", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.sendQueueSize", "How many messages were ahead of the current one on the connection's queue when it was first added", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.receiveTime", "How long it takes to receive an inbound message", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.receiveSize", "How large the received message was", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.sendBacklogTime", "How long the head of the send queue has been waiting when we fail to add a new one to the queue (period is the number of messages queued)", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.failsafeWrites", "How many times do we need to proactively add in an extra nio write to a peer at any given failsafe pass?", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.failsafeCloses", "How many times do we need to proactively close an idle connection to a peer at any given failsafe pass?", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.failsafeInvalid", "How many times do we close a connection to a peer to work around a JVM bug?", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.accept", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.attemptShitlistedPeer", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.attemptUnreachablePeer", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.closeOnBacklog", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.connectFailedIOE", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.connectFailedInvalidPort", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.bidRejectedLocalAddress", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.bidRejectedNoNTCPAddress", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.connectFailedTimeout", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.connectFailedTimeoutIOE", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.connectFailedUnresolved", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.connectImmediate", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.connectSuccessful", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.corruptDecryptedI2NP", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.corruptI2NPCRC", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.corruptI2NPIME", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.corruptI2NPIOE", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.corruptMetaCRC", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.corruptSkew", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.corruptTooLargeI2NP", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.dontSendOnBacklog", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.inboundCheckConnection", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.inboundEstablished", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.inboundEstablishedDuplicate", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.infoMessageEnqueued", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.floodInfoMessageEnqueued", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidDH", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidHXY", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidHXxorBIH", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidInboundDFE", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidInboundIOE", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidInboundSignature", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidInboundSize", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidInboundSkew", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidSignature", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.liveReadBufs", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.multipleCloseOnRemove", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.outboundEstablishFailed", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.outboundFailedIOEImmediate", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.invalidOutboundSkew", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.prepBufCache", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.queuedRecv", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.read", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.readEOF", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.readError", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.receiveCorruptEstablishment", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.receiveMeta", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.registerConnect", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.throttledReadComplete", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.throttledWriteComplete", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.wantsQueuedWrite", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.write", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("ntcp.writeError", "", "ntcp", new long[] { 60*1000, 10*60*1000 }); + _context.statManager().createRateStat("ntcp.sendTime", "Total message lifetime when sent completely", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.transmitTime", "How long after message preparation before the message was fully sent", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.sendQueueSize", "How many messages were ahead of the current one on the connection's queue when it was first added", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.receiveTime", "How long it takes to receive an inbound message", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.receiveSize", "How large the received message was", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.sendBacklogTime", "How long the head of the send queue has been waiting when we fail to add a new one to the queue (period is the number of messages queued)", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.failsafeWrites", "How many times do we need to proactively add in an extra nio write to a peer at any given failsafe pass?", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.failsafeCloses", "How many times do we need to proactively close an idle connection to a peer at any given failsafe pass?", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.failsafeInvalid", "How many times do we close a connection to a peer to work around a JVM bug?", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.accept", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.attemptShitlistedPeer", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.attemptUnreachablePeer", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.closeOnBacklog", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.connectFailedIOE", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.connectFailedInvalidPort", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.bidRejectedLocalAddress", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.bidRejectedNoNTCPAddress", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.connectFailedTimeout", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.connectFailedTimeoutIOE", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.connectFailedUnresolved", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.connectImmediate", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.connectSuccessful", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.corruptDecryptedI2NP", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.corruptI2NPCRC", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.corruptI2NPIME", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.corruptI2NPIOE", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.corruptMetaCRC", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.corruptSkew", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.corruptTooLargeI2NP", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.dontSendOnBacklog", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.inboundCheckConnection", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.inboundEstablished", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.inboundEstablishedDuplicate", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.infoMessageEnqueued", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.floodInfoMessageEnqueued", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidDH", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidHXY", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidHXxorBIH", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidInboundDFE", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidInboundIOE", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidInboundSignature", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidInboundSize", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidInboundSkew", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidSignature", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.liveReadBufs", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.multipleCloseOnRemove", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.outboundEstablishFailed", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.outboundFailedIOEImmediate", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.invalidOutboundSkew", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.noBidTooLargeI2NP", "send size", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.prepBufCache", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.queuedRecv", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.read", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.readEOF", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.readError", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.receiveCorruptEstablishment", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.receiveMeta", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.registerConnect", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.throttledReadComplete", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.throttledWriteComplete", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.wantsQueuedWrite", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.write", "", "ntcp", RATES); + _context.statManager().createRateStat("ntcp.writeError", "", "ntcp", RATES); _establishing = new ArrayList(4); _conLock = new Object(); _conByIdent = new HashMap(64); - + _sent = new ArrayList(4); _finisher = new NTCPSendFinisher(ctx, this); - + _pumper = new EventPumper(ctx, this); _reader = new Reader(ctx); _writer = new net.i2p.router.transport.ntcp.Writer(ctx); - + _fastBid = new SharedBid(25); // best _slowBid = new SharedBid(70); // better than ssu unestablished, but not better than ssu established + _nearCapacityBid = new SharedBid(90); // not better than ssu - save our conns for inbound _transientFail = new SharedBid(TransportBid.TRANSIENT_FAIL); } - + void inboundEstablished(NTCPConnection con) { _context.statManager().addRateData("ntcp.inboundEstablished", 1, 0); markReachable(con.getRemotePeer().calculateHash(), true); @@ -149,7 +155,7 @@ public class NTCPTransport extends TransportImpl { old.close(); } } - + protected void outboundMessageReady() { OutNetMessage msg = getNextMessage(); if (msg != null) { @@ -218,7 +224,7 @@ public class NTCPTransport extends TransportImpl { } con.enqueueInfoMessage(); // enqueues a netDb store of our own info con.send(msg); // doesn't do anything yet, just enqueues it - + try { SocketChannel channel = SocketChannel.open(); con.setChannel(channel); @@ -236,11 +242,19 @@ public class NTCPTransport extends TransportImpl { */ } } - + + @Override public void afterSend(OutNetMessage msg, boolean sendSuccessful, boolean allowRequeue, long msToSend) { super.afterSend(msg, sendSuccessful, allowRequeue, msToSend); } public TransportBid bid(RouterInfo toAddress, long dataSize) { + if (!isAlive()) + return null; + if (dataSize > NTCPConnection.MAX_MSG_SIZE) { + // let SSU deal with it + _context.statManager().addRateData("ntcp.noBidTooLargeI2NP", dataSize, 0); + return null; + } Hash peer = toAddress.getIdentity().calculateHash(); if (_context.shitlist().isShitlisted(peer, STYLE)) { // we aren't shitlisted in general (since we are trying to get a bid), but we have @@ -251,21 +265,21 @@ public class NTCPTransport extends TransportImpl { _context.statManager().addRateData("ntcp.attemptUnreachablePeer", 1, 0); return null; } - + boolean established = isEstablished(toAddress.getIdentity()); if (established) { // should we check the queue size? nah, if its valid, use it if (_log.shouldLog(Log.DEBUG)) - _log.debug("fast bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as its already established"); + _log.debug("fast bid when trying to send to " + peer.toBase64() + " as its already established"); return _fastBid; } RouterAddress addr = toAddress.getTargetAddress(STYLE); - + if (addr == null) { markUnreachable(peer); _context.statManager().addRateData("ntcp.bidRejectedNoNTCPAddress", 1, 0); //_context.shitlist().shitlistRouter(toAddress.getIdentity().calculateHash(), "No NTCP address", STYLE); if (_log.shouldLog(Log.DEBUG)) - _log.debug("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as they don't have an ntcp address"); + _log.debug("no bid when trying to send to " + peer.toBase64() + " as they don't have an ntcp address"); return null; } NTCPAddress naddr = new NTCPAddress(addr); @@ -274,7 +288,7 @@ public class NTCPTransport extends TransportImpl { markUnreachable(peer); //_context.shitlist().shitlistRouter(toAddress.getIdentity().calculateHash(), "Invalid NTCP address", STYLE); if (_log.shouldLog(Log.DEBUG)) - _log.debug("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as they don't have a valid ntcp address"); + _log.debug("no bid when trying to send to " + peer.toBase64() + " as they don't have a valid ntcp address"); return null; } if (!naddr.isPubliclyRoutable()) { @@ -282,31 +296,30 @@ public class NTCPTransport extends TransportImpl { _context.statManager().addRateData("ntcp.bidRejectedLocalAddress", 1, 0); markUnreachable(peer); if (_log.shouldLog(Log.DEBUG)) - _log.debug("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as they have a private ntcp address"); + _log.debug("no bid when trying to send to " + peer.toBase64() + " as they have a private ntcp address"); return null; } } - + if (!allowConnection()) { if (_log.shouldLog(Log.WARN)) - _log.warn("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + ", max connection limit reached"); + _log.warn("no bid when trying to send to " + peer.toBase64() + ", max connection limit reached"); return _transientFail; } - //if ( (_myAddress != null) && (_myAddress.equals(addr)) ) + //if ( (_myAddress != null) && (_myAddress.equals(addr)) ) // return null; // dont talk to yourself - + if (_log.shouldLog(Log.DEBUG)) - _log.debug("slow bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64()); - return _slowBid; - } - - public boolean allowConnection() { - return countActivePeers() < getMaxConnections(); + _log.debug("slow bid when trying to send to " + peer.toBase64()); + if (haveCapacity()) + return _slowBid; + else + return _nearCapacityBid; } - public boolean haveCapacity() { - return countActivePeers() < getMaxConnections() * 4 / 5; + public boolean allowConnection() { + return countActivePeers() < getMaxConnections(); } /** queue up afterSend call, which can take some time w/ jobs, etc */ @@ -315,21 +328,23 @@ public class NTCPTransport extends TransportImpl { private boolean isEstablished(RouterIdentity peer) { return isEstablished(peer.calculateHash()); } - + + @Override public boolean isEstablished(Hash dest) { synchronized (_conLock) { NTCPConnection con = (NTCPConnection)_conByIdent.get(dest); return (con != null) && con.isEstablished() && !con.isClosed(); } } - + + @Override public boolean isBacklogged(Hash dest) { synchronized (_conLock) { NTCPConnection con = (NTCPConnection)_conByIdent.get(dest); return (con != null) && con.isEstablished() && con.tooBacklogged(); } } - + void removeCon(NTCPConnection con) { NTCPConnection removed = null; synchronized (_conLock) { @@ -344,15 +359,17 @@ public class NTCPTransport extends TransportImpl { removed.close(); } } - + /** * How many peers can we talk to right now? * */ + @Override public int countActivePeers() { synchronized (_conLock) { return _conByIdent.size(); } } /** * How many peers are we actively sending messages to (this minute) */ + @Override public int countActiveSendPeers() { int active = 0; synchronized (_conLock) { @@ -364,11 +381,12 @@ public class NTCPTransport extends TransportImpl { } return active; } - + /** * Return our peer clock skews on this transport. * Vector composed of Long, each element representing a peer skew in seconds. */ + @Override public Vector getClockSkews() { Vector peers = new Vector(); @@ -386,31 +404,34 @@ public class NTCPTransport extends TransportImpl { _log.debug("NTCP transport returning " + skews.size() + " peer clock skews."); return skews; } - + private static final int NUM_CONCURRENT_READERS = 3; private static final int NUM_CONCURRENT_WRITERS = 3; - - public RouterAddress startListening() { - if (_log.shouldLog(Log.DEBUG)) _log.debug("Starting ntcp transport listening"); + + public synchronized RouterAddress startListening() { + if (_log.shouldLog(Log.WARN)) _log.warn("Starting ntcp transport listening"); _finisher.start(); _pumper.startPumping(); - + _reader.startReading(NUM_CONCURRENT_READERS); _writer.startWriting(NUM_CONCURRENT_WRITERS); - + configureLocalAddress(); return bindAddress(); } - public RouterAddress restartListening(RouterAddress addr) { - if (_log.shouldLog(Log.DEBUG)) _log.debug("Restarting ntcp transport listening"); + public synchronized RouterAddress restartListening(RouterAddress addr) { + if (_log.shouldLog(Log.WARN)) _log.warn("Restarting ntcp transport listening"); _finisher.start(); _pumper.startPumping(); - + _reader.startReading(NUM_CONCURRENT_READERS); _writer.startWriting(NUM_CONCURRENT_WRITERS); - - _myAddress = new NTCPAddress(addr); + + if (addr == null) + _myAddress = null; + else + _myAddress = new NTCPAddress(addr); return bindAddress(); } @@ -440,7 +461,7 @@ public class NTCPTransport extends TransportImpl { if (_log.shouldLog(Log.INFO)) _log.info("Outbound NTCP connections only - no listener configured"); } - + if (_myAddress != null) { RouterAddress rv = _myAddress.toRouterAddress(); if (rv != null) @@ -450,12 +471,12 @@ public class NTCPTransport extends TransportImpl { return null; } } - + Reader getReader() { return _reader; } net.i2p.router.transport.ntcp.Writer getWriter() { return _writer; } public String getStyle() { return STYLE; } EventPumper getPumper() { return _pumper; } - + /** * how long from initial connection attempt (accept() or connect()) until * the con must be established to avoid premature close()ing @@ -496,9 +517,9 @@ public class NTCPTransport extends TransportImpl { if ( (expired != null) && (expired.size() > 0) ) _context.statManager().addRateData("ntcp.outboundEstablishFailed", expired.size(), 0); } - + //private boolean bindAllInterfaces() { return true; } - + private void configureLocalAddress() { RouterContext ctx = getContext(); if (ctx == null) { @@ -523,13 +544,61 @@ public class NTCPTransport extends TransportImpl { } } } - + + /** + * If we didn't used to be forwarded, and we have an address, + * and we are configured to use UPnP, update our RouterAddress + * + * Don't do anything now. If it fails, we don't know if it's + * because there is no firewall, or if the firewall rejected the request. + * So we just use the SSU reachability status + * to decide whether to enable inbound NTCP. SSU will have CSFI build a new + * NTCP address when it transitions to OK. + */ + public void forwardPortStatus(int port, boolean success, String reason) { + if (_log.shouldLog(Log.WARN)) { + if (success) + _log.warn("UPnP has opened the NTCP port: " + port); + else + _log.warn("UPnP has failed to open the NTCP port: " + port + " reason: " + reason); + } + } + + public int getRequestedPort() { + // would be nice to do this here but we can't easily get to the UDP transport.getRequested_Port() + // from here, so we do it in TransportManager. + // if (Boolean.valueOf(_context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_PORT)).booleanValue()) + // return foo; + return _context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_PORT, -1); + } + + /** + * Maybe we should trust UPnP here and report OK if it opened the port, but + * for now we don't. Just go through and if we have one inbound connection, + * we must be good. As we drop idle connections pretty quickly, this will + * be fairly accurate. + * + * We have to be careful here because much of the router console code assumes + * that the reachability status is really just the UDP status. + */ + public short getReachabilityStatus() { + if (isAlive() && _myAddress != null) { + synchronized (_conLock) { + for (NTCPConnection con : _conByIdent.values()) { + if (con.isInbound()) + return CommSystemFacade.STATUS_OK; + } + } + } + return CommSystemFacade.STATUS_UNKNOWN; + } + /** * This doesn't (completely) block, caller should check isAlive() * before calling startListening() or restartListening() */ - public void stopListening() { - if (_log.shouldLog(Log.DEBUG)) _log.debug("Stopping ntcp transport"); + public synchronized void stopListening() { + if (_log.shouldLog(Log.WARN)) _log.warn("Stopping ntcp transport"); _pumper.stopPumping(); _writer.stopWriting(); _reader.stopReading(); @@ -547,8 +616,9 @@ public class NTCPTransport extends TransportImpl { replaceAddress(null); } public static final String STYLE = "NTCP"; - + public void renderStatusHTML(java.io.Writer out, int sortFlags) throws IOException {} + @Override public void renderStatusHTML(java.io.Writer out, String urlBase, int sortFlags) throws IOException { TreeSet peers = new TreeSet(getComparator(sortFlags)); synchronized (_conLock) { @@ -562,47 +632,48 @@ public class NTCPTransport extends TransportImpl { long sendTotal = 0; long recvTotal = 0; int numPeers = 0; - int readingPeers = 0; - int writingPeers = 0; float bpsSend = 0; float bpsRecv = 0; long totalUptime = 0; long totalSend = 0; long totalRecv = 0; - - StringBuffer buf = new StringBuffer(512); - buf.append("NTCP connections: ").append(peers.size()); - buf.append(" limit: ").append(getMaxConnections()); - buf.append(" timeout: ").append(DataHelper.formatDuration(_pumper.getIdleTimeout())); - buf.append("
              \n"); - buf.append("\n"); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); - buf.append(" "); + + StringBuilder buf = new StringBuilder(512); + buf.append("

              NTCP connections: ").append(peers.size()); + buf.append(". Limit: ").append(getMaxConnections()); + buf.append(". Timeout: ").append(DataHelper.formatDuration(_pumper.getIdleTimeout())); + buf.append(".

              \n"); + buf.append("
              peerdiridlein/outupskewsendrecvout queuebacklogged?reading?
              \n"); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(" \n"); out.write(buf.toString()); buf.setLength(0); for (Iterator iter = peers.iterator(); iter.hasNext(); ) { NTCPConnection con = (NTCPConnection)iter.next(); - String name = con.getRemotePeer().calculateHash().toBase64().substring(0,6); - buf.append("\n"); + buf.append("\n"); out.write(buf.toString()); buf.setLength(0); } if (peers.size() > 0) { - buf.append("\n"); - buf.append("\n"); + buf.append("\n"); } - - buf.append("
              PeerDirIdleIn/OutUpSkewTXRXOut queueBacklogged?Reading?
              ").append(name); - buf.append(""); + buf.append("
              "); + buf.append(_context.commSystem().renderPeerHTML(con.getRemotePeer().calculateHash())); + //byte[] ip = getIP(con.getRemotePeer().calculateHash()); + //if (ip != null) + // buf.append(' ').append(_context.blocklist().toStr(ip)); + buf.append(" "); if (con.isInbound()) - buf.append("in"); + buf.append("\"Inbound\""); else - buf.append("out"); - buf.append(""); + buf.append("\"Outbound\""); + buf.append(" "); buf.append(con.getTimeSinceReceive()/1000); buf.append("s/").append(con.getTimeSinceSend()/1000); - buf.append("s"); + buf.append("s "); if (con.getTimeSinceReceive() < 10*1000) { buf.append(formatRate(con.getRecvRate()/1024)); bpsRecv += con.getRecvRate(); @@ -616,60 +687,56 @@ public class NTCPTransport extends TransportImpl { } else { buf.append(formatRate(0)); } - buf.append("KBps"); - buf.append("").append(DataHelper.formatDuration(con.getUptime())); + buf.append("K/s"); + buf.append(" ").append(DataHelper.formatDuration(con.getUptime())); totalUptime += con.getUptime(); offsetTotal = offsetTotal + con.getClockSkew(); - buf.append("").append(con.getClockSkew()); - buf.append("s").append(con.getMessagesSent()); + buf.append(" ").append(con.getClockSkew()); + buf.append("s ").append(con.getMessagesSent()); totalSend += con.getMessagesSent(); - buf.append("").append(con.getMessagesReceived()); + buf.append(" ").append(con.getMessagesReceived()); totalRecv += con.getMessagesReceived(); long outQueue = con.getOutboundQueueSize(); if (outQueue <= 0) { - buf.append("No messages"); + buf.append(" No messages"); } else { - buf.append("").append(outQueue).append(" message"); + buf.append(" ").append(outQueue).append(" message"); if (outQueue > 1) buf.append("s"); - writingPeers++; } - buf.append("").append(con.getConsecutiveBacklog() > 0 ? "true" : "false"); + buf.append(" ").append(con.getConsecutiveBacklog() > 0 ? "true" : "false"); long readTime = con.getReadTime(); if (readTime <= 0) { - buf.append("No"); + buf.append(" No"); } else { - buf.append("For ").append(DataHelper.formatDuration(readTime)); - readingPeers++; + buf.append(" For ").append(DataHelper.formatDuration(readTime)); } - buf.append("

              ").append(peers.size()).append(" peers  "); - buf.append("").append(formatRate(bpsRecv/1024)).append("/").append(formatRate(bpsSend/1024)).append("KBps"); - buf.append("").append(DataHelper.formatDuration(totalUptime/peers.size())); - buf.append("").append(peers.size() > 0 ? DataHelper.formatDuration(offsetTotal*1000/peers.size()) : "0ms"); - buf.append("").append(totalSend).append("").append(totalRecv); - buf.append("   "); +// buf.append("

              ").append(peers.size()).append(" peers    "); + buf.append(" ").append(formatRate(bpsRecv/1024)).append("/").append(formatRate(bpsSend/1024)).append("K/s"); + buf.append(" ").append(DataHelper.formatDuration(totalUptime/peers.size())); + buf.append(" ").append(peers.size() > 0 ? DataHelper.formatDuration(offsetTotal*1000/peers.size()) : "0ms"); + buf.append(" ").append(totalSend).append(" ").append(totalRecv); + buf.append("      "); buf.append("
              \n"); - buf.append("Peers currently reading I2NP messages: ").append(readingPeers).append("
              \n"); - buf.append("Peers currently writing I2NP messages: ").append(writingPeers).append("
              \n"); + + buf.append("

    \n"); out.write(buf.toString()); buf.setLength(0); } - - private static NumberFormat _rateFmt = new DecimalFormat("#,#0.00"); + + private static final NumberFormat _rateFmt = new DecimalFormat("#,#0.00"); private static String formatRate(float rate) { synchronized (_rateFmt) { return _rateFmt.format(rate); } } - + private Comparator getComparator(int sortFlags) { Comparator rv = null; switch (Math.abs(sortFlags)) { @@ -693,7 +760,7 @@ public class NTCPTransport extends TransportImpl { } private static class PeerComparator implements Comparator { public int compare(Object lhs, Object rhs) { - if ( (lhs == null) || (rhs == null) || !(lhs instanceof NTCPConnection) || !(rhs instanceof NTCPConnection)) + if ( (lhs == null) || (rhs == null) || !(lhs instanceof NTCPConnection) || !(rhs instanceof NTCPConnection)) throw new IllegalArgumentException("rhs = " + rhs + " lhs = " + lhs); return compare((NTCPConnection)lhs, (NTCPConnection)rhs); } @@ -702,13 +769,15 @@ public class NTCPTransport extends TransportImpl { return l.getRemotePeer().calculateHash().toBase64().compareTo(r.getRemotePeer().calculateHash().toBase64()); } } - + /** * Cache the bid to reduce object churn */ private class SharedBid extends TransportBid { public SharedBid(int ms) { super(); setLatencyMs(ms); } + @Override public Transport getTransport() { return NTCPTransport.this; } + @Override public String toString() { return "NTCP bid @ " + getLatencyMs(); } } } diff --git a/router/java/src/net/i2p/router/transport/ntcp/Reader.java b/router/java/src/net/i2p/router/transport/ntcp/Reader.java index 4b4dc3db1..2c017b5b6 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/Reader.java +++ b/router/java/src/net/i2p/router/transport/ntcp/Reader.java @@ -17,7 +17,7 @@ import net.i2p.util.Log; class Reader { private RouterContext _context; private Log _log; - private List _pendingConnections; + private final List _pendingConnections; private List _liveReads; private List _readAfterLive; private List _runners; diff --git a/router/java/src/net/i2p/router/transport/ntcp/Writer.java b/router/java/src/net/i2p/router/transport/ntcp/Writer.java index 29b725816..97823313b 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/Writer.java +++ b/router/java/src/net/i2p/router/transport/ntcp/Writer.java @@ -16,7 +16,7 @@ import net.i2p.util.Log; class Writer { private RouterContext _context; private Log _log; - private List _pendingConnections; + private final List _pendingConnections; private List _liveWrites; private List _writeAfterLive; private List _runners; diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java index 66aad6f4d..ec2078312 100644 --- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java +++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java @@ -18,7 +18,7 @@ public class ACKSender implements Runnable { private UDPTransport _transport; private PacketBuilder _builder; /** list of peers (PeerState) who we have received data from but not yet ACKed to */ - private List _peersToACK; + private final List _peersToACK; private boolean _alive; /** how frequently do we want to send ACKs to a peer? */ @@ -31,10 +31,10 @@ public class ACKSender implements Runnable { _peersToACK = new ArrayList(4); _builder = new PacketBuilder(_context, transport); _alive = true; - _context.statManager().createRateStat("udp.sendACKCount", "how many ack messages were sent to a peer", "udp", new long[] { 60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.ackFrequency", "how long ago did we send an ACK to this peer?", "udp", new long[] { 60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendACKRemaining", "when we ack a peer, how many peers are left waiting to ack?", "udp", new long[] { 60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.abortACK", "How often do we schedule up an ACK send only to find it had already been sent (through piggyback)?", "udp", new long[] { 60*1000, 60*60*1000 }); + _context.statManager().createRateStat("udp.sendACKCount", "how many ack messages were sent to a peer", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.ackFrequency", "how long ago did we send an ACK to this peer?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendACKRemaining", "when we ack a peer, how many peers are left waiting to ack?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.abortACK", "How often do we schedule up an ACK send only to find it had already been sent (through piggyback)?", "udp", UDPTransport.RATES); } public void ackPeer(PeerState peer) { diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java index 896fe1ce4..de14dba5b 100644 --- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java +++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java @@ -37,15 +37,15 @@ public class EstablishmentManager { private UDPTransport _transport; private PacketBuilder _builder; /** map of RemoteHostId to InboundEstablishState */ - private Map _inboundStates; + private final Map _inboundStates; /** map of RemoteHostId to OutboundEstablishState */ - private Map _outboundStates; + private final Map _outboundStates; /** map of RemoteHostId to List of OutNetMessage for messages exceeding capacity */ - private Map _queuedOutbound; + private final Map _queuedOutbound; /** map of nonce (Long) to OutboundEstablishState */ - private Map _liveIntroductions; + private final Map _liveIntroductions; private boolean _alive; - private Object _activityLock; + private final Object _activityLock; private int _activity; private static final int DEFAULT_MAX_CONCURRENT_ESTABLISH = 10; @@ -61,15 +61,15 @@ public class EstablishmentManager { _queuedOutbound = new HashMap(32); _liveIntroductions = new HashMap(32); _activityLock = new Object(); - _context.statManager().createRateStat("udp.inboundEstablishTime", "How long it takes for a new inbound session to be established", "udp", new long[] { 60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.outboundEstablishTime", "How long it takes for a new outbound session to be established", "udp", new long[] { 60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.inboundEstablishFailedState", "What state a failed inbound establishment request fails in", "udp", new long[] { 60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.outboundEstablishFailedState", "What state a failed outbound establishment request fails in", "udp", new long[] { 60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendIntroRelayRequest", "How often we send a relay request to reach a peer", "udp", new long[] { 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendIntroRelayTimeout", "How often a relay request times out before getting a response (due to the target or intro peer being offline)", "udp", new long[] { 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.receiveIntroRelayResponse", "How long it took to receive a relay response", "udp", new long[] { 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.establishRejected", "How many pending outbound connections are there when we refuse to add any more?", "udp", new long[] { 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.establishOverflow", "How many messages were queued up on a pending connection when it was too much?", "udp", new long[] { 60*60*1000, 24*60*60*1000 }); + _context.statManager().createRateStat("udp.inboundEstablishTime", "How long it takes for a new inbound session to be established", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.outboundEstablishTime", "How long it takes for a new outbound session to be established", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.inboundEstablishFailedState", "What state a failed inbound establishment request fails in", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.outboundEstablishFailedState", "What state a failed outbound establishment request fails in", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendIntroRelayRequest", "How often we send a relay request to reach a peer", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendIntroRelayTimeout", "How often a relay request times out before getting a response (due to the target or intro peer being offline)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveIntroRelayResponse", "How long it took to receive a relay response", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.establishRejected", "How many pending outbound connections are there when we refuse to add any more?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.establishOverflow", "How many messages were queued up on a pending connection when it was too much?", "udp", UDPTransport.RATES); } public void startup() { @@ -282,7 +282,10 @@ public class EstablishmentManager { } if (isNew) { // we don't expect inbound connections when hidden, but it could happen - if ((!_context.router().isHidden()) && !_transport.introducersRequired()) { + // Don't offer if we are approaching max connections. While Relay Intros do not + // count as connections, we have to keep the connection to this peer up longer if + // we are offering introductions. + if ((!_context.router().isHidden()) && (!_transport.introducersRequired()) && _transport.haveCapacity()) { long tag = _context.random().nextLong(MAX_TAG_VALUE); state.setSentRelayTag(tag); if (_log.shouldLog(Log.INFO)) @@ -450,6 +453,7 @@ public class EstablishmentManager { _transport.addRemotePeerState(peer); _transport.inboundConnectionReceived(); + _transport.setIP(remote.calculateHash(), state.getSentIP()); _context.statManager().addRateData("udp.inboundEstablishTime", state.getLifetime(), 0); sendInboundComplete(peer); @@ -531,6 +535,7 @@ public class EstablishmentManager { _transport.addRemotePeerState(peer); + _transport.setIP(remote.calculateHash(), state.getSentIP()); _context.statManager().addRateData("udp.outboundEstablishTime", state.getLifetime(), 0); sendOurInfo(peer, false); @@ -568,7 +573,8 @@ public class EstablishmentManager { private void sendCreated(InboundEstablishState state) { long now = _context.clock().now(); - if (!_transport.introducersRequired()) { + // don't offer if we are approaching max connections (see comments above) + if ((!_transport.introducersRequired()) && _transport.haveCapacity()) { // offer to relay // (perhaps we should check our bw usage and/or how many peers we are // already offering introducing?) @@ -668,7 +674,7 @@ public class EstablishmentManager { } } - public void receiveRelayResponse(RemoteHostId bob, UDPPacketReader reader) { + public void receiveRelayResponse(RemoteHostId bob, UDPPacketReader reader) {// LINT -- Exporting non-public type through public API long nonce = reader.getRelayResponseReader().readNonce(); OutboundEstablishState state = null; synchronized (_liveIntroductions) { diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java index ababfa7c4..7b2bce4b0 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java @@ -181,7 +181,7 @@ public class InboundEstablishState { _sentSignature = _context.dsa().sign(signed, _context.keyManager().getSigningPrivateKey()); if (_log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Signing sessionCreated:"); buf.append(" ReceivedX: ").append(Base64.encode(_receivedX)); buf.append(" SentY: ").append(Base64.encode(_sentY)); @@ -210,7 +210,7 @@ public class InboundEstablishState { public synchronized void setNextSendTime(long when) { _nextSend = when; } /** RemoteHostId, uniquely identifies an attempt */ - public RemoteHostId getRemoteHostId() { return _remoteHostId; } + public RemoteHostId getRemoteHostId() { return _remoteHostId; }// LINT -- Exporting non-public type through public API public synchronized void receiveSessionConfirmed(UDPPacketReader.SessionConfirmedReader conf) { if (_receivedIdentity == null) @@ -331,8 +331,9 @@ public class InboundEstablishState { _nextSend = _lastReceive; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(super.toString()); if (_receivedX != null) buf.append(" ReceivedX: ").append(Base64.encode(_receivedX, 0, 4)); diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java index cd0630a0a..9315a9ff0 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java @@ -38,13 +38,13 @@ public class InboundMessageFragments /*implements UDPTransport.PartialACKSource _transport = transport; _ackSender = new ACKSender(_context, _transport); _messageReceiver = new MessageReceiver(_context, _transport); - _context.statManager().createRateStat("udp.receivedCompleteTime", "How long it takes to receive a full message", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.receivedCompleteFragments", "How many fragments go in a fully received message", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.receivedACKs", "How many messages were ACKed at a time", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.ignoreRecentDuplicate", "Take note that we received a packet for a recently completed message", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.receiveMessagePeriod", "How long it takes to pull the message fragments out of a packet", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.receiveACKPeriod", "How long it takes to pull the ACKs out of a packet", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.receivePiggyback", "How many acks were included in a packet with data fragments (time == # data fragments)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); + _context.statManager().createRateStat("udp.receivedCompleteTime", "How long it takes to receive a full message", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivedCompleteFragments", "How many fragments go in a fully received message", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivedACKs", "How many messages were ACKed at a time", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.ignoreRecentDuplicate", "Take note that we received a packet for a recently completed message", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveMessagePeriod", "How long it takes to pull the message fragments out of a packet", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveACKPeriod", "How long it takes to pull the ACKs out of a packet", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePiggyback", "How many acks were included in a packet with data fragments (time == # data fragments)", "udp", UDPTransport.RATES); } public void startup() { diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java index a99929f40..7338e0b83 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java @@ -30,7 +30,7 @@ public class InboundMessageState { /** expire after 10s */ private static final long MAX_RECEIVE_TIME = 10*1000; - private static final int MAX_FRAGMENTS = 64; + public static final int MAX_FRAGMENTS = 64; private static final ByteCache _fragmentCache = ByteCache.getInstance(64, 2048); @@ -138,8 +138,9 @@ public class InboundMessageState { } public boolean receivedComplete() { return false; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("Partial ACK of "); buf.append(_bitfieldMessageId); buf.append(" with ACKs for: "); @@ -162,8 +163,9 @@ public class InboundMessageState { } public int getFragmentCount() { return _lastFragment+1; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(32); + StringBuilder buf = new StringBuilder(32); buf.append("Message: ").append(_messageId); if (isComplete()) { buf.append(" completely received with "); diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java index bbbc35cab..8d20a43c1 100644 --- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java +++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java @@ -25,7 +25,7 @@ public class IntroductionManager { /** map of relay tag to PeerState that should receive the introduction */ private Map _outbound; /** list of peers (PeerState) who have given us introduction tags */ - private List _inbound; + private final List _inbound; public IntroductionManager(RouterContext ctx, UDPTransport transport) { _context = ctx; @@ -34,9 +34,9 @@ public class IntroductionManager { _builder = new PacketBuilder(ctx, transport); _outbound = Collections.synchronizedMap(new HashMap(128)); _inbound = new ArrayList(128); - ctx.statManager().createRateStat("udp.receiveRelayIntro", "How often we get a relayed request for us to talk to someone?", "udp", new long[] { 10*60*1000 }); - ctx.statManager().createRateStat("udp.receiveRelayRequest", "How often we receive a good request to relay to someone else?", "udp", new long[] { 10*60*1000 }); - ctx.statManager().createRateStat("udp.receiveRelayRequestBadTag", "Received relay requests with bad/expired tag", "udp", new long[] { 10*60*1000 }); + ctx.statManager().createRateStat("udp.receiveRelayIntro", "How often we get a relayed request for us to talk to someone?", "udp", UDPTransport.RATES); + ctx.statManager().createRateStat("udp.receiveRelayRequest", "How often we receive a good request to relay to someone else?", "udp", UDPTransport.RATES); + ctx.statManager().createRateStat("udp.receiveRelayRequestBadTag", "Received relay requests with bad/expired tag", "udp", UDPTransport.RATES); } public void reset() { @@ -157,7 +157,7 @@ public class IntroductionManager { return found; } - public void receiveRelayIntro(RemoteHostId bob, UDPPacketReader reader) { + public void receiveRelayIntro(RemoteHostId bob, UDPPacketReader reader) {// LINT -- Exporting non-public type through public API if (_context.router().isHidden()) return; if (_log.shouldLog(Log.INFO)) @@ -166,7 +166,7 @@ public class IntroductionManager { _transport.send(_builder.buildHolePunch(reader)); } - public void receiveRelayRequest(RemoteHostId alice, UDPPacketReader reader) { + public void receiveRelayRequest(RemoteHostId alice, UDPPacketReader reader) {// LINT -- Exporting non-public type through public API if (_context.router().isHidden()) return; long tag = reader.getRelayRequestReader().readTag(); diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java index a6a75459e..d7f0421e3 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java @@ -24,7 +24,7 @@ public class MessageReceiver { private Log _log; private UDPTransport _transport; /** list of messages (InboundMessageState) fully received but not interpreted yet */ - private List _completeMessages; + private final List _completeMessages; private boolean _alive; private ByteCache _cache; @@ -34,12 +34,12 @@ public class MessageReceiver { _transport = transport; _completeMessages = new ArrayList(16); _cache = ByteCache.getInstance(64, I2NPMessage.MAX_SIZE); - _context.statManager().createRateStat("udp.inboundExpired", "How many messages were expired before reception?", "udp", new long[] { 60*1000l, 10*60*1000l }); - _context.statManager().createRateStat("udp.inboundRemaining", "How many messages were remaining when a message is pulled off the complete queue?", "udp", new long[] { 60*1000l, 10*60*1000l }); - _context.statManager().createRateStat("udp.inboundReady", "How many messages were ready when a message is added to the complete queue?", "udp", new long[] { 60*1000l, 10*60*1000l }); - _context.statManager().createRateStat("udp.inboundReadTime", "How long it takes to parse in the completed fragments into a message?", "udp", new long[] { 60*1000l, 10*60*1000l }); - _context.statManager().createRateStat("udp.inboundReceiveProcessTime", "How long it takes to add the message to the transport?", "udp", new long[] { 60*1000l, 10*60*1000l }); - _context.statManager().createRateStat("udp.inboundLag", "How long the olded ready message has been sitting on the queue (period is the queue size)?", "udp", new long[] { 60*1000l, 10*60*1000l }); + _context.statManager().createRateStat("udp.inboundExpired", "How many messages were expired before reception?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.inboundRemaining", "How many messages were remaining when a message is pulled off the complete queue?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.inboundReady", "How many messages were ready when a message is added to the complete queue?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.inboundReadTime", "How long it takes to parse in the completed fragments into a message?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.inboundReceiveProcessTime", "How long it takes to add the message to the transport?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.inboundLag", "How long the olded ready message has been sitting on the queue (period is the queue size)?", "udp", UDPTransport.RATES); _alive = true; } diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java index fc424de5b..a5c732e08 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java @@ -51,7 +51,7 @@ public class OutboundEstablishState { private RemoteHostId _remoteHostId; private RouterIdentity _remotePeer; private SessionKey _introKey; - private List _queuedMessages; + private final List _queuedMessages; private int _currentState; private long _introductionNonce; // intro @@ -291,7 +291,7 @@ public class OutboundEstablishState { DataHelper.toLong(signed, off, 4, _receivedSignedOnTime); boolean valid = _context.dsa().verifySignature(_receivedSignature, signed, _remotePeer.getSigningPublicKey()); if (!valid || _log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Signed sessionCreated:"); buf.append(" AliceIP: ").append(Base64.encode(_aliceIP)); buf.append(" AlicePort: ").append(_alicePort); @@ -413,7 +413,7 @@ public class OutboundEstablishState { } /** uniquely identifies an attempt */ - public RemoteHostId getRemoteHostId() { return _remoteHostId; } + public RemoteHostId getRemoteHostId() { return _remoteHostId; }// LINT -- Exporting non-public type through public API /** we have received a real data packet, so we're done establishing */ public synchronized void dataReceived() { diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java index c65bb458e..69f9f7554 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java @@ -12,35 +12,35 @@ import net.i2p.util.Log; /** * Coordinate the outbound fragments and select the next one to be built. - * This pool contains messages we are actively trying to send, essentially + * This pool contains messages we are actively trying to send, essentially * doing a round robin across each message to send one fragment, as implemented - * in {@link #getNextVolley()}. This also honors per-peer throttling, taking + * in {@link #getNextVolley()}. This also honors per-peer throttling, taking * note of each peer's allocations. If a message has each of its fragments - * sent more than a certain number of times, it is failed out. In addition, - * this instance also receives notification of message ACKs from the - * {@link InboundMessageFragments}, signaling that we can stop sending a + * sent more than a certain number of times, it is failed out. In addition, + * this instance also receives notification of message ACKs from the + * {@link InboundMessageFragments}, signaling that we can stop sending a * message. - * + * */ public class OutboundMessageFragments { private RouterContext _context; private Log _log; private UDPTransport _transport; - private ActiveThrottle _throttle; + private ActiveThrottle _throttle; // LINT not used ?? /** peers we are actively sending messages to */ - private List _activePeers; + private final List _activePeers; private boolean _alive; /** which peer should we build the next packet out of? */ private int _nextPeer; private PacketBuilder _builder; /** if we can handle more messages explicitly, set this to true */ - private boolean _allowExcess; - private volatile long _packetsRetransmitted; - - private static final int MAX_ACTIVE = 64; + private boolean _allowExcess; // LINT not used?? + private volatile long _packetsRetransmitted; // LINT not used?? + + // private static final int MAX_ACTIVE = 64; // not used. // don't send a packet more than 10 times static final int MAX_VOLLEYS = 10; - + public OutboundMessageFragments(RouterContext ctx, UDPTransport transport, ActiveThrottle throttle) { _context = ctx; _log = ctx.logManager().getLog(OutboundMessageFragments.class); @@ -51,26 +51,25 @@ public class OutboundMessageFragments { _builder = new PacketBuilder(ctx, transport); _alive = true; _allowExcess = false; - _context.statManager().createRateStat("udp.sendVolleyTime", "Long it takes to send a full volley", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendConfirmTime", "How long it takes to send a message and get the ACK", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendConfirmFragments", "How many fragments are included in a fully ACKed message", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendConfirmVolley", "How many times did fragments need to be sent before ACK", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendFailed", "How many sends a failed message was pushed", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendAggressiveFailed", "How many volleys was a packet sent before we gave up", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.outboundActiveCount", "How many messages are in the peer's active pool", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendRejected", "What volley are we on when the peer was throttled (time == message lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.partialACKReceived", "How many fragments were partially ACKed (time == message lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendSparse", "How many fragments were partially ACKed and hence not resent (time == message lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendPiggyback", "How many acks were piggybacked on a data packet (time == message lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendPiggybackPartial", "How many partial acks were piggybacked on a data packet (time == message lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.activeDelay", "How often we wait blocking on the active queue", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.packetsRetransmitted", "Lifetime of packets during their retransmission (period == packets transmitted, lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.peerPacketsRetransmitted", "How many packets have been retransmitted to the peer (lifetime) when a burst of packets are retransmitted (period == packets transmitted, lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.blockedRetransmissions", "How packets have been transmitted to the peer when we blocked a retransmission to them?", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendCycleTime", "How long it takes to cycle through all of the active messages?", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendCycleTimeSlow", "How long it takes to cycle through all of the active messages, when its going slowly?", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); + _context.statManager().createRateStat("udp.sendVolleyTime", "Long it takes to send a full volley", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendConfirmTime", "How long it takes to send a message and get the ACK", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendConfirmFragments", "How many fragments are included in a fully ACKed message", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendConfirmVolley", "How many times did fragments need to be sent before ACK", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendFailed", "How many sends a failed message was pushed", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendAggressiveFailed", "How many volleys was a packet sent before we gave up", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.outboundActiveCount", "How many messages are in the peer's active pool", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendRejected", "What volley are we on when the peer was throttled (time == message lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.partialACKReceived", "How many fragments were partially ACKed (time == message lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendSparse", "How many fragments were partially ACKed and hence not resent (time == message lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPiggyback", "How many acks were piggybacked on a data packet (time == message lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPiggybackPartial", "How many partial acks were piggybacked on a data packet (time == message lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.packetsRetransmitted", "Lifetime of packets during their retransmission (period == packets transmitted, lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.peerPacketsRetransmitted", "How many packets have been retransmitted to the peer (lifetime) when a burst of packets are retransmitted (period == packets transmitted, lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.blockedRetransmissions", "How packets have been transmitted to the peer when we blocked a retransmission to them?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendCycleTime", "How long it takes to cycle through all of the active messages?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendCycleTimeSlow", "How long it takes to cycle through all of the active messages, when its going slowly?", "udp", UDPTransport.RATES); } - + public void startup() { _alive = true; } public void shutdown() { _alive = false; @@ -87,7 +86,7 @@ public class OutboundMessageFragments { _activePeers.notifyAll(); } } - + /** * Block until we allow more messages to be admitted to the active * pool. This is called by the {@link OutboundRefiller} @@ -95,11 +94,11 @@ public class OutboundMessageFragments { * @return true if more messages are allowed */ public boolean waitForMoreAllowed() { - // test without choking. + // test without choking. // perhaps this should check the lifetime of the first activeMessage? if (true) return true; /* - + long start = _context.clock().now(); int numActive = 0; int maxActive = Math.max(_transport.countActivePeers(), MAX_ACTIVE); @@ -123,7 +122,7 @@ public class OutboundMessageFragments { */ return false; } - + /** * Add a new message to the active pool * @@ -133,7 +132,7 @@ public class OutboundMessageFragments { RouterInfo target = msg.getTarget(); if ( (msgBody == null) || (target == null) ) return; - + // todo: make sure the outNetMessage is initialzed once and only once OutboundMessageState state = new OutboundMessageState(_context); boolean ok = state.initialize(msg, msgBody); @@ -164,9 +163,9 @@ public class OutboundMessageFragments { } //finishMessages(); } - - /** - * short circuit the OutNetMessage, letting us send the establish + + /** + * short circuit the OutNetMessage, letting us send the establish * complete message reliably */ public void add(OutboundMessageState state) { @@ -228,11 +227,11 @@ public class OutboundMessageFragments { rv += remaining; } } - + private long _lastCycleTime = System.currentTimeMillis(); - + /** - * Fetch all the packets for a message volley, blocking until there is a + * Fetch all the packets for a message volley, blocking until there is a * message which can be fully transmitted (or the transport is shut down). * The returned array may be sparse, with null packets taking the place of * already ACKed fragments. @@ -270,7 +269,7 @@ public class OutboundMessageFragments { } } if (_log.shouldLog(Log.DEBUG)) - _log.debug("Done looping, next peer we are sending for: " + + _log.debug("Done looping, next peer we are sending for: " + (peer != null ? peer.getRemotePeer().toBase64() : "none")); if (state == null) { if (_log.shouldLog(Log.DEBUG)) @@ -291,10 +290,10 @@ public class OutboundMessageFragments { _log.debug("Woken up while waiting"); } } - + if (_log.shouldLog(Log.DEBUG)) _log.debug("Sending " + state); - + UDPPacket packets[] = preparePackets(state, peer); if ( (state != null) && (state.getMessage() != null) ) { int valid = 0; @@ -303,21 +302,21 @@ public class OutboundMessageFragments { valid++; /* state.getMessage().timestamp("sending a volley of " + valid - + " lastReceived: " + + " lastReceived: " + (_context.clock().now() - peer.getLastReceiveTime()) - + " lastSentFully: " + + " lastSentFully: " + (_context.clock().now() - peer.getLastSendFullyTime())); */ } return packets; } - + private UDPPacket[] preparePackets(OutboundMessageState state, PeerState peer) { if ( (state != null) && (peer != null) ) { int fragments = state.getFragmentCount(); if (fragments < 0) return null; - + // ok, simplest possible thing is to always tack on the bitfields if List msgIds = peer.getCurrentFullACKs(); if (msgIds == null) msgIds = new ArrayList(); @@ -353,7 +352,7 @@ public class OutboundMessageFragments { } if (sparseCount > 0) remaining.clear(); - + int piggybackedAck = 0; if (msgIds.size() != remaining.size()) { for (int i = 0; i < msgIds.size(); i++) { @@ -364,7 +363,7 @@ public class OutboundMessageFragments { } } } - + if (sparseCount > 0) _context.statManager().addRateData("udp.sendSparse", sparseCount, state.getLifetime()); if (piggybackedAck > 0) @@ -390,10 +389,10 @@ public class OutboundMessageFragments { return null; } } - + /** * We received an ACK of the given messageId from the given peer, so if it - * is still unacked, mark it as complete. + * is still unacked, mark it as complete. * * @return fragments acked */ @@ -409,7 +408,7 @@ public class OutboundMessageFragments { return 0; } } - + public void acked(ACKBitfield bitfield, Hash ackedBy) { PeerState peer = _transport.getPeerState(ackedBy); if (peer != null) { @@ -421,7 +420,7 @@ public class OutboundMessageFragments { _log.debug("partial acked [" + bitfield + "] by an unknown remote peer? " + ackedBy.toBase64()); } } - + public interface ActiveThrottle { public void choke(Hash peer); public void unchoke(Hash peer); diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java index fc6896627..650c17592 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java @@ -34,8 +34,11 @@ public class OutboundMessageState { private short _maxSends; private int _nextSendFragment; - public static final int MAX_FRAGMENTS = 32; - private static final ByteCache _cache = ByteCache.getInstance(64, MAX_FRAGMENTS*1024); + public static final int MAX_MSG_SIZE = 32 * 1024; + /** is this enough for a high-bandwidth router? */ + private static final int MAX_ENTRIES = 64; + /** would two caches, one for small and one for large messages, be better? */ + private static final ByteCache _cache = ByteCache.getInstance(MAX_ENTRIES, MAX_MSG_SIZE); public OutboundMessageState(I2PAppContext context) { _context = context; @@ -226,7 +229,9 @@ public class OutboundMessageState { int numFragments = totalSize / fragmentSize; if (numFragments * fragmentSize < totalSize) numFragments++; - + // This should never happen, as 534 bytes * 64 fragments > 32KB, and we won't bid on > 32KB + if (numFragments > InboundMessageState.MAX_FRAGMENTS) + throw new IllegalArgumentException("Fragmenting a " + totalSize + " message into " + numFragments + " fragments - too many!"); if (_log.shouldLog(Log.DEBUG)) _log.debug("Fragmenting a " + totalSize + " message into " + numFragments + " fragments"); @@ -286,10 +291,11 @@ public class OutboundMessageState { } } + @Override public String toString() { short sends[] = _fragmentSends; ByteArray messageBuf = _messageBuf; - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("Message ").append(_messageId); if (sends != null) buf.append(" with ").append(sends.length).append(" fragments"); diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java b/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java index ee41ad8c0..457f7668e 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java @@ -24,7 +24,7 @@ public class OutboundRefiller implements Runnable { _fragments = fragments; _messages = messages; _refillLock = this; - _context.statManager().createRateStat("udp.timeToActive", "Message lifetime until it reaches the outbound fragment queue", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("udp.timeToActive", "Message lifetime until it reaches the outbound fragment queue", "udp", UDPTransport.RATES); } public void startup() { diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java index f00587bcd..d00f6f9b2 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java @@ -39,8 +39,8 @@ public class PacketBuilder { _context = ctx; _transport = transport; _log = ctx.logManager().getLog(PacketBuilder.class); - _context.statManager().createRateStat("udp.packetAuthTime", "How long it takes to encrypt and MAC a packet for sending", "udp", new long[] { 60*1000 }); - _context.statManager().createRateStat("udp.packetAuthTimeSlow", "How long it takes to encrypt and MAC a packet for sending (when its slow)", "udp", new long[] { 60*1000, 10*60*1000 }); + _context.statManager().createRateStat("udp.packetAuthTime", "How long it takes to encrypt and MAC a packet for sending", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.packetAuthTimeSlow", "How long it takes to encrypt and MAC a packet for sending (when its slow)", "udp", UDPTransport.RATES); } public UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState peer) { @@ -61,10 +61,10 @@ public class PacketBuilder { public UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState peer, List ackIdsRemaining, List partialACKsRemaining) { UDPPacket packet = UDPPacket.acquire(_context, false); - StringBuffer msg = null; + StringBuilder msg = null; boolean acksIncluded = false; if (_log.shouldLog(Log.INFO)) { - msg = new StringBuffer(128); + msg = new StringBuilder(128); msg.append("Send to ").append(peer.getRemotePeer().toBase64()); msg.append(" msg ").append(state.getMessageId()).append(":").append(fragment); if (fragment == state.getFragmentCount() - 1) @@ -219,9 +219,9 @@ public class PacketBuilder { public UDPPacket buildACK(PeerState peer, List ackBitfields) { UDPPacket packet = UDPPacket.acquire(_context, false); - StringBuffer msg = null; + StringBuilder msg = null; if (_log.shouldLog(Log.DEBUG)) { - msg = new StringBuffer(128); + msg = new StringBuilder(128); msg.append("building ACK packet to ").append(peer.getRemotePeer().toBase64().substring(0,6)); } @@ -379,7 +379,7 @@ public class PacketBuilder { off += 8; if (_log.shouldLog(Log.DEBUG)) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Sending sessionCreated:"); buf.append(" AliceIP: ").append(Base64.encode(sentIP)); buf.append(" AlicePort: ").append(state.getSentPort()); @@ -786,6 +786,7 @@ public class PacketBuilder { private int getOurExplicitPort() { return 0; } /** build intro packets for each of the published introducers */ + @SuppressWarnings("static-access") public UDPPacket[] buildRelayRequest(UDPTransport transport, OutboundEstablishState state, SessionKey ourIntroKey) { UDPAddress addr = state.getRemoteAddress(); int count = addr.getIntroducerCount(); @@ -878,7 +879,7 @@ public class PacketBuilder { */ private static final byte PEER_RELAY_INTRO_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_INTRO << 4); - public UDPPacket buildRelayIntro(RemoteHostId alice, PeerState charlie, UDPPacketReader.RelayRequestReader request) { + public UDPPacket buildRelayIntro(RemoteHostId alice, PeerState charlie, UDPPacketReader.RelayRequestReader request) {// LINT -- Exporting non-public type through public API UDPPacket packet = UDPPacket.acquire(_context, false); byte data[] = packet.getPacket().getData(); Arrays.fill(data, 0, data.length, (byte)0x0); @@ -928,7 +929,7 @@ public class PacketBuilder { */ private static final byte PEER_RELAY_RESPONSE_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE << 4); - public UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce, SessionKey aliceIntroKey) { + public UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce, SessionKey aliceIntroKey) {// LINT -- Exporting non-public type through public API InetAddress aliceAddr = null; try { aliceAddr = InetAddress.getByAddress(alice.getIP()); diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java index 9e9cde1d3..e3896748c 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -37,7 +37,7 @@ public class PacketHandler { private static final long GRACE_PERIOD = Router.CLOCK_FUDGE_FACTOR + 30*1000; - public PacketHandler(RouterContext ctx, UDPTransport transport, UDPEndpoint endpoint, EstablishmentManager establisher, InboundMessageFragments inbound, PeerTestManager testManager, IntroductionManager introManager) { + public PacketHandler(RouterContext ctx, UDPTransport transport, UDPEndpoint endpoint, EstablishmentManager establisher, InboundMessageFragments inbound, PeerTestManager testManager, IntroductionManager introManager) {// LINT -- Exporting non-public type through public API _context = ctx; _log = ctx.logManager().getLog(PacketHandler.class); _transport = transport; @@ -50,33 +50,33 @@ public class PacketHandler { for (int i = 0; i < NUM_HANDLERS; i++) { _handlers.add(new Handler()); } - _context.statManager().createRateStat("udp.handleTime", "How long it takes to handle a received packet after its been pulled off the queue", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.queueTime", "How long after a packet is received can we begin handling it", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSkew", "How long ago after the packet was sent did we receive it", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidUnkown", "How old the packet we dropped due to invalidity (unkown type) was", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidReestablish", "How old the packet we dropped due to invalidity (doesn't use existing key, not an establishment) was", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidEstablish", "How old the packet we dropped due to invalidity (establishment, bad key) was", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidEstablish.inbound", "How old the packet we dropped due to invalidity (even though we have an active inbound establishment with the peer) was", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidEstablish.outbound", "How old the packet we dropped due to invalidity (even though we have an active outbound establishment with the peer) was", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidEstablish.new", "How old the packet we dropped due to invalidity (even though we do not have any active establishment with the peer) was", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidInboundEstablish", "How old the packet we dropped due to invalidity (inbound establishment, bad key) was", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.droppedInvalidSkew", "How skewed the packet we dropped due to invalidity (valid except bad skew) was", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.packetDequeueTime", "How long it takes the UDPReader to pull a packet off the inbound packet queue (when its slow)", "udp", new long[] { 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.packetVerifyTime", "How long it takes the PacketHandler to verify a data packet after dequeueing (period is dequeue time)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.packetVerifyTimeSlow", "How long it takes the PacketHandler to verify a data packet after dequeueing when its slow (period is dequeue time)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.packetValidateMultipleCount", "How many times we validate a packet, if done more than once (period = afterValidate-enqueue)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.packetNoValidationLifetime", "How long packets that are never validated are around for", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.sessionRequest", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.sessionConfirmed", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.sessionCreated", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.dataKnown", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.dataKnownAck", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.dataUnknown", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.dataUnknownAck", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.test", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.relayRequest", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.relayIntro", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.receivePacketSize.relayResponse", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", new long[] { 60*1000, 10*60*1000 }); + _context.statManager().createRateStat("udp.handleTime", "How long it takes to handle a received packet after its been pulled off the queue", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.queueTime", "How long after a packet is received can we begin handling it", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSkew", "How long ago after the packet was sent did we receive it", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidUnkown", "How old the packet we dropped due to invalidity (unkown type) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidReestablish", "How old the packet we dropped due to invalidity (doesn't use existing key, not an establishment) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidEstablish", "How old the packet we dropped due to invalidity (establishment, bad key) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidEstablish.inbound", "How old the packet we dropped due to invalidity (even though we have an active inbound establishment with the peer) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidEstablish.outbound", "How old the packet we dropped due to invalidity (even though we have an active outbound establishment with the peer) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidEstablish.new", "How old the packet we dropped due to invalidity (even though we do not have any active establishment with the peer) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidInboundEstablish", "How old the packet we dropped due to invalidity (inbound establishment, bad key) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInvalidSkew", "How skewed the packet we dropped due to invalidity (valid except bad skew) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.packetDequeueTime", "How long it takes the UDPReader to pull a packet off the inbound packet queue (when its slow)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.packetVerifyTime", "How long it takes the PacketHandler to verify a data packet after dequeueing (period is dequeue time)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.packetVerifyTimeSlow", "How long it takes the PacketHandler to verify a data packet after dequeueing when its slow (period is dequeue time)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.packetValidateMultipleCount", "How many times we validate a packet, if done more than once (period = afterValidate-enqueue)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.packetNoValidationLifetime", "How long packets that are never validated are around for", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.sessionRequest", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.sessionConfirmed", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.sessionCreated", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.dataKnown", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.dataKnownAck", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.dataUnknown", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.dataUnknownAck", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.test", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.relayRequest", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.relayIntro", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receivePacketSize.relayResponse", "Packet size of the given inbound packet type (period is the packet's lifetime)", "udp", UDPTransport.RATES); } public void startup() { @@ -93,7 +93,7 @@ public class PacketHandler { } String getHandlerStatus() { - StringBuffer rv = new StringBuffer(); + StringBuilder rv = new StringBuilder(); int size = _handlers.size(); rv.append("Handlers: ").append(size); for (int i = 0; i < size; i++) { @@ -324,7 +324,7 @@ public class PacketHandler { private void receivePacket(UDPPacketReader reader, UDPPacket packet, InboundEstablishState state, boolean allowFallback) { _state = 31; if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Attempting to receive a packet on a known inbound state: "); buf.append(state); buf.append(" MAC key: ").append(state.getMACKey()); @@ -362,7 +362,7 @@ public class PacketHandler { private void receivePacket(UDPPacketReader reader, UDPPacket packet, OutboundEstablishState state) { _state = 35; if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Attempting to receive a packet on a known outbound state: "); buf.append(state); buf.append(" MAC key: ").append(state.getMACKey()); @@ -470,7 +470,7 @@ public class PacketHandler { if (state != null) { UDPPacketReader.DataReader dr = reader.getDataReader(); if (_log.shouldLog(Log.INFO)) { - StringBuffer msg = new StringBuffer(); + StringBuilder msg = new StringBuilder(); msg.append("Receive ").append(System.identityHashCode(packet)); msg.append(" from ").append(state.getRemotePeer().toBase64()).append(" ").append(state.getRemoteHostId()); for (int i = 0; i < dr.readFragmentCount(); i++) { diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java index f3cd1e269..23205cc67 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -74,13 +74,13 @@ public class PeerState { /** when did we last have a failed send (beginning of period) */ private long _lastFailedSendPeriod; /** list of messageIds (Long) that we have received but not yet sent */ - private List _currentACKs; + private final List _currentACKs; /** * list of the most recent messageIds (Long) that we have received and sent * an ACK for. We keep a few of these around to retransmit with _currentACKs, * hopefully saving some spurious retransmissions */ - private List _currentACKsResend; + private final List _currentACKsResend; /** when did we last send ACKs to the peer? */ private volatile long _lastACKSend; /** when did we decide we need to ACK to this peer? */ @@ -169,9 +169,9 @@ public class PeerState { private long _packetsReceived; /** list of InboundMessageState for active message */ - private Map _inboundMessages; + private final Map _inboundMessages; /** list of OutboundMessageState */ - private List _outboundMessages; + private final List _outboundMessages; /** which outbound message is currently being retransmitted */ private OutboundMessageState _retransmitter; @@ -272,30 +272,22 @@ public class PeerState { _dead = false; _isInbound = false; _lastIntroducerTime = 0; - _context.statManager().createRateStat("udp.congestionOccurred", "How large the cwin was when congestion occurred (duration == sendBps)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.congestedRTO", "retransmission timeout after congestion (duration == rtt dev)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendACKPartial", "Number of partial ACKs sent (duration == number of full ACKs in that ack packet)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.sendBps", "How fast we are transmitting when a packet is acked", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.receiveBps", "How fast we are receiving when a packet is fully received (at most one per second)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.mtuIncrease", "How many retransmissions have there been to the peer when the MTU was increased (period is total packets transmitted)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.mtuDecrease", "How many retransmissions have there been to the peer when the MTU was decreased (period is total packets transmitted)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.rejectConcurrentActive", "How many messages are currently being sent to the peer when we reject it (period is how many concurrent packets we allow)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.allowConcurrentActive", "How many messages are currently being sent to the peer when we accept it (period is how many concurrent packets we allow)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.rejectConcurrentSequence", "How many consecutive concurrency rejections have we had when we stop rejecting (period is how many concurrent packets we are on)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.queueDropSize", "How many messages were queued up when it was considered full, causing a tail drop?", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.queueAllowTotalLifetime", "When a peer is retransmitting and we probabalistically allow a new message, what is the sum of the pending message lifetimes? (period is the new message's lifetime)?", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); + _context.statManager().createRateStat("udp.congestionOccurred", "How large the cwin was when congestion occurred (duration == sendBps)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.congestedRTO", "retransmission timeout after congestion (duration == rtt dev)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendACKPartial", "Number of partial ACKs sent (duration == number of full ACKs in that ack packet)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendBps", "How fast we are transmitting when a packet is acked", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveBps", "How fast we are receiving when a packet is fully received (at most one per second)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.mtuIncrease", "How many retransmissions have there been to the peer when the MTU was increased (period is total packets transmitted)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.mtuDecrease", "How many retransmissions have there been to the peer when the MTU was decreased (period is total packets transmitted)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.rejectConcurrentActive", "How many messages are currently being sent to the peer when we reject it (period is how many concurrent packets we allow)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.allowConcurrentActive", "How many messages are currently being sent to the peer when we accept it (period is how many concurrent packets we allow)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.rejectConcurrentSequence", "How many consecutive concurrency rejections have we had when we stop rejecting (period is how many concurrent packets we are on)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.queueDropSize", "How many messages were queued up when it was considered full, causing a tail drop?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.queueAllowTotalLifetime", "When a peer is retransmitting and we probabalistically allow a new message, what is the sum of the pending message lifetimes? (period is the new message's lifetime)?", "udp", UDPTransport.RATES); } private int getDefaultMTU() { - String mtu = _context.getProperty(PROP_DEFAULT_MTU); - if (mtu != null) { - try { - return Integer.valueOf(mtu).intValue(); - } catch (NumberFormatException nfe) { - // ignore - } - } - return DEFAULT_MTU; + return _context.getProperty(PROP_DEFAULT_MTU, DEFAULT_MTU); } /** @@ -802,6 +794,7 @@ public class PeerState { public long getMessageId() { return _msgId; } public boolean received(int fragmentNum) { return true; } public boolean receivedComplete() { return true; } + @Override public String toString() { return "Full ACK of " + _msgId; } } @@ -1010,7 +1003,7 @@ public class PeerState { return MAX_RTO; } - public RemoteHostId getRemoteHostId() { return _remoteHostId; } + public RemoteHostId getRemoteHostId() { return _remoteHostId; }// LINT -- Exporting non-public type through public API public int add(OutboundMessageState state) { if (_dead) { @@ -1560,8 +1553,9 @@ public class PeerState { } */ + @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append(_remoteHostId.toString()); if (_remotePeer != null) buf.append(" ").append(_remotePeer.toBase64().substring(0,6)); diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java index 35c5511be..fd2d6021a 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java @@ -27,7 +27,7 @@ class PeerTestManager { private UDPTransport _transport; private PacketBuilder _packetBuilder; /** map of Long(nonce) to PeerTestState for tests currently in progress */ - private Map _activeTests; + private final Map _activeTests; /** current test we are running, or null */ private PeerTestState _currentTest; private boolean _currentTestComplete; @@ -45,9 +45,9 @@ class PeerTestManager { _packetBuilder = new PacketBuilder(context, transport); _currentTest = null; _currentTestComplete = false; - _context.statManager().createRateStat("udp.statusKnownCharlie", "How often the bob we pick passes us to a charlie we already have a session with?", "udp", new long[] { 60*1000, 20*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.receiveTestReply", "How often we get a reply to our peer test?", "udp", new long[] { 60*1000, 20*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.receiveTest", "How often we get a packet requesting us to participate in a peer test?", "udp", new long[] { 60*1000, 20*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("udp.statusKnownCharlie", "How often the bob we pick passes us to a charlie we already have a session with?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveTestReply", "How often we get a reply to our peer test?", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveTest", "How often we get a packet requesting us to participate in a peer test?", "udp", UDPTransport.RATES); } private static final int RESEND_TIMEOUT = 5*1000; diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java index 57dc648d8..16fff5fa8 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java @@ -96,8 +96,9 @@ class PeerTestState { public int getPacketsRelayed() { return _packetsRelayed; } public void incrementPacketsRelayed() { ++_packetsRelayed; } + @Override public synchronized String toString() { - StringBuffer buf = new StringBuffer(512); + StringBuilder buf = new StringBuilder(512); buf.append("Role: "); if (_ourRole == ALICE) buf.append("Alice"); else if (_ourRole == BOB) buf.append("Bob"); diff --git a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java index 117f8c563..510d712a0 100644 --- a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java +++ b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java @@ -26,6 +26,7 @@ final class RemoteHostId { public int getPort() { return _port; } public byte[] getPeerHash() { return _peerHash; } + @Override public int hashCode() { int rv = 0; for (int i = 0; _ip != null && i < _ip.length; i++) @@ -36,6 +37,7 @@ final class RemoteHostId { return rv; } + @Override public boolean equals(Object obj) { if (obj == null) throw new NullPointerException("obj is null"); @@ -45,6 +47,7 @@ final class RemoteHostId { return (_port == id.getPort()) && DataHelper.eq(_ip, id.getIP()) && DataHelper.eq(_peerHash, id.getPeerHash()); } + @Override public String toString() { return toString(true); } public String toString(boolean includePort) { if (_ip != null) { @@ -57,7 +60,7 @@ final class RemoteHostId { } } public static String toString(byte ip[]) { - StringBuffer buf = new StringBuffer(ip.length+5); + StringBuilder buf = new StringBuilder(ip.length+5); for (int i = 0; i < ip.length; i++) { buf.append(ip[i]&0xFF); if (i + 1 < ip.length) diff --git a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java index b28fb9101..44a26d4a4 100644 --- a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java +++ b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java @@ -33,7 +33,7 @@ public class TimedWeightedPriorityMessageQueue implements MessageQueue, Outbound /** how many bytes total have been pulled off the given queue */ private long _bytesTransferred[]; /** lock to notify message enqueue/removal (and block for getNext()) */ - private Object _nextLock; + private final Object _nextLock; /** have we shut down or are we still alive? */ private boolean _alive; /** which queue should we pull out of next */ @@ -76,8 +76,8 @@ public class TimedWeightedPriorityMessageQueue implements MessageQueue, Outbound _nextQueue = 0; _chokedPeers = Collections.synchronizedSet(new HashSet(16)); _listener = lsnr; - _context.statManager().createRateStat("udp.timeToEntrance", "Message lifetime until it reaches the UDP system", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.messageQueueSize", "How many messages are on the current class queue at removal", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("udp.timeToEntrance", "Message lifetime until it reaches the UDP system", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.messageQueueSize", "How many messages are on the current class queue at removal", "udp", UDPTransport.RATES); _expirer = new Expirer(); I2PThread t = new I2PThread(_expirer, "UDP outbound expirer"); t.setDaemon(true); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java index df8b024f5..6db0b1c6c 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java @@ -40,8 +40,9 @@ public class UDPAddress { parse(addr); } + @Override public String toString() { - StringBuffer rv = new StringBuffer(64); + StringBuilder rv = new StringBuilder(64); if (_introHosts != null) { for (int i = 0; i < _introHosts.length; i++) { rv.append("ssu://"); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java b/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java index dbcd8dfda..14dfced39 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java @@ -18,7 +18,7 @@ class UDPFlooder implements Runnable { private RouterContext _context; private Log _log; private UDPTransport _transport; - private List _peers; + private final List _peers; private boolean _alive; private static final byte _floodData[] = new byte[4096]; @@ -37,9 +37,10 @@ class UDPFlooder implements Runnable { _peers.notifyAll(); } } + @SuppressWarnings("empty-statement") public void removePeer(PeerState peer) { synchronized (_peers) { - while (_peers.remove(peer)) + while (_peers.remove(peer)) // can this be written better? ;// loops until its empty _peers.notifyAll(); } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java index 46d8ae3c1..8bd857fa2 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java @@ -75,11 +75,7 @@ public class UDPPacket { private static final int MAX_VALIDATE_SIZE = MAX_PACKET_SIZE; private UDPPacket(I2PAppContext ctx, boolean inbound) { - ctx.statManager().createRateStat("udp.packetsLiveInbound", "Number of live inbound packets in memory", "udp", new long[] { 60*1000, 5*60*1000 }); - ctx.statManager().createRateStat("udp.packetsLiveOutbound", "Number of live outbound packets in memory", "udp", new long[] { 60*1000, 5*60*1000 }); - ctx.statManager().createRateStat("udp.packetsLivePendingRecvInbound", "Number of live inbound packets not yet handled by the PacketHandler", "udp", new long[] { 60*1000, 5*60*1000 }); - ctx.statManager().createRateStat("udp.packetsLivePendingHandleInbound", "Number of live inbound packets not yet handled fully by the PacketHandler", "udp", new long[] { 60*1000, 5*60*1000 }); - ctx.statManager().createRateStat("udp.fetchRemoteSlow", "How long it takes to grab the remote ip info", "udp", new long[] { 60*1000 }); + ctx.statManager().createRateStat("udp.fetchRemoteSlow", "How long it takes to grab the remote ip info", "udp", UDPTransport.RATES); // the data buffer is clobbered on init(..), but we need it to bootstrap _data = new byte[MAX_PACKET_SIZE]; _packet = new DatagramPacket(_data, MAX_PACKET_SIZE); @@ -129,7 +125,7 @@ public class UDPPacket { int getFragmentCount() { return _fragmentCount; } void setFragmentCount(int count) { _fragmentCount = count; } - public RemoteHostId getRemoteHost() { + public RemoteHostId getRemoteHost() {// LINT -- Exporting non-public type through public API if (_remoteHost == null) { long before = System.currentTimeMillis(); InetAddress addr = _packet.getAddress(); @@ -172,7 +168,7 @@ public class UDPPacket { Hash hmac = _context.hmac().calculate(macKey, buf.getData(), 0, off); if (_log.shouldLog(Log.DEBUG)) { - StringBuffer str = new StringBuffer(128); + StringBuilder str = new StringBuilder(128); str.append(_packet.getLength()).append(" byte packet received, payload length "); str.append(payloadLength); str.append("\nIV: ").append(Base64.encode(buf.getData(), payloadLength, IV_SIZE)); @@ -238,9 +234,10 @@ public class UDPPacket { /** how many times we tried to validate the packet */ int getValidateCount() { return _validateCount; } + @Override public String toString() { verifyNotReleased(); - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append(_packet.getLength()); buf.append(" byte packet with "); buf.append(_packet.getAddress().getHostAddress()).append(":"); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java index 159c21ae6..9bb665f6b 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java @@ -105,6 +105,7 @@ public class UDPPacketReader { public RelayIntroReader getRelayIntroReader() { return _relayIntroReader; } public RelayResponseReader getRelayResponseReader() { return _relayResponseReader; } + @Override public String toString() { switch (readPayloadType()) { case UDPPacket.PAYLOAD_TYPE_DATA: @@ -128,7 +129,7 @@ public class UDPPacketReader { } } - public void toRawString(StringBuffer buf) { + public void toRawString(StringBuilder buf) { if (_message != null) buf.append(Base64.encode(_message, _payloadBeginOffset, _payloadLength)); } @@ -398,8 +399,9 @@ public class UDPPacketReader { return ((_message[flagOffset] & flag) != 0); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(256); + StringBuilder buf = new StringBuilder(256); long msAgo = _context.clock().now() - readTimestamp()*1000; buf.append("Data packet sent ").append(msAgo).append("ms ago "); buf.append("IV "); @@ -461,7 +463,7 @@ public class UDPPacketReader { return buf.toString(); } - public void toRawString(StringBuffer buf) { + public void toRawString(StringBuilder buf) { UDPPacketReader.this.toRawString(buf); buf.append(" payload: "); @@ -502,8 +504,9 @@ public class UDPPacketReader { int flagNum = fragmentNum % 7; return (_message[byteNum] & (1 << flagNum)) != 0x0; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("Read partial ACK of "); buf.append(getMessageId()); buf.append(" with ACKs for: "); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java index 3535484c9..f8f00bb10 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java @@ -25,7 +25,7 @@ public class UDPReceiver { private Log _log; private DatagramSocket _socket; private String _name; - private List _inboundQueue; + private final List _inboundQueue; private boolean _keepRunning; private Runner _runner; private UDPTransport _transport; @@ -41,17 +41,15 @@ public class UDPReceiver { _socket = socket; _transport = transport; _runner = new Runner(); - _context.statManager().createRateStat("udp.receivePacketSize", "How large packets received are", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.receiveRemaining", "How many packets are left sitting on the receiver's queue", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.droppedInbound", "How many packet are queued up but not yet received when we drop", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.droppedInboundProbabalistically", "How many packet we drop probabalistically (to simulate failures)", "udp", new long[] { 60*1000, 5*60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.acceptedInboundProbabalistically", "How many packet we accept probabalistically (to simulate failures)", "udp", new long[] { 60*1000, 5*60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.receiveHolePunch", "How often we receive a NAT hole punch", "udp", new long[] { 60*1000, 5*60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.ignorePacketFromDroplist", "Packet lifetime for those dropped on the drop list", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("udp.receivePacketSize", "How large packets received are", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveRemaining", "How many packets are left sitting on the receiver's queue", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.droppedInbound", "How many packet are queued up but not yet received when we drop", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveHolePunch", "How often we receive a NAT hole punch", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.ignorePacketFromDroplist", "Packet lifetime for those dropped on the drop list", "udp", UDPTransport.RATES); } public void startup() { - adjustDropProbability(); + //adjustDropProbability(); _keepRunning = true; I2PThread t = new I2PThread(_runner, _name + "." + _id); t.setDaemon(true); @@ -66,6 +64,7 @@ public class UDPReceiver { } } +/********* private void adjustDropProbability() { String p = _context.getProperty("i2np.udp.dropProbability"); if (p != null) { @@ -77,6 +76,7 @@ public class UDPReceiver { //ARTIFICIAL_DROP_PROBABILITY = 0; } } +**********/ /** * Replace the old listen port with the new one, returning the old. @@ -90,17 +90,21 @@ public class UDPReceiver { /** if a packet been sitting in the queue for a full second (meaning the handlers are overwhelmed), drop subsequent packets */ private static final long MAX_QUEUE_PERIOD = 2*1000; +/********* private static int ARTIFICIAL_DROP_PROBABILITY = 0; // 4 private static final int ARTIFICIAL_DELAY = 0; // 200; private static final int ARTIFICIAL_DELAY_BASE = 0; //600; +**********/ private int receive(UDPPacket packet) { +/********* //adjustDropProbability(); if (ARTIFICIAL_DROP_PROBABILITY > 0) { // the first check is to let the compiler optimize away this // random block on the live system when the probability is == 0 + // (not if it isn't final jr) int v = _context.random().nextInt(100); if (v <= ARTIFICIAL_DROP_PROBABILITY) { if (_log.shouldLog(Log.ERROR)) @@ -119,6 +123,7 @@ public class UDPReceiver { SimpleScheduler.getInstance().addEvent(new ArtificiallyDelayedReceive(packet), delay); return -1; } +**********/ return doReceive(packet); } @@ -159,7 +164,7 @@ public class UDPReceiver { packet.release(); _context.statManager().addRateData("udp.droppedInbound", queueSize, headPeriod); if (_log.shouldLog(Log.WARN)) { - StringBuffer msg = new StringBuffer(); + StringBuilder msg = new StringBuilder(); msg.append("Dropping inbound packet with "); msg.append(queueSize); msg.append(" queued for "); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPSender.java b/router/java/src/net/i2p/router/transport/udp/UDPSender.java index 141b87892..446fd9d63 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPSender.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPSender.java @@ -20,7 +20,7 @@ public class UDPSender { private Log _log; private DatagramSocket _socket; private String _name; - private List _outboundQueue; + private final List _outboundQueue; private boolean _keepRunning; private Runner _runner; @@ -33,42 +33,43 @@ public class UDPSender { _socket = socket; _runner = new Runner(); _name = name; - _context.statManager().createRateStat("udp.pushTime", "How long a UDP packet takes to get pushed out", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendQueueSize", "How many packets are queued on the UDP sender", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendQueueFailed", "How often it was unable to add a new packet to the queue", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendQueueTrimmed", "How many packets were removed from the queue for being too old (duration == remaining)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize", "How large packets sent are", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.socketSendTime", "How long the actual socket.send took", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendBWThrottleTime", "How long the send is blocked by the bandwidth throttle", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendACKTime", "How long an ACK packet is blocked for (duration == lifetime)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("udp.sendException", "How frequently we fail to send a packet (likely due to a windows exception)", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("udp.pushTime", "How long a UDP packet takes to get pushed out", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendQueueSize", "How many packets are queued on the UDP sender", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendQueueFailed", "How often it was unable to add a new packet to the queue", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendQueueTrimmed", "How many packets were removed from the queue for being too old (duration == remaining)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize", "How large packets sent are", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.socketSendTime", "How long the actual socket.send took", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendBWThrottleTime", "How long the send is blocked by the bandwidth throttle", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendACKTime", "How long an ACK packet is blocked for (duration == lifetime)", "udp", UDPTransport.RATES); + // used in RouterWatchdog + _context.statManager().createRateStat("udp.sendException", "How frequently we fail to send a packet (likely due to a windows exception)", "udp", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.1", "db store message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.2", "db lookup message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.3", "db search reply message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.6", "tunnel create message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.7", "tunnel create status message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.10", "delivery status message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.11", "garlic message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.16", "date message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.18", "tunnel data message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.19", "tunnel gateway message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.20", "data message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.21", "tunnel build", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.22", "tunnel build reply", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.20", "data message size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.42", "ack-only packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.43", "hole punch packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.44", "relay response packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.45", "relay intro packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.46", "relay request packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.47", "peer test charlie to bob packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.48", "peer test bob to charlie packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.49", "peer test to alice packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.50", "peer test from alice packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.51", "session confirmed packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.52", "session request packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); - _context.statManager().createRateStat("udp.sendPacketSize.53", "session created packet size", "udp", new long[] { 60*1000, 5*60*1000, 30*60*1000 }); + _context.statManager().createRateStat("udp.sendPacketSize.1", "db store message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.2", "db lookup message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.3", "db search reply message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.6", "tunnel create message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.7", "tunnel create status message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.10", "delivery status message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.11", "garlic message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.16", "date message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.18", "tunnel data message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.19", "tunnel gateway message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.20", "data message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.21", "tunnel build", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.22", "tunnel build reply", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.20", "data message size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.42", "ack-only packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.43", "hole punch packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.44", "relay response packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.45", "relay intro packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.46", "relay request packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.47", "peer test charlie to bob packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.48", "peer test bob to charlie packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.49", "peer test to alice packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.50", "peer test from alice packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.51", "session confirmed packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.52", "session request packet size", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendPacketSize.53", "session created packet size", "udp", UDPTransport.RATES); } public void startup() { diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index 0a2e7f1be..044b33b8e 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -40,13 +40,13 @@ import net.i2p.util.SimpleTimer; * */ public class UDPTransport extends TransportImpl implements TimedWeightedPriorityMessageQueue.FailedListener { - private RouterContext _context; + private RouterContext _context; // LINT -- field hides a field private Log _log; private UDPEndpoint _endpoint; /** Peer (Hash) to PeerState */ - private Map _peersByIdent; + private final Map _peersByIdent; /** RemoteHostId to PeerState */ - private Map _peersByRemoteHost; + private final Map _peersByRemoteHost; private PacketHandler _handler; private EstablishmentManager _establisher; private MessageQueue _outboundMessages; @@ -81,6 +81,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private TransportBid _fastBid; /** shared slow bid for unconnected peers when we want to prefer UDP */ private TransportBid _slowBid; + /** save some conns for inbound */ + private TransportBid _nearCapacityBid; /** shared slow bid for unconnected peers */ private TransportBid _slowestBid; /** shared fast bid for unconnected peers when we want to prefer UDP */ @@ -90,7 +92,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private TransportBid _transientFail; /** list of RemoteHostId for peers whose packets we want to drop outright */ - private List _dropList; + private final List _dropList; private int _expireTimeout; @@ -99,6 +101,10 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public static final String STYLE = "SSU"; public static final String PROP_INTERNAL_PORT = "i2np.udp.internalPort"; + public static final int DEFAULT_INTERNAL_PORT = 8887; + /** since fixed port defaults to true, this doesnt do anything at the moment. + * We should have an exception if it matches the existing low port. */ + private static final int MIN_EXTERNAL_PORT = 1024; /** define this to explicitly set an external IP address */ public static final String PROP_EXTERNAL_HOST = "i2np.udp.host"; @@ -117,9 +123,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public static final String PROP_PREFER_UDP = "i2np.udp.preferred"; private static final String DEFAULT_PREFER_UDP = "false"; + /** if true (default), we don't change our advertised port no matter what our peers tell us */ public static final String PROP_FIXED_PORT = "i2np.udp.fixedPort"; private static final String DEFAULT_FIXED_PORT = "true"; + /** allowed sources of address updates */ + public static final String PROP_SOURCES = "i2np.udp.addressSources"; + public static final String DEFAULT_SOURCES = "local,upnp,ssu"; + /** remember IP changes */ + public static final String PROP_IP= "i2np.lastIP"; + public static final String PROP_IP_CHANGE = "i2np.lastIPChange"; + /** do we require introducers, regardless of our status? */ public static final String PROP_FORCE_INTRODUCERS = "i2np.udp.forceIntroducers"; /** do we allow direct SSU connections, sans introducers? */ @@ -140,6 +154,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final int MAX_CONSECUTIVE_FAILED = 5; private static final int TEST_FREQUENCY = 13*60*1000; + public static final long[] RATES = { 10*60*1000 }; public UDPTransport(RouterContext ctx) { super(ctx); @@ -158,7 +173,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _slowBid = new SharedBid(65); _fastPreferredBid = new SharedBid(15); _slowPreferredBid = new SharedBid(20); - _slowestBid = new SharedBid(1000); + _slowestBid = new SharedBid(80); + _nearCapacityBid = new SharedBid(100); _transientFail = new SharedBid(TransportBid.TRANSIENT_FAIL); _fragments = new OutboundMessageFragments(_context, this, _activeThrottle); @@ -173,18 +189,18 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _lastInboundReceivedOn = -1; _needsRebuild = true; - _context.statManager().createRateStat("udp.alreadyConnected", "What is the lifetime of a reestablished session", "udp", new long[] { 60*1000, 10*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.droppedPeer", "How long ago did we receive from a dropped peer (duration == session lifetime", "udp", new long[] { 60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.droppedPeerInactive", "How long ago did we receive from a dropped peer (duration == session lifetime)", "udp", new long[] { 60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.statusOK", "How many times the peer test returned OK", "udp", new long[] { 5*60*1000, 20*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.statusDifferent", "How many times the peer test returned different IP/ports", "udp", new long[] { 5*60*1000, 20*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.statusReject", "How many times the peer test returned reject unsolicited", "udp", new long[] { 5*60*1000, 20*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.statusUnknown", "How many times the peer test returned an unknown result", "udp", new long[] { 5*60*1000, 20*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.addressTestInsteadOfUpdate", "How many times we fire off a peer test of ourselves instead of adjusting our own reachable address?", "udp", new long[] { 1*60*1000, 20*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.addressUpdated", "How many times we adjust our own reachable IP address", "udp", new long[] { 1*60*1000, 20*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.proactiveReestablish", "How long a session was idle for when we proactively reestablished it", "udp", new long[] { 1*60*1000, 20*60*1000, 60*60*1000, 24*60*60*1000 }); - _context.statManager().createRateStat("udp.dropPeerDroplist", "How many peers currently have their packets dropped outright when a new peer is added to the list?", "udp", new long[] { 1*60*1000, 20*60*1000 }); - _context.statManager().createRateStat("udp.dropPeerConsecutiveFailures", "How many consecutive failed sends to a peer did we attempt before giving up and reestablishing a new session (lifetime is inactivity perood)", "udp", new long[] { 1*60*1000, 10*60*1000 }); + _context.statManager().createRateStat("udp.alreadyConnected", "What is the lifetime of a reestablished session", "udp", RATES); + _context.statManager().createRateStat("udp.droppedPeer", "How long ago did we receive from a dropped peer (duration == session lifetime", "udp", RATES); + _context.statManager().createRateStat("udp.droppedPeerInactive", "How long ago did we receive from a dropped peer (duration == session lifetime)", "udp", RATES); + _context.statManager().createRateStat("udp.statusOK", "How many times the peer test returned OK", "udp", RATES); + _context.statManager().createRateStat("udp.statusDifferent", "How many times the peer test returned different IP/ports", "udp", RATES); + _context.statManager().createRateStat("udp.statusReject", "How many times the peer test returned reject unsolicited", "udp", RATES); + _context.statManager().createRateStat("udp.statusUnknown", "How many times the peer test returned an unknown result", "udp", RATES); + _context.statManager().createRateStat("udp.addressTestInsteadOfUpdate", "How many times we fire off a peer test of ourselves instead of adjusting our own reachable address?", "udp", RATES); + _context.statManager().createRateStat("udp.addressUpdated", "How many times we adjust our own reachable IP address", "udp", RATES); + _context.statManager().createRateStat("udp.proactiveReestablish", "How long a session was idle for when we proactively reestablished it", "udp", RATES); + _context.statManager().createRateStat("udp.dropPeerDroplist", "How many peers currently have their packets dropped outright when a new peer is added to the list?", "udp", RATES); + _context.statManager().createRateStat("udp.dropPeerConsecutiveFailures", "How many consecutive failed sends to a peer did we attempt before giving up and reestablishing a new session (lifetime is inactivity perood)", "udp", RATES); __instance = this; } @@ -215,22 +231,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority int port = -1; if (_externalListenPort <= 0) { // no explicit external port, so lets try an internal one - String portStr = _context.getProperty(PROP_INTERNAL_PORT); - if (portStr != null) { - try { - port = Integer.parseInt(portStr); - } catch (NumberFormatException nfe) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Invalid port specified [" + portStr + "]"); - } - } - if (port <= 0) { - port = 8887; - //port = 1024 + _context.random().nextInt(31*1024); - if (_log.shouldLog(Log.INFO)) - _log.info("Selecting an arbitrary port to bind to: " + port); - _context.router().setConfigSetting(PROP_INTERNAL_PORT, port+""); - } + port = _context.getProperty(PROP_INTERNAL_PORT, DEFAULT_INTERNAL_PORT); // attempt to use it as our external port - this will be overridden by // externalAddressReceived(...) _context.router().setConfigSetting(PROP_EXTERNAL_PORT, port+""); @@ -321,7 +322,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public int getLocalPort() { return _externalListenPort; } public InetAddress getLocalAddress() { return _externalListenHost; } public int getExternalPort() { return _externalListenPort; } - + public int getRequestedPort() { + if (_externalListenPort > 0) + return _externalListenPort; + return _context.getProperty(PROP_INTERNAL_PORT, DEFAULT_INTERNAL_PORT); + } + /** * If we have received an inbound connection in the last 2 minutes, don't allow * our IP to change. @@ -333,14 +339,62 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _lastInboundReceivedOn = System.currentTimeMillis(); } + /** + * From config, UPnP, local i/f, ... + * + * @param source used for logging only + * @param ip publicly routable IPv4 only + * @param port 0 if unknown + */ + public void externalAddressReceived(String source, byte[] ip, int port) { + String s = RemoteHostId.toString(ip); + if (_log.shouldLog(Log.WARN)) + _log.warn("Received address: " + s + " port: " + port + " from: " + source); + if (explicitAddressSpecified()) + return; + String sources = _context.getProperty(PROP_SOURCES, DEFAULT_SOURCES); + if (!sources.contains(source)) + return; + boolean changed = changeAddress(ip, port); + // Assume if we have an interface with a public IP that we aren't firewalled. + // If this is wrong, the peer test will figure it out and change the status. + if (changed && source.equals(Transport.SOURCE_INTERFACE)) + setReachabilityStatus(CommSystemFacade.STATUS_OK); + } + + /** + * Callback from UPnP. + * If we we have an IP address and UPnP claims success, believe it. + * If this is wrong, the peer test will figure it out and change the status. + * Don't do anything if UPnP claims failure. + */ + public void forwardPortStatus(int port, boolean success, String reason) { + if (_log.shouldLog(Log.WARN)) { + if (success) + _log.warn("UPnP has opened the SSU port: " + port); + else + _log.warn("UPnP has failed to open the SSU port: " + port + " reason: " + reason); + } + if (success && _externalListenHost != null) + setReachabilityStatus(CommSystemFacade.STATUS_OK); + } + /** * Someone we tried to contact gave us what they think our IP address is. * Right now, we just blindly trust them, changing our IP and port on a * whim. this is not good ;) * + * Todo: + * - Much better tracking of troublemakers + * - Disable if we have good local address or UPnP + * + * @param from Hash of inbound destination + * @param ourIP publicly routable IPv4 only + * @param ourPort >= 1024 */ void externalAddressReceived(Hash from, byte ourIP[], int ourPort) { - boolean isValid = isValid(ourIP); + boolean isValid = isValid(ourIP) && + (ourPort >= MIN_EXTERNAL_PORT || ourPort == _externalListenPort || _externalListenPort <= 0); boolean explicitSpecified = explicitAddressSpecified(); boolean inboundRecent = _lastInboundReceivedOn + ALLOW_IP_CHANGE_INTERVAL > System.currentTimeMillis(); if (_log.shouldLog(Log.INFO)) @@ -350,15 +404,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (explicitSpecified) return; + String sources = _context.getProperty(PROP_SOURCES, DEFAULT_SOURCES); + if (!sources.contains("ssu")) + return; - boolean fixedPort = getIsPortFixed(); - boolean updated = false; - boolean fireTest = false; if (!isValid) { // ignore them if (_log.shouldLog(Log.ERROR)) _log.error("The router " + from.toBase64() + " told us we have an invalid IP - " - + RemoteHostId.toString(ourIP) + ". Lets throw tomatoes at them"); + + RemoteHostId.toString(ourIP) + " port " + ourPort + ". Lets throw tomatoes at them"); markUnreachable(from); //_context.shitlist().shitlistRouter(from, "They said we had an invalid IP", STYLE); return; @@ -367,33 +421,54 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldLog(Log.INFO)) _log.info("Ignoring IP address suggestion, since we have received an inbound con recently"); } else { + changeAddress(ourIP, ourPort); + } + + } + + /** + * @param ourPort >= 1024 or 0 for no change + */ + private boolean changeAddress(byte ourIP[], int ourPort) { + /** this defaults to true, which means we never change our external port based on what somebody tells us */ + boolean fixedPort = getIsPortFixed(); + boolean updated = false; + boolean fireTest = false; + synchronized (this) { if ( (_externalListenHost == null) || (!eq(_externalListenHost.getAddress(), _externalListenPort, ourIP, ourPort)) ) { - if ( (_reachabilityStatus == CommSystemFacade.STATUS_UNKNOWN) || + if (_log.shouldLog(Log.WARN)) + _log.warn("Change address? status = " + _reachabilityStatus + + " diff = " + (_context.clock().now() - _reachabilityStatusLastUpdated) + + " old = " + _externalListenHost + ':' + _externalListenPort); + if ( (_reachabilityStatus != CommSystemFacade.STATUS_OK) || (_externalListenHost == null) || (_externalListenPort <= 0) || (_context.clock().now() - _reachabilityStatusLastUpdated > 2*TEST_FREQUENCY) ) { // they told us something different and our tests are either old or failing - if (_log.shouldLog(Log.INFO)) - _log.info("Trying to change our external address..."); + if (_log.shouldLog(Log.WARN)) + _log.warn("Trying to change our external address..."); try { _externalListenHost = InetAddress.getByAddress(ourIP); - if (!fixedPort) + // fixed port defaults to true so we never do this + if (ourPort >= MIN_EXTERNAL_PORT && !fixedPort) _externalListenPort = ourPort; - rebuildExternalAddress(); - replaceAddress(_externalAddress); - updated = true; + if (_externalListenPort > 0) { + rebuildExternalAddress(); + replaceAddress(_externalAddress); + updated = true; + } } catch (UnknownHostException uhe) { _externalListenHost = null; - if (_log.shouldLog(Log.INFO)) - _log.info("Error trying to change our external address", uhe); + if (_log.shouldLog(Log.WARN)) + _log.warn("Error trying to change our external address", uhe); } } else { // they told us something different, but our tests are recent and positive, // so lets test again fireTest = true; - if (_log.shouldLog(Log.INFO)) - _log.info("Different address, but we're fine.. (" + _reachabilityStatus + ")"); + if (_log.shouldLog(Log.WARN)) + _log.warn("Different address, but we're fine.. (" + _reachabilityStatus + ")"); } } else { // matched what we expect @@ -401,23 +476,29 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _log.info("Same address as the current one"); } } - } - + if (fireTest) { _context.statManager().addRateData("udp.addressTestInsteadOfUpdate", 1, 0); - _testEvent.forceRun(); - SimpleTimer.getInstance().addEvent(_testEvent, 5*1000); } else if (updated) { _context.statManager().addRateData("udp.addressUpdated", 1, 0); if (!fixedPort) _context.router().setConfigSetting(PROP_EXTERNAL_PORT, ourPort+""); - _context.router().saveConfig(); + // queue a country code lookup of the new IP + _context.commSystem().queueLookup(ourIP); + // store these for laptop-mode (change ident on restart... or every time... when IP changes) + String oldIP = _context.getProperty(PROP_IP); + if (!_externalListenHost.getHostAddress().equals(oldIP)) { + _context.router().setConfigSetting(PROP_IP, _externalListenHost.getHostAddress()); + _context.router().setConfigSetting(PROP_IP_CHANGE, "" + _context.clock().now()); + _context.router().saveConfig(); + } _context.router().rebuildRouterInfo(); - _testEvent.forceRun(); - SimpleTimer.getInstance().addEvent(_testEvent, 5*1000); } + _testEvent.forceRun(); + SimpleTimer.getInstance().addEvent(_testEvent, 5*1000); + return updated; } - + private static final boolean eq(byte laddr[], int lport, byte raddr[], int rport) { return (rport == lport) && DataHelper.eq(laddr, raddr); } @@ -427,7 +508,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (addr.length < 4) return false; if (isPubliclyRoutable(addr)) return true; - return Boolean.valueOf(_context.getProperty("i2np.udp.allowLocal", "false")).booleanValue(); + return Boolean.valueOf(_context.getProperty("i2np.udp.allowLocal")).booleanValue(); } private boolean getIsPortFixed() { @@ -437,7 +518,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority * get the state for the peer at the given remote host/port, or null * if no state exists */ - public PeerState getPeerState(RemoteHostId hostInfo) { + public PeerState getPeerState(RemoteHostId hostInfo) { // LINT -- Exporting non-public type through public API synchronized (_peersByRemoteHost) { return (PeerState)_peersByRemoteHost.get(hostInfo); } @@ -597,6 +678,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } ***/ + @Override public void messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived) { if (inMsg.getType() == DatabaseStoreMessage.MESSAGE_TYPE) { DatabaseStoreMessage dsm = (DatabaseStoreMessage)inMsg; @@ -673,7 +755,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - public boolean isInDropList(RemoteHostId peer) { synchronized (_dropList) { return _dropList.contains(peer); } } + public boolean isInDropList(RemoteHostId peer) { synchronized (_dropList) { return _dropList.contains(peer); } }// LINT -- Exporting non-public type through public API void dropPeer(Hash peer, boolean shouldShitlist, String why) { PeerState state = getPeerState(peer); @@ -683,7 +765,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private void dropPeer(PeerState peer, boolean shouldShitlist, String why) { if (_log.shouldLog(Log.WARN)) { long now = _context.clock().now(); - StringBuffer buf = new StringBuffer(4096); + StringBuilder buf = new StringBuilder(4096); long timeSinceSend = now - peer.getLastSendTime(); long timeSinceRecv = now - peer.getLastReceiveTime(); long timeSinceAck = now - peer.getLastACKSend(); @@ -861,6 +943,10 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } public TransportBid bid(RouterInfo toAddress, long dataSize) { + if (dataSize > OutboundMessageState.MAX_MSG_SIZE) { + // NTCP max is lower, so msg will get dropped + return null; + } Hash to = toAddress.getIdentity().calculateHash(); PeerState peer = getPeerState(to); if (peer != null) { @@ -911,8 +997,10 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return _slowPreferredBid; else if (preferUDP()) return _slowBid; - else + else if (haveCapacity()) return _slowestBid; + else + return _nearCapacityBid; } } @@ -935,6 +1023,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final int MIN_EXPIRE_TIMEOUT = 10*60*1000; public String getStyle() { return STYLE; } + @Override public void send(OutNetMessage msg) { if (msg == null) return; if (msg.getTarget() == null) return; @@ -1011,14 +1100,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority void rebuildExternalAddress(boolean allowRebuildRouterInfo) { // if the external port is specified, we want to use that to bind to even // if we don't know the external host. - String port = _context.getProperty(PROP_EXTERNAL_PORT); - if (port != null) { - try { - _externalListenPort = Integer.parseInt(port); - } catch (NumberFormatException nfe) { - _externalListenPort = -1; - } - } + _externalListenPort = _context.getProperty(PROP_EXTERNAL_PORT, -1); if (explicitAddressSpecified()) { try { @@ -1114,12 +1196,18 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } public boolean introducersRequired() { + /****************** + * Don't do this anymore, as we are removing the checkbox from the UI, + * and we rarely if ever see the problem of false negatives for firewall detection - + * it's usually false positives. + ****************** String forceIntroducers = _context.getProperty(PROP_FORCE_INTRODUCERS); if ( (forceIntroducers != null) && (Boolean.valueOf(forceIntroducers).booleanValue()) ) { if (_log.shouldLog(Log.INFO)) _log.info("Force introducers specified"); return true; } + *******************/ short status = getReachabilityStatus(); switch (status) { case CommSystemFacade.STATUS_REJECT_UNSOLICITED: @@ -1137,6 +1225,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } + /** default true */ private boolean allowDirectUDP() { String allowDirect = _context.getProperty(PROP_ALLOW_DIRECT); return ( (allowDirect == null) || (Boolean.valueOf(allowDirect).booleanValue()) ); @@ -1168,8 +1257,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // + " lastSentFully: " + sendDelay // + " expired? " + msg.isExpired()); consecutive = msg.getPeer().incrementConsecutiveFailedSends(); - if (_log.shouldLog(Log.WARN)) - _log.warn("Consecutive failure #" + consecutive + if (_log.shouldLog(Log.INFO)) + _log.info("Consecutive failure #" + consecutive + " on " + msg.toString() + " to " + msg.getPeer()); if ( (_context.clock().now() - msg.getPeer().getLastSendFullyTime() <= 60*1000) || (consecutive < MAX_CONSECUTIVE_FAILED) ) { @@ -1189,13 +1278,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } private void noteSend(OutboundMessageState msg, boolean successful) { + // bail before we do all the work + if (!_context.messageHistory().getDoLog()) + return; int pushCount = msg.getPushCount(); int sends = msg.getMaxSends(); boolean expired = msg.isExpired(); OutNetMessage m = msg.getMessage(); PeerState p = msg.getPeer(); - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append(" lifetime: ").append(msg.getLifetime()); buf.append(" sends: ").append(sends); buf.append(" pushes: ").append(pushCount); @@ -1225,10 +1317,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public void failed(OutNetMessage msg, String reason) { if (msg == null) return; - if (_log.shouldLog(Log.WARN)) - _log.warn("Sending message failed: " + msg, new Exception("failed from")); + if (_log.shouldLog(Log.INFO)) + _log.info("Sending message failed: " + msg, new Exception("failed from")); - _context.messageHistory().sendMessage(msg.getMessageType(), msg.getMessageId(), msg.getExpiration(), + if (!_context.messageHistory().getDoLog()) + _context.messageHistory().sendMessage(msg.getMessageType(), msg.getMessageId(), msg.getExpiration(), msg.getTarget().getIdentity().calculateHash(), false, reason); super.afterSend(msg, false); } @@ -1242,6 +1335,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority super.afterSend(m, true); } + @Override + public int countPeers() { + synchronized (_peersByIdent) { + return _peersByIdent.size(); + } + } + + @Override public int countActivePeers() { long now = _context.clock().now(); int active = 0; @@ -1258,6 +1359,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return active; } + @Override public int countActiveSendPeers() { long now = _context.clock().now(); int active = 0; @@ -1274,6 +1376,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return active; } + @Override public boolean isEstablished(Hash dest) { return getPeerState(dest) != null; } @@ -1284,16 +1387,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - public boolean haveCapacity() { - synchronized (_peersByIdent) { - return _peersByIdent.size() < getMaxConnections() * 4 / 5; - } - } - /** * Return our peer clock skews on this transport. * Vector composed of Long, each element representing a peer skew in seconds. */ + @Override public Vector getClockSkews() { Vector skews = new Vector(); @@ -1419,6 +1517,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class IdleInComparator extends PeerComparator { private static final IdleInComparator _instance = new IdleInComparator(); public static final IdleInComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = r.getLastReceiveTime() - l.getLastReceiveTime(); if (rv == 0) // fallback on alpha @@ -1430,6 +1529,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class IdleOutComparator extends PeerComparator { private static final IdleOutComparator _instance = new IdleOutComparator(); public static final IdleOutComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = r.getLastSendTime() - l.getLastSendTime(); if (rv == 0) // fallback on alpha @@ -1441,6 +1541,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class RateInComparator extends PeerComparator { private static final RateInComparator _instance = new RateInComparator(); public static final RateInComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getReceiveBps() - r.getReceiveBps(); if (rv == 0) // fallback on alpha @@ -1452,6 +1553,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class RateOutComparator extends PeerComparator { private static final RateOutComparator _instance = new RateOutComparator(); public static final RateOutComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getSendBps() - r.getSendBps(); if (rv == 0) // fallback on alpha @@ -1463,6 +1565,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class UptimeComparator extends PeerComparator { private static final UptimeComparator _instance = new UptimeComparator(); public static final UptimeComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = r.getKeyEstablishedTime() - l.getKeyEstablishedTime(); if (rv == 0) // fallback on alpha @@ -1474,6 +1577,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class SkewComparator extends PeerComparator { private static final SkewComparator _instance = new SkewComparator(); public static final SkewComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = Math.abs(l.getClockSkew()) - Math.abs(r.getClockSkew()); if (rv == 0) // fallback on alpha @@ -1485,6 +1589,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class CwndComparator extends PeerComparator { private static final CwndComparator _instance = new CwndComparator(); public static final CwndComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getSendWindowBytes() - r.getSendWindowBytes(); if (rv == 0) // fallback on alpha @@ -1496,6 +1601,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class SsthreshComparator extends PeerComparator { private static final SsthreshComparator _instance = new SsthreshComparator(); public static final SsthreshComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getSlowStartThreshold() - r.getSlowStartThreshold(); if (rv == 0) // fallback on alpha @@ -1507,6 +1613,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class RTTComparator extends PeerComparator { private static final RTTComparator _instance = new RTTComparator(); public static final RTTComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getRTT() - r.getRTT(); if (rv == 0) // fallback on alpha @@ -1518,6 +1625,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class DevComparator extends PeerComparator { private static final DevComparator _instance = new DevComparator(); public static final DevComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getRTTDeviation() - r.getRTTDeviation(); if (rv == 0) // fallback on alpha @@ -1529,6 +1637,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class RTOComparator extends PeerComparator { private static final RTOComparator _instance = new RTOComparator(); public static final RTOComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getRTO() - r.getRTO(); if (rv == 0) // fallback on alpha @@ -1540,6 +1649,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class MTUComparator extends PeerComparator { private static final MTUComparator _instance = new MTUComparator(); public static final MTUComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getMTU() - r.getMTU(); if (rv == 0) // fallback on alpha @@ -1551,6 +1661,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class SendCountComparator extends PeerComparator { private static final SendCountComparator _instance = new SendCountComparator(); public static final SendCountComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getPacketsTransmitted() - r.getPacketsTransmitted(); if (rv == 0) // fallback on alpha @@ -1562,6 +1673,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class RecvCountComparator extends PeerComparator { private static final RecvCountComparator _instance = new RecvCountComparator(); public static final RecvCountComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getPacketsReceived() - r.getPacketsReceived(); if (rv == 0) // fallback on alpha @@ -1573,6 +1685,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class ResendComparator extends PeerComparator { private static final ResendComparator _instance = new ResendComparator(); public static final ResendComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getPacketsRetransmitted() - r.getPacketsRetransmitted(); if (rv == 0) // fallback on alpha @@ -1584,6 +1697,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static class DupComparator extends PeerComparator { private static final DupComparator _instance = new DupComparator(); public static final DupComparator instance() { return _instance; } + @Override protected int compare(PeerState l, PeerState r) { long rv = l.getPacketsReceivedDuplicate() - r.getPacketsReceivedDuplicate(); if (rv == 0) // fallback on alpha @@ -1612,7 +1726,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - private void appendSortLinks(StringBuffer buf, String urlBase, int sortFlags, String descr, int ascending) { + private void appendSortLinks(StringBuilder buf, String urlBase, int sortFlags, String descr, int ascending) { if (sortFlags == ascending) { buf.append(" V^ "); @@ -1628,6 +1742,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority //public void renderStatusHTML(Writer out) throws IOException { renderStatusHTML(out, 0); } public void renderStatusHTML(Writer out, int sortFlags) throws IOException {} + @Override public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException { TreeSet peers = new TreeSet(getComparator(sortFlags)); synchronized (_peersByIdent) { @@ -1647,57 +1762,55 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority long dupRecvTotal = 0; int numPeers = 0; - StringBuffer buf = new StringBuffer(512); - buf.append("UDP connections: ").append(peers.size()); - buf.append(" limit: ").append(getMaxConnections()); - buf.append(" timeout: ").append(DataHelper.formatDuration(_expireTimeout)); - buf.append("
    \n"); - buf.append("\n"); - buf.append(" \n"); + buf.append("

    Percentage of bytes retransmitted (lifetime): ").append(formatPct(bwResent)); + buf.append("

    (Includes retransmission required by packet loss)

    \n"); out.write(buf.toString()); buf.setLength(0); out.write(KEY); - out.write("
    peer"); - if (sortFlags == FLAG_ALPHA) - buf.append(" V "); - else + StringBuilder buf = new StringBuilder(512); + buf.append("

    UDP connections: ").append(peers.size()); + buf.append(". Limit: ").append(getMaxConnections()); + buf.append(". Timeout: ").append(DataHelper.formatDuration(_expireTimeout)); + buf.append(".

    \n"); + buf.append("
    \n"); + buf.append("\n"); + buf.append("\n"); + buf.append("\n"); out.write(buf.toString()); buf.setLength(0); long now = _context.clock().now(); @@ -1706,44 +1819,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (now-peer.getLastReceiveTime() > 60*60*1000) continue; // don't include old peers - buf.append(""); - - String name = peer.getRemotePeer().toBase64().substring(0,6); - buf.append(""); + //byte[] ip = getIP(peer.getRemotePeer()); + //if (ip != null) + // buf.append(' ').append(_context.blocklist().toStr(ip)); + buf.append(""); long idleIn = (now-peer.getLastReceiveTime())/1000; long idleOut = (now-peer.getLastSendTime())/1000; if (idleIn < 0) idleIn = 0; if (idleOut < 0) idleOut = 0; - buf.append(""); + buf.append("s"); int recvBps = (idleIn > 2 ? 0 : peer.getReceiveBps()); int sendBps = (idleOut > 2 ? 0 : peer.getSendBps()); - buf.append(""); + //buf.append("K/s "); + buf.append(""); long uptime = now - peer.getKeyEstablishedTime(); - buf.append(""); + buf.append(""); - buf.append(""); + buf.append("s"); offsetTotal = offsetTotal + peer.getClockSkew(); long sendWindow = peer.getSendWindowBytes(); - buf.append(""); + buf.append(""); - buf.append(""); + buf.append("K"); int rtt = peer.getRTT(); int rto = peer.getRTO(); - buf.append(""); + buf.append(""); - buf.append(""); + buf.append(""); - buf.append(""); + buf.append(""); - buf.append(""); + buf.append(""); long sent = peer.getPacketsTransmitted(); long recv = peer.getPacketsReceived(); - buf.append(""); + buf.append(""); - buf.append(""); + buf.append(""); //double sent = (double)peer.getPacketsPeriodTransmitted(); //double sendLostPct = 0; @@ -1861,16 +1949,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority long resent = peer.getPacketsRetransmitted(); long dupRecv = peer.getPacketsReceivedDuplicate(); - buf.append(""); + buf.append(""); double recvDupPct = (double)peer.getPacketsReceivedDuplicate()/(double)peer.getPacketsReceived(); - buf.append(""); + buf.append(""); buf.append("\n"); out.write(buf.toString()); @@ -1892,26 +1980,25 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority numPeers++; } - buf.append("\n"); - buf.append(" "); - buf.append(" \n"); + buf.append(" "); + buf.append(" "); - buf.append(" \n"); - buf.append(" "); + buf.append(" \n"); + buf.append(" \n"); - buf.append(" \n"); + buf.append(" \n \n"); - buf.append(" \n"); - buf.append(" \n"); - buf.append("\n \n"); + buf.append(" \n"); + buf.append("
    Peer"); + if (sortFlags != FLAG_ALPHA) buf.append(" V "); - buf.append("idle"); + buf.append("DirIdle
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by idle inbound", FLAG_IDLE_IN); buf.append("/"); appendSortLinks(buf, urlBase, sortFlags, "Sort by idle outbound", FLAG_IDLE_OUT); - buf.append(""); - buf.append("
    in/out"); + buf.append(""); + buf.append("In/Out
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by inbound rate", FLAG_RATE_IN); buf.append("/"); appendSortLinks(buf, urlBase, sortFlags, "Sort by outbound rate", FLAG_RATE_OUT); - buf.append("\n"); - buf.append("
    up"); + buf.append("\n"); + buf.append("Up
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by connection uptime", FLAG_UPTIME); - buf.append("
    skew"); + buf.append("Skew
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by clock skew", FLAG_SKEW); - buf.append("\n"); - buf.append("
    cwnd"); + buf.append("\n"); + buf.append("Cwnd
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by congestion window", FLAG_CWND); - buf.append("
    ssthresh"); + buf.append("Sst
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by slow start threshold", FLAG_SSTHRESH); - buf.append("\n"); - buf.append("
    rtt"); + buf.append("\n"); + buf.append("Rtt
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by round trip time", FLAG_RTT); - buf.append("
    dev"); + buf.append("Dev
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by round trip time deviation", FLAG_DEV); - buf.append("
    rto"); + buf.append("Rto
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by retransmission timeout", FLAG_RTO); - buf.append("\n"); - buf.append("
    mtu"); + buf.append("\n"); + buf.append("Mtu
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by maximum transmit unit", FLAG_MTU); - buf.append("
    send"); + buf.append("TX
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets sent", FLAG_SEND); - buf.append("
    recv"); + buf.append("RX
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets received", FLAG_RECV); - buf.append("\n"); - buf.append("
    resent"); + buf.append("\n"); + buf.append("ReTX
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets retransmitted", FLAG_RESEND); - buf.append("
    dupRecv"); + buf.append("DupRX
    "); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets received more than once", FLAG_DUP); - buf.append("\n"); - buf.append("
    "); - buf.append(""); - buf.append(name); -/* - buf.append("@"); - byte ip[] = peer.getRemoteIP(); - for (int j = 0; j < ip.length; j++) { - int num = ip[j] & 0xFF; - if (num < 10) - buf.append("00"); - else if (num < 100) - buf.append("0"); - buf.append(num); - if (j + 1 < ip.length) - buf.append('.'); - } - buf.append(':'); - int port = peer.getRemotePort(); - if (port < 10) - buf.append("0000"); - else if (port < 100) - buf.append("000"); - else if (port < 1000) - buf.append("00"); - else if (port < 10000) - buf.append("0"); - buf.append(port); -*/ - buf.append(" "); + buf.append("
    "); + buf.append(_context.commSystem().renderPeerHTML(peer.getRemotePeer())); + //byte ip[] = peer.getRemoteIP(); + //if (ip != null) + // buf.append(' ').append(_context.blocklist().toStr(ip)); + buf.append(" "); if (peer.isInbound()) - buf.append("in "); + buf.append("\"Inbound\" "); else - buf.append("out "); + buf.append("\"Outbound\" "); if (peer.getWeRelayToThemAs() > 0) buf.append("^"); else @@ -1754,104 +1839,107 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority boolean appended = false; if (_activeThrottle.isChoked(peer.getRemotePeer())) { if (!appended) buf.append("
    "); - buf.append(" [choked]"); + buf.append(" Choked"); appended = true; } if (peer.getConsecutiveFailedSends() > 0) { if (!appended) buf.append("
    "); - buf.append(" [").append(peer.getConsecutiveFailedSends()).append(" failures]"); + buf.append(" ").append(peer.getConsecutiveFailedSends()).append(" fail(s)"); appended = true; } if (_context.shitlist().isShitlisted(peer.getRemotePeer(), STYLE)) { if (!appended) buf.append("
    "); - buf.append(" [shitlisted]"); + buf.append(" Shitlist"); appended = true; } - buf.append("
    "); + buf.append(" "); buf.append(idleIn); buf.append("s/"); buf.append(idleOut); - buf.append("s"); + buf.append(" "); buf.append(formatKBps(recvBps)); buf.append("/"); buf.append(formatKBps(sendBps)); - buf.append("KBps "); + buf.append("K/s "); //buf.append(formatKBps(peer.getReceiveACKBps())); - //buf.append("KBps/"); + //buf.append("K/s/"); //buf.append(formatKBps(peer.getSendACKBps())); - //buf.append("KBps "); - buf.append(""); + buf.append(" "); buf.append(DataHelper.formatDuration(uptime)); - buf.append(""); + buf.append(" "); buf.append(peer.getClockSkew()); - buf.append("s"); + buf.append(" "); buf.append(sendWindow/1024); buf.append("K"); buf.append("/").append(peer.getConcurrentSends()); buf.append("/").append(peer.getConcurrentSendWindow()); buf.append("/").append(peer.getConsecutiveSendRejections()); - buf.append(""); + buf.append(" "); buf.append(peer.getSlowStartThreshold()/1024); - buf.append("K"); + buf.append(" "); buf.append(rtt); - buf.append(""); + buf.append(" "); buf.append(peer.getRTTDeviation()); - buf.append(""); + buf.append(" "); buf.append(rto); - buf.append(""); + buf.append(" "); buf.append(peer.getMTU()).append("/").append(peer.getReceiveMTU()); //.append('/'); //buf.append(peer.getMTUIncreases()).append('/'); //buf.append(peer.getMTUDecreases()); - buf.append(""); + buf.append(" "); buf.append(sent); - buf.append(""); + buf.append(" "); buf.append(recv); - buf.append(""); + buf.append(" "); //buf.append(formatPct(sendLostPct)); buf.append(resent); // + "/" + peer.getPacketsPeriodRetransmitted() + "/" + sent); //buf.append(peer.getPacketRetransmissionRate()); - buf.append(""); + buf.append(" "); buf.append(dupRecv); //formatPct(recvDupPct)); - buf.append("

    Total"); +// buf.append("

    Total"); buf.append(formatKBps(bpsIn)).append("/").append(formatKBps(bpsOut)); - buf.append("KBps").append(numPeers > 0 ? DataHelper.formatDuration(uptimeMsTotal/numPeers) : "0s"); - buf.append("").append(numPeers > 0 ? DataHelper.formatDuration(offsetTotal*1000/numPeers) : "0ms").append(""); + buf.append("K/s").append(numPeers > 0 ? DataHelper.formatDuration(uptimeMsTotal/numPeers) : "0s"); + buf.append(" ").append(numPeers > 0 ? DataHelper.formatDuration(offsetTotal*1000/numPeers) : "0ms").append(""); buf.append(numPeers > 0 ? cwinTotal/(numPeers*1024) + "K" : "0K"); - buf.append(" "); + buf.append("  "); buf.append(numPeers > 0 ? rttTotal/numPeers : 0); - buf.append(" "); + buf.append("   "); buf.append(numPeers > 0 ? rtoTotal/numPeers : 0); - buf.append(" "); - buf.append(sendTotal).append("").append(recvTotal).append("").append(resentTotal); - buf.append("").append(dupRecvTotal).append("
    "); + buf.append("  "); + buf.append(sendTotal).append(" ").append(recvTotal).append("").append(resentTotal); + buf.append(" ").append(dupRecvTotal).append("

    \n"); long bytesTransmitted = _context.bandwidthLimiter().getTotalAllocatedOutboundBytes(); // NPE here early double averagePacketSize = _context.statManager().getRate("udp.sendPacketSize").getLifetimeAverageValue(); @@ -1919,13 +2006,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority resentTotal = (long)_context.statManager().getRate("udp.packetsRetransmitted").getLifetimeEventCount(); double nondupSent = ((double)bytesTransmitted - ((double)resentTotal)*averagePacketSize); double bwResent = (nondupSent <= 0 ? 0d : ((((double)resentTotal)*averagePacketSize) / nondupSent)); - buf.append("Percentage of bytes retransmitted (lifetime): ").append(formatPct(bwResent)); - buf.append(" (includes retransmission required by packet loss)
    \n"); - buf.append("

    \n"); } private static final DecimalFormat _fmt = new DecimalFormat("#,##0.00"); @@ -1941,38 +2026,41 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - private static final String KEY = "" + - "peer: the remote peer (< inbound, > outbound, v means they offer to introduce us, ^ means we offer to introduce them)
    \n" + - "idle: the idle time is how long since a packet has been received or sent
    \n" + - "in/out: the rates show a smoothed inbound and outbound transfer rate (KBytes per second)
    \n" + - "up: the uptime is how long ago this session was established
    \n" + - "skew: the skew says how far off the other user's clock is, relative to your own
    \n" + - "cwnd: the congestion window is how many bytes in 'in flight' you can send w/out an acknowledgement /
    \n" + - "      the number of currently active messages being sent /
    \n" + - "      the maximum number of concurrent messages to send /
    \n"+ - "      the number of consecutive sends which were blocked due to throws message window size
    \n" + - "ssthresh: the slow start threshold help make sure the cwnd doesn't grow too fast
    \n" + - "rtt: the round trip time is how long it takes to get an acknowledgement of a packet
    \n" + - "dev: the standard deviation of the round trip time, to help control the retransmit timeout
    \n" + - "rto: the retransmit timeout controls how frequently an unacknowledged packet will be retransmitted
    \n" + - "mtu: current sending packet size / estimated receiving packet size
    \n" + - "send: the number of packets sent to the peer
    \n" + - "recv: the number of packets received from the peer
    \n" + - "resent: the number of packets retransmitted to the peer
    \n" + - "dupRecv: the number of duplicate packets received from the peer" + - "\n"; + private static final String KEY = "

    Definitions:

    " + + "
    Peer: the remote peer.
    \n" + + "Dir: v means they offer to introduce us, ^ means we offer to introduce them.
    \n" + + "Idle: the idle time is how long since a packet has been received or sent.
    \n" + + "In/out: the rates show a smoothed inbound and outbound transfer rate (KBytes per second).
    \n" + + "Up: the uptime is how long ago this session was established.
    \n" + + "Skew: the skew says how far off the other user's clock is, relative to your own.
    \n" + + "Cwnd: the congestion window is how many bytes in 'in flight' you can send w/out an acknowledgement, /
    \n" + + "        the number of currently active messages being sent, /
    \n" + + "        the maximum number of concurrent messages to send, /
    \n"+ + "        the number of consecutive sends which were blocked due to throws message window size.
    \n" + + "Sst: the slow start threshold helps make sure the cwnd doesn't grow too fast.
    \n" + + "Rtt: the round trip time is how long it takes to get an acknowledgement of a packet.
    \n" + + "Dev: the standard deviation of the round trip time, to help control the retransmit timeout.
    \n" + + "Rto: the retransmit timeout controls how frequently an unacknowledged packet will be retransmitted.
    \n" + + "Mtu: current sending packet size / estimated receiving packet size.
    \n" + + "TX: the number of packets sent to the peer.
    \n" + + "RX: the number of packets received from the peer.
    \n" + + "ReTX: the number of packets retransmitted to the peer.
    \n" + + "DupRX: the number of duplicate packets received from the peer." + + "
    \n"; /** * Cache the bid to reduce object churn */ private class SharedBid extends TransportBid { public SharedBid(int ms) { super(); setLatencyMs(ms); } + @Override public Transport getTransport() { return UDPTransport.this; } + @Override public String toString() { return "UDP bid @ " + getLatencyMs(); } } private class ExpirePeerEvent implements SimpleTimer.TimedEvent { - private List _expirePeers; + private final List _expirePeers; private List _expireBuffer; private boolean _alive; public ExpirePeerEvent() { @@ -2043,6 +2131,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority * */ private static final long STATUS_GRACE_PERIOD = 5*60*1000; + private long _statusLastCalled; + private short _lastStatus = CommSystemFacade.STATUS_UNKNOWN; void setReachabilityStatus(short status) { short old = _reachabilityStatus; @@ -2060,6 +2150,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority break; case CommSystemFacade.STATUS_REJECT_UNSOLICITED: _context.statManager().addRateData("udp.statusReject", 1, 0); +// if old != unsolicited && now - lastUpdated > STATUS_GRACE_PERIOD) +// // fall through... case CommSystemFacade.STATUS_HOSED: _reachabilityStatus = status; @@ -2077,10 +2169,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority //} break; } + _statusLastCalled = now; + _lastStatus = status; if ( (status != old) && (status != CommSystemFacade.STATUS_UNKNOWN) ) { if (_log.shouldLog(Log.INFO)) _log.info("Old status: " + old + " New status: " + status + " from: ", new Exception("traceback")); - if (needsRebuild()) + // Always rebuild when the status changes, even if our address hasn't changed, + // as rebuildExternalAddress() calls replaceAddress() which calls CSFI.notifyReplaceAddress() + // which will start up NTCP inbound when we transition to OK. + // if (needsRebuild()) rebuildExternalAddress(); } } @@ -2099,11 +2196,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return _reachabilityStatus; } + @Override public void recheckReachability() { _testEvent.runTest(); } - public PeerState pickTestPeer(RemoteHostId dontInclude) { + public PeerState pickTestPeer(RemoteHostId dontInclude) {// LINT -- Exporting non-public type through public API List peers = null; synchronized (_peersByIdent) { peers = new ArrayList(_peersByIdent.values()); diff --git a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java index 6d2e7b739..751d629a5 100644 --- a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java +++ b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java @@ -49,6 +49,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor { private static final int FORCE_BATCH_FLUSH = 50; /** how long do we want to wait before flushing */ + @Override public long getDelayAmount() { return getDelayAmount(true); } private long getDelayAmount(boolean shouldStat) { long rv = -1; @@ -62,11 +63,12 @@ public class BatchedPreprocessor extends TrivialPreprocessor { return rv; } + @Override public boolean preprocessQueue(List pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) { - StringBuffer timingBuf = null; + StringBuilder timingBuf = null; if (_log.shouldLog(Log.DEBUG)) { _log.debug("Preprocess queue with " + pending.size() + " to send"); - timingBuf = new StringBuffer(128); + timingBuf = new StringBuilder(128); timingBuf.append("Preprocess with " + pending.size() + " to send. "); } if (DISABLE_BATCHING) { @@ -244,7 +246,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor { private void display(long allocated, List pending, String title) { if (_log.shouldLog(Log.INFO)) { long highestDelay = 0; - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append(_name).append(": "); buf.append(title); buf.append(" allocated: ").append(allocated); @@ -284,7 +286,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor { // generate the final preprocessed data if (offset <= 0) { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("wtf, written offset is ").append(offset); buf.append(" for ").append(startAt).append(" through ").append(sendThrough); for (int i = startAt; i <= sendThrough; i++) { diff --git a/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java index 0be137b45..2e5e98885 100644 --- a/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java +++ b/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java @@ -57,6 +57,7 @@ public class BatchedRouterPreprocessor extends BatchedPreprocessor { } /** how long should we wait before flushing */ + @Override protected long getSendDelay() { String freq = null; if (_config != null) { @@ -77,6 +78,7 @@ public class BatchedRouterPreprocessor extends BatchedPreprocessor { return DEFAULT_BATCH_FREQUENCY; } + @Override protected void notePreprocessing(long messageId, int numFragments, int totalLength, List messageIds, String msg) { if (_config != null) _routerContext.messageHistory().fragmentMessage(messageId, numFragments, totalLength, messageIds, _config, msg); diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java index 5a97956b9..43e1d1314 100644 --- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java +++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java @@ -26,7 +26,7 @@ import net.i2p.util.SimpleTimer; public class FragmentHandler { private I2PAppContext _context; private Log _log; - private Map _fragmentedMessages; + private final Map _fragmentedMessages; private DefragmentedReceiver _receiver; private int _completed; private int _failed; @@ -74,6 +74,12 @@ public class FragmentHandler { int padding = 0; while (preprocessed[offset] != (byte)0x00) { offset++; // skip the padding + // AIOOBE http://forum.i2p/viewtopic.php?t=3187 + if (offset >= TrivialPreprocessor.PREPROCESSED_SIZE) { + _cache.release(new ByteArray(preprocessed)); + _context.statManager().addRateData("tunnel.corruptMessage", 1, 1); + return; + } padding++; } offset++; // skip the final 0x00, terminating the padding @@ -100,7 +106,18 @@ public class FragmentHandler { if (_log.shouldLog(Log.ERROR)) _log.error("Corrupt fragment received: offset = " + offset, e); _context.statManager().addRateData("tunnel.corruptMessage", 1, 1); - throw e; + // java.lang.IllegalStateException: wtf, don't get the completed size when we're not complete - null fragment i=0 of 1 + // at net.i2p.router.tunnel.FragmentedMessage.getCompleteSize(FragmentedMessage.java:194) + // at net.i2p.router.tunnel.FragmentedMessage.toByteArray(FragmentedMessage.java:223) + // at net.i2p.router.tunnel.FragmentHandler.receiveComplete(FragmentHandler.java:380) + // at net.i2p.router.tunnel.FragmentHandler.receiveSubsequentFragment(FragmentHandler.java:353) + // at net.i2p.router.tunnel.FragmentHandler.receiveFragment(FragmentHandler.java:208) + // at net.i2p.router.tunnel.FragmentHandler.receiveTunnelMessage(FragmentHandler.java:92) + // ... + // still trying to find root cause + // let's limit the damage here and skip the: + // .transport.udp.MessageReceiver: b0rked receiving a message.. wazza huzza hmm? + //throw e; } finally { // each of the FragmentedMessages populated make a copy out of the // payload, which they release separately, so we can release @@ -387,8 +404,8 @@ public class FragmentHandler { _log.error("Error receiving fragmented message (corrupt?): " + stringified, ioe); } catch (I2NPMessageException ime) { if (stringified == null) stringified = msg.toString(); - if (_log.shouldLog(Log.ERROR)) - _log.error("Error receiving fragmented message (corrupt?): " + stringified, ime); + if (_log.shouldLog(Log.WARN)) + _log.warn("Error receiving fragmented message (corrupt?): " + stringified, ime); } } diff --git a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java index d26c691b7..77f54bb2c 100644 --- a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java +++ b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java @@ -78,13 +78,13 @@ public class FragmentedMessage { return false; } if (length <= 0) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Length is impossible (" + length + ") for messageId " + messageId); + if (_log.shouldLog(Log.WARN)) + _log.warn("Length is impossible (" + length + ") for messageId " + messageId); return false; } if (offset + length > payload.length) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Length is impossible (" + length + "/" + offset + " out of " + payload.length + ") for messageId " + messageId); + if (_log.shouldLog(Log.WARN)) + _log.warn("Length is impossible (" + length + "/" + offset + " out of " + payload.length + ") for messageId " + messageId); return false; } if (_log.shouldLog(Log.DEBUG)) @@ -131,13 +131,13 @@ public class FragmentedMessage { return false; } if (length <= 0) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Length is impossible (" + length + ") for messageId " + messageId); + if (_log.shouldLog(Log.WARN)) + _log.warn("Length is impossible (" + length + ") for messageId " + messageId); return false; } if (offset + length > payload.length) { - if (_log.shouldLog(Log.ERROR)) - _log.error("Length is impossible (" + length + "/" + offset + " out of " + payload.length + ") for messageId " + messageId); + if (_log.shouldLog(Log.WARN)) + _log.warn("Length is impossible (" + length + "/" + offset + " out of " + payload.length + ") for messageId " + messageId); return false; } if (_log.shouldLog(Log.DEBUG)) @@ -273,8 +273,9 @@ public class FragmentedMessage { } } + @Override public String toString() { - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append("Fragments for ").append(_messageId).append(": "); for (int i = 0; i <= _highFragmentNum; i++) { ByteArray ba = _fragments[i]; diff --git a/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java b/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java index aea18dc3f..c9241fcce 100644 --- a/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java +++ b/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java @@ -9,7 +9,7 @@ import net.i2p.data.DataHelper; * waste lots of RAM */ class HashSetIVValidator implements IVValidator { - private HashSet _received; + private final HashSet _received; public HashSetIVValidator() { _received = new HashSet(); diff --git a/router/java/src/net/i2p/router/tunnel/HopConfig.java b/router/java/src/net/i2p/router/tunnel/HopConfig.java index 740cf9025..532bdfe20 100644 --- a/router/java/src/net/i2p/router/tunnel/HopConfig.java +++ b/router/java/src/net/i2p/router/tunnel/HopConfig.java @@ -135,8 +135,9 @@ public class HopConfig { return rv; } + @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); if (_receiveTunnelId != null) { buf.append("recv on "); buf.append(DataHelper.fromLong(_receiveTunnelId, 0, 4)); diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java index c5c46c365..b1b03fb22 100644 --- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java +++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java @@ -10,7 +10,6 @@ import net.i2p.data.i2np.DeliveryStatusMessage; import net.i2p.data.i2np.GarlicMessage; import net.i2p.data.i2np.I2NPMessage; import net.i2p.data.i2np.TunnelBuildReplyMessage; -import net.i2p.data.i2np.TunnelGatewayMessage; import net.i2p.router.ClientMessage; import net.i2p.router.RouterContext; import net.i2p.router.TunnelInfo; diff --git a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java index a2cac90bb..9364092df 100644 --- a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java +++ b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java @@ -32,7 +32,7 @@ import net.i2p.util.Log; * */ public class PumpedTunnelGateway extends TunnelGateway { - private List _prequeue; + private final List _prequeue; private TunnelGatewayPumper _pumper; /** @@ -58,6 +58,7 @@ public class PumpedTunnelGateway extends TunnelGateway { * @param toRouter router to send to after the endpoint (or null for endpoint processing) * @param toTunnel tunnel to send to after the endpoint (or null for endpoint or router processing) */ + @Override public void add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) { _messagesSent++; Pending cur = new PendingImpl(msg, toRouter, toTunnel); diff --git a/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java b/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java index 7caa3271e..acb4231d2 100644 --- a/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java +++ b/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java @@ -16,16 +16,19 @@ public class RouterFragmentHandler extends FragmentHandler { _log = context.logManager().getLog(RouterFragmentHandler.class); } + @Override protected void noteReception(long messageId, int fragmentId, Object status) { if (_log.shouldLog(Log.INFO)) _log.info("Received fragment " + fragmentId + " for message " + messageId + ": " + status); _routerContext.messageHistory().receiveTunnelFragment(messageId, fragmentId, status); } + @Override protected void noteCompletion(long messageId) { if (_log.shouldLog(Log.INFO)) _log.info("Received complete message " + messageId); _routerContext.messageHistory().receiveTunnelFragmentComplete(messageId); } + @Override protected void noteFailure(long messageId, String status) { if (_log.shouldLog(Log.INFO)) _log.info("Dropped message " + messageId + ": " + status); diff --git a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java index d687df726..4792b14c2 100644 --- a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java +++ b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java @@ -43,9 +43,9 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor { */ public boolean preprocessQueue(List pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) { long begin = System.currentTimeMillis(); - StringBuffer buf = null; + StringBuilder buf = null; if (_log.shouldLog(Log.DEBUG)) { - buf = new StringBuffer(256); + buf = new StringBuilder(256); buf.append("Trivial preprocessing of ").append(pending.size()).append(" "); } while (pending.size() > 0) { diff --git a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java index 83f5fbf94..c91af6929 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java @@ -163,9 +163,10 @@ public class TunnelCreatorConfig implements TunnelInfo { _failures = 0; } + @Override public String toString() { // H0:1235-->H1:2345-->H2:2345 - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); if (_isInbound) buf.append("inbound"); else diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java index de29a9540..6351c5855 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java @@ -253,6 +253,12 @@ public class TunnelDispatcher implements Service { return _participatingConfig.size(); } + /******* may be used for congestion control later... + public int getParticipatingInboundGatewayCount() { + return _inboundGateways.size(); + } + *******/ + /** what is the date/time on which the last non-locally-created tunnel expires? */ public long getLastParticipatingExpiration() { return _lastParticipatingExpiration; } @@ -492,14 +498,14 @@ public class TunnelDispatcher implements Service { /** * Generate a current estimate of usage per-participating-tunnel lifetime. - * The router code calls this every 20s. + * The router code calls this every 'ms' millisecs. * This is better than waiting until the tunnel expires to update the rate, * as we want this to be current because it's an important part of * the throttle code. * Stay a little conservative by taking the counts only for tunnels 1-10m old * and computing the average from that. */ - public void updateParticipatingStats() { + public void updateParticipatingStats(int ms) { List participating = listParticipatingTunnels(); int size = participating.size(); long count = 0; @@ -521,9 +527,9 @@ public class TunnelDispatcher implements Service { } if (tcount > 0) count = count * 30 / tcount; - _context.statManager().addRateData("tunnel.participatingMessageCount", count, 20*1000); - _context.statManager().addRateData("tunnel.participatingBandwidth", bw*1024/20, 20*1000); - _context.statManager().addRateData("tunnel.participatingBandwidthOut", bwOut*1024/20, 20*1000); + _context.statManager().addRateData("tunnel.participatingMessageCount", count, ms); + _context.statManager().addRateData("tunnel.participatingBandwidth", bw*1024/(ms/1000), ms); + _context.statManager().addRateData("tunnel.participatingBandwidthOut", bwOut*1024/(ms/1000), ms); _context.statManager().addRateData("tunnel.participatingTunnels", size, 0); } diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java index a9ed0cc1e..75887f406 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java @@ -36,13 +36,13 @@ import net.i2p.util.SimpleTimer; public class TunnelGateway { protected I2PAppContext _context; protected Log _log; - protected List _queue; + protected final List _queue; protected QueuePreprocessor _preprocessor; protected Sender _sender; protected Receiver _receiver; protected long _lastFlush; protected int _flushFrequency; - protected DelayedFlush _delayedFlush; + protected DelayedFlush _delayedFlush;// LINT -- Exporting non-public type through public API protected int _messagesSent; /** @@ -236,8 +236,9 @@ public class TunnelGateway { super(message, toRouter, toTunnel, _context.clock().now()); } + @Override public String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("Message ").append(_messageId).append(" on "); buf.append(TunnelGateway.this.toString()); if (_toRouter != null) { @@ -257,6 +258,7 @@ public class TunnelGateway { return buf.toString(); } + @Override public long getLifetime() { return _context.clock().now()-_created; } } diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java index 7e808199d..b840dad28 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java @@ -14,7 +14,7 @@ import net.i2p.util.Log; public class TunnelGatewayPumper implements Runnable { private RouterContext _context; private Log _log; - private List _wantsPumping; + private final List _wantsPumping; private boolean _stop; /** Creates a new instance of TunnelGatewayPumper */ diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java b/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java index 1abceb9f2..aefe9670d 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java @@ -12,8 +12,8 @@ import net.i2p.util.Log; * */ public class TunnelGatewayZeroHop extends TunnelGateway { - private RouterContext _context; - private Log _log; + private RouterContext _context; // LINT -- field hides a field + private Log _log; // LINT -- field hides a field private TunnelCreatorConfig _config; private OutboundMessageDistributor _outDistributor; private InboundMessageDistributor _inDistributor; @@ -37,6 +37,7 @@ public class TunnelGatewayZeroHop extends TunnelGateway { * * @param msg message received to be sent through the tunnel */ + @Override public void add(TunnelGatewayMessage msg) { add(msg.getMessage(), null, null); } @@ -50,6 +51,7 @@ public class TunnelGatewayZeroHop extends TunnelGateway { * @param toRouter router to send to after the endpoint (or null for endpoint processing) * @param toTunnel tunnel to send to after the endpoint (or null for endpoint or router processing) */ + @Override public void add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) { if (_log.shouldLog(Log.DEBUG)) _log.debug("zero hop gateway: distribute " + (_config.isInbound() ? "inbound " : " outbound ") diff --git a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java index 5fc870857..b9d660751 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java @@ -218,9 +218,10 @@ public class TunnelParticipant { } } + @Override public String toString() { if (_config != null) { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("participant at ").append(_config.toString()); return buf.toString(); } else { diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java index 3a84f4810..05b53fbf9 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java @@ -21,11 +21,12 @@ import net.i2p.util.Log; * */ class BuildExecutor implements Runnable { + private final List _recentBuildIds = new ArrayList(100); private RouterContext _context; private Log _log; private TunnelPoolManager _manager; /** list of TunnelCreatorConfig elements of tunnels currently being built */ - private List _currentlyBuilding; + private final List _currentlyBuilding; private boolean _isRunning; private BuildHandler _handler; private boolean _repoll; @@ -37,12 +38,12 @@ class BuildExecutor implements Runnable { _currentlyBuilding = new ArrayList(10); _context.statManager().createRateStat("tunnel.concurrentBuilds", "How many builds are going at once", "Tunnels", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); _context.statManager().createRateStat("tunnel.concurrentBuildsLagged", "How many builds are going at once when we reject further builds, due to job lag (period is lag)", "Tunnels", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("tunnel.buildExploratoryExpire", "How often an exploratory tunnel times out during creation", "Tunnels", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("tunnel.buildClientExpire", "How often a client tunnel times out during creation", "Tunnels", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("tunnel.buildExploratorySuccess", "Response time for success", "Tunnels", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("tunnel.buildClientSuccess", "Response time for success", "Tunnels", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("tunnel.buildExploratoryReject", "Response time for rejection", "Tunnels", new long[] { 60*1000, 10*60*1000 }); - _context.statManager().createRateStat("tunnel.buildClientReject", "Response time for rejection", "Tunnels", new long[] { 60*1000, 10*60*1000 }); + _context.statManager().createRateStat("tunnel.buildExploratoryExpire", "How often an exploratory tunnel times out during creation", "Tunnels", new long[] { 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("tunnel.buildClientExpire", "How often a client tunnel times out during creation", "Tunnels", new long[] { 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("tunnel.buildExploratorySuccess", "Response time for success", "Tunnels", new long[] { 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("tunnel.buildClientSuccess", "Response time for success", "Tunnels", new long[] { 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("tunnel.buildExploratoryReject", "Response time for rejection", "Tunnels", new long[] { 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("tunnel.buildClientReject", "Response time for rejection", "Tunnels", new long[] { 10*60*1000, 60*60*1000 }); _context.statManager().createRateStat("tunnel.buildRequestTime", "How long it takes to build a tunnel request", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.buildRequestZeroHopTime", "How long it takes to build a zero hop tunnel", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.pendingRemaining", "How many inbound requests are pending after a pass (period is how long the pass takes)?", "Tunnels", new long[] { 60*1000, 10*60*1000 }); @@ -50,7 +51,7 @@ class BuildExecutor implements Runnable { // Get stat manager, get recognized bandwidth tiers StatManager statMgr = _context.statManager(); - String bwTiers = _context.router().getRouterInfo().BW_CAPABILITY_CHARS; + String bwTiers = _context.router().getRouterInfo().BW_CAPABILITY_CHARS; // LINT -- Accessing static field "BW_CAPABILITY_CHARS" // For each bandwidth tier, create tunnel build agree/reject/expire stats for (int i = 0; i < bwTiers.length(); i++) { String bwTier = String.valueOf(bwTiers.charAt(i)); @@ -423,7 +424,6 @@ class BuildExecutor implements Runnable { } } - private List _recentBuildIds = new ArrayList(100); public boolean wasRecentlyBuilding(long replyId) { synchronized (_recentBuildIds) { return _recentBuildIds.contains(new Long(replyId)); diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java index 0699d3ff4..86f0d134d 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java @@ -39,11 +39,11 @@ class BuildHandler { private Job _buildMessageHandlerJob; private Job _buildReplyMessageHandlerJob; /** list of BuildMessageState, oldest first */ - private List _inboundBuildMessages; + private final List _inboundBuildMessages; /** list of BuildReplyMessageState, oldest first */ - private List _inboundBuildReplyMessages; + private final List _inboundBuildReplyMessages; /** list of BuildEndMessageState, oldest first */ - private List _inboundBuildEndMessages; + private final List _inboundBuildEndMessages; private BuildMessageProcessor _processor; public BuildHandler(RouterContext ctx, BuildExecutor exec) { @@ -65,6 +65,7 @@ class BuildHandler { _context.statManager().createRateStat("tunnel.rejectOverloaded", "How long we had to wait before processing the request (when it was rejected)", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.acceptLoad", "Delay before processing the accepted request", "Tunnels", new long[] { 60*1000, 10*60*1000 }); + _context.statManager().createRateStat("tunnel.dropConnLimits", "Drop instead of reject due to conn limits", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.dropLoad", "How long we had to wait before finally giving up on an inbound request (period is queue count)?", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.dropLoadDelay", "How long we had to wait before finally giving up on an inbound request?", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.dropLoadBacklog", "How many requests were pending when they were so lagged that we had to drop a new inbound request??", "Tunnels", new long[] { 60*1000, 10*60*1000 }); @@ -206,7 +207,7 @@ class BuildHandler { long replyMessageId = state.msg.getUniqueId(); PooledTunnelCreatorConfig cfg = null; List building = _exec.locked_getCurrentlyBuilding(); - StringBuffer buf = null; + StringBuilder buf = null; synchronized (building) { for (int i = 0; i < building.size(); i++) { PooledTunnelCreatorConfig cur = (PooledTunnelCreatorConfig)building.get(i); @@ -217,7 +218,7 @@ class BuildHandler { } } if ( (cfg == null) && (_log.shouldLog(Log.DEBUG)) ) - buf = new StringBuffer(building.toString()); + buf = new StringBuilder(building.toString()); } if (cfg == null) { @@ -466,7 +467,6 @@ class BuildHandler { return 0; } - private static final String PROP_REJECT_NONPARTICIPANT = "router.participantOnly"; private void handleReq(RouterInfo nextPeerInfo, BuildMessageState state, BuildRequestRecord req, Hash nextPeer) { long ourId = req.readReceiveTunnelId(); long nextId = req.readNextTunnelId(); @@ -508,10 +508,17 @@ class BuildHandler { * Being a IBGW or OBEP generally leads to more connections, so if we are * approaching our connection limit (i.e. !haveCapacity()), * reject this request. + * + * Don't do this for class O, under the assumption that they are already talking + * to most of the routers, so there's no reason to reject. This may drive them + * to their conn. limits, but it's hopefully a temporary solution to the + * tunnel build congestion. As the net grows this will have to be revisited. */ - if (response == 0 && (isInGW || isOutEnd) && - (Boolean.valueOf(_context.getProperty(PROP_REJECT_NONPARTICIPANT)).booleanValue() || - ! _context.commSystem().haveCapacity())) { + RouterInfo ri = _context.router().getRouterInfo(); + if (response == 0 && + (ri == null || ri.getBandwidthTier().charAt(0) != 'O') && + ((isInGW && ! _context.commSystem().haveInboundCapacity(87)) || + (isOutEnd && ! _context.commSystem().haveOutboundCapacity(87)))) { _context.throttle().setTunnelStatus("Rejecting tunnels: Connection limit"); response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH; } @@ -569,6 +576,18 @@ class BuildHandler { (isOutEnd ? "outbound endpoint" : isInGW ? "inbound gw" : "participant")); } + // Connection congestion control: + // If we rejected the request, are near our conn limits, and aren't connected to the next hop, + // just drop it. + // 81% = between 75% control measures in Transports and 87% rejection above + if (response != 0 && + (! _context.routerHash().equals(nextPeer)) && + (! _context.commSystem().haveOutboundCapacity(81)) && + (! _context.commSystem().isEstablished(nextPeer))) { + _context.statManager().addRateData("tunnel.dropConnLimits", 1, 0); + return; + } + BuildResponseRecord resp = new BuildResponseRecord(); byte reply[] = resp.create(_context, response, req.readReplyKey(), req.readReplyIV(), state.msg.getUniqueId()); for (int j = 0; j < TunnelBuildMessage.RECORD_COUNT; j++) { @@ -607,7 +626,7 @@ class BuildHandler { // send it to the reply tunnel on the reply peer within a new TunnelBuildReplyMessage // (enough layers jrandom?) TunnelBuildReplyMessage replyMsg = new TunnelBuildReplyMessage(_context); - for (int i = 0; i < state.msg.RECORD_COUNT; i++) + for (int i = 0; i < state.msg.RECORD_COUNT; i++) // LINT -- Accessing Static field "RECORD_COUNT" replyMsg.setRecord(i, state.msg.getRecord(i)); replyMsg.setUniqueId(req.readReplyMessageId()); replyMsg.setMessageExpiration(_context.clock().now() + 10*1000); diff --git a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java index 629a4b524..8971b8ba3 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java +++ b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java @@ -42,10 +42,15 @@ class ExploratoryPeerSelector extends TunnelPeerSelector { // exclude.addAll(fac.getFloodfillPeers()); HashSet matches = new HashSet(length); boolean exploreHighCap = shouldPickHighCap(ctx); + // + // We don't honor IP Restriction here, to be fixed + // if (exploreHighCap) ctx.profileOrganizer().selectHighCapacityPeers(length, exclude, matches); - else + else if (ctx.commSystem().haveHighOutboundCapacity()) ctx.profileOrganizer().selectNotFailingPeers(length, exclude, matches, false); + else // use only connected peers so we don't make more connections + ctx.profileOrganizer().selectActiveNotFailingPeers(length, exclude, matches); if (l.shouldLog(Log.DEBUG)) l.debug("profileOrganizer.selectNotFailing(" + length + ") found " + matches); diff --git a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java index 76f2c3c25..3cc4906ea 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java +++ b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java @@ -31,6 +31,7 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig { } // calls TestJob + @Override public void testSuccessful(int ms) { if (_testJob != null) _testJob.testSuccessful(ms); @@ -47,6 +48,7 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig { /** * The tunnel failed a test, so (maybe) stop using it */ + @Override public boolean tunnelFailed() { boolean rv = super.tunnelFailed(); if (!rv) { @@ -60,6 +62,7 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig { return rv; } + @Override public Properties getOptions() { if (_pool == null) return null; return _pool.getSettings().getUnknownOptions(); @@ -75,7 +78,8 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig { } public TunnelPool getTunnelPool() { return _pool; } - public void setTestJob(TestJob job) { _testJob = job; } + + public void setTestJob(TestJob job) { _testJob = job; } // LINT -- Exporting non-public type through public API public void setExpireJob(Job job) { /* _expireJob = job; */ } // Fix memory leaks caused by references if you need to use pairedTunnel diff --git a/router/java/src/net/i2p/router/tunnel/pool/SendGarlicMessageJob.java b/router/java/src/net/i2p/router/tunnel/pool/SendGarlicMessageJob.java deleted file mode 100644 index b55baa2dd..000000000 --- a/router/java/src/net/i2p/router/tunnel/pool/SendGarlicMessageJob.java +++ /dev/null @@ -1,92 +0,0 @@ -package net.i2p.router.tunnel.pool; - -import java.util.Set; - -import net.i2p.data.Certificate; -import net.i2p.data.RouterInfo; -import net.i2p.data.SessionKey; -import net.i2p.data.TunnelId; -import net.i2p.data.i2np.DeliveryInstructions; -import net.i2p.data.i2np.GarlicMessage; -import net.i2p.data.i2np.I2NPMessage; -import net.i2p.router.Job; -import net.i2p.router.JobImpl; -import net.i2p.router.MessageSelector; -import net.i2p.router.OutNetMessage; -import net.i2p.router.ReplyJob; -import net.i2p.router.RouterContext; -import net.i2p.router.TunnelInfo; -import net.i2p.router.message.GarlicMessageBuilder; -import net.i2p.router.message.PayloadGarlicConfig; -import net.i2p.util.Log; - -/** - * Wrap the tunnel request in a garlic to the participant, and then send it out - * a tunnel. - * - */ -class SendGarlicMessageJob extends JobImpl { - private Log _log; - private I2NPMessage _payload; - private RouterInfo _target; - private MessageSelector _replySelector; - private ReplyJob _onReply; - private Job _onTimeout; - private SessionKey _sentKey; - private Set _sentTags; - - /** only elGamal the message, never use session tags */ - private static final boolean FORCE_ELGAMAL = false; - - public SendGarlicMessageJob(RouterContext ctx, I2NPMessage payload, RouterInfo target, MessageSelector selector, ReplyJob onReply, Job onTimeout, SessionKey sentKey, Set sentTags) { - super(ctx); - _log = ctx.logManager().getLog(SendGarlicMessageJob.class); - _payload = payload; - _target = target; - _replySelector = selector; - _onReply = onReply; - _onTimeout = onTimeout; - _sentKey = sentKey; - _sentTags = sentTags; - } - public String getName() { return "build and send request garlic"; } - - public void runJob() { - DeliveryInstructions instructions = new DeliveryInstructions(); - instructions.setDeliveryMode(DeliveryInstructions.DELIVERY_MODE_LOCAL); - - PayloadGarlicConfig payload = new PayloadGarlicConfig(); - payload.setCertificate(new Certificate(Certificate.CERTIFICATE_TYPE_NULL, null)); - payload.setId(getContext().random().nextLong(I2NPMessage.MAX_ID_VALUE)); - payload.setPayload(_payload); - payload.setRecipient(_target); - payload.setDeliveryInstructions(instructions); - payload.setRequestAck(false); - payload.setExpiration(_payload.getMessageExpiration()); - int timeout = (int)(payload.getExpiration() - getContext().clock().now()); - - GarlicMessage msg = null; - if (FORCE_ELGAMAL) - msg = GarlicMessageBuilder.buildMessage(getContext(), payload, _sentKey, _sentTags, 0, true); - else - msg = GarlicMessageBuilder.buildMessage(getContext(), payload, _sentKey, _sentTags); - - // so we will look for the reply - OutNetMessage dummyMessage = getContext().messageRegistry().registerPending(_replySelector, _onReply, _onTimeout, timeout); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Scheduling timeout job (" + _onTimeout + ") to be run in " + timeout + "ms"); - - // now find an outbound tunnel and send 'er off - TunnelInfo out = getContext().tunnelManager().selectOutboundTunnel(); - if (out == null) { - if (_onTimeout != null) - getContext().jobQueue().addJob(_onTimeout); - getContext().messageRegistry().unregisterPending(dummyMessage); - return; - } - TunnelId outId = out.getSendTunnelId(0); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Dispatching the garlic request out " + outId + " targetting " + _target.getIdentity().calculateHash().toBase64().substring(0,4)); - getContext().tunnelDispatcher().dispatchOutbound(msg, outId, _target.getIdentity().calculateHash()); - } -} diff --git a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java index b81178bdf..c0633ef9f 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java @@ -250,8 +250,9 @@ class TestJob extends JobImpl { return false; } + @Override public String toString() { - StringBuffer rv = new StringBuffer(64); + StringBuilder rv = new StringBuilder(64); rv.append("Testing tunnel ").append(_cfg.toString()).append(" waiting for "); rv.append(_id).append(" found? ").append(_found); return rv.toString(); @@ -281,8 +282,9 @@ class TestJob extends JobImpl { _successTime = getContext().clock().now() - ((DeliveryStatusMessage)message).getArrival(); } + @Override public String toString() { - StringBuffer rv = new StringBuffer(64); + StringBuilder rv = new StringBuilder(64); rv.append("Testing tunnel ").append(_cfg.toString()); rv.append(" successful after ").append(_successTime); return rv.toString(); @@ -306,8 +308,9 @@ class TestJob extends JobImpl { testFailed(getContext().clock().now() - _started); } + @Override public String toString() { - StringBuffer rv = new StringBuffer(64); + StringBuilder rv = new StringBuilder(64); rv.append("Testing tunnel ").append(_cfg.toString()); rv.append(" timed out"); return rv.toString(); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java index 1e0247c02..2cfac2cc4 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java @@ -11,6 +11,7 @@ import java.util.Set; import java.util.StringTokenizer; import net.i2p.I2PAppContext; +import net.i2p.crypto.SHA256Generator; import net.i2p.data.DataFormatException; import net.i2p.data.Hash; import net.i2p.data.RouterInfo; @@ -128,7 +129,7 @@ public abstract class TunnelPeerSelector { rv.remove(0); if (log.shouldLog(Log.INFO)) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (settings.getDestinationNickname() != null) buf.append("peers for ").append(settings.getDestinationNickname()); else if (settings.getDestination() != null) @@ -176,6 +177,7 @@ public abstract class TunnelPeerSelector { Set peers = new HashSet(1); peers.addAll(ctx.profileOrganizer().selectPeersRecentlyRejecting()); + peers.addAll(ctx.tunnelManager().selectPeersInTooManyTunnels()); // if (false && filterUnreachable(ctx, isInbound, isExploratory)) { if (filterUnreachable(ctx, isInbound, isExploratory)) { List caps = ctx.peerManager().getPeersByCapability(Router.CAPABILITY_UNREACHABLE); @@ -476,6 +478,19 @@ public abstract class TunnelPeerSelector { Collections.sort(rv, new HashComparator(hash)); } + /** + * Implement a deterministic comparison that cannot be predicted by + * others. A naive implementation (using the distance from a random key) + * allows an attacker who runs two routers with hashes far apart + * to maximize his chances of those two routers being at opposite + * ends of a tunnel. + * + * Previous: + * d(l, h) - d(r, h) + * + * Now: + * d((H(l+h), h) - d(H(r+h), h) + */ private class HashComparator implements Comparator { private Hash _hash; @@ -483,8 +498,14 @@ public abstract class TunnelPeerSelector { _hash = h; } public int compare(Object l, Object r) { - BigInteger ll = PeerSelector.getDistance(_hash, (Hash) l); - BigInteger rr = PeerSelector.getDistance(_hash, (Hash) r); + byte[] data = new byte[2*Hash.HASH_LENGTH]; + System.arraycopy(_hash.getData(), 0, data, Hash.HASH_LENGTH, Hash.HASH_LENGTH); + System.arraycopy(((Hash) l).getData(), 0, data, 0, Hash.HASH_LENGTH); + Hash lh = SHA256Generator.getInstance().calculateHash(data); + System.arraycopy(((Hash) r).getData(), 0, data, 0, Hash.HASH_LENGTH); + Hash rh = SHA256Generator.getInstance().calculateHash(data); + BigInteger ll = PeerSelector.getDistance(_hash, lh); + BigInteger rr = PeerSelector.getDistance(_hash, rh); return ll.compareTo(rr); } } diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java index 06a9b4999..39e6c2280 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java @@ -25,10 +25,11 @@ import net.i2p.util.Log; * */ public class TunnelPool { + private final List _inProgress = new ArrayList(); private RouterContext _context; private Log _log; private TunnelPoolSettings _settings; - private ArrayList _tunnels; + private final ArrayList _tunnels; private TunnelPeerSelector _peerSelector; private TunnelPoolManager _manager; private boolean _alive; @@ -64,6 +65,9 @@ public class TunnelPool { } public void startup() { + synchronized (_inProgress) { + _inProgress.clear(); + } _alive = true; _started = System.currentTimeMillis(); _lastRateUpdate = _started; @@ -90,6 +94,9 @@ public class TunnelPool { _lastSelectionPeriod = 0; _lastSelected = null; _context.statManager().removeRateStat(_rateName); + synchronized (_inProgress) { + _inProgress.clear(); + } } TunnelPoolManager getManager() { return _manager; } @@ -227,7 +234,7 @@ public class TunnelPool { * * @return list of TunnelInfo objects */ - public List listTunnels() { + public List listTunnels() { synchronized (_tunnels) { return new ArrayList(_tunnels); } @@ -292,7 +299,9 @@ public class TunnelPool { int remaining = 0; LeaseSet ls = null; synchronized (_tunnels) { - _tunnels.remove(info); + boolean removed = _tunnels.remove(info); + if (!removed) + return; if (_settings.isInbound() && (_settings.getDestination() != null) ) ls = locked_buildNewLeaseSet(); remaining = _tunnels.size(); @@ -333,12 +342,15 @@ public class TunnelPool { } } + /** This may be called multiple times from TestJob */ public void tunnelFailed(PooledTunnelCreatorConfig cfg) { if (_log.shouldLog(Log.WARN)) _log.warn(toString() + ": Tunnel failed: " + cfg); LeaseSet ls = null; synchronized (_tunnels) { - _tunnels.remove(cfg); + boolean removed = _tunnels.remove(cfg); + if (!removed) + return; if (_settings.isInbound() && (_settings.getDestination() != null) ) ls = locked_buildNewLeaseSet(); if (_lastSelected == cfg) { @@ -464,7 +476,7 @@ public class TunnelPool { if (!_alive) return null; - int wanted = _settings.getQuantity(); + int wanted = Math.min(_settings.getQuantity(), LeaseSet.MAX_LEASES); if (_tunnels.size() < wanted) { if (_log.shouldLog(Log.WARN)) _log.warn(toString() + ": Not enough tunnels (" + _tunnels.size() + ", wanted " + wanted + ")"); @@ -866,13 +878,13 @@ public class TunnelPool { return cfg; } - private List _inProgress = new ArrayList(); void buildComplete(PooledTunnelCreatorConfig cfg) { synchronized (_inProgress) { _inProgress.remove(cfg); } cfg.setTunnelPool(this); //_manager.buildComplete(cfg); } + @Override public String toString() { if (_settings.isExploratory()) { if (_settings.isInbound()) @@ -880,7 +892,7 @@ public class TunnelPool { else return "Outbound exploratory pool"; } else { - StringBuffer rv = new StringBuffer(32); + StringBuilder rv = new StringBuilder(32); if (_settings.isInbound()) rv.append("Inbound client pool for "); else diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java index 58637ce63..7b86ba83b 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -6,9 +6,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.DataHelper; import net.i2p.data.Destination; @@ -17,7 +20,6 @@ import net.i2p.data.RouterInfo; import net.i2p.data.TunnelId; import net.i2p.router.ClientTunnelSettings; import net.i2p.router.JobImpl; -import net.i2p.router.LoadTestManager; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.TunnelInfo; @@ -27,6 +29,7 @@ import net.i2p.router.tunnel.HopConfig; import net.i2p.stat.RateStat; import net.i2p.util.I2PThread; import net.i2p.util.Log; +import net.i2p.util.ObjectCounter; /** * @@ -35,12 +38,11 @@ public class TunnelPoolManager implements TunnelManagerFacade { private RouterContext _context; private Log _log; /** Hash (destination) to TunnelPool */ - private Map _clientInboundPools; + private final Map _clientInboundPools; /** Hash (destination) to TunnelPool */ - private Map _clientOutboundPools; + private final Map _clientOutboundPools; private TunnelPool _inboundExploratory; private TunnelPool _outboundExploratory; - private LoadTestManager _loadTestManager; private BuildExecutor _executor; private boolean _isShutdown; @@ -56,8 +58,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { _clientInboundPools = new HashMap(4); _clientOutboundPools = new HashMap(4); - if (! LoadTestManager.FORCE_DISABLE) - _loadTestManager = new LoadTestManager(_context); _isShutdown = false; _executor = new BuildExecutor(ctx, this); @@ -192,13 +192,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { public int getParticipatingCount() { return _context.tunnelDispatcher().getParticipatingCount(); } public long getLastParticipatingExpiration() { return _context.tunnelDispatcher().getLastParticipatingExpiration(); } - public boolean isInUse(Hash peer) { - // this lets peers that are in our tunnels expire (forcing us to refetch them) - // if the info is old - //!! no, dont. bad. - return true; - } - public boolean isValidTunnel(Hash client, TunnelInfo tunnel) { if (tunnel.getExpiration() < _context.clock().now()) return false; @@ -315,8 +308,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { void buildComplete(PooledTunnelCreatorConfig cfg) { buildComplete(); - if (_loadTestManager != null) - _loadTestManager.addTunnelTestCandidate(cfg); if (cfg.getLength() > 1) { TunnelPool pool = cfg.getTunnelPool(); if (pool == null) { @@ -345,8 +336,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { } void buildComplete() {} - private static final String PROP_LOAD_TEST = "router.loadTest"; - public void startup() { _isShutdown = false; if (!_executor.isRunning()) { @@ -416,7 +405,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { public void renderStatusHTML(Writer out) throws IOException { - out.write("

    Exploratory tunnels (config):

    \n"); + out.write("

    Exploratory tunnels (config):

    \n"); renderPool(out, _inboundExploratory, _outboundExploratory); List destinations = null; @@ -439,7 +428,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { if (name == null) name = client.toBase64().substring(0,4); out.write("

    Client tunnels for " + name); + + "\" >Client tunnels for " + name); if (_context.clientManager().isLocal(client)) out.write(" (config):

    \n"); else @@ -449,10 +438,10 @@ public class TunnelPoolManager implements TunnelManagerFacade { List participating = _context.tunnelDispatcher().listParticipatingTunnels(); Collections.sort(participating, new TunnelComparator()); - out.write("

    Participating tunnels:

    \n"); - out.write("" - + "\n"); + out.write("

    Participating tunnels:

    Receive onFrom" - + "Send onToExpirationUsageRateRole
    \n"); + out.write("" + + "\n"); long processed = 0; RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount"); if (rs != null) @@ -466,46 +455,48 @@ public class TunnelPoolManager implements TunnelManagerFacade { } out.write(""); if (cfg.getReceiveTunnel() != null) - out.write(""); + out.write(" "); else - out.write(""); + out.write(" "); if (cfg.getReceiveFrom() != null) - out.write(""); + out.write(" "); else - out.write(""); + out.write(" "); if (cfg.getSendTunnel() != null) - out.write(""); + out.write(" "); else - out.write(""); + out.write(" "); if (cfg.getSendTo() != null) - out.write(""); + out.write(" "); else - out.write(""); +// out.write(" "); + out.write(" "); long timeLeft = cfg.getExpiration()-_context.clock().now(); if (timeLeft > 0) - out.write(""); + out.write(" "); else - out.write(""); - out.write(""); + out.write(" "); + out.write(" "); int lifetime = (int) ((_context.clock().now() - cfg.getCreation()) / 1000); if (lifetime <= 0) lifetime = 1; if (lifetime > 10*60) lifetime = 10*60; int bps = 1024 * (int) cfg.getProcessedMessagesCount() / lifetime; - out.write(""); + out.write(" "); if (cfg.getSendTo() == null) - out.write(""); + out.write(" "); else if (cfg.getReceiveFrom() == null) - out.write(""); + out.write(" "); else - out.write(""); + out.write(" "); out.write("\n"); processed += cfg.getProcessedMessagesCount(); } out.write("
    Receive onFrom" + + "Send onToExpirationUsageRateRole
    " + cfg.getReceiveTunnel().getTunnelId() +"" + cfg.getReceiveTunnel().getTunnelId() +"n/an/a" + netDbLink(cfg.getReceiveFrom()) +"" + netDbLink(cfg.getReceiveFrom()) +"  " + cfg.getSendTunnel().getTunnelId() +"" + cfg.getSendTunnel().getTunnelId() +"  " + netDbLink(cfg.getSendTo()) +"" + netDbLink(cfg.getSendTo()) +"   " + DataHelper.formatDuration(timeLeft) + "" + DataHelper.formatDuration(timeLeft) + "(grace period)" + cfg.getProcessedMessagesCount() + "KB(grace period)" + cfg.getProcessedMessagesCount() + "KB" + bps + "Bps" + bps + "BpsOutbound EndpointOutbound EndpointInbound GatewayInbound GatewayParticipantParticipant
    \n"); - out.write("Inactive participating tunnels: " + inactive + "
    \n"); - out.write("Lifetime bandwidth usage: " + DataHelper.formatSize(processed*1024) + "B
    \n"); + out.write("
    Inactive participating tunnels: " + inactive + "
    \n"); + out.write("
    Lifetime bandwidth usage: " + DataHelper.formatSize(processed*1024) + "B
    \n"); + renderPeers(out); } class TunnelComparator implements Comparator { @@ -526,8 +517,25 @@ public class TunnelPoolManager implements TunnelManagerFacade { long processedIn = (in != null ? in.getLifetimeProcessed() : 0); long processedOut = (outPool != null ? outPool.getLifetimeProcessed() : 0); - out.write("\n"); int live = 0; + int maxLength = 1; + for (int i = 0; i < tunnels.size(); i++) { + TunnelInfo info = (TunnelInfo)tunnels.get(i); + if (info.getLength() > maxLength) + maxLength = info.getLength(); + } + out.write("
    DirectionExpirationUsageHops (gateway first)
    "); + if (maxLength > 3) { + out.write(""); + } + else if (maxLength == 3) { + out.write(""); + } + if (maxLength > 1) { + out.write(""); + } + out.write("\n"); for (int i = 0; i < tunnels.size(); i++) { TunnelInfo info = (TunnelInfo)tunnels.get(i); long timeLeft = info.getExpiration()-_context.clock().now(); @@ -535,19 +543,24 @@ public class TunnelPoolManager implements TunnelManagerFacade { continue; // don't display tunnels in their grace period live++; if (info.isInbound()) - out.write(""); + out.write(""); else - out.write(""); - out.write("\n"); - out.write("\n"); + out.write(""); + out.write(" \n"); + out.write(" \n"); for (int j = 0; j < info.getLength(); j++) { Hash peer = info.getPeer(j); - String cap = getCapacity(peer); TunnelId id = (info.isInbound() ? info.getReceiveTunnelId(j) : info.getSendTunnelId(j)); - if (_context.routerHash().equals(peer)) - out.write(""); - else - out.write(""); + if (_context.routerHash().equals(peer)) { + out.write(" "); + } else { + String cap = getCapacity(peer); + out.write(" "); + } + if (info.getLength() < maxLength && (info.getLength() == 1 || j == info.getLength() - 2)) { + for (int k = info.getLength(); k < maxLength; k++) + out.write(" "); + } } out.write("\n"); @@ -559,50 +572,143 @@ public class TunnelPoolManager implements TunnelManagerFacade { out.write("
    In/OutExpiryUsageGatewayParticipantsParticipantEndpoint
    inbound
    \"Inbound\"
    outbound" + DataHelper.formatDuration(timeLeft) + "" + info.getProcessedMessagesCount() + "KB
    \"Outbound\"" + DataHelper.formatDuration(timeLeft) + "" + info.getProcessedMessagesCount() + "KB" + (id == null ? "" : "" + id) + "" + netDbLink(peer) + (id == null ? "" : ":" + id) + cap + "" + (id == null ? "" : "" + id) + "" + netDbLink(peer) + (id == null ? "" : " " + id) + cap + " 
    \n"); if (in != null) { List pending = in.listPending(); - for (int i = 0; i < pending.size(); i++) { - TunnelInfo info = (TunnelInfo)pending.get(i); - out.write("In progress: " + info.toString() + "
    \n"); - } + if (pending.size() > 0) + out.write("
    Build in progress: " + pending.size() + " inbound
    \n"); live += pending.size(); } if (outPool != null) { List pending = outPool.listPending(); - for (int i = 0; i < pending.size(); i++) { - TunnelInfo info = (TunnelInfo)pending.get(i); - out.write("In progress: " + info.toString() + "
    \n"); - } + if (pending.size() > 0) + out.write("
    Build in progress: " + pending.size() + " outbound
    \n"); live += pending.size(); } if (live <= 0) - out.write("No tunnels, waiting for the grace period to end
    \n"); - out.write("Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "B in, " + - DataHelper.formatSize(processedOut*1024) + "B out
    "); + out.write("
    No tunnels; waiting for the grace period to end.
    \n"); + out.write("
    Lifetime bandwidth usage: " + DataHelper.formatSize(processedIn*1024) + "B in, " + + DataHelper.formatSize(processedOut*1024) + "B out
    "); } + private void renderPeers(Writer out) throws IOException { + // count up the peers in the local pools + ObjectCounter lc = new ObjectCounter(); + int tunnelCount = countTunnelsPerPeer(lc); + + // count up the peers in the participating tunnels + ObjectCounter pc = new ObjectCounter(); + int partCount = countParticipatingPerPeer(pc); + + Set peers = new HashSet(lc.objects()); + peers.addAll(pc.objects()); + List peerList = new ArrayList(peers); + Collections.sort(peerList, new HashComparator()); + + out.write("

    Tunnel Counts By Peer:

    \n"); + out.write("\n"); + for (Hash h : peerList) { + out.write("
    PeerExpl. + Client% of totalPart. from + to% of total
    "); + out.write(netDbLink(h)); + out.write(" " + lc.count(h)); + out.write(" "); + if (tunnelCount > 0) + out.write("" + (lc.count(h) * 100 / tunnelCount)); + else + out.write('0'); + out.write(" " + pc.count(h)); + out.write(" "); + if (partCount > 0) + out.write("" + (pc.count(h) * 100 / partCount)); + else + out.write('0'); + out.write('\n'); + } + out.write("
    Tunnels " + tunnelCount); + out.write("   " + partCount); + out.write("  
    \n"); + } + + /** @return total number of non-fallback expl. + client tunnels */ + private int countTunnelsPerPeer(ObjectCounter lc) { + List pools = new ArrayList(); + listPools(pools); + int tunnelCount = 0; + for (TunnelPool tp : pools) { + for (TunnelInfo info : tp.listTunnels()) { + if (info.getLength() > 1) { + tunnelCount++; + for (int j = 0; j < info.getLength(); j++) { + Hash peer = info.getPeer(j); + if (!_context.routerHash().equals(peer)) + lc.increment(peer); + } + } + } + } + return tunnelCount; + } + + private static final int DEFAULT_MAX_PCT_TUNNELS = 33; + /** + * For reliability reasons, don't allow a peer in more than x% of + * client and exploratory tunnels. + * + * This also will prevent a single huge-capacity (or malicious) peer from + * taking all the tunnels in the network (although it would be nice to limit + * the % of total network tunnels to 10% or so, but that appears to be + * too low to set as a default here... much lower than 33% will push client + * tunnels out of the fast tier into high cap or beyond...) + * + * Possible improvement - restrict based on count per IP, or IP block, + * to slightly increase costs of collusion + * + * @return Set of peers that should not be allowed in another tunnel + */ + public Set selectPeersInTooManyTunnels() { + ObjectCounter lc = new ObjectCounter(); + int tunnelCount = countTunnelsPerPeer(lc); + Set rv = new HashSet(); + if (tunnelCount >= 4 && _context.router().getUptime() > 10*60*1000) { + int max = _context.getProperty("router.maxTunnelPercentage", DEFAULT_MAX_PCT_TUNNELS); + for (Hash h : lc.objects()) { + if (lc.count(h) > 0 && (lc.count(h) + 1) * 100 / (tunnelCount + 1) > max) + rv.add(h); + } + } + return rv; + } + + /** @return total number of part. tunnels */ + private int countParticipatingPerPeer(ObjectCounter pc) { + List participating = _context.tunnelDispatcher().listParticipatingTunnels(); + for (HopConfig cfg : participating) { + Hash from = cfg.getReceiveFrom(); + if (from != null) + pc.increment(from); + Hash to = cfg.getSendTo(); + if (to != null) + pc.increment(to); + } + return participating.size(); + } + + class HashComparator implements Comparator { + public int compare(Object l, Object r) { + return ((Hash)l).toBase64().compareTo(((Hash)r).toBase64()); + } + } + private String getCapacity(Hash peer) { RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer); if (info != null) { String caps = info.getCapabilities(); - if (caps.indexOf(Router.CAPABILITY_BW12) >= 0) { - return "[<12 ]"; - } else if (caps.indexOf(Router.CAPABILITY_BW32) >= 0) { - return "[<=32 ]"; - } else if (caps.indexOf(Router.CAPABILITY_BW64) >= 0) { - return "[<=64 ]"; - } else if (caps.indexOf(Router.CAPABILITY_BW128) >= 0) { - return "[<=128]"; - } else if (caps.indexOf(Router.CAPABILITY_BW256) >= 0) { - return "[>128]"; - } else { - return "[old ]"; + for (char c = Router.CAPABILITY_BW12; c <= Router.CAPABILITY_BW256; c++) { + if (caps.indexOf(c) >= 0) + return " " + c; } - } else { - return "[unkn]"; } + return ""; } - private static String netDbLink(Hash peer) { - String h = peer.toBase64().substring(0, 4); - return "" + h + ""; + private String netDbLink(Hash peer) { + return _context.commSystem().renderPeerHTML(peer); } } diff --git a/router/java/src/org/cybergarage/http/HTTPRequest.java b/router/java/src/org/cybergarage/http/HTTPRequest.java index 673542724..74513d763 100644 --- a/router/java/src/org/cybergarage/http/HTTPRequest.java +++ b/router/java/src/org/cybergarage/http/HTTPRequest.java @@ -401,12 +401,22 @@ public class HTTPRequest extends HTTPPacket InputStream in = null; try { - if (postSocket == null){ - // Thanks for Hao Hu + if (postSocket == null) { + // Mod for I2P + // We can't handle the default system soTimeout of 3 minutes or so + // as when the device goes away, this hangs the display of peers.jsp + // and who knows what else. + // Set the timeout to be nice and short, the device should be local and fast. + // Yeah, the UPnP standard is a minute or something, too bad. + // If he can't get back to us in a few seconds, forget it. + // And set the soTimeout to 1 second (for reads). + //postSocket = new Socket(host, port); postSocket = new Socket(); - postSocket.connect(new InetSocketAddress(host, port), HTTPServer.DEFAULT_TIMEOUT); - } - + postSocket.setSoTimeout(1000); + SocketAddress sa = new InetSocketAddress(host, port); + postSocket.connect(sa, 3000); + } + out = postSocket.getOutputStream(); PrintStream pout = new PrintStream(out); pout.print(getHeader()); @@ -522,6 +532,6 @@ public class HTTPRequest extends HTTPPacket public void print() { - System.out.println(toString()); + Debug.message(toString()); } } diff --git a/router/java/src/org/cybergarage/http/HTTPResponse.java b/router/java/src/org/cybergarage/http/HTTPResponse.java index e028e02f5..8c9c25091 100644 --- a/router/java/src/org/cybergarage/http/HTTPResponse.java +++ b/router/java/src/org/cybergarage/http/HTTPResponse.java @@ -20,6 +20,7 @@ package org.cybergarage.http; import java.io.InputStream; +import org.cybergarage.util.Debug; public class HTTPResponse extends HTTPPacket { @@ -111,6 +112,6 @@ public class HTTPResponse extends HTTPPacket public void print() { - System.out.println(toString()); + Debug.message(toString()); } } diff --git a/router/java/src/org/cybergarage/http/HTTPServer.java b/router/java/src/org/cybergarage/http/HTTPServer.java index 1ac591744..e498b7198 100644 --- a/router/java/src/org/cybergarage/http/HTTPServer.java +++ b/router/java/src/org/cybergarage/http/HTTPServer.java @@ -147,6 +147,7 @@ public class HTTPServer implements Runnable serverSock = new ServerSocket(bindPort, 0, bindAddr); } catch (IOException e) { + Debug.warning("HTTP server open failed " + addr + " " + port, e); return false; } return true; diff --git a/router/java/src/org/cybergarage/upnp/Action.java b/router/java/src/org/cybergarage/upnp/Action.java index 56b13d9a3..1384608de 100644 --- a/router/java/src/org/cybergarage/upnp/Action.java +++ b/router/java/src/org/cybergarage/upnp/Action.java @@ -401,7 +401,7 @@ public class Action public void print() { - System.out.println("Action : " + getName()); + Debug.message("Action : " + getName()); ArgumentList argList = getArgumentList(); int nArgs = argList.size(); for (int n=0; nXmlPullParserException.html; - * import plugins.JabberLinker.org.xmlpull.v1.XmlPullParserFactory; - * import plugins.JabberLinker.org.xmlpull.v1.XmlPullParser; -//import plugins.UPnP.org.cybergarage.util.*; -import java.io.*; -import java.io.*; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.Writer; -import java.net.*; -import java.net.*; -import java.util.*; -import java.util.*; -import java.util.Calendar; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.TimeZone; -import java.util.Vector; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.xml.sax.InputSource; -import plugins.UPnP.org.cybergarage.http.*; -import plugins.UPnP.org.cybergarage.http.*; -import plugins.UPnP.org.cybergarage.net.*; -import plugins.UPnP.org.cybergarage.net.*; -import plugins.UPnP.org.cybergarage.soap.*; -import plugins.UPnP.org.cybergarage.soap.*; -import plugins.UPnP.org.cybergarage.upnp.*; -import plugins.UPnP.org.cybergarage.upnp.*; -import plugins.UPnP.org.cybergarage.upnp.Device; -import plugins.UPnP.org.cybergarage.upnp.control.*; -import plugins.UPnP.org.cybergarage.upnp.control.*; -import plugins.UPnP.org.cybergarage.upnp.device.*; -import plugins.UPnP.org.cybergarage.upnp.device.*; -import plugins.UPnP.org.cybergarage.upnp.event.*; -import plugins.UPnP.org.cybergarage.upnp.event.*; -import plugins.UPnP.org.cybergarage.upnp.ssdp.*; -import plugins.UPnP.org.cybergarage.upnp.ssdp.*; -import plugins.UPnP.org.cybergarage.upnp.xml.*; -import plugins.UPnP.org.cybergarage.upnp.xml.*; -import plugins.UPnP.org.cybergarage.util.*; -import plugins.UPnP.org.cybergarage.util.*; -import plugins.UPnP.org.cybergarage.xml.*; -import plugins.UPnP.org.cybergarage.xml.*; -import plugins.UPnP.org.cybergarage.xml.Node; -import plugins.UPnP.org.cybergarage.xml.Parser; -import plugins.UPnP.org.cybergarage.xml.ParserException; -import plugins.UPnP.org.cybergarage.xml.parser.*; diff --git a/router/java/src/org/xmlpull/v1/XmlPullParser.java b/router/java/src/org/xmlpull/v1/XmlPullParser.java index 24a34d2de..076732a24 100644 --- a/router/java/src/org/xmlpull/v1/XmlPullParser.java +++ b/router/java/src/org/xmlpull/v1/XmlPullParser.java @@ -815,7 +815,7 @@ public interface XmlPullParser { * Namespaces in XML * specification to "http://www.w3.org/XML/1998/namespace". * - * @param zero based index of attribute + * @param index zero based index of attribute * @return attribute namespace, * empty string ("") is returned if namesapces processing is not enabled or * namespaces processing is enabled but attribute has no namespace (it has no prefix). @@ -828,7 +828,7 @@ public interface XmlPullParser { * Throws an IndexOutOfBoundsException if the index is out of range * or current event type is not START_TAG. * - * @param zero based index of attribute + * @param index zero based index of attribute * @return attribute name (null is never returned) */ String getAttributeName (int index); @@ -840,7 +840,7 @@ public interface XmlPullParser { * Throws an IndexOutOfBoundsException if the index is out of range * or current event type is not START_TAG. * - * @param zero based index of attribute + * @param index zero based index of attribute * @return attribute prefix or null if namespaces processing is not enabled. */ String getAttributePrefix(int index); @@ -849,7 +849,7 @@ public interface XmlPullParser { * Returns the type of the specified attribute * If parser is non-validating it MUST return CDATA. * - * @param zero based index of attribute + * @param index zero based index of attribute * @return attribute type (null is never returned) */ String getAttributeType(int index); @@ -859,7 +859,7 @@ public interface XmlPullParser { * If parser is non-validating it MUST always return false. * This information is part of XML infoset: * - * @param zero based index of attribute + * @param index zero based index of attribute * @return false if attribute was in input */ boolean isAttributeDefault(int index); @@ -876,7 +876,7 @@ public interface XmlPullParser { * * @see #defineEntityReplacementText * - * @param zero based index of attribute + * @param index zero based index of attribute * @return value of attribute (null is never returned) */ String getAttributeValue(int index); diff --git a/router/java/src/net/i2p/router/SSUDemo.java b/router/java/test/net/i2p/router/SSUDemo.java similarity index 100% rename from router/java/src/net/i2p/router/SSUDemo.java rename to router/java/test/net/i2p/router/SSUDemo.java