diff --git a/LICENSE.txt b/LICENSE.txt index 30f548aa2e1b64135fe9b2b9a0a8baea1172f9b6..d91b95fe795772203ae9e9b650aafe7774404cba 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -83,7 +83,9 @@ Public domain except as listed below: Copyright (C) 2003-2010 Satoshi Konno See licenses/LICENSE-UPnP.txt - GeoIP data free to use, courtesy http://www.maxmind.com/ + GeoIP: GeoLite databases are licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. + http://creativecommons.org/licenses/by-sa/3.0/ + This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com/ Installer: diff --git a/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java b/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java index 4ce2e4f7141295dde75a3dc218031c23328e455e..578a348e37437c6ccd717288a83a3a7a4ab1a211 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/Daemon.java @@ -230,7 +230,7 @@ public class Daemon { */ public static void update(Map<String, String> settings, String home) { File published = null; - boolean should_publish = Boolean.valueOf(settings.get("should_publish")).booleanValue(); + boolean should_publish = Boolean.parseBoolean(settings.get("should_publish")); if (should_publish) published = new File(home, settings .get("published_addressbook")); @@ -261,7 +261,7 @@ public class Daemon { // If false, add hosts via naming service; if true, write hosts.txt file directly // Default false - if (Boolean.valueOf(settings.get("update_direct")).booleanValue()) { + if (Boolean.parseBoolean(settings.get("update_direct"))) { // Direct hosts.txt access File routerFile = new File(home, settings.get("router_addressbook")); AddressBook master; diff --git a/apps/i2psnark/java/src/org/klomp/snark/BitField.java b/apps/i2psnark/java/src/org/klomp/snark/BitField.java index 4fb6b28151e68a8dcc20ed145038154f4ef23b7e..3f16deb684da1b5100c2affc7bb79917e1eb4c11 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/BitField.java +++ b/apps/i2psnark/java/src/org/klomp/snark/BitField.java @@ -39,7 +39,6 @@ public class BitField this.size = size; int arraysize = ((size-1)/8)+1; bitfield = new byte[arraysize]; - this.count = 0; } /** @@ -99,9 +98,11 @@ public class BitField throw new IndexOutOfBoundsException(Integer.toString(bit)); int index = bit/8; int mask = 128 >> (bit % 8); - if ((bitfield[index] & mask) == 0) { - count++; - bitfield[index] |= mask; + synchronized(this) { + if ((bitfield[index] & mask) == 0) { + count++; + bitfield[index] |= mask; + } } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index 38ff07ced2a707ee5abd0206656932d11a171e64..1ef8cd302a5d3a48f65974a79719b4a6f3199f08 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -78,7 +78,7 @@ public class I2PSnarkUtil { public static final int DEFAULT_MAX_UP_BW = 8; //KBps public static final int MAX_CONNECTIONS = 16; // per torrent public static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond"; - public static final boolean DEFAULT_USE_DHT = false; + public static final boolean DEFAULT_USE_DHT = true; public I2PSnarkUtil(I2PAppContext ctx) { _context = ctx; diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 536865b0b053f387579c91a8a33efe495ed9547e..2869193a0a703344af2867123b60bcb884c26932 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -649,10 +649,15 @@ class PeerCoordinator implements PeerListener if (listener != null) listener.peerChange(this, peer); - synchronized(wantedPieces) - { - return wantedPieces.contains(new Piece(piece)); - } + synchronized(wantedPieces) { + for (Piece pc : wantedPieces) { + if (pc.getId() == piece) { + pc.addPeer(peer); + return true; + } + } + return false; + } } /** @@ -664,20 +669,17 @@ class PeerCoordinator implements PeerListener if (listener != null) listener.peerChange(this, peer); - synchronized(wantedPieces) - { - Iterator<Piece> it = wantedPieces.iterator(); - while (it.hasNext()) - { - Piece p = it.next(); + boolean rv = false; + synchronized(wantedPieces) { + for (Piece p : wantedPieces) { int i = p.getId(); if (bitfield.get(i)) { p.addPeer(peer); - return true; + rv = true; } - } - } - return false; + } + } + return rv; } /** @@ -785,7 +787,8 @@ class PeerCoordinator implements PeerListener } if (record) { if (_log.shouldLog(Log.INFO)) - _log.info(peer + " is now requesting: piece " + piece + " priority " + piece.getPriority()); + _log.info("Now requesting from " + peer + ": piece " + piece + " priority " + piece.getPriority() + + " peers " + piece.getPeerCount() + '/' + peers.size()); piece.setRequested(peer, true); } return piece; @@ -1077,8 +1080,7 @@ class PeerCoordinator implements PeerListener */ public void removePeerFromPieces(Peer peer) { synchronized(wantedPieces) { - for(Iterator<Piece> iter = wantedPieces.iterator(); iter.hasNext(); ) { - Piece piece = iter.next(); + for (Piece piece : wantedPieces) { piece.removePeer(peer); } } @@ -1172,11 +1174,24 @@ class PeerCoordinator implements PeerListener for(Piece piece : wantedPieces) { if (piece.getId() == savedPiece) { if (peer.isCompleted() && piece.getPeerCount() > 1) { - // Try to preserve rarest-first when we have only one seeder - // by not preferring a partial piece that others have too + // Try to preserve rarest-first + // by not requesting a partial piece that non-seeders also have // from a seeder - skipped = true; - break; + boolean nonSeeds = false; + for (Peer pr : peers) { + PeerState state = pr.state; + if (state == null) continue; + BitField bf = state.bitfield; + if (bf == null) continue; + if (bf.get(savedPiece) && !pr.isCompleted()) { + nonSeeds = true; + break; + } + } + if (nonSeeds) { + skipped = true; + break; + } } iter.remove(); piece.setRequested(peer, true); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java index a9822640bf1bda472abf95c85d5713a83c727d9c..3ca03ad98865bbf976336ecd225ed86bc59bcc73 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java @@ -18,7 +18,7 @@ class Piece implements Comparable { public Piece(int id) { this.id = id; - this.peers = new HashSet(I2PSnarkUtil.MAX_CONNECTIONS); + this.peers = new HashSet(I2PSnarkUtil.MAX_CONNECTIONS / 2); // defer creating requests to save memory } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index c0781d7d8ab5f7adb63116cc0e0f93603dc988e7..f553f54d29f6f3086bd02899c1bbec796c0f1be6 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -688,6 +688,22 @@ public class Snark starting = true; } + /** + * File checking in progress. + * @since 0.9.3 + */ + public boolean isChecking() { + return storage != null && storage.isChecking(); + } + + /** + * Disk allocation (ballooning) in progress. + * @since 0.9.3 + */ + public boolean isAllocating() { + return storage != null && storage.isAllocating(); + } + /** * @since 0.8.4 */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index eed367e7a5fff955cdadffa4916bd88d628daa75..e0b56b140955a019560a10589626021a177bd902 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -200,11 +200,11 @@ public class SnarkManager implements Snark.CompleteListener { * @since 0.8.9 */ public boolean areFilesPublic() { - return Boolean.valueOf(_config.getProperty(PROP_FILES_PUBLIC)).booleanValue(); + return Boolean.parseBoolean(_config.getProperty(PROP_FILES_PUBLIC)); } public boolean shouldAutoStart() { - return Boolean.valueOf(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START)).booleanValue(); + return Boolean.parseBoolean(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START)); } /**** @@ -384,11 +384,11 @@ public class SnarkManager implements Snark.CompleteListener { if (ot != null) _util.setOpenTrackers(getOpenTrackers()); String useOT = _config.getProperty(PROP_USE_OPENTRACKERS); - boolean bOT = useOT == null || Boolean.valueOf(useOT).booleanValue(); + boolean bOT = useOT == null || Boolean.parseBoolean(useOT); _util.setUseOpenTrackers(bOT); // careful, so we can switch default to true later - _util.setUseDHT(Boolean.valueOf(_config.getProperty(PROP_USE_DHT, - Boolean.toString(I2PSnarkUtil.DEFAULT_USE_DHT))).booleanValue()); + _util.setUseDHT(Boolean.parseBoolean(_config.getProperty(PROP_USE_DHT, + Boolean.toString(I2PSnarkUtil.DEFAULT_USE_DHT)))); getDataDir().mkdirs(); initTrackerMap(); } @@ -707,7 +707,7 @@ public class SnarkManager implements Snark.CompleteListener { 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 = 512; + public static final int MAX_FILES_PER_TORRENT = 512; /** * Set of canonical .torrent filenames that we are dealing with. @@ -1370,6 +1370,8 @@ public class SnarkManager implements Snark.CompleteListener { } catch (Exception e) { _log.error("Error in the DirectoryMonitor", e); } + if (!_snarks.isEmpty()) + addMessage(_("Up bandwidth limit is {0} KBps", _util.getMaxUpBW())); } try { Thread.sleep(60*1000); } catch (InterruptedException ie) {} } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 5ae23203a003e1367e90ddf09e7c2423401526ae..21e006f5e46b3662c1669ae089479cbbce4601d2 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import net.i2p.crypto.SHA1; import net.i2p.data.ByteArray; @@ -45,7 +46,7 @@ import net.i2p.util.SystemVersion; */ public class Storage { - private MetaInfo metainfo; + private final MetaInfo metainfo; private long[] lengths; private RandomAccessFile[] rafs; private String[] names; @@ -69,6 +70,8 @@ public class Storage private final int pieces; private final long total_length; private boolean changed; + private volatile boolean _isChecking; + private final AtomicInteger _allocateCount = new AtomicInteger(); /** The default piece size. */ private static final int MIN_PIECE_SIZE = 256*1024; @@ -89,17 +92,15 @@ public class Storage * Creates a new storage based on the supplied MetaInfo. This will * try to create and/or check all needed files in the MetaInfo. * - * @exception IOException when creating and/or checking files fails. + * Does not check storage. Caller MUST call check() */ public Storage(I2PSnarkUtil util, MetaInfo metainfo, StorageListener listener) - throws IOException { _util = util; _log = util.getContext().logManager().getLog(Storage.class); this.metainfo = metainfo; this.listener = listener; needed = metainfo.getPieces(); - _probablyComplete = false; bitfield = new BitField(needed); piece_size = metainfo.getPieceLength(0); pieces = needed; @@ -107,12 +108,15 @@ public class Storage } /** - * Creates a storage from the existing file or directory together - * with an appropriate MetaInfo file as can be announced on the - * given announce String location. + * Creates a storage from the existing file or directory. + * Creates an in-memory metainfo but does not save it to + * a file, caller must do that. + * + * Creates the metainfo, this may take a LONG time. BLOCKING. * * @param announce may be null * @param listener may be null + * @throws IOException when creating and/or checking files fails. */ public Storage(I2PSnarkUtil util, File baseFile, String announce, boolean privateTorrent, StorageListener listener) @@ -135,6 +139,8 @@ public class Storage if (total <= 0) throw new IOException("Torrent contains no data"); + if (total > MAX_TOTAL_SIZE) + throw new IOException("Torrent too big (" + total + " bytes), max is " + MAX_TOTAL_SIZE); int pc_size = MIN_PIECE_SIZE; int pcs = (int) ((total - 1)/pc_size) + 1; @@ -170,6 +176,7 @@ public class Storage lengthsList = null; } + // TODO thread this so we can return and show something on the UI byte[] piece_hashes = fast_digestCreate(); metainfo = new MetaInfo(announce, baseFile.getName(), null, files, lengthsList, piece_size, piece_hashes, total, privateTorrent); @@ -205,6 +212,8 @@ public class Storage private void getFiles(File base) throws IOException { + if (base.getAbsolutePath().equals("/")) + throw new IOException("Don't seed root"); ArrayList files = new ArrayList(); addFiles(files, base); @@ -233,12 +242,15 @@ public class Storage } } - private void addFiles(List l, File f) - { - if (!f.isDirectory()) - l.add(f); - else - { + /** + * @throws IOException if too many total files + */ + private void addFiles(List l, File f) throws IOException { + if (!f.isDirectory()) { + if (l.size() >= SnarkManager.MAX_FILES_PER_TORRENT) + throw new IOException("Too many files, limit is " + SnarkManager.MAX_FILES_PER_TORRENT + ", zip them?"); + l.add(f); + } else { File[] files = f.listFiles(); if (files == null) { @@ -284,6 +296,23 @@ public class Storage return changed; } + /** + * File checking in progress. + * @since 0.9.3 + */ + public boolean isChecking() { + return _isChecking; + } + + /** + * Disk allocation (ballooning) in progress. + * Always false on Windows. + * @since 0.9.3 + */ + public boolean isAllocating() { + return _allocateCount.get() > 0; + } + /** * @param file canonical path (non-directory) * @return number of bytes remaining; -1 if unknown file @@ -703,11 +732,25 @@ public class Storage * This is called at the beginning, and at presumed completion, * so we have to be careful about locking. * + * TODO thread the checking so we can return and display + * something on the UI + * * @param recheck if true, this is a check after we downloaded the * last piece, and we don't modify the global bitfield unless * the check fails. */ - private void checkCreateFiles(boolean recheck) throws IOException + private void checkCreateFiles(boolean recheck) throws IOException { + synchronized(this) { + _isChecking = true; + try { + locked_checkCreateFiles(recheck); + } finally { + _isChecking = false; + } + } + } + + private void locked_checkCreateFiles(boolean recheck) throws IOException { // Whether we are resuming or not, // if any of the files already exists we assume we are resuming. @@ -867,10 +910,19 @@ public class Storage final int ZEROBLOCKSIZE = (int) Math.min(remaining, 32*1024); byte[] zeros = new byte[ZEROBLOCKSIZE]; rafs[nr].seek(0); - while (remaining > 0) { - int size = (int) Math.min(remaining, ZEROBLOCKSIZE); - rafs[nr].write(zeros, 0, size); - remaining -= size; + // don't bother setting flag for small files + if (remaining > 20*1024*1024) + _allocateCount.incrementAndGet(); + try { + while (remaining > 0) { + int size = (int) Math.min(remaining, ZEROBLOCKSIZE); + rafs[nr].write(zeros, 0, size); + remaining -= size; + } + } finally { + remaining = lengths[nr]; + if (remaining > 20*1024*1024) + _allocateCount.decrementAndGet(); } isSparse[nr] = false; } 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 731c43727798344f0afcf253caa8dbbb8d9a4325..7283b14be1d5e1da6ee078a02d5a6fd92c65ae6e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -609,6 +609,7 @@ public class I2PSnarkServlet extends DefaultServlet { MetaInfo meta = snark.getMetaInfo(); if (meta == null) { // magnet - remove and delete are the same thing + // Remove not shown on UI so we shouldn't get here _manager.deleteMagnet(snark); _manager.addMessage(_("Magnet deleted: {0}", name)); return; @@ -637,7 +638,10 @@ public class I2PSnarkServlet extends DefaultServlet { if (meta == null) { // magnet - remove and delete are the same thing _manager.deleteMagnet(snark); - _manager.addMessage(_("Magnet deleted: {0}", name)); + if (snark instanceof FetchAndAdd) + _manager.addMessage(_("Download deleted: {0}", name)); + else + _manager.addMessage(_("Magnet deleted: {0}", name)); return; } _manager.stopTorrent(snark, true); @@ -739,6 +743,7 @@ public class I2PSnarkServlet extends DefaultServlet { try { // This may take a long time to check the storage, but since it already exists, // it shouldn't be THAT bad, so keep it in this thread. + // TODO thread it for big torrents, perhaps a la FetchAndAdd boolean isPrivate = _manager.getPrivateTrackers().contains(announceURL); Storage s = new Storage(_manager.util(), baseFile, announceURL, isPrivate, null); s.close(); // close the files... maybe need a way to pass this Storage to addTorrent rather than starting over @@ -988,7 +993,13 @@ public class I2PSnarkServlet extends DefaultServlet { String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd"); String statusString; - if (err != null) { + if (snark.isChecking()) { + statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" title=\"" + _("Checking") + "\"></td>" + + "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Checking"); + } else if (snark.isAllocating()) { + statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" title=\"" + _("Allocating") + "\"></td>" + + "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Allocating"); + } else if (err != null) { if (isRunning && curPeers > 0 && !showPeers) statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td>" + "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") + @@ -1170,7 +1181,9 @@ public class I2PSnarkServlet extends DefaultServlet { String b64 = Base64.encode(snark.getInfoHash()); if (showPeers) parameters = parameters + "&p=1"; - if (isRunning) { + if (snark.isChecking()) { + // show no buttons + } else if (isRunning) { // Stop Button if (isDegraded) out.write("<a href=\"/i2psnark/?action=Stop_" + b64 + "&nonce=" + _nonce + "\"><img title=\""); diff --git a/apps/i2psnark/locale/messages_cs.po b/apps/i2psnark/locale/messages_cs.po index ed8bca2b1fd7ffd84faf1bbbfddcb30ac9b9eae7..3f0f45a7a57ad61dff9bd1e9a0f385715fff4143 100644 --- a/apps/i2psnark/locale/messages_cs.po +++ b/apps/i2psnark/locale/messages_cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-17 11:41+0000\n" +"POT-Creation-Date: 2012-09-12 11:58+0000\n" "PO-Revision-Date: 2012-02-12 20:06+0000\n" "Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n" "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n" @@ -18,420 +18,535 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:355 +#: ../java/src/org/klomp/snark/SnarkManager.java:434 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Celkový limit sdílečů změněn na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:357 +#: ../java/src/org/klomp/snark/SnarkManager.java:436 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Nejmenší celkový limit sdílečů je {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:369 +#: ../java/src/org/klomp/snark/SnarkManager.java:448 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Horní BW limit změněn na {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:371 +#: ../java/src/org/klomp/snark/SnarkManager.java:450 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Nejmenší horní limit přenosové rychlist je {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:383 +#: ../java/src/org/klomp/snark/SnarkManager.java:462 #, java-format msgid "Startup delay changed to {0}" msgstr "Prodleva při startu změněna na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:394 +#: ../java/src/org/klomp/snark/SnarkManager.java:473 #, java-format msgid "Refresh time changed to {0}" msgstr "Doba aktualizace stavu (refresh time) změněna na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:396 +#: ../java/src/org/klomp/snark/SnarkManager.java:475 msgid "Refresh disabled" msgstr "Aktualizace stavu vypnuta" -#: ../java/src/org/klomp/snark/SnarkManager.java:451 +#: ../java/src/org/klomp/snark/SnarkManager.java:530 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Změny I2CP a tunelu se projeví až po zastavení všech torrentů" -#: ../java/src/org/klomp/snark/SnarkManager.java:455 +#: ../java/src/org/klomp/snark/SnarkManager.java:534 #, java-format msgid "I2CP options changed to {0}" msgstr "Nastavení (options) I2CP změněno na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:460 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Disconnecting old I2CP destination" msgstr "Odpojuji se od starého I2CP cíle" -#: ../java/src/org/klomp/snark/SnarkManager.java:462 +#: ../java/src/org/klomp/snark/SnarkManager.java:541 #, java-format msgid "I2CP settings changed to {0}" msgstr "Nastavení (settings) I2CP změněno na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:467 +#: ../java/src/org/klomp/snark/SnarkManager.java:546 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Nemůžu se připojit s novým nastavením I2CP, vracím se k předhozímu." -#: ../java/src/org/klomp/snark/SnarkManager.java:471 +#: ../java/src/org/klomp/snark/SnarkManager.java:550 msgid "Unable to reconnect with the old settings!" msgstr "Nemohu se opětovně připojit ani s předchozím nastavením!" -#: ../java/src/org/klomp/snark/SnarkManager.java:473 +#: ../java/src/org/klomp/snark/SnarkManager.java:552 msgid "Reconnected on the new I2CP destination" msgstr "Opětovně připojeno k novému I2CP cíli" -#: ../java/src/org/klomp/snark/SnarkManager.java:480 +#: ../java/src/org/klomp/snark/SnarkManager.java:559 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP listener restartován pro \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:492 +#: ../java/src/org/klomp/snark/SnarkManager.java:571 msgid "New files will be publicly readable" msgstr "Nové soubory budou veřejně přístupné" -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#: ../java/src/org/klomp/snark/SnarkManager.java:573 msgid "New files will not be publicly readable" msgstr "Nové soubory nebudou veřejně přístupné" -#: ../java/src/org/klomp/snark/SnarkManager.java:501 +#: ../java/src/org/klomp/snark/SnarkManager.java:580 msgid "Enabled autostart" msgstr "Automatické spuštění zapnuto" -#: ../java/src/org/klomp/snark/SnarkManager.java:503 +#: ../java/src/org/klomp/snark/SnarkManager.java:582 msgid "Disabled autostart" msgstr "Automatické spuštění vypnuto" -#: ../java/src/org/klomp/snark/SnarkManager.java:509 +#: ../java/src/org/klomp/snark/SnarkManager.java:588 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Zapnuto automatické spuštění" -#: ../java/src/org/klomp/snark/SnarkManager.java:511 +#: ../java/src/org/klomp/snark/SnarkManager.java:590 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "" "Otevřené trackery vypnuty - aby se změna projevila je nutné restartovat " "všechny torrenty" -#: ../java/src/org/klomp/snark/SnarkManager.java:519 -msgid "Open Tracker list changed - torrent restart required to take effect." +#: ../java/src/org/klomp/snark/SnarkManager.java:597 +msgid "Enabled DHT." msgstr "" -"Seznam otevřených trackerů změněn - aby se změna projevila je nutné " -"restartovat všechny torrenty" -#: ../java/src/org/klomp/snark/SnarkManager.java:526 +#: ../java/src/org/klomp/snark/SnarkManager.java:599 +msgid "Disabled DHT." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:601 +msgid "DHT change requires tunnel shutdown and reopen" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:608 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Téma {0} bylo nahráno, přejděte prosím na hlavní stránku i2snark" -#: ../java/src/org/klomp/snark/SnarkManager.java:533 +#: ../java/src/org/klomp/snark/SnarkManager.java:615 msgid "Configuration unchanged." msgstr "Nastavení nebylo změněno." -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#: ../java/src/org/klomp/snark/SnarkManager.java:647 +msgid "Open Tracker list changed - torrent restart required to take effect." +msgstr "" +"Seznam otevřených trackerů změněn - aby se změna projevila je nutné " +"restartovat všechny torrenty" + +#: ../java/src/org/klomp/snark/SnarkManager.java:657 +msgid "Private tracker list changed - affects newly created torrents only." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:703 #, java-format msgid "Unable to save the config to {0}" msgstr "Nemůžu uložit soubor s nastavením do souboru {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:608 +#: ../java/src/org/klomp/snark/SnarkManager.java:768 msgid "Connecting to I2P" msgstr "Připojuji se k I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:611 +#: ../java/src/org/klomp/snark/SnarkManager.java:771 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "" "Při připojování k I2P nastala chyba, zkontrolujte prosím nastavení I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:620 +#: ../java/src/org/klomp/snark/SnarkManager.java:780 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Chyba: nepodařilo se přidat torrent {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:642 +#: ../java/src/org/klomp/snark/SnarkManager.java:802 #, java-format msgid "Cannot open \"{0}\"" msgstr "Nejde otevřít \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:661 -#: ../java/src/org/klomp/snark/SnarkManager.java:737 -#: ../java/src/org/klomp/snark/SnarkManager.java:792 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2048 +#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:899 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent s tímto infohašišem již běží: {0}" -#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); -#: ../java/src/org/klomp/snark/SnarkManager.java:668 -#, java-format +#: ../java/src/org/klomp/snark/SnarkManager.java:827 +#, fuzzy, java-format +msgid "ERROR - No I2P trackers in private torrent \"{0}\"" +msgstr "CHYBA - nedostatek paměti, nemohu vytvořit torrent z {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:829 +#, fuzzy, java-format msgid "" -"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " -"only." +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and " +"DHT only." msgstr "" "Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, budou použity pouze " "otevrené I2P trackery." -#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); -#: ../java/src/org/klomp/snark/SnarkManager.java:673 -#, java-format +#: ../java/src/org/klomp/snark/SnarkManager.java:832 +#, fuzzy, java-format +msgid "" +"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " +"announce to DHT only." +msgstr "" +"Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, budou použity pouze " +"otevrené I2P trackery." + +#: ../java/src/org/klomp/snark/SnarkManager.java:834 +#, fuzzy, java-format msgid "" -"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " -"enabled before starting this torrent." +"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " +"disabled, you should enable open trackers or DHT before starting the torrent." msgstr "" "Varování - v \"{0}\" nebyly nalezeny žádné I2P trackery, před spuštěním " "tohoto torrentu se ujistěte že otevřené trackery jsou povoleny." -#: ../java/src/org/klomp/snark/SnarkManager.java:694 +#: ../java/src/org/klomp/snark/SnarkManager.java:856 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent v \"{0}\" je chybný" -#: ../java/src/org/klomp/snark/SnarkManager.java:699 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "CHYBA - nedostatek paměti, nemohu vytvořit torrent z {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:711 +#: ../java/src/org/klomp/snark/SnarkManager.java:873 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "Torrent přidán a spuštěn: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:713 +#: ../java/src/org/klomp/snark/SnarkManager.java:875 #, java-format msgid "Torrent added: \"{0}\"" msgstr "Torrent přidán: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:748 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:499 +#: ../java/src/org/klomp/snark/SnarkManager.java:910 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87 #, java-format msgid "Fetching {0}" msgstr "Získávám {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 -#, java-format +#: ../java/src/org/klomp/snark/SnarkManager.java:916 +#, fuzzy, java-format msgid "" -"We have no saved peers and no other torrents are running. Fetch of {0} will " -"not succeed until you start another torrent." +"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " +"succeed until you start another torrent, enable open trackers, or enable DHT." msgstr "" "Nejsou uloženi žádní sdíleči a žádné další torrenty neběží. Získání {0} " "neuspěje dokud nespustíte nějaký další torrent." -#: ../java/src/org/klomp/snark/SnarkManager.java:755 +#: ../java/src/org/klomp/snark/SnarkManager.java:920 #, java-format msgid "Adding {0}" msgstr "Přídávám {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:802 -#: ../java/src/org/klomp/snark/SnarkManager.java:825 -#: ../java/src/org/klomp/snark/SnarkManager.java:1260 +#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#, fuzzy, java-format +msgid "Download already running: {0}" +msgstr "Torrent s tímto infohašišem již běží: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:990 +#: ../java/src/org/klomp/snark/SnarkManager.java:1013 +#: ../java/src/org/klomp/snark/SnarkManager.java:1449 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Chyba: nepodařilo se zkopírovat soubor torrentu do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1052 +#: ../java/src/org/klomp/snark/SnarkManager.java:1240 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "V \"{0}\" ({1}) je příliš mnoho souborů, mažu je!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1054 +#: ../java/src/org/klomp/snark/SnarkManager.java:1242 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" msgstr "Jméno souboru torrentu \"{0}\" nemůže končit na \".torrent\", mažu ho!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1056 +#: ../java/src/org/klomp/snark/SnarkManager.java:1244 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "\"{0}\" neobsahuje žádné části, mažu to!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1058 +#: ../java/src/org/klomp/snark/SnarkManager.java:1246 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "Příliš mnoho částí v \"{0}\", maximum je {1}, mažu to!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1248 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1061 +#: ../java/src/org/klomp/snark/SnarkManager.java:1249 #, java-format msgid "Limit is {0}B" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1063 +#: ../java/src/org/klomp/snark/SnarkManager.java:1251 #, java-format msgid "Torrent \"{0}\" has no data, deleting it!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1071 +#: ../java/src/org/klomp/snark/SnarkManager.java:1259 #, java-format msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1087 +#: ../java/src/org/klomp/snark/SnarkManager.java:1275 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1108 -#: ../java/src/org/klomp/snark/SnarkManager.java:1126 +#: ../java/src/org/klomp/snark/SnarkManager.java:1296 +#: ../java/src/org/klomp/snark/SnarkManager.java:1314 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1147 +#: ../java/src/org/klomp/snark/SnarkManager.java:1335 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1155 +#: ../java/src/org/klomp/snark/SnarkManager.java:1343 #, java-format msgid "Adding torrents in {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1394 #, java-format msgid "Download finished: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1256 +#: ../java/src/org/klomp/snark/SnarkManager.java:1445 #, java-format msgid "Metainfo received for {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1257 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/SnarkManager.java:1446 +#: ../java/src/org/klomp/snark/SnarkManager.java:1669 #, java-format msgid "Starting up torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1313 +#: ../java/src/org/klomp/snark/SnarkManager.java:1461 +#, fuzzy, java-format +msgid "Error on torrent {0}" +msgstr "Chyba: nepodařilo se přidat torrent {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1802 +msgid "Magnet" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1518 msgid "Unable to connect to I2P!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1319 +#: ../java/src/org/klomp/snark/SnarkManager.java:1524 #, java-format msgid "Unable to add {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +#: ../java/src/org/klomp/snark/SnarkManager.java:1668 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124 +msgid "Opening the I2P tunnel" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1692 +msgid "Opening the I2P tunnel and starting all torrents." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1747 +msgid "Stopping all torrents and closing the I2P tunnel." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1766 +msgid "Closing I2P tunnel after notifying trackers." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1773 +#: ../java/src/org/klomp/snark/SnarkManager.java:1784 +msgid "I2P tunnel closed." +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:227 +#, java-format +msgid "No valid trackers for {0} - enable opentrackers or DHT?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75 +#, fuzzy, java-format +msgid "Download torrent file from {0}" +msgstr "Chyba: nepodařilo se zkopírovat soubor torrentu do {0}" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:97 +#, java-format +msgid "Torrent was not retrieved from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:150 +#, java-format +msgid "Torrent fetched from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:171 +#, java-format +msgid "Torrent already running: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:173 +#, java-format +msgid "Torrent already in the queue: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:179 +#, java-format +msgid "Torrent at {0} was not valid" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:236 +msgid "Router is down" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251 msgid "Torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:224 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254 msgid "I2PSnark" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258 msgid "Refresh page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:263 msgid "Forum" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:276 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1791 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 +msgid "clear messages" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2248 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250 msgid "Status" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:296 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:347 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349 msgid "Hide Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:303 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:356 msgid "Show Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1724 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2118 msgid "Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:316 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370 msgid "Estimated time remaining" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373 msgid "ETA" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 msgid "Downloaded" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381 msgid "RX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:386 msgid "Uploaded" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:389 msgid "TX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:395 msgid "Down Rate" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352 -msgid "Rate" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398 +msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 msgid "Up Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 +msgid "TX Rate" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430 msgid "Stop all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:374 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432 msgid "Stop All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:383 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441 msgid "Start all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443 msgid "Start All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463 msgid "No torrents loaded." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:409 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468 msgid "Totals" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:411 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -439,7 +554,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:414 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:473 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -447,101 +562,132 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:498 -msgid "Opening the I2P tunnel" -msgstr "" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:479 +#, java-format +msgid "1 DHT peer" +msgid_plural "{0} DHT peers" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:640 #, java-format msgid "Magnet deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:621 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 #, java-format msgid "Torrent file deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:592 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:603 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:652 #, java-format msgid "Data file deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:594 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665 #, java-format msgid "Data file could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689 +#, java-format +msgid "Directory could not be deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 #, java-format -msgid "Data dir deleted: {0}" +msgid "Directory deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 msgid "Error creating torrent - you must select a tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 #, java-format msgid "Torrent created for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:752 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:754 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:757 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:760 msgid "Error creating torrent - you must enter a file or directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 -msgid "Stopping all torrents and closing the I2P tunnel." +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +msgid "Delete selected" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:702 -msgid "I2P tunnel closed." +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:705 -msgid "Opening the I2P tunnel and starting all torrents." +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 +msgid "Removed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762 +msgid "Add tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:844 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 +msgid "Enter valid tracker name and URLs" +msgstr "" + +#. "<input type=\"reset\" class=\"cancel\" value=\"").append(_("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761 +msgid "Restore defaults" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 +msgid "Restored default trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007 msgid "Tracker Error" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:830 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:858 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:867 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:871 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1002 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -549,318 +695,357 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1010 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011 +msgid "Starting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 msgid "Seeding" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1023 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1038 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2305 msgid "Complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:860 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1048 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 msgid "OK" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:864 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060 msgid "Stalled" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:873 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 msgid "No Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1072 msgid "Stopped" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 msgid "Torrent details" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1187 -msgid "Info" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 msgid "View files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:940 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1136 msgid "Open file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1179 msgid "Stop the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:984 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1181 msgid "Stop" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 msgid "Start the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:996 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195 msgid "Start" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. -#. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012 +#. Then the remaining single quote must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1212 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " "data will not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1015 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1215 msgid "Remove" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1026 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1227 msgid "Delete the .torrent file and the associated data file(s)" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. -#. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031 +#. Then the remaining single quote must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1232 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725 msgid "Delete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270 msgid "Unknown" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1282 msgid "Seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1104 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305 msgid "Uninteresting (The peer has no pieces we need)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1307 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1327 msgid "Uninterested (We have no pieces the peer needs)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1128 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1329 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1383 #, java-format msgid "Details at {0} tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399 +msgid "Info" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1427 msgid "Add Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1429 msgid "From URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432 msgid "" -"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +"Enter the torrent file download URL (I2P only), magnet link, maggot link, or " +"info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437 msgid "Add torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442 msgid "Removing a .torrent will cause it to stop." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465 msgid "Create Torrent" msgstr "" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1468 msgid "Data to seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1472 msgid "File or directory to seed (must be within the specified path)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1474 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 msgid "Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476 msgid "Select a tracker" msgstr "" #. out.write(_("Open trackers and DHT only")); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481 msgid "Open trackers only" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 -msgid "or" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 -msgid "Specify custom tracker announce URL" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 msgid "Create torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 msgid "Configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Data directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 msgid "Edit i2psnark.config and restart to change" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 msgid "Files readable by all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 msgid "If checked, other users may access the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1540 msgid "Auto start" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1334 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 msgid "If checked, automatically start torrents that are added" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 msgid "Theme" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 msgid "Refresh time" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1364 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574 msgid "Never" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 msgid "Startup delay" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1582 msgid "minutes" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1396 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1606 msgid "Total uploader limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1609 msgid "peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1403 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1613 msgid "Up bandwidth limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1616 msgid "Half available bandwidth recommended." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1618 msgid "View or change router bandwidth" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1412 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1622 msgid "Use open trackers also" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1416 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1626 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed " "in the torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 -msgid "Open tracker announce URLs" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1630 +msgid "Enable DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1634 +msgid "If checked, use DHT" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1650 msgid "Inbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1656 msgid "Outbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1446 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1664 msgid "I2CP host" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 msgid "I2CP port" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1466 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "I2CP options" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1471 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689 msgid "Save configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1496 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703 +msgid "Trackers" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +msgid "Name" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1710 +msgid "Website URL" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2343 +msgid "Open" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +msgid "Private" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 +msgid "Announce URL" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 +msgid "Add" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1787 #, java-format msgid "Invalid magnet URL {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1821 #, java-format msgid "Invalid info hash in magnet URL {0}" msgstr "" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1945 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -868,7 +1053,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1946 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -876,113 +1061,87 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 -msgid "Completion" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2127 +msgid "Torrent file" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162 +msgid "Magnet link" msgstr "" -#. else unknown -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1788 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 +msgid "Private torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2242 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2244 msgid "Size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1737 -msgid "Files" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2185 +msgid "Completion" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1739 -msgid "Pieces" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +msgid "Remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1740 -msgid "Piece size" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2202 +msgid "Files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762 -msgid "Magnet link" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207 +msgid "Pieces" msgstr "" -#. We don't have the hash of the torrent file -#. buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">") -#. .append(MAGGOT).append(hex).append(':').append(hex).append("</a>"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1768 -msgid "Torrent file" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2211 +msgid "Piece size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1786 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2234 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2238 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 msgid "Directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1795 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2257 msgid "Priority" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1800 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Up to higher level directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1830 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2293 msgid "Torrent not found?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2302 msgid "File not found in torrent?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315 msgid "complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 -msgid "bytes remaining" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316 +msgid "remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1878 -msgid "Open" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1904 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "High" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1909 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2375 msgid "Normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1914 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2380 msgid "Skip" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2389 msgid "Save priorities" msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2039 -#, java-format -msgid "Torrent fetched from {0}" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2060 -#, java-format -msgid "Torrent already running: {0}" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 -#, java-format -msgid "Torrent already in the queue: {0}" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 -#, java-format -msgid "Torrent at {0} was not valid" -msgstr "" - -#. FIXME don't lose peer setting -#. String peerParam = req.getParameter("p"); -#. if (peerParam != null) -#. buf.append("<input type=\"hidden\" name=\"p\" value=\"").append(peerParam).append("\" >\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 -#, java-format -msgid "Torrent was not retrieved from {0}" -msgstr "" diff --git a/apps/i2psnark/locale/messages_en.po b/apps/i2psnark/locale/messages_en.po index 414f106c41c23df479d37d72035249d0d0d85fb3..5969bd5bfffc1d81b261ea315e6939093cb1406c 100644 --- a/apps/i2psnark/locale/messages_en.po +++ b/apps/i2psnark/locale/messages_en.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2psnark\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-25 19:38+0000\n" +"POT-Creation-Date: 2012-09-06 09:09+0000\n" "PO-Revision-Date: 2010-06-15 14:09+0100\n" "Last-Translator: duck <duck@mail.i2p>\n" "Language-Team: duck <duck@mail.i2p>\n" @@ -334,8 +334,8 @@ msgid "Error on torrent {0}" msgstr "" #: ../java/src/org/klomp/snark/SnarkManager.java:1487 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1785 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1795 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1802 msgid "Magnet" msgstr "" @@ -405,724 +405,724 @@ msgstr "" msgid "Torrent at {0} was not valid" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:222 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:236 msgid "Router is down" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:250 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251 msgid "Torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:253 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1254 msgid "I2PSnark" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:257 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258 msgid "Refresh page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:263 msgid "Forum" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:276 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 msgid "clear messages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2243 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2248 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250 msgid "Status" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:347 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349 msgid "Hide Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:356 msgid "Show Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:362 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:364 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2111 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2118 msgid "Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:369 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370 msgid "Estimated time remaining" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373 msgid "ETA" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 msgid "Downloaded" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:380 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381 msgid "RX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:386 msgid "Uploaded" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:388 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:389 msgid "TX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:395 msgid "Down Rate" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398 msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:403 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 msgid "Up Rate" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:406 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 msgid "TX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430 msgid "Stop all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:431 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432 msgid "Stop All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:440 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441 msgid "Start all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:442 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443 msgid "Start All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:462 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463 msgid "No torrents loaded." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468 msgid "Totals" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:469 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:472 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:473 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:478 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:479 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:612 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:639 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:640 #, java-format msgid "Magnet deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:620 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:621 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646 #, java-format msgid "Torrent file deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:651 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:652 #, java-format msgid "Data file deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:664 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665 #, java-format msgid "Data file could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:679 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689 #, java-format msgid "Directory could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 #, java-format msgid "Directory deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:733 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734 msgid "Error creating torrent - you must select a tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:749 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 #, java-format msgid "Torrent created for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:752 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:754 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:757 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:760 msgid "Error creating torrent - you must enter a file or directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:774 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Delete selected" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:774 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1752 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:791 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 msgid "Removed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762 msgid "Add tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:844 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 msgid "Enter valid tracker name and URLs" msgstr "" #. "<input type=\"reset\" class=\"cancel\" value=\"").append(_("Cancel")).append("\">\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761 msgid "Restore defaults" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:851 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "Restored default trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1007 msgid "Tracker Error" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1023 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1039 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1050 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1002 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1003 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1004 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1010 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011 msgid "Starting" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 msgid "Seeding" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1016 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2183 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2298 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1023 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1038 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2305 msgid "Complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1036 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1048 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 msgid "OK" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060 msgid "Stalled" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1058 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 msgid "No Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1072 msgid "Stopped" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1098 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 msgid "Torrent details" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1127 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 msgid "View files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1129 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1136 msgid "Open file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1172 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1179 msgid "Stop the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1181 msgid "Stop" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 msgid "Start the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195 msgid "Start" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1200 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1212 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " "data will not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1208 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1215 msgid "Remove" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1220 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1227 msgid "Delete the .torrent file and the associated data file(s)" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1232 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1718 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725 msgid "Delete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270 msgid "Unknown" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1282 msgid "Seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1298 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305 msgid "Uninteresting (The peer has no pieces we need)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1307 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1327 msgid "Uninterested (We have no pieces the peer needs)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1329 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1376 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1383 #, java-format msgid "Details at {0} tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1399 msgid "Info" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1427 msgid "Add Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1422 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1429 msgid "From URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1432 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or " "info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1430 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1437 msgid "Add torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442 msgid "Removing a .torrent will cause it to stop." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1458 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465 msgid "Create Torrent" msgstr "" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1468 msgid "Data to seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1472 msgid "File or directory to seed (must be within the specified path)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1467 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2133 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1474 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 msgid "Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1469 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476 msgid "Select a tracker" msgstr "" #. out.write(_("Open trackers and DHT only")); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1474 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481 msgid "Open trackers only" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 msgid "Create torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1515 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771 msgid "Configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1519 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Data directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 msgid "Edit i2psnark.config and restart to change" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 msgid "Files readable by all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1529 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 msgid "If checked, other users may access the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1540 msgid "Auto start" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 msgid "If checked, automatically start torrents that are added" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 msgid "Theme" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 msgid "Refresh time" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574 msgid "Never" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1573 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 msgid "Startup delay" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1582 msgid "minutes" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1599 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1606 msgid "Total uploader limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1602 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1609 msgid "peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1606 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1613 msgid "Up bandwidth limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1609 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1616 msgid "Half available bandwidth recommended." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1611 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1618 msgid "View or change router bandwidth" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1622 msgid "Use open trackers also" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1619 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1626 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed " "in the torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1623 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1630 msgid "Enable DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1634 msgid "If checked, use DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1650 msgid "Inbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1649 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1656 msgid "Outbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1657 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1664 msgid "I2CP host" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1662 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 msgid "I2CP port" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "I2CP options" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689 msgid "Save configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1696 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703 msgid "Trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 msgid "Name" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1710 msgid "Website URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1705 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2343 msgid "Open" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1707 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 msgid "Private" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1709 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 msgid "Announce URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 msgid "Add" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1787 #, java-format msgid "Invalid magnet URL {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1814 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1821 #, java-format msgid "Invalid info hash in magnet URL {0}" msgstr "" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1945 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1946 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2120 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2127 msgid "Torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2155 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162 msgid "Magnet link" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Private torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2171 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2242 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2244 msgid "Size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2185 msgid "Completion" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2188 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 msgid "Remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2202 msgid "Files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2200 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2207 msgid "Pieces" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2211 msgid "Piece size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2227 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2234 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2238 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 msgid "Directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2248 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2257 msgid "Priority" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2256 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Up to higher level directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2286 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2293 msgid "Torrent not found?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2295 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2302 msgid "File not found in torrent?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315 msgid "complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2309 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316 msgid "remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2363 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "High" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2375 msgid "Normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2373 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2380 msgid "Skip" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2389 msgid "Save priorities" msgstr "" diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java index 052a211f45faf8cd7f59e9a6186bd882c1d46d55..296691b9dfac9b36a9be6754bc29937f5d1c81e8 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java @@ -694,7 +694,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { public void runClient(String args[], Logging l) { boolean isShared = true; if (args.length >= 3) - isShared = Boolean.valueOf(args[2].trim()).booleanValue(); + isShared = Boolean.parseBoolean(args[2].trim()); if (args.length >= 2) { int portNum = -1; try { @@ -717,7 +717,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { addtask(task); notifyEvent("clientTaskId", Integer.valueOf(task.getId())); } catch (IllegalArgumentException iae) { - String msg = "Invalid I2PTunnel configuration to create an HTTP Proxy connecting to the router at " + host + ':'+ port + + String msg = "Invalid I2PTunnel configuration to create a standard client tunnel connecting to the router at " + host + ':'+ port + " and listening on " + listenHost + ':' + portNum; _log.error(getPrefix() + msg, iae); l.log(msg); @@ -766,7 +766,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { String proxy = ""; boolean isShared = true; if (args.length > 1) { - if (Boolean.valueOf(args[1].trim()).booleanValue()) { + if (Boolean.parseBoolean(args[1].trim())) { isShared = true; if (args.length == 3) proxy = args[2]; @@ -835,7 +835,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { String proxy = ""; boolean isShared = true; if (args.length > 1) { - if (Boolean.valueOf(args[1].trim()).booleanValue()) { + if (Boolean.parseBoolean(args[1].trim())) { isShared = true; if (args.length == 3) proxy = args[2]; @@ -906,7 +906,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { boolean isShared = true; if (args.length > 2) { - if (Boolean.valueOf(args[2].trim()).booleanValue()) { + if (Boolean.parseBoolean(args[2].trim())) { isShared = true; } else if ("false".equalsIgnoreCase(args[2].trim())) { _log.warn("args[2] == [" + args[2] + "] and rejected explicitly"); @@ -973,7 +973,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { boolean isShared = false; if (args.length > 1) - isShared = Boolean.valueOf(args[1].trim()).booleanValue(); + isShared = Boolean.parseBoolean(args[1].trim()); ownDest = !isShared; try { @@ -1017,7 +1017,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { boolean isShared = false; if (args.length == 2) - isShared = Boolean.valueOf(args[1].trim()).booleanValue(); + isShared = Boolean.parseBoolean(args[1].trim()); ownDest = !isShared; String privateKeyFile = null; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java index d9fea97433b4d8381baa8701e3c5c8ba52341843..24bc2d2f7ef9428ed50bcb0bf008491a75ff58d7 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java @@ -190,11 +190,11 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna // no need to load the netDb with leaseSets for destinations that will never // be looked up boolean dccEnabled = (this instanceof I2PTunnelIRCClient) && - Boolean.valueOf(tunnel.getClientOptions().getProperty(I2PTunnelIRCClient.PROP_DCC)).booleanValue(); + Boolean.parseBoolean(tunnel.getClientOptions().getProperty(I2PTunnelIRCClient.PROP_DCC)); if (!dccEnabled) tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true"); - boolean openNow = !Boolean.valueOf(tunnel.getClientOptions().getProperty("i2cp.delayOpen")).booleanValue(); + boolean openNow = !Boolean.parseBoolean(tunnel.getClientOptions().getProperty("i2cp.delayOpen")); if (openNow) { while (sockMgr == null) { verifySocketManager(); @@ -258,8 +258,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna 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()) { + Boolean.parseBoolean(getTunnel().getClientOptions().getProperty("i2cp.closeOnIdle")) && + Boolean.parseBoolean(getTunnel().getClientOptions().getProperty("i2cp.newDestOnResume"))) { // build a new socket manager and a new dest if the session is closed. getTunnel().removeSession(sess); if (_log.shouldLog(Log.WARN)) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java index f8113382d1d247d6a74b2e2714de2088b8f629d0..04ca75e75aa069237266bfa4c2e0215cbe0e1ebd 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java @@ -253,7 +253,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R line = null; } else { // Add Proxy-Authentication header for next hop (outproxy) - if (usingWWWProxy && Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH)).booleanValue()) { + if (usingWWWProxy && Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH))) { // specific for this proxy String user = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_USER_PREFIX + currentProxy); String pw = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_PW_PREFIX + currentProxy); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index 6487956daa5d829da9e8d73cf409241c25751adb..bc7a474774d1013047a57a236f8b540f2b0e75ea 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -521,7 +521,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn // Try to find an address helper in the query String[] helperStrings = removeHelper(query); if(helperStrings != null && - !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER)).booleanValue()) { + !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER))) { query = helperStrings[0]; if(query.equals("")) { query = null; @@ -736,7 +736,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn } else if(lowercaseLine.startsWith("user-agent: ")) { // save for deciding whether to offer address book form userAgent = lowercaseLine.substring(12); - if(!Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT)).booleanValue()) { + if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT))) { line = null; continue; } @@ -746,13 +746,13 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn line = null; continue; } else if(lowercaseLine.startsWith("referer: ") && - !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_REFERER)).booleanValue()) { + !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_REFERER))) { // Shouldn't we be more specific, like accepting in-site referers ? //line = "Referer: i2p"; line = null; continue; // completely strip the line } else if(lowercaseLine.startsWith("via: ") && - !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_VIA)).booleanValue()) { + !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_VIA))) { //line = "Via: i2p"; line = null; continue; // completely strip the line @@ -786,7 +786,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn String ok = getTunnel().getClientOptions().getProperty("i2ptunnel.gzip"); boolean gzip = DEFAULT_GZIP; if(ok != null) { - gzip = Boolean.valueOf(ok).booleanValue(); + gzip = Boolean.parseBoolean(ok); } if(gzip && !usingInternalServer) { // according to rfc2616 s14.3, this *should* force identity, even if @@ -796,7 +796,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn newRequest.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(!shout) { - if(!Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT)).booleanValue()) { + if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT))) { // let's not advertise to external sites that we are from I2P if(usingWWWProxy) { newRequest.append("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6\r\n"); @@ -806,7 +806,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn } } // Add Proxy-Authentication header for next hop (outproxy) - if(usingWWWProxy && Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH)).booleanValue()) { + if(usingWWWProxy && Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_AUTH))) { // specific for this proxy String user = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_USER_PREFIX + currentProxy); String pw = getTunnel().getClientOptions().getProperty(PROP_OUTPROXY_PW_PREFIX + currentProxy); @@ -869,7 +869,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn if(usingInternalServer) { // disable the add form if address helper is disabled if(internalPath.equals("/add") && - Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER)).booleanValue()) { + Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER))) { out.write(ERR_HELPER_DISABLED); } else { LocalHTTPServer.serveLocalFile(out, method, internalPath, internalRawQuery, _proxyNonce); @@ -949,7 +949,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn // Don't do this for eepget, which uses a user-agent of "Wget" if(ahelperNew && "GET".equals(method) && (userAgent == null || !userAgent.startsWith("Wget")) && - !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER)).booleanValue()) { + !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_DISABLE_HELPER))) { writeHelperSaveForm(out, destination, ahelperKey, targetRequest); s.close(); return; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java index 331c786f13331bd72900d8c229d00b63af208778..f14de68b4b1550d7ed26ae0ef8e384255a13e4d3 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java @@ -100,7 +100,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem // Ref: RFC 2617 // If the socket is an InternalSocket, no auth required. String authRequired = getTunnel().getClientOptions().getProperty(PROP_AUTH); - if (Boolean.valueOf(authRequired).booleanValue() || + if (Boolean.parseBoolean(authRequired) || (authRequired != null && "basic".equals(authRequired.toLowerCase(Locale.US)))) { if (s instanceof InternalSocket) { if (_log.shouldLog(Log.INFO)) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java index 5c69959adee60df464c1a72ced733e1a01b9aadf..d1dec5248e008e5b5f10ef03756896d1ca454667 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java @@ -45,7 +45,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { private static final String[] CLIENT_SKIPHEADERS = {HASH_HEADER, DEST64_HEADER, DEST32_HEADER}; private static final String SERVER_HEADER = "Server"; private static final String[] SERVER_SKIPHEADERS = {SERVER_HEADER}; - private static final long HEADER_TIMEOUT = 60*1000; + private static final long HEADER_TIMEOUT = 15*1000; + private static final long TOTAL_HEADER_TIMEOUT = 2 * HEADER_TIMEOUT; private static final long START_INTERVAL = (60 * 1000) * 3; private long _startedOn = 0L; @@ -154,7 +155,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { boolean allowGZIP = true; if (opts != null) { String val = opts.getProperty("i2ptunnel.gzip"); - if ( (val != null) && (!Boolean.valueOf(val).booleanValue()) ) + if ( (val != null) && (!Boolean.parseBoolean(val)) ) allowGZIP = false; } if (_log.shouldLog(Log.INFO)) @@ -492,7 +493,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { } } - protected static Map<String, List<String>> readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException { + protected static Map<String, List<String>> readHeaders(InputStream in, StringBuilder command, + String[] skipHeaders, I2PAppContext ctx) throws IOException { HashMap<String, List<String>> headers = new HashMap<String, List<String>>(); StringBuilder buf = new StringBuilder(128); @@ -516,6 +518,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { if (trimmed > 0) ctx.statManager().addRateData("i2ptunnel.httpNullWorkaround", trimmed, 0); + // slowloris / darkloris + long expire = ctx.clock().now() + TOTAL_HEADER_TIMEOUT; int i = 0; while (true) { if (++i > MAX_HEADERS) @@ -528,6 +532,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { // end of headers reached return headers; } else { + if (ctx.clock().now() > expire) + throw new IOException("Headers took too long [" + buf.toString() + "]"); int split = buf.indexOf(":"); if (split <= 0) throw new IOException("Invalid HTTP header, missing colon [" + buf.toString() + "]"); String name = buf.substring(0, split).trim(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java index 60d8dc0dbff058c5a20adc14c24dfb15469cf5d3..fdba9af6300a0f7ec917c91f2dfc82aeec448063 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java @@ -87,7 +87,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase { setName("IRC Client on " + tunnel.listenHost + ':' + localPort); - _dccEnabled = Boolean.valueOf(tunnel.getClientOptions().getProperty(PROP_DCC)).booleanValue(); + _dccEnabled = Boolean.parseBoolean(tunnel.getClientOptions().getProperty(PROP_DCC)); // TODO add some prudent tunnel options (or is it too late?) startRunning(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java index b592ebcf82dcc267f90ddbbb621329b6207403f1..31cc4c26c2ffe43f780ad1ba0497ea3efc968489 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java @@ -62,7 +62,8 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable { public static final String PROP_WEBIRC_SPOOF_IP_DEFAULT="127.0.0.1"; public static final String PROP_HOSTNAME="ircserver.fakeHostname"; public static final String PROP_HOSTNAME_DEFAULT="%f.b32.i2p"; - private static final long HEADER_TIMEOUT = 60*1000; + private static final long HEADER_TIMEOUT = 15*1000; + private static final long TOTAL_HEADER_TIMEOUT = 2 * HEADER_TIMEOUT; private final static byte[] ERR_UNAVAILABLE = (":ircserver.i2p 499 you :" + @@ -188,12 +189,16 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable { StringBuilder buf = new StringBuilder(128); int lineCount = 0; + // slowloris / darkloris + long expire = System.currentTimeMillis() + TOTAL_HEADER_TIMEOUT; 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"); + if (System.currentTimeMillis() > expire) + throw new IOException("Headers took too long [" + buf.toString() + "]"); s = s.trim(); //if (_log.shouldLog(Log.DEBUG)) // _log.debug("Got line: " + s); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java index 49b44f1c92e732f0e3f04ee75347220c4882a008..24e2c58eab5b04ca6abcd058218ebf34cc600d23 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java @@ -49,8 +49,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { protected Logging l; - private static final long DEFAULT_READ_TIMEOUT = -1; // 3*60*1000; - /** default timeout to 3 minutes - override if desired */ + private static final long DEFAULT_READ_TIMEOUT = 5*60*1000; + /** default timeout to 5 minutes - override if desired */ protected long readTimeout = DEFAULT_READ_TIMEOUT; /** do we use threads? default true (ignored for standard servers, always false) */ @@ -191,7 +191,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { if (_usePool) { String usePool = getTunnel().getClientOptions().getProperty(PROP_USE_POOL); if (usePool != null) - _usePool = Boolean.valueOf(usePool).booleanValue(); + _usePool = Boolean.parseBoolean(usePool); else _usePool = DEFAULT_USE_POOL; } @@ -207,7 +207,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { if (sockMgr == null) { // try to make this error sensible as it will happen... String msg = "Unable to connect to the router at " + getTunnel().host + ':' + portNum + - " and build tunnels for the server at " + getTunnel().listenHost + ':' + port; + " and build tunnels for the server at " + host.getHostAddress() + ':' + port; if (++retries < MAX_RETRIES) { this.l.log(msg + ", retrying in " + (RETRY_DELAY / 1000) + " seconds"); _log.error(msg + ", retrying in " + (RETRY_DELAY / 1000) + " seconds"); @@ -223,7 +223,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { sockMgr.setName("Server"); getTunnel().addSession(sockMgr.getSession()); - l.log("Tunnels ready for server at " + getTunnel().listenHost + ':' + port); + l.log("Tunnels ready for server at " + host.getHostAddress() + ':' + port); notifyEvent("openServerResult", "ok"); open = true; } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java index 61b7c6432426c38a5c78eb7bfdf13b1bb724cf8b..8420604c9a56afc20b554046fb38dcdeaedfb2fb 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java @@ -536,8 +536,8 @@ public class TunnelController implements Logging { /** default true */ public String getSharedClient() { return _config.getProperty("sharedClient", "true"); } /** default true */ - public boolean getStartOnLoad() { return Boolean.valueOf(_config.getProperty("startOnLoad", "true")).booleanValue(); } - public boolean getPersistentClientKey() { return Boolean.valueOf(_config.getProperty("option.persistentClientKey")).booleanValue(); } + public boolean getStartOnLoad() { return Boolean.parseBoolean(_config.getProperty("startOnLoad", "true")); } + public boolean getPersistentClientKey() { return Boolean.parseBoolean(_config.getProperty("option.persistentClientKey")); } public String getMyDestination() { if (_tunnel != null) { 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 0854c799351062cee9d65eebe507bc2523e7b094..912dd6b603a3ddf48160a96fc588635ae69f0fca 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java @@ -61,7 +61,7 @@ public class SOCKS5Server extends SOCKSServer { this.clientSock = clientSock; this.props = props; this.authRequired = - Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)).booleanValue() && + Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)) && props.containsKey(I2PTunnelHTTPClientBase.PROP_USER) && props.containsKey(I2PTunnelHTTPClientBase.PROP_PW); } @@ -181,7 +181,7 @@ 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()) { + /*** if(!Boolean.parseBoolean(tunnel.getOptions().getProperty("i2ptunnel.socks.allowUDP"))) { _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"); @@ -463,7 +463,7 @@ public class SOCKS5Server extends SOCKSServer { I2PSocket destSock = tun.createI2PSocket(I2PAppContext.getGlobalContext().namingService().lookup(proxy), proxyOpts); try { DataOutputStream out = new DataOutputStream(destSock.getOutputStream()); - boolean authAvail = Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH)).booleanValue(); + boolean authAvail = Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH)); String configUser = null; String configPW = null; if (authAvail) { 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 8a373b6794ddeb8671f155018af7655b05e030ec..971f3be0402a591bf27bf98791418c2cdc7e30aa 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java @@ -49,7 +49,7 @@ public class SOCKSServerFactory { switch (socksVer) { case 0x04: // SOCKS version 4/4a - if (Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)).booleanValue() && + if (Boolean.parseBoolean(props.getProperty(I2PTunnelHTTPClientBase.PROP_AUTH)) && props.containsKey(I2PTunnelHTTPClientBase.PROP_USER) && props.containsKey(I2PTunnelHTTPClientBase.PROP_PW)) { throw new SOCKSException("SOCKS 4/4a not supported when authorization is required"); 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 172e3eb57632b3cb032d3a6be9c4961f0586dad8..a0c38616e80b536f8bce34b6e4f4bc480ad5de3b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -114,7 +114,7 @@ public class EditBean extends IndexBean { public boolean isSharedClient(int tunnel) { TunnelController tun = getController(tunnel); if (tun != null) - return Boolean.valueOf(tun.getSharedClient()).booleanValue(); + return Boolean.parseBoolean(tun.getSharedClient()); else return false; } @@ -312,7 +312,7 @@ public class EditBean extends IndexBean { if (tun != null) { Properties opts = getOptions(tun); if (opts != null) - return Boolean.valueOf(opts.getProperty(prop)).booleanValue(); + return Boolean.parseBoolean(opts.getProperty(prop)); } return false; } 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 e4609593cf9dc339695524fa3e43cd854d1f11d4..363c9a60b132ae907d229a9e7256f84ff378790c 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -32,6 +32,7 @@ import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase; import net.i2p.i2ptunnel.I2PTunnelIRCClient; import net.i2p.i2ptunnel.TunnelController; import net.i2p.i2ptunnel.TunnelControllerGroup; +import net.i2p.util.Addresses; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.FileUtil; import net.i2p.util.Log; @@ -265,7 +266,7 @@ public class IndexBean { } // Only modify other shared tunnels // if the current tunnel is shared, and of supported type - if (Boolean.valueOf(cur.getSharedClient()).booleanValue() && isClient(cur.getType())) { + if (Boolean.parseBoolean(cur.getSharedClient()) && isClient(cur.getType())) { // all clients use the same I2CP session, and as such, use the same I2CP options List controllers = _group.getControllers(); @@ -277,7 +278,7 @@ public class IndexBean { // Only modify this non-current tunnel // if it belongs to a shared destination, and is of supported type - if (Boolean.valueOf(c.getSharedClient()).booleanValue() && isClient(c.getType())) { + if (Boolean.parseBoolean(c.getSharedClient()) && isClient(c.getType())) { Properties cOpt = c.getConfig(""); if (_tunnelQuantity != null) { cOpt.setProperty("option.inbound.quantity", _tunnelQuantity); @@ -436,6 +437,9 @@ public class IndexBean { return _("New Tunnel"); } + /** + * No validation + */ public String getClientPort(int tunnel) { TunnelController tun = getController(tunnel); if (tun != null && tun.getListenPort() != null) @@ -444,6 +448,28 @@ public class IndexBean { return ""; } + /** + * Returns error message if blank or invalid + * @since 0.9.3 + */ + public String getClientPort2(int tunnel) { + TunnelController tun = getController(tunnel); + if (tun != null && tun.getListenPort() != null) { + String port = tun.getListenPort(); + if (port.length() == 0) + return "<font color=\"red\">" + _("Port not set") + "</font>"; + int iport = Addresses.getPort(port); + if (iport == 0) + return "<font color=\"red\">" + _("Invalid port") + ' ' + port + "</font>"; + if (iport < 1024) + return "<font color=\"red\">" + + _("Warning - ports less than 1024 are not recommended") + + ": " + port + "</font>"; + return port; + } + return "<font color=\"red\">" + _("Port not set") + "</font>"; + } + public String getTunnelType(int tunnel) { TunnelController tun = getController(tunnel); if (tun != null) @@ -551,12 +577,16 @@ public class IndexBean { else host = tun.getTargetHost(); String port = tun.getTargetPort(); - if (host == null) + if (host == null || host.length() == 0) host = "<font color=\"red\">" + _("Host not set") + "</font>"; + else if (Addresses.getIP(host) == null) + host = "<font color=\"red\">" + _("Invalid address") + ' ' + host + "</font>"; else if (host.indexOf(':') >= 0) host = '[' + host + ']'; - if (port == null) + if (port == null || port.length() == 0) port = "<font color=\"red\">" + _("Port not set") + "</font>"; + else if (Addresses.getPort(port) == 0) + port = "<font color=\"red\">" + _("Invalid port") + ' ' + port + "</font>"; return host + ':' + port; } else return ""; diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp index 5fad2c9ad45c1257dbed449d8735bef73547d7bf..6494430e4ea742d637ca89226677d3b2902edbc3 100644 --- a/apps/i2ptunnel/jsp/index.jsp +++ b/apps/i2ptunnel/jsp/index.jsp @@ -222,14 +222,8 @@ <label><%=intl._("Port")%>:</label> <span class="text"> <% - String cPort= indexBean.getClientPort(curClient); - if ("".equals(cPort)) { - out.write("<font color=\"red\">"); - out.write(intl._("Port not set")); - out.write("</font>"); - } else { - out.write(cPort); - } + String cPort= indexBean.getClientPort2(curClient); + out.write(cPort); %> </span> </div> diff --git a/apps/i2ptunnel/locale/messages_cs.po b/apps/i2ptunnel/locale/messages_cs.po index dc7d455de1d8981219563e10461e0f33bf7b8207..a1601bf67d0e5d4199506825e7b5971768430a04 100644 --- a/apps/i2ptunnel/locale/messages_cs.po +++ b/apps/i2ptunnel/locale/messages_cs.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-17 11:41+0000\n" +"POT-Creation-Date: 2012-09-12 11:58+0000\n" "PO-Revision-Date: 2012-02-17 11:26+0000\n" "Last-Translator: kytv <killyourtv@i2pmail.org>\n" "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n" @@ -19,15 +19,15 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554 msgid "This seems to be a bad destination:" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:554 msgid "i2paddresshelper cannot help you with a destination like that!" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:561 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:621 #, java-format msgid "" "To visit the destination in your host database, click <a href=\"{0}\">here</" @@ -35,85 +35,95 @@ msgid "" "\"{1}\">here</a>." msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:937 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:391 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1023 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410 msgid "Host" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:938 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:372 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1027 +msgid "Base 32" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1031 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380 msgid "Destination" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:943 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1037 #, java-format msgid "Continue to {0} without saving" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:948 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1042 #, java-format msgid "Save {0} to router address book and continue to eepsite" msgstr "" #. only blockfile supports multiple books -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:951 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1045 #, java-format msgid "Save {0} to master address book and continue to eepsite" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:952 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1046 #, java-format msgid "Save {0} to private address book and continue to eepsite" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1107 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1211 msgid "HTTP Outproxy" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1112 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1216 msgid "" "Click a link below to look for an address helper by using a \"jump\" service:" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1330 +#. Translators: parameter is a host name +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1252 +#, java-format +msgid "{0} jump service" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:159 msgid "Added via address helper" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1354 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:183 #, java-format msgid "Redirecting to {0}" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1360 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:189 msgid "Router Console" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:190 msgid "Addressbook" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:190 msgid "Configuration" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1361 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:190 msgid "Help" msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1366 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:195 #, java-format msgid "Saved {0} to the {1} addressbook, redirecting now." msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1367 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:196 #, java-format msgid "Failed to save {0} to the {1} addressbook, redirecting now." msgstr "" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1369 +#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198 msgid "Click here if you are not redirected automatically." msgstr "" @@ -122,7 +132,7 @@ msgstr "" msgid "internal" msgstr "vnitřní" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:175 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:174 msgid "" "Invalid form submission, probably because you used the 'back' or 'reload' " "button on your browser. Please resubmit." @@ -130,25 +140,25 @@ msgstr "" "Neplatně odeslaný formulář, nejspíše jste použili tlačítka 'Zpět' nebo " "'Znovu načíst' ve vašem prohlížeči. Prosím odešlete formulář znovu." -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:222 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:221 msgid "Configuration reloaded for all tunnels" msgstr "Nastavení pro všechny tunely bylo opětovně nahráno." #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:234 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:233 msgid "Starting tunnel" msgstr "Startuji tunel" #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:247 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:246 msgid "Stopping tunnel" msgstr "Zastavuji tunel" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:315 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 msgid "Configuration changes saved" msgstr "Změny nastavení byly uloženy" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:318 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:317 msgid "Failed to save configuration" msgstr "Nepodařilo se uložit nastavení" @@ -205,103 +215,103 @@ msgid "HTTP bidir" msgstr "HTTP bidir" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:555 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305 msgid "Host not set" msgstr "Host není nastaven" #: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:559 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287 msgid "Port not set" msgstr "Port není nastaven" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:82 msgid "I2P Tunnel Manager - Edit Client Tunnel" msgstr "Správce I2P tunelů - editovat klientský tunel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:104 msgid "Edit proxy settings" msgstr "Editovat nastavení proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112 msgid "New proxy settings" msgstr "Nové nastavení proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:126 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:123 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:123 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:123 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:326 msgid "Name" msgstr "Jméno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:127 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:127 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294 msgid "Type" msgstr "Typ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:131 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:131 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:330 msgid "Description" msgstr "Popis" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:147 msgid "Target" msgstr "Cíl" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:141 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:173 msgid "Access Point" msgstr "Přístupové místo (access point)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:164 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223 msgid "required" msgstr "požadováno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:188 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:479 msgid "Reachable by" msgstr "Dosažitelné (kým)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:190 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:358 msgid "Outproxies" msgstr "Výstupní proxy (Outproxies)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:378 msgid "Tunnel Destination" msgstr "Cíl tunelu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:382 msgid "name or destination" msgstr "jméno nebo cíl" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:385 msgid "b32 not recommended" msgstr "není doporučeno b32" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217 msgid "Shared Client" msgstr "Sdílený klient" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:221 msgid "" "(Share tunnels with other clients and irc/httpclients? Change requires " "restart of client proxy)" @@ -309,29 +319,29 @@ msgstr "" "(Sdílet tunely s ostatními klienty a klienty irc/http? Změny vyžadují " "restart proxy klienta)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:500 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:225 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:135 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:519 msgid "Auto Start" msgstr "Automatické spuštění" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:229 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:523 msgid "(Check the Box for 'YES')" msgstr "Zašrtněte zaškrtávací políčko pro 'ANO'" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:233 msgid "Enable DCC" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:232 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:253 msgid "Advanced networking options" msgstr "Rozšířená síťová nastavení" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 msgid "" "(NOTE: when this client proxy is configured to share tunnels, then these " "options are for all the shared proxy clients!)" @@ -339,900 +349,893 @@ msgstr "" "(POZN.: když je klientská proxy nastavena aby sdílela tunely, tak tyto " "nastavení platí pro všechny sdílené klienty proxy!)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:255 msgid "Tunnel Options" msgstr "Nastavení možností tunelu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:238 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:257 msgid "Length" msgstr "Délka" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:245 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:264 msgid "0 hop tunnel (low anonymity, low latency)" msgstr "" "Tunel s 0 skoky (nízká/žádná anonymita, rychlá odezva) - jen pro spolehlivé " "kámoše kteří se určitě nedostanou do \"potíží\" třeba za sdílení na DC++ či " "používání normálních torrentů." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:249 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268 msgid "1 hop tunnel (medium anonymity, medium latency)" msgstr "" "Tunel s 1 skokem (střední anonymita, středně rychlá odezva) - pro přístup ke " "kámošům vašich spolehlivých kámošů." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:272 msgid "2 hop tunnel (high anonymity, high latency)" msgstr "" "Tunel se 2 skoky (vysoká anonymita, pomalá odezva) - pro kohokoliv koho " "neznáte osobně vy ani vaši kámoši." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:276 msgid "3 hop tunnel (very high anonymity, poor performance)" msgstr "" "Tunel se 3 skoky (velmi vysoká anonymita, velmi pomalé) - pro kohokoliv komu " "naprosto nedůvěřujete ale chcete s ním vyměňovat data." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:284 msgid "hop tunnel (very poor performance)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:279 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:289 msgid "Variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:296 msgid "0 hop variance (no randomisation, consistant performance)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:282 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:300 msgid "" "+ 0-1 hop variance (medium additive randomisation, subtractive performance)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:286 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:304 msgid "" "+ 0-2 hop variance (high additive randomisation, subtractive performance)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:290 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:308 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:294 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:312 msgid "+/- 0-2 hop variance (not recommended)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:306 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:323 msgid "hop variance" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:328 msgid "Count" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:318 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:322 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:339 msgid "" "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard " "reliability)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:343 msgid "" "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:335 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:351 msgid "tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 msgid "Backup Count" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:363 msgid "0 backup tunnels (0 redundancy, no added resource usage)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:351 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:367 msgid "1 backup tunnel each direction (low redundancy, low resource usage)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:355 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371 msgid "" "2 backup tunnels each direction (medium redundancy, medium resource usage)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:359 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375 msgid "3 backup tunnels each direction (high redundancy, high resource usage)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383 msgid "backup tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:375 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:390 msgid "Profile" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:397 msgid "interactive connection" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 msgid "bulk connection (downloads/websites/BT)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393 msgid "Delay Connect" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:392 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397 msgid "for request/response connections" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:405 msgid "Router I2CP Address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:271 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:411 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:259 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431 msgid "Port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 msgid "Reduce tunnel quantity when idle" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:418 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:432 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:462 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:496 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:457 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:487 msgid "Enable" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:491 msgid "Reduced tunnel count" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:451 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 msgid "Idle minutes" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:435 msgid "Close tunnels when idle" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:441 msgid "New Keys on Reopen" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:441 msgid "Disable" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:455 msgid "Delay tunnel open until required" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:465 msgid "Persistent private key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:466 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471 msgid "File" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 msgid "Local destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479 msgid "(if known)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 msgid "Local Authorization" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:500 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504 msgid "Username" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 msgid "Password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:498 msgid "Outproxy Authorization" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:515 msgid "Jump URL List" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 msgid "Custom options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:522 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 -msgid "" -"NOTE: If tunnel is currently running, most changes will not take effect " -"until tunnel is stopped and restarted." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:524 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:678 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:699 msgid "Cancel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:528 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:529 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:539 msgid "Delete" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:530 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:541 msgid "Save" msgstr "Uložit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:82 msgid "I2P Tunnel Manager - Edit Server Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:104 msgid "Edit server settings" msgstr "Změnit nastavení serveru" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112 msgid "New server settings" msgstr "Nové nastavení serveru" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:209 msgid "Website name" msgstr "Jméno webové stránky" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 msgid "(leave blank for outproxies)" msgstr "(nechejte prázdné pro výstupní proxiny)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218 msgid "Private key file" msgstr "Soubor s privátním klíčem" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:240 msgid "Add to local addressbook" msgstr "Přidat do lokální knihy kontaktů (addressbook)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 msgid "Hostname Signature" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 msgid "Encrypt Leaseset" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 msgid "Encryption Key" msgstr "Šifrovací klíč" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 msgid "Generate New Key" msgstr "Vygenerovat nový klíč" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 msgid "Generate" msgstr "Generovat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:437 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 msgid "(Tunnel must be stopped first)" msgstr "(nejdříve je třeba zastavit tunel)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 msgid "Restricted Access List" msgstr "Seznam těch s omezeným přístupem" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:445 msgid "Whitelist" msgstr "Seznam povolených (whitelist)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:449 msgid "Blacklist" msgstr "Seznam zakázaných (blacklist)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 msgid "Access List" msgstr "Seznam přístupů" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:457 msgid "Inbound connection limits (0=unlimited)" msgstr "Limit příchozích spojení (0 = bez omezení)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 msgid "Per client" msgstr "Na klienta" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:461 msgid "Per minute" msgstr "Během minuty" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:465 msgid "Per hour" msgstr "Během hodiny" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:469 msgid "Per day" msgstr "Během dne" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:473 msgid "Total" msgstr "Celkově" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 msgid "Max concurrent connections (0=unlimited)" msgstr "Maximální počet současných spojení (0 = bez omezení)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 msgid "New Certificate type" msgstr "Nový typ certifikátu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:501 msgid "None" msgstr "Žádný" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 msgid "Hashcash (effort)" msgstr "Hashcash (složitost)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:511 msgid "Hashcash Calc Time" msgstr "Doba pro výpočet hashcash" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 msgid "Estimate" msgstr "Předpoklad" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:515 msgid "Hidden" msgstr "Skryté" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 msgid "Signed (signed by)" msgstr "Podepsáno (kým)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 msgid "Modify Certificate" msgstr "Změnit certifikát" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:527 msgid "Modify" msgstr "Změnit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83 msgid "I2P Tunnel Manager - List" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:97 msgid "Status Messages" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:101 msgid "Refresh" msgstr "Obnovit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:92 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103 msgid "Tunnel Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:96 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107 msgid "Stop All" msgstr "Zastavit vše" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:100 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111 msgid "Start All" msgstr "Spustit vše" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:104 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:115 msgid "Restart All" msgstr "Spustit vše znovu (restartovat)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:119 msgid "Reload Config" msgstr "Opětovně načíst nastavení" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:110 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121 msgid "I2P Server Tunnels" msgstr "Tunely I2P serveru" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:135 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:125 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:146 msgid "Points at" msgstr "Ukazuje na" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:158 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:162 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:127 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:172 msgid "Preview" msgstr "Náhled" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:182 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:129 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:312 msgid "Status" msgstr "Stav" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:168 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:178 msgid "Base32 Address" msgstr "Base32 adresa" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:176 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:186 msgid "No Preview" msgstr "Bez náhledu" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:189 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:199 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:319 msgid "Starting..." msgstr "Spouštím" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:196 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:210 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:330 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:206 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354 msgid "Stop" msgstr "Zastaveno" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:347 msgid "Running" msgstr "Běží" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:361 msgid "Stopped" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368 msgid "Start" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:249 msgid "New server tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:204 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:246 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:276 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:282 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:554 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:573 msgid "Standard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411 msgid "Create" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:255 msgid "I2P Client Tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:288 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:263 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:298 msgid "Interface" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333 msgid "Standby" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:368 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:377 msgid "Outproxy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 msgid "none" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:407 msgid "New client tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:102 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:119 msgid "I2P Tunnel Manager - Tunnel Creation Wizard" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:120 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:564 msgid "Server or client tunnel?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:126 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:568 msgid "Tunnel type" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:579 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:151 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:598 msgid "Tunnel name and description" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:138 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:588 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:607 msgid "Tunnel destination" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:144 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:604 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:623 msgid "Binding address and port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:150 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:649 msgid "Tunnel auto-start" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:156 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:175 msgid "Wizard completed" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:170 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:189 msgid "" "This wizard will take you through the various options available for creating " "tunnels in I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:172 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:191 msgid "" "The first thing to decide is whether you want to create a server or a client " "tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:174 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:193 msgid "" "If you need to connect to a remote service, such as an IRC server inside I2P " "or a code repository, then you will require a CLIENT tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:176 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:195 msgid "" "On the other hand, if you wish to host a service for others to connect to " "you'll need to create a SERVER tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:178 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:197 msgid "Server Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:180 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:199 msgid "Client Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:198 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:217 msgid "There are several types of tunnels to choose from:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:206 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:225 msgid "Basic tunnel for connecting to a single service inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:208 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:269 msgid "" "Try this if none of the tunnel types below fit your requirements, or you " "don't know what type of tunnel you need." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:229 msgid "Tunnel that acts as an HTTP proxy for reaching eepsites inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:231 msgid "" "Set your browser to use this tunnel as an http proxy, or set your " "\"http_proxy\" environment variable for command-line applications in GNU/" "Linux." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:233 msgid "" "Websites outside I2P can also be reached if an HTTP proxy within I2P is " "known." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:235 msgid "Customised client tunnel specific for IRC connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:237 msgid "" "With this tunnel type, your IRC client will be able to connect to an IRC " "network inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:239 msgid "" "Each IRC network in I2P that you wish to connect to will require its own " "tunnel. (See Also, SOCKS IRC)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:241 msgid "A tunnel that implements the SOCKS protocol." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:243 msgid "" "This enables both TCP and UDP connections to be made through a SOCKS " "outproxy within I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:245 msgid "" "A client tunnel implementing the SOCKS protocol, which is customised for " "connecting to IRC networks." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:247 msgid "" "With this tunnel type, IRC networks in I2P can be reached by typing the I2P " "address into your IRC client, and configuring the IRC client to use this " "SOCKS tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:249 msgid "" "This means that only one I2P tunnel is required rather than a separate " "tunnel per IRC network." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:251 msgid "" "IRC networks outside I2P can also be reached if a SOCKS outproxy within I2P " "is known, though it depends on whether or not the outproxy has been blocked " "by the IRC network." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:253 msgid "A client tunnel that implements the HTTP CONNECT command." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:255 msgid "" "This enables TCP connections to be made through an HTTP outproxy, assuming " "the proxy supports the CONNECT command." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:238 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:257 msgid "A customised client tunnel for Streamr." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:267 msgid "A basic server tunnel for hosting a generic service inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:271 msgid "A server tunnel that is customised for HTTP connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:273 msgid "Use this tunnel type if you want to host an eepsite." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:275 msgid "" "A customised server tunnel that can both serve HTTP data and connect to " "other server tunnels." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:277 msgid "This tunnel type is predominantly used when running a Seedless server." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:279 msgid "A customised server tunnel for hosting IRC networks inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:281 msgid "" "Usually, a separate tunnel needs to be created for each IRC server that is " "to be accessible inside I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:264 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:283 msgid "A customised server tunnel for Streamr." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:322 msgid "Choose a name and description for your tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:324 msgid "" "These can be anything you want - they are just for ease of identifying the " "tunnel in the routerconsole." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:354 msgid "" "If you know of any outproxies for this type of tunnel (either HTTP or " "SOCKS), fill them in below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:356 msgid "Separate multiple proxies with commas." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:374 msgid "" "Type in the I2P destination of the service that this client tunnel should " "connect to." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:376 msgid "" "This could be the full base 64 destination key, or an I2P URL from your " "address book." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:406 msgid "" "This is the IP that your service is running on, this is usually on the same " "machine so 127.0.0.1 is autofilled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:429 msgid "This is the port that the service is accepting connections on." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:450 msgid "This is the port that the client tunnel will be accessed from locally." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452 msgid "This is also the client port for the HTTPBidir server tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:452 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:471 msgid "" "How do you want this tunnel to be accessed? By just this machine, your " "entire subnet, or external internet?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:454 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:473 msgid "You will most likely want to just allow 127.0.0.1" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:496 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:515 msgid "" "The I2P router can automatically start this tunnel for you when the router " "is started." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:498 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:517 msgid "" "This can be useful for frequently-used tunnels (especially server tunnels), " "but for tunnels that are only used occassionally it would mean that the I2P " "router is creating and maintaining unnecessary tunnels." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543 msgid "The wizard has now collected enough information to create your tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:526 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:545 msgid "" "Upon clicking the Save button below, the wizard will set up the tunnel, and " "take you back to the main I2PTunnel page." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:550 msgid "" "Because you chose to automatically start the tunnel when the router starts, " "you don't have to do anything further." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:533 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:552 msgid "The router will start the tunnel once it has been set up." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:556 msgid "" "Because you chose not to automatically start the tunnel, you will have to " "manually start it." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:558 msgid "" "You can do this by clicking the Start button on the main page which " "corresponds to the new tunnel." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:562 msgid "Below is a summary of the options you chose:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:660 msgid "" "Alongside these basic settings, there are a number of advanced options for " "tunnel configuration." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:643 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:662 msgid "" "The wizard will set reasonably sensible default values for these, but you " "can view and/or edit these by clicking on the tunnel's name in the main " "I2PTunnel page." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:683 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:704 msgid "Previous" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:691 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:712 msgid "Save Tunnel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:697 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:718 msgid "Finish" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:703 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:724 msgid "Next" msgstr "" diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java index c20a89a591e6983cd75456f1c17d0979c839c334..1095a9334ef0cafd1266fecc78e327777d507f7d 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptions.java @@ -17,6 +17,9 @@ public interface I2PSocketOptions { /** * How long we will wait for the ACK from a SYN, in milliseconds. * + * Default 60 seconds. Max of 2 minutes enforced in Connection.java, + * and it also interprets <= 0 as default. + * * @return milliseconds to wait, or -1 if we will wait indefinitely */ public long getConnectTimeout(); @@ -24,6 +27,9 @@ public interface I2PSocketOptions { /** * Define how long we will wait for the ACK from a SYN, in milliseconds. * + * Default 60 seconds. Max of 2 minutes enforced in Connection.java, + * and it also interprets <= 0 as default. + * * @param ms timeout in ms */ public void setConnectTimeout(long ms); @@ -32,6 +38,9 @@ public interface I2PSocketOptions { * What is the longest we'll block on the input stream while waiting * for more data. If this value is exceeded, the read() throws * InterruptedIOException + * + * WARNING: Default -1 (unlimited), which is probably not what you want. + * * @return timeout in ms */ public long getReadTimeout(); @@ -40,6 +49,9 @@ public interface I2PSocketOptions { * What is the longest we'll block on the input stream while waiting * for more data. If this value is exceeded, the read() throws * InterruptedIOException + * + * WARNING: Default -1 (unlimited), which is probably not what you want. + * * @param ms timeout in ms */ public void setReadTimeout(long ms); @@ -50,6 +62,8 @@ public interface I2PSocketOptions { * either some data is removed or the connection is closed. If this is * less than or equal to zero, there is no limit (warning: can eat ram) * + * Default 64 KB + * * @return buffer size limit, in bytes */ public int getMaxBufferSize(); @@ -60,6 +74,8 @@ public interface I2PSocketOptions { * either some data is removed or the connection is closed. If this is * less than or equal to zero, there is no limit (warning: can eat ram) * + * Default 64 KB + * * @param numBytes How much data will we accept that hasn't been written out yet. */ public void setMaxBufferSize(int numBytes); @@ -69,6 +85,9 @@ public interface I2PSocketOptions { * for the data to flush. If this value is exceeded, the write() throws * InterruptedIOException. If this is less than or equal to zero, there * is no timeout. + * + * Default -1 (unlimited) + * * @return wait time to block on the output stream while waiting for the data to flush. */ public long getWriteTimeout(); @@ -78,6 +97,9 @@ public interface I2PSocketOptions { * for the data to flush. If this value is exceeded, the write() throws * InterruptedIOException. If this is less than or equal to zero, there * is no timeout. + * + * Default -1 (unlimited) + * * @param ms wait time to block on the output stream while waiting for the data to flush. */ public void setWriteTimeout(long ms); 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 5d0636676be05648a04f407e6d0c58c0a8a5865a..3a1722dfb31942c1ffa174b71be64894139d843c 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java @@ -96,6 +96,9 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { /** * How long we will wait for the ACK from a SYN, in milliseconds. * + * Default 60 seconds. Max of 2 minutes enforced in Connection.java, + * and it also interprets <= 0 as default. + * * @return milliseconds to wait, or -1 if we will wait indefinitely */ public long getConnectTimeout() { @@ -105,6 +108,9 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { /** * Define how long we will wait for the ACK from a SYN, in milliseconds. * + * Default 60 seconds. Max of 2 minutes enforced in Connection.java, + * and it also interprets <= 0 as default. + * */ public void setConnectTimeout(long ms) { _connectTimeout = ms; @@ -114,6 +120,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { * What is the longest we'll block on the input stream while waiting * for more data. If this value is exceeded, the read() throws * InterruptedIOException + * + * WARNING: Default -1 (unlimited), which is probably not what you want. */ public long getReadTimeout() { return _readTimeout; @@ -123,6 +131,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { * What is the longest we'll block on the input stream while waiting * for more data. If this value is exceeded, the read() throws * InterruptedIOException + * + * WARNING: Default -1 (unlimited), which is probably not what you want. */ public void setReadTimeout(long ms) { _readTimeout = ms; @@ -134,6 +144,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { * either some data is removed or the connection is closed. If this is * less than or equal to zero, there is no limit (warning: can eat ram) * + * Default 64 KB + * * @return buffer size limit, in bytes */ public int getMaxBufferSize() { @@ -146,6 +158,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { * either some data is removed or the connection is closed. If this is * less than or equal to zero, there is no limit (warning: can eat ram) * + * Default 64 KB + * */ public void setMaxBufferSize(int numBytes) { _maxBufferSize = numBytes; @@ -156,6 +170,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { * for the data to flush. If this value is exceeded, the write() throws * InterruptedIOException. If this is less than or equal to zero, there * is no timeout. + * + * Default -1 (unlimited) */ public long getWriteTimeout() { return _writeTimeout; @@ -166,6 +182,8 @@ class I2PSocketOptionsImpl implements I2PSocketOptions { * for the data to flush. If this value is exceeded, the write() throws * InterruptedIOException. If this is less than or equal to zero, there * is no timeout. + * + * Default -1 (unlimited) */ public void setWriteTimeout(long ms) { _writeTimeout = ms; 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 f94f4b9c77287ae366901f13925e9d13c4193875..c3816570157cca83bff05c4b550e5be514f0866a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -218,7 +218,7 @@ public class ConfigClientsHelper extends HelperBase { .append("<a href=\"").append(updateURL).append("\">").append(_("Update link")).append("</a><td> "); } desc.append("</table>"); - boolean enableStop = !Boolean.valueOf(appProps.getProperty("disableStop")).booleanValue(); + boolean enableStop = !Boolean.parseBoolean(appProps.getProperty("disableStop")); enableStop &= PluginStarter.isPluginRunning(app, _context); boolean enableStart = !PluginStarter.isPluginRunning(app, _context); renderForm(buf, app, app, false, diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java index a2298c7f71506c4bd19d78a02acb67e40fadcfd7..cd1f103caf3cc9d109c708681c269301e8b67e76 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java @@ -1,7 +1,5 @@ package net.i2p.router.web; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -13,6 +11,7 @@ import net.i2p.router.transport.TransportImpl; import net.i2p.router.transport.TransportManager; import net.i2p.router.transport.udp.UDPTransport; import net.i2p.router.web.ConfigServiceHandler; +import net.i2p.util.Addresses; /** * Handler to deal with form submissions from the main config form and act @@ -143,6 +142,7 @@ public class ConfigNetHandler extends FormHandler { */ private void saveChanges() { boolean restartRequired = false; + boolean error = false; List<String> removes = new ArrayList(); if (!_ratesOnly) { @@ -166,6 +166,8 @@ public class ConfigNetHandler extends FormHandler { valid = verifyAddress(uhost); if (valid) { changes.put(UDPTransport.PROP_EXTERNAL_HOST, uhost); + } else { + error = true; } } else { removes.add(UDPTransport.PROP_EXTERNAL_HOST); @@ -182,7 +184,7 @@ public class ConfigNetHandler extends FormHandler { String oldNPort = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT, ""); String oldAutoHost = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_IP, "true"); String sAutoPort = _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_AUTO_PORT, "true"); - boolean oldAutoPort = Boolean.valueOf(sAutoPort).booleanValue(); + boolean oldAutoPort = Boolean.parseBoolean(sAutoPort); if (_ntcpHostname == null) _ntcpHostname = ""; if (_ntcpPort == null) _ntcpPort = ""; if (_ntcpAutoIP == null) _ntcpAutoIP = "true"; @@ -195,7 +197,9 @@ public class ConfigNetHandler extends FormHandler { valid = verifyAddress(_ntcpHostname); if (valid) { changes.put(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME, _ntcpHostname); - addFormNotice(_("Updating inbound TCP address to") + " " + _ntcpHostname); + addFormNotice(_("Updating TCP address to {0}", _ntcpHostname)); + } else { + error = true; } } else { removes.add(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME); @@ -212,8 +216,18 @@ public class ConfigNetHandler extends FormHandler { } if (oldAutoPort != _ntcpAutoPort || ! oldNPort.equals(_ntcpPort)) { if (_ntcpPort.length() > 0 && !_ntcpAutoPort) { - changes.put(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort); - addFormNotice(_("Updating inbound TCP port to") + " " + _ntcpPort); + int port = Addresses.getPort(_ntcpPort); + if (port != 0) { + changes.put(ConfigNetHelper.PROP_I2NP_NTCP_PORT, _ntcpPort); + addFormNotice(_("Updating TCP port to {0}", _ntcpPort)); + if (port < 1024) { + addFormError(_("Warning - ports less than 1024 are not recommended")); + error = true; + } + } else { + addFormError(_("Invalid port") + ": " + _ntcpPort); + error = true; + } } else { removes.add(ConfigNetHelper.PROP_I2NP_NTCP_PORT); addFormNotice(_("Updating inbound TCP port to auto")); @@ -226,10 +240,21 @@ public class ConfigNetHandler extends FormHandler { if ( (_udpPort != null) && (_udpPort.length() > 0) ) { String oldPort = _context.getProperty(UDPTransport.PROP_INTERNAL_PORT, "unset"); if (!oldPort.equals(_udpPort)) { - changes.put(UDPTransport.PROP_INTERNAL_PORT, _udpPort); - changes.put(UDPTransport.PROP_EXTERNAL_PORT, _udpPort); - addFormNotice(_("Updating UDP port from") + " " + oldPort + " " + _("to") + " " + _udpPort); - restartRequired = true; + int port = Addresses.getPort(_udpPort); + if (port != 0) { + changes.put(UDPTransport.PROP_INTERNAL_PORT, _udpPort); + changes.put(UDPTransport.PROP_EXTERNAL_PORT, _udpPort); + addFormNotice(_("Updating UDP port to {0}", _udpPort)); + if (port < 1024) { + addFormError(_("Warning - ports less than 1024 are not recommended")); + error = true; + } else { + restartRequired = true; + } + } else { + addFormError(_("Invalid port") + ": " + _udpPort); + error = true; + } } } @@ -251,7 +276,7 @@ public class ConfigNetHandler extends FormHandler { changes.put(Router.PROP_DYNAMIC_KEYS, "" + _dynamicKeys); - if (Boolean.valueOf(_context.getProperty(TransportManager.PROP_ENABLE_UPNP)).booleanValue() != + if (Boolean.parseBoolean(_context.getProperty(TransportManager.PROP_ENABLE_UPNP)) != _upnp) { // This is minor, don't set restartRequired if (_upnp) @@ -261,7 +286,7 @@ public class ConfigNetHandler extends FormHandler { } changes.put(TransportManager.PROP_ENABLE_UPNP, "" + _upnp); - if (Boolean.valueOf(_context.getProperty(UDPTransport.PROP_LAPTOP_MODE)).booleanValue() != + if (Boolean.parseBoolean(_context.getProperty(UDPTransport.PROP_LAPTOP_MODE)) != _laptop) { // This is minor, don't set restartRequired if (_laptop) @@ -302,10 +327,11 @@ public class ConfigNetHandler extends FormHandler { if (ratesUpdated) _context.bandwidthLimiter().reinitialize(); - if (switchRequired) { - hiddenSwitch(); - } else if (restartRequired) { - //if (_context.hasWrapper()) { + if (saved && !error) { + if (switchRequired) { + hiddenSwitch(); + } else if (restartRequired) { + //if (_context.hasWrapper()) { // Wow this dumps all conns immediately and really isn't nice addFormNotice("Performing a soft restart"); _context.router().restart(); @@ -320,12 +346,13 @@ public class ConfigNetHandler extends FormHandler { // So don't do this... //_context.router().rebuildRouterInfo(); //addFormNotice("Router Info rebuilt"); - //} else { + //} else { // There's a few changes that don't really require restart (e.g. enabling inbound TCP) // But it would be hard to get right, so just do a restart. //addFormError(_("Gracefully restarting I2P to change published router address")); //_context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART); - //} + //} + } } } @@ -337,17 +364,15 @@ public class ConfigNetHandler extends FormHandler { private boolean verifyAddress(String addr) { if (addr == null || addr.length() <= 0) return false; - try { - InetAddress ia = InetAddress.getByName(addr); - byte[] iab = ia.getAddress(); - boolean rv = TransportImpl.isPubliclyRoutable(iab); - if (!rv) - addFormError(_("The hostname or IP {0} is not publicly routable", addr)); - return rv; - } catch (UnknownHostException uhe) { - addFormError(_("The hostname or IP {0} is invalid", addr) + ": " + uhe); + byte[] iab = Addresses.getIP(addr); + if (iab == null) { + addFormError(_("Invalid address") + ": " + addr); return false; } + boolean rv = TransportImpl.isPubliclyRoutable(iab); + if (!rv) + addFormError(_("The hostname or IP {0} is not publicly routable", addr)); + return rv; } private void hiddenSwitch() { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java index 6b79c40617f8bb381c00dadfe7d37481fefece23..3419ba2146c125cacb03a170a7e36032bed2bc06 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java @@ -218,6 +218,9 @@ public class ConfigServiceHandler extends FormHandler { } else if (_("Do not view console on startup").equals(_action)) { browseOnStartup(false); addFormNotice(_("Console is not to be shown on startup")); + } else if (_("Force GC").equals(_action)) { + Runtime.getRuntime().gc(); + addFormNotice(_("Full garbage collection requested")); } else { //addFormNotice("Blah blah blah. whatever. I'm not going to " + _action); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java index 8ef110c396564c89989a09682f6b08e3249f5735..07fad31975da21d62aec17baab9a651054686cf4 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java @@ -74,15 +74,14 @@ public class ConfigUpdateHelper extends HelperBase { public String getUpdateThroughProxy() { String proxy = _context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY); - if (Boolean.valueOf(proxy).booleanValue()) + if (Boolean.parseBoolean(proxy)) return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateThroughProxy\" checked=\"checked\" >"; else return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateThroughProxy\" >"; } public String getUpdateUnsigned() { - String foo = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED); - if (Boolean.valueOf(foo).booleanValue()) + if (_context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED)) return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateUnsigned\" checked=\"checked\" >"; else return "<input type=\"checkbox\" class=\"optbox\" value=\"true\" name=\"updateUnsigned\" >"; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java index b56108be389334f60af91d52016b17b6cc3c5d5c..2200b9af6d3f850397f7c7690be567aa5fb2f6f3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java @@ -16,7 +16,7 @@ public class ContentHelper extends HelperBase { */ public void setPage(String page) { _page = page; } public void setStartAtBeginning(String moo) { - _startAtBeginning = Boolean.valueOf(""+moo).booleanValue(); + _startAtBeginning = Boolean.parseBoolean(moo); } public void setLang(String l) { /***** diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index aa6596a2047a5a5d36ef4a772185295e32d40aec..de9d427eeabe0c16803b3e5ee68ba228c33bccef 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -24,12 +24,19 @@ public class LogsHelper extends HelperBase { return Server.getVersion(); } + /** + * Does not call logManager.flush(); call getCriticalLogs() first to flush + */ public String getLogs() { String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages()); return _("File location") + ": <b><code>" + _context.logManager().currentFile() + "</code></b><br><br>" + str; } + /** + * Side effect - calls logManager.flush() + */ public String getCriticalLogs() { + _context.logManager().flush(); return formatMessages(_context.logManager().getBuffer().getMostRecentCriticalMessages()); } @@ -91,6 +98,7 @@ public class LogsHelper extends HelperBase { for (int i = msgs.size() - 1; i >= 0; i--) { String msg = msgs.get(i); msg = msg.replace("&", "&").replace("<", "<").replace(">", ">"); + msg = msg.replace("&darr;", "↓"); // hack - undo the damage (LogWriter) // remove last \n that LogRecordFormatter added if (msg.endsWith(NL)) msg = msg.substring(0, msg.length() - NL.length()); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java index 23210dced01222ecc4c5daecf21c8b9c519a7775..84b5a75ee56227815c51464b1dcd628206e8c12d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java @@ -172,7 +172,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { boolean dontInstall() { File test = new File(_context.getBaseDir(), "history.txt"); boolean readonly = ((test.exists() && !test.canWrite()) || (!_context.getBaseDir().canWrite())); - boolean disabled = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_UPDATE_DISABLED)).booleanValue(); + boolean disabled = _context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_DISABLED); return readonly || disabled; } @@ -220,7 +220,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { public void fetchNews() { String newsURL = ConfigUpdateHelper.getNewsURL(_context); - boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue(); + boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)); String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); int proxyPort = ConfigUpdateHandler.proxyPort(_context); if (_tempFile.exists()) @@ -252,7 +252,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { public boolean shouldFetchUnsigned() { String url = _context.getProperty(ConfigUpdateHandler.PROP_ZIP_URL); return url != null && url.length() > 0 && - Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED)).booleanValue() && + _context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED) && !dontInstall(); } @@ -265,7 +265,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { if (url == null || url.length() <= 0) return; // assume always proxied for now - //boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue(); + //boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)); String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); int proxyPort = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java index 06f2e019ca610c5a5a99156d4c76159870e4166c..60e9dd8c3a3f4f51a283f0c885f817e09a143f2d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java @@ -61,12 +61,12 @@ public class PluginStarter implements Runnable { } static boolean pluginsEnabled(I2PAppContext ctx) { - return Boolean.valueOf(ctx.getProperty("router.enablePlugins", "true")).booleanValue(); + return ctx.getBooleanPropertyDefaultTrue("router.enablePlugins"); } public void run() { if (_context.getBooleanPropertyDefaultTrue("plugins.autoUpdate") && - (!Boolean.valueOf(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS)).booleanValue()) && + (!Boolean.parseBoolean(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS))) && (!RouterVersion.VERSION.equals(_context.getProperty("router.previousVersion")))) updateAll(_context, true); startPlugins(_context); @@ -169,7 +169,7 @@ public class PluginStarter implements Runnable { for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); if (name.startsWith(PREFIX) && name.endsWith(ENABLED)) { - if (Boolean.valueOf(props.getProperty(name)).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty(name))) { String app = name.substring(PREFIX.length(), name.lastIndexOf(ENABLED)); // plugins could have been started after update if (isPluginRunning(app, ctx)) @@ -508,7 +508,7 @@ public class PluginStarter implements Runnable { public static boolean isPluginEnabled(String appName) { Properties props = pluginProperties(); String prop = PREFIX + appName + ENABLED; - return Boolean.valueOf(props.getProperty(prop, "true")).booleanValue(); + return Boolean.parseBoolean(props.getProperty(prop, "true")); } /** @@ -519,7 +519,7 @@ public class PluginStarter implements Runnable { public static void disablePlugin(String appName) { Properties props = pluginProperties(); String prop = PREFIX + appName + ENABLED; - if (Boolean.valueOf(props.getProperty(prop, "true")).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty(prop, "true"))) { props.setProperty(prop, "false"); storePluginProperties(props); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java index 621c0d898bd74559e0c7acfbf3754311aa681bbf..8e895702409bf193107f855d2dac3dc9332ad702 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java @@ -139,7 +139,7 @@ public class PluginUpdateHandler extends UpdateHandler { } else { updateStatus("<b>" + _("Downloading plugin from {0}", _xpi2pURL) + "</b>"); // use the same settings as for updater - boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue(); + boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)); String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); int proxyPort = ConfigUpdateHandler.proxyPort(_context); try { @@ -313,7 +313,7 @@ public class PluginUpdateHandler extends UpdateHandler { boolean wasRunning = false; File destDir = new SecureDirectory(appDir, appName); if (destDir.exists()) { - if (Boolean.valueOf(props.getProperty("install-only")).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty("install-only"))) { to.delete(); statusDone("<b>" + _("Downloaded plugin is for new installs only, but the plugin is already installed", url) + "</b>"); return; @@ -374,7 +374,7 @@ public class PluginUpdateHandler extends UpdateHandler { return; } // do we defer extraction and installation? - if (Boolean.valueOf(props.getProperty("router-restart-required")).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty("router-restart-required"))) { // Yup! try { if(!FileUtil.copy(to, (new SecureFile( new SecureFile(appDir.getCanonicalPath() +"/" + appName +"/"+ ZIP).getCanonicalPath())) , true, true)) { @@ -405,7 +405,7 @@ public class PluginUpdateHandler extends UpdateHandler { } update = true; } else { - if (Boolean.valueOf(props.getProperty("update-only")).booleanValue()) { + if (Boolean.parseBoolean(props.getProperty("update-only"))) { to.delete(); statusDone("<b>" + _("Plugin is for upgrades only, but the plugin is not installed") + "</b>"); return; @@ -426,7 +426,7 @@ public class PluginUpdateHandler extends UpdateHandler { _updated = true; to.delete(); // install != update. Changing the user's settings like this is probabbly a bad idea. - if (Boolean.valueOf( props.getProperty("dont-start-at-install")).booleanValue()) { + if (Boolean.parseBoolean( props.getProperty("dont-start-at-install"))) { statusDone("<b>" + _("Plugin {0} installed", appName) + "</b>"); if(!update) { Properties pluginProps = PluginStarter.pluginProperties(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index cc8a26f14c2c0c077183a7d5dbb96e9ac126b6f9..c520a2bb5635dc943cdafe7d2f86a87f7031ff6e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -120,8 +120,8 @@ public class SummaryHelper extends HelperBase { public boolean allowReseed() { return _context.netDb().isInitialized() && - ((_context.netDb().getKnownRouters() < 30) || - Boolean.valueOf(_context.getProperty("i2p.alwaysAllowReseed")).booleanValue()); + (_context.netDb().getKnownRouters() < 30) || + _context.getBooleanProperty("i2p.alwaysAllowReseed"); } /** subtract one for ourselves, so if we know no other peers it displays zero */ diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java index 1492f3bb1f319f620daf69eb6e7f530f88695e6a..2b87231bb6ccc2d39a20bb279e56c7292b49cc84 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java @@ -169,7 +169,7 @@ public class UpdateHandler { // Alternative: In bytesTransferred(), Check the data in the output file after // we've received at least 56 bytes. Need a cancel() method in EepGet ? - boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue(); + boolean shouldProxy = Boolean.parseBoolean(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)); String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); int proxyPort = ConfigUpdateHandler.proxyPort(_context); diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index 628010685d9f255dcaa3837dbf03d2c629ea35b3..303fa4d31cb370be4a1f332d6129ce00fa585902 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -62,17 +62,21 @@ <h3><%=intl._("Debugging")%></h3> <p><a href="/jobs"><%=intl._("View the job queue")%></a> - <% if (System.getProperty("wrapper.version") != null) { %> +<% if (System.getProperty("wrapper.version") != null) { %> <p><%=intl._("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 <a href=\"logs.jsp#servicelogs\">wrapper.log</a>.")%></p> - <hr><div class="formaction"> - <input type="submit" name="action" value="<%=intl._("Dump threads")%>" > - </div> + <hr> <% } %> + <div class="formaction"> + <input type="submit" class="reload" name="action" value="<%=intl._("Force GC")%>" > +<% if (System.getProperty("wrapper.version") != null) { %> + <input type="submit" class="download" name="action" value="<%=intl._("Dump threads")%>" > +<% } %> + </div> <h3><%=intl._("Launch browser on router startup?")%></h3> <p><%=intl._("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%> <a href="http://127.0.0.1:7657/">http://127.0.0.1:7657/</a> .</p> <hr><div class="formaction"> - <input type="submit" name="action" value="<%=intl._("View console on startup")%>" > - <input type="submit" name="action" value="<%=intl._("Do not view console on startup")%>" > + <input type="submit" class="check" name="action" value="<%=intl._("View console on startup")%>" > + <input type="submit" class="delete" name="action" value="<%=intl._("Do not view console on startup")%>" > </div></form></div></div></body></html> diff --git a/apps/routerconsole/jsp/error500.jsp b/apps/routerconsole/jsp/error500.jsp index 2b420e4f6d13b49d60a7e1abd536068130d98fca..2ffeadff87f4e87ee3c070a0d27b00b1ba52b7a5 100644 --- a/apps/routerconsole/jsp/error500.jsp +++ b/apps/routerconsole/jsp/error500.jsp @@ -1,5 +1,4 @@ <%@page contentType="text/html"%> -<%@page trimDirectiveWhitespaces="true"%> <%@page pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% diff --git a/apps/routerconsole/locale/messages_cs.po b/apps/routerconsole/locale/messages_cs.po index c3e3f1216c3568d4b68e258b3db53a39f6ea2329..78e1d98081a5a7eea74c6792df666443f8bcac80 100644 --- a/apps/routerconsole/locale/messages_cs.po +++ b/apps/routerconsole/locale/messages_cs.po @@ -9,15 +9,15 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-17 11:43+0000\n" -"PO-Revision-Date: 2012-02-17 11:34+0000\n" -"Last-Translator: kytv <killyourtv@i2pmail.org>\n" -"Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n" +"POT-Creation-Date: 2012-09-12 11:58+0000\n" +"PO-Revision-Date: 2012-09-08 21:09+0000\n" +"Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n" +"Language-Team: Czech (http://www.transifex.com/projects/p/I2P/language/cs/)\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... #. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in @@ -27,7 +27,7 @@ msgstr "" #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1361 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1396 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -37,7 +37,7 @@ msgstr[2] "{0,number,####} ms" #. seconds #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1365 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1400 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -47,7 +47,7 @@ msgstr[2] "{0} sek." #. minutes #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1369 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1404 #, java-format msgid "1 min" msgid_plural "{0} min" @@ -57,7 +57,7 @@ msgstr[2] "{0} minut" #. hours #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1373 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1408 #, java-format msgid "1 hour" msgid_plural "{0} hours" @@ -65,13 +65,13 @@ msgstr[0] "{0} hodina" msgstr[1] "{0} hodiny" msgstr[2] "{0} hodin" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1375 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:315 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1410 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:341 msgid "n/a" msgstr "neaplikovatelné" #. days -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1378 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1413 #, java-format msgid "1 day" msgid_plural "{0} days" @@ -79,43 +79,44 @@ msgstr[0] "{0} den" msgstr[1] "{0} dny" msgstr[2] "{0} dnů" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:128 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:127 #, java-format msgid "Banned by router hash: {0}" msgstr "Zakázáno hašišem routeru: {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:130 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:129 msgid "Banned by router hash" msgstr "Zakázáno hašišem routeru" #. Temporary reason, until the job finishes -#: ../../../router/java/src/net/i2p/router/Blocklist.java:679 -#: ../../../router/java/src/net/i2p/router/Blocklist.java:752 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:672 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:745 #, java-format msgid "IP banned by blocklist.txt entry {0}" msgstr "IP adresa zakázána v souboru blocklist.txt, záznam {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:791 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:784 msgid "IPs Banned Until Restart" msgstr "" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:815 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:808 msgid "IPs Permanently Banned" msgstr "" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:817 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:810 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:66 msgid "From" msgstr "" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:819 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:75 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:812 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67 msgid "To" msgstr "" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:855 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:848 #: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:415 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:647 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:451 msgid "none" msgstr "" @@ -123,63 +124,63 @@ msgstr "" #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K")) #. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low"); #. else -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:82 -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:124 -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:526 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:73 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:115 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:517 msgid "Rejecting tunnels: Starting up" msgstr "" -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:168 msgid "Rejecting tunnels: High message delay" msgstr "Odmítám tunely: velké spoždění zprávy" #. hard to do {0} from here #. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests"); -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:216 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:207 msgid "Rejecting most tunnels: High number of requests" msgstr "Odmítám tunely: velké množství požadavků" -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:271 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:262 msgid "Rejecting tunnels: Limit reached" msgstr "Odmítám tunely: limit dosažen" #. .067KBps #. * also limited to 90% - see below #. always leave at least 4KBps free when allowing -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:339 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:330 msgid "Rejecting tunnels: Bandwidth limit" msgstr "Odmítnutí tunelů: limit rychlosti" #. hard to do {0} from here #. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit"); -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:409 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:400 msgid "Rejecting most tunnels: Bandwidth limit" msgstr "Odmítnutí většiny tunelů: limit rychlost" #. hard to do {0} from here #. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels"); -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:413 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:404 msgid "Accepting most tunnels" msgstr "Přijetí většiny tunelů" -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:415 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:406 msgid "Accepting tunnels" msgstr "Přijetí tunelů" -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:531 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:522 msgid "Rejecting tunnels: Shutting down" msgstr "Odmítám tunely: vypínání" -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:536 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:527 msgid "Rejecting tunnels" msgstr "Odmítnutí tunelů" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:155 -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:151 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:22 msgid "Reseeding" msgstr "Opětovné sdílení (reseeding)" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:171 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:163 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." @@ -187,24 +188,24 @@ msgstr[0] "Reseed získán pouze pro 1 router." msgstr[1] "Reseed získán pouze pro {0} routerů." msgstr[2] "Reseed získán pouze pro {0} routerů." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:178 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:170 msgid "Reseed failed." msgstr "Reseed selhal." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:179 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:171 #, java-format msgid "See {0} for help." msgstr "Další informace viz. {0}." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:180 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:172 msgid "reseed configuration page" msgstr "" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:323 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:313 msgid "Reseeding: fetching seed URL." msgstr "" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:373 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:371 #, java-format msgid "" "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." @@ -237,7 +238,7 @@ msgstr "" msgid "Known fast peers" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:526 +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:529 msgid "NetDb entry" msgstr "Záznam NetDB" @@ -246,25 +247,26 @@ msgstr "Záznam NetDB" msgid "No transports (hidden or starting up?)" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:445 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:453 msgid "Unreachable on any transport" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:494 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:502 msgid "Router Transport Addresses" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:507 #, java-format msgid "{0} is used for outbound connections only" -msgstr "" +msgstr "{0} je použito pouze pro odchozí spojení" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:513 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:137 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +#: ../java/src/net/i2p/router/web/HomeHelper.java:32 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:152 msgid "Help" msgstr "Nápověda" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:514 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522 msgid "" "Your transport connection limits are automatically set based on your " "configured bandwidth." @@ -272,7 +274,7 @@ msgstr "" "Vaše limity spojení pro přeneos jsou automaticky nastaveny v závislosti na " "nastavení přenosové rychlosti." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:516 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 msgid "" "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and " "i2np.udp.maxConnections=nnn on the advanced configuration page." @@ -280,270 +282,271 @@ msgstr "" "Pro nastavení těchto limitů přidejte nastavení i2np.ntcp.maxConnections=nnn " "a i2np.udp.maxConnections=nnn na stránce pokročilá nastavení." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:279 msgid "Definitions" msgstr "Definice" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:751 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1976 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:753 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2063 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:91 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 msgid "Peer" msgstr "Sdíleč" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 msgid "The remote peer, identified by router hash" msgstr "Vzdálený sdíleč určený hašišem routru." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:752 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1980 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:754 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067 msgid "Dir" msgstr "Adresář" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 msgid "Inbound connection" msgstr "Příchozí spojení" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 msgid "Outbound connection" msgstr "Odchozí spojení" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 msgid "They offered to introduce us (help other peers traverse our firewall)" msgstr "" "Nabídli nám že nás představí (pomoc ostatním sdílečům překonat náš firewall)." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 msgid "We offered to introduce them (help other peers traverse their firewall)" msgstr "" "Nabídli jsme jim že je představíme (pomoc ostatním sdílečům překonat " "firewall za kterým jsou)." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 msgid "How long since a packet has been received / sent" msgstr "Doba od posledního přijetí / odeslání paketu." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:753 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1981 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:755 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2068 msgid "Idle" msgstr "Nečinný" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:754 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1986 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:756 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2073 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157 msgid "In/Out" msgstr "příchozí/odchozí" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" msgstr "Průměrná příchozí / odchozí přenosová rychlost." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 msgid "How long ago this connection was established" msgstr "Před jak dlouhou dobou bylo toto spojení navázáno" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:755 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1991 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:757 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2078 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:835 msgid "Up" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:756 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1993 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2080 msgid "Skew" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 msgid "The difference between the peer's clock and your own" msgstr "Rozdíl mezi vašim časem a časem sdíleče." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 msgid "" "The congestion window, which is how many bytes can be sent without an " "acknowledgement" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 msgid "The number of sent messages awaiting acknowledgement" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 msgid "The maximum number of concurrent messages to send" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 msgid "The number of pending sends which exceed congestion window" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 msgid "The slow start threshold" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 msgid "The round trip time in milliseconds" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2003 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2090 msgid "Dev" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 msgid "The standard deviation of the round trip time in milliseconds" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 msgid "The retransmit timeout in milliseconds" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 msgid "" "Current maximum send packet size / estimated maximum receive packet size " "(bytes)" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:757 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2010 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:759 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2097 msgid "TX" msgstr "TX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 msgid "The total number of packets sent to the peer" -msgstr "" +msgstr "Celkový počet paketů odeslaných " -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2012 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2099 msgid "RX" msgstr "RX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 msgid "The total number of packets received from the peer" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2015 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102 msgid "Dup TX" msgstr "Dup TX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 msgid "The total number of packets retransmitted to the peer" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2017 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2104 msgid "Dup RX" msgstr "Dup RX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552 msgid "The total number of duplicate packets received from the peer" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:437 -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:448 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Service" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:439 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:450 msgid "WAN Common Interface Configuration" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:440 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:446 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:456 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:461 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:451 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:457 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:467 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:472 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:96 msgid "Status" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:441 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:447 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:457 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:452 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:458 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:468 msgid "Type" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:442 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:448 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:453 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:459 msgid "Upstream" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:443 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:449 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:454 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:460 msgid "Downstream" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:445 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:456 msgid "WAN PPP Connection" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:450 -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:458 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:461 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:469 msgid "External IP" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:452 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:463 msgid "Layer 3 Forwarding" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:453 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:464 msgid "Default Connection Service" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:455 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:466 msgid "WAN IP Connection" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:460 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:471 msgid "WAN Ethernet Link Configuration" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:473 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:484 msgid "Found Device" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:475 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:486 msgid "Subdevice" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:496 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:507 msgid "UPnP Status" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:499 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:510 msgid "" "UPnP has been disabled; Do you have more than one UPnP Internet Gateway " "Device on your LAN ?" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:502 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:513 msgid "UPnP has not found any UPnP-aware, compatible device on your LAN." msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:510 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:521 #, java-format msgid "The current external IP address reported by UPnP is {0}" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:512 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:523 msgid "The current external IP address is not available." msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:516 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:527 #, java-format msgid "UPnP reports the maximum downstream bit rate is {0}bits/sec" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:518 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:529 #, java-format msgid "UPnP reports the maximum upstream bit rate is {0}bits/sec" msgstr "" @@ -551,1396 +554,1473 @@ msgstr "" #. {0} is TCP or UDP #. {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. #. If you want the digit separator in your locale, translate as {1}. -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:527 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:538 #, java-format msgid "{0} port {1,number,#####} was successfully forwarded by UPnP." msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:529 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:540 #, java-format msgid "{0} port {1,number,#####} was not forwarded by UPnP." msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:163 +#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:162 msgid "UPnP is not enabled" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:416 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:633 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:401 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:618 #, java-format msgid "Excessive clock skew: {0}" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:748 msgid "NTCP connections" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:747 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1972 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:749 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2059 msgid "Limit" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:748 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1973 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:750 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2060 msgid "Timeout" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:759 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:761 msgid "Out Queue" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762 msgid "Backlogged?" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:774 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2035 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:776 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2122 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88 msgid "Inbound" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:776 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2037 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:778 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2124 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88 msgid "Outbound" msgstr "" #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:825 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:827 msgid "peers" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1971 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2058 msgid "UDP connections" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1978 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065 msgid "Sort by peer hash" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1980 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067 msgid "Direction/Introduction" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1982 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2069 msgid "Sort by idle inbound" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1984 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2071 msgid "Sort by idle outbound" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1987 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2074 msgid "Sort by inbound rate" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1989 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2076 msgid "Sort by outbound rate" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1992 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2079 msgid "Sort by connection uptime" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1994 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2081 msgid "Sort by clock skew" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1997 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2084 msgid "Sort by congestion window" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1999 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2086 msgid "Sort by slow start threshold" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2002 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2089 msgid "Sort by round trip time" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2004 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2091 msgid "Sort by round trip time deviation" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2006 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2093 msgid "Sort by retransmission timeout" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2009 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2096 msgid "Sort by outbound maximum transmit unit" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2011 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2098 msgid "Sort by packets sent" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2013 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2100 msgid "Sort by packets received" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2016 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103 msgid "Sort by packets retransmitted" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2018 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2105 msgid "Sort by packets received more than once" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2039 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2126 msgid "We offered to introduce them" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2041 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2128 msgid "They offered to introduce us" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2045 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2132 msgid "Choked" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2053 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2140 msgid "1 fail" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2055 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2142 #, java-format msgid "{0} fails" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2061 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 +#. 1 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2148 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171 +#: ../java/src/net/i2p/router/web/ProfilesHelper.java:13 msgid "Banned" msgstr "" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2192 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2278 msgid "SUMMARY" msgstr "" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:159 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:187 msgid "Dropping tunnel requests: Too slow" msgstr "" #. don't even bother, since we are so overloaded locally -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:304 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:330 msgid "Dropping tunnel requests: Overloaded" msgstr "" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:513 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:539 msgid "Rejecting tunnels: Request overload" msgstr "" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:544 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:570 msgid "Rejecting tunnels: Connection limit" msgstr "" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:747 -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:768 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:773 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:794 msgid "Dropping tunnel requests: High load" msgstr "" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:760 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:786 msgid "Dropping tunnel requests: Queue time" msgstr "" -#. geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip -#: ../java/build/Countries.java:8 -msgid " -f3-5 < GeoIPCountryWhois.csv|sed 's/" -msgstr "" - -#. geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip -#. g' > geoip.txt"); -#: ../java/build/Countries.java:9 -msgid " -f5,6 < GeoIPCountryWhois.csv |sed 's/" -msgstr "" - -#. geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip -#. g' > geoip.txt"); -#. g' | sort | uniq > countries.txt"); -#: ../java/build/Countries.java:10 +#. Automatically generated pseudo-java for xgettext - do not edit +#. Translators may wish to translate a few of these, do not bother to translate all of them!! +#: ../java/build/Countries.java:3 msgid "Anonymous Proxy" msgstr "" -#: ../java/build/Countries.java:11 +#: ../java/build/Countries.java:4 msgid "Satellite Provider" msgstr "" -#: ../java/build/Countries.java:12 +#: ../java/build/Countries.java:5 msgid "Andorra" msgstr "" -#: ../java/build/Countries.java:13 +#: ../java/build/Countries.java:6 msgid "United Arab Emirates" msgstr "" -#: ../java/build/Countries.java:14 +#: ../java/build/Countries.java:7 msgid "Afghanistan" msgstr "" -#: ../java/build/Countries.java:15 +#: ../java/build/Countries.java:8 msgid "Antigua and Barbuda" msgstr "" -#: ../java/build/Countries.java:16 +#: ../java/build/Countries.java:9 msgid "Anguilla" msgstr "" -#: ../java/build/Countries.java:17 +#: ../java/build/Countries.java:10 msgid "Albania" msgstr "" -#: ../java/build/Countries.java:18 +#: ../java/build/Countries.java:11 msgid "Armenia" msgstr "" -#: ../java/build/Countries.java:19 +#: ../java/build/Countries.java:12 msgid "Netherlands Antilles" msgstr "" -#: ../java/build/Countries.java:20 +#: ../java/build/Countries.java:13 msgid "Angola" msgstr "" -#: ../java/build/Countries.java:21 +#: ../java/build/Countries.java:14 msgid "Antarctica" msgstr "" -#: ../java/build/Countries.java:22 +#: ../java/build/Countries.java:15 msgid "Argentina" msgstr "" -#: ../java/build/Countries.java:23 +#: ../java/build/Countries.java:16 msgid "American Samoa" msgstr "" -#: ../java/build/Countries.java:24 +#: ../java/build/Countries.java:17 msgid "Austria" msgstr "" -#: ../java/build/Countries.java:25 +#: ../java/build/Countries.java:18 msgid "Australia" msgstr "" -#: ../java/build/Countries.java:26 +#: ../java/build/Countries.java:19 msgid "Aruba" msgstr "" -#: ../java/build/Countries.java:27 +#: ../java/build/Countries.java:20 msgid "Åland Islands" msgstr "" -#: ../java/build/Countries.java:28 +#: ../java/build/Countries.java:21 msgid "Azerbaijan" msgstr "" -#: ../java/build/Countries.java:29 +#: ../java/build/Countries.java:22 msgid "Bosnia and Herzegovina" msgstr "" -#: ../java/build/Countries.java:30 +#: ../java/build/Countries.java:23 msgid "Barbados" msgstr "" -#: ../java/build/Countries.java:31 +#: ../java/build/Countries.java:24 msgid "Bangladesh" msgstr "" -#: ../java/build/Countries.java:32 +#: ../java/build/Countries.java:25 msgid "Belgium" msgstr "" -#: ../java/build/Countries.java:33 +#: ../java/build/Countries.java:26 msgid "Burkina Faso" msgstr "" -#: ../java/build/Countries.java:34 +#: ../java/build/Countries.java:27 msgid "Bulgaria" msgstr "" -#: ../java/build/Countries.java:35 +#: ../java/build/Countries.java:28 msgid "Bahrain" msgstr "" -#: ../java/build/Countries.java:36 +#: ../java/build/Countries.java:29 msgid "Burundi" msgstr "" -#: ../java/build/Countries.java:37 +#: ../java/build/Countries.java:30 msgid "Benin" msgstr "" -#: ../java/build/Countries.java:38 +#: ../java/build/Countries.java:31 msgid "Bermuda" msgstr "" -#: ../java/build/Countries.java:39 +#: ../java/build/Countries.java:32 msgid "Brunei Darussalam" msgstr "" -#: ../java/build/Countries.java:40 +#: ../java/build/Countries.java:33 msgid "Bolivia" msgstr "" -#: ../java/build/Countries.java:41 +#: ../java/build/Countries.java:34 msgid "Brazil" msgstr "" -#: ../java/build/Countries.java:42 +#: ../java/build/Countries.java:35 msgid "Bahamas" msgstr "" -#: ../java/build/Countries.java:43 +#: ../java/build/Countries.java:36 msgid "Bhutan" msgstr "" -#: ../java/build/Countries.java:44 +#: ../java/build/Countries.java:37 msgid "Bouvet Island" msgstr "" -#: ../java/build/Countries.java:45 +#: ../java/build/Countries.java:38 msgid "Botswana" msgstr "" -#: ../java/build/Countries.java:46 +#: ../java/build/Countries.java:39 msgid "Belarus" msgstr "" -#: ../java/build/Countries.java:47 +#: ../java/build/Countries.java:40 msgid "Belize" msgstr "" -#: ../java/build/Countries.java:48 +#: ../java/build/Countries.java:41 msgid "Canada" msgstr "" -#: ../java/build/Countries.java:49 +#: ../java/build/Countries.java:42 msgid "Cocos (Keeling) Islands" msgstr "" -#: ../java/build/Countries.java:50 +#: ../java/build/Countries.java:43 msgid "The Democratic Republic of the Congo" msgstr "" -#: ../java/build/Countries.java:51 +#: ../java/build/Countries.java:44 msgid "Central African Republic" msgstr "" -#: ../java/build/Countries.java:52 +#: ../java/build/Countries.java:45 msgid "Congo" msgstr "" -#: ../java/build/Countries.java:53 +#: ../java/build/Countries.java:46 msgid "Switzerland" msgstr "" -#: ../java/build/Countries.java:54 +#: ../java/build/Countries.java:47 msgid "Cote D'Ivoire" msgstr "" -#: ../java/build/Countries.java:55 +#: ../java/build/Countries.java:48 msgid "Cook Islands" msgstr "" -#: ../java/build/Countries.java:56 +#: ../java/build/Countries.java:49 msgid "Chile" msgstr "" -#: ../java/build/Countries.java:57 +#: ../java/build/Countries.java:50 msgid "Cameroon" msgstr "" -#: ../java/build/Countries.java:58 +#: ../java/build/Countries.java:51 msgid "China" msgstr "" -#: ../java/build/Countries.java:59 +#: ../java/build/Countries.java:52 msgid "Colombia" msgstr "" -#: ../java/build/Countries.java:60 +#: ../java/build/Countries.java:53 msgid "Costa Rica" msgstr "" -#: ../java/build/Countries.java:61 +#: ../java/build/Countries.java:54 msgid "Serbia and Montenegro" msgstr "" -#: ../java/build/Countries.java:62 +#: ../java/build/Countries.java:55 msgid "Cuba" msgstr "" -#: ../java/build/Countries.java:63 +#: ../java/build/Countries.java:56 msgid "Cape Verde" msgstr "" -#: ../java/build/Countries.java:64 +#: ../java/build/Countries.java:57 msgid "Christmas Island" msgstr "" -#: ../java/build/Countries.java:65 +#: ../java/build/Countries.java:58 msgid "Cyprus" msgstr "" -#: ../java/build/Countries.java:66 +#: ../java/build/Countries.java:59 msgid "Czech Republic" msgstr "" -#: ../java/build/Countries.java:67 +#: ../java/build/Countries.java:60 msgid "Germany" msgstr "" -#: ../java/build/Countries.java:68 +#: ../java/build/Countries.java:61 msgid "Djibouti" msgstr "" -#: ../java/build/Countries.java:69 +#: ../java/build/Countries.java:62 msgid "Denmark" msgstr "" -#: ../java/build/Countries.java:70 +#: ../java/build/Countries.java:63 msgid "Dominica" msgstr "" -#: ../java/build/Countries.java:71 +#: ../java/build/Countries.java:64 msgid "Dominican Republic" msgstr "" -#: ../java/build/Countries.java:72 +#: ../java/build/Countries.java:65 msgid "Algeria" msgstr "" -#: ../java/build/Countries.java:73 +#: ../java/build/Countries.java:66 msgid "Ecuador" msgstr "" -#: ../java/build/Countries.java:74 +#: ../java/build/Countries.java:67 msgid "Estonia" msgstr "" -#: ../java/build/Countries.java:75 +#: ../java/build/Countries.java:68 msgid "Egypt" msgstr "" -#: ../java/build/Countries.java:76 +#: ../java/build/Countries.java:69 msgid "Western Sahara" msgstr "" -#: ../java/build/Countries.java:77 +#: ../java/build/Countries.java:70 msgid "Eritrea" msgstr "" -#: ../java/build/Countries.java:78 +#: ../java/build/Countries.java:71 msgid "Spain" msgstr "" -#: ../java/build/Countries.java:79 +#: ../java/build/Countries.java:72 msgid "Ethiopia" msgstr "" -#: ../java/build/Countries.java:80 +#: ../java/build/Countries.java:73 msgid "European Union" msgstr "" -#: ../java/build/Countries.java:81 +#: ../java/build/Countries.java:74 msgid "Finland" msgstr "" -#: ../java/build/Countries.java:82 +#: ../java/build/Countries.java:75 msgid "Fiji" msgstr "" -#: ../java/build/Countries.java:83 +#: ../java/build/Countries.java:76 msgid "Falkland Islands (Malvinas)" msgstr "" -#: ../java/build/Countries.java:84 +#: ../java/build/Countries.java:77 msgid "Federated States of Micronesia" msgstr "" -#: ../java/build/Countries.java:85 +#: ../java/build/Countries.java:78 msgid "Faroe Islands" msgstr "" -#: ../java/build/Countries.java:86 +#: ../java/build/Countries.java:79 msgid "France" msgstr "" -#: ../java/build/Countries.java:87 +#: ../java/build/Countries.java:80 msgid "Gabon" msgstr "" -#: ../java/build/Countries.java:88 +#: ../java/build/Countries.java:81 msgid "United Kingdom" msgstr "" -#: ../java/build/Countries.java:89 +#: ../java/build/Countries.java:82 msgid "Grenada" msgstr "" -#: ../java/build/Countries.java:90 +#: ../java/build/Countries.java:83 msgid "Georgia" msgstr "" -#: ../java/build/Countries.java:91 +#: ../java/build/Countries.java:84 msgid "French Guiana" msgstr "" -#: ../java/build/Countries.java:92 +#: ../java/build/Countries.java:85 msgid "Guernsey" msgstr "" -#: ../java/build/Countries.java:93 +#: ../java/build/Countries.java:86 msgid "Ghana" msgstr "" -#: ../java/build/Countries.java:94 +#: ../java/build/Countries.java:87 msgid "Gibraltar" msgstr "" -#: ../java/build/Countries.java:95 +#: ../java/build/Countries.java:88 msgid "Greenland" msgstr "" -#: ../java/build/Countries.java:96 +#: ../java/build/Countries.java:89 msgid "Gambia" msgstr "" -#: ../java/build/Countries.java:97 +#: ../java/build/Countries.java:90 msgid "Guinea" msgstr "" -#: ../java/build/Countries.java:98 +#: ../java/build/Countries.java:91 msgid "Guadeloupe" msgstr "" -#: ../java/build/Countries.java:99 +#: ../java/build/Countries.java:92 msgid "Equatorial Guinea" msgstr "" -#: ../java/build/Countries.java:100 +#: ../java/build/Countries.java:93 msgid "Greece" msgstr "" -#: ../java/build/Countries.java:101 +#: ../java/build/Countries.java:94 msgid "South Georgia and the South Sandwich Islands" msgstr "" -#: ../java/build/Countries.java:102 +#: ../java/build/Countries.java:95 msgid "Guatemala" msgstr "" -#: ../java/build/Countries.java:103 +#: ../java/build/Countries.java:96 msgid "Guam" msgstr "" -#: ../java/build/Countries.java:104 +#: ../java/build/Countries.java:97 msgid "Guinea-Bissau" msgstr "" -#: ../java/build/Countries.java:105 +#: ../java/build/Countries.java:98 msgid "Guyana" msgstr "" -#: ../java/build/Countries.java:106 +#: ../java/build/Countries.java:99 msgid "Hong Kong" msgstr "" -#: ../java/build/Countries.java:107 +#: ../java/build/Countries.java:100 msgid "Honduras" msgstr "" -#: ../java/build/Countries.java:108 +#: ../java/build/Countries.java:101 msgid "Croatia" msgstr "" -#: ../java/build/Countries.java:109 +#: ../java/build/Countries.java:102 msgid "Haiti" msgstr "" -#: ../java/build/Countries.java:110 +#: ../java/build/Countries.java:103 msgid "Hungary" msgstr "" -#: ../java/build/Countries.java:111 +#: ../java/build/Countries.java:104 msgid "Indonesia" msgstr "" -#: ../java/build/Countries.java:112 +#: ../java/build/Countries.java:105 msgid "Ireland" msgstr "" -#: ../java/build/Countries.java:113 +#: ../java/build/Countries.java:106 msgid "Israel" msgstr "" -#: ../java/build/Countries.java:114 +#: ../java/build/Countries.java:107 msgid "Isle of Man" msgstr "" -#: ../java/build/Countries.java:115 +#: ../java/build/Countries.java:108 msgid "India" msgstr "" -#: ../java/build/Countries.java:116 +#: ../java/build/Countries.java:109 msgid "British Indian Ocean Territory" msgstr "" -#: ../java/build/Countries.java:117 +#: ../java/build/Countries.java:110 msgid "Iraq" msgstr "" -#: ../java/build/Countries.java:118 +#: ../java/build/Countries.java:111 msgid "Islamic Republic of Iran" msgstr "" -#: ../java/build/Countries.java:119 +#: ../java/build/Countries.java:112 msgid "Iceland" msgstr "" -#: ../java/build/Countries.java:120 +#: ../java/build/Countries.java:113 msgid "Italy" msgstr "" -#: ../java/build/Countries.java:121 +#: ../java/build/Countries.java:114 msgid "Jersey" msgstr "" -#: ../java/build/Countries.java:122 +#: ../java/build/Countries.java:115 msgid "Jamaica" msgstr "" -#: ../java/build/Countries.java:123 +#: ../java/build/Countries.java:116 msgid "Jordan" msgstr "" -#: ../java/build/Countries.java:124 +#: ../java/build/Countries.java:117 msgid "Japan" msgstr "" -#: ../java/build/Countries.java:125 +#: ../java/build/Countries.java:118 msgid "Kenya" msgstr "" -#: ../java/build/Countries.java:126 +#: ../java/build/Countries.java:119 msgid "Kyrgyzstan" msgstr "" -#: ../java/build/Countries.java:127 +#: ../java/build/Countries.java:120 msgid "Cambodia" msgstr "" -#: ../java/build/Countries.java:128 +#: ../java/build/Countries.java:121 msgid "Kiribati" msgstr "" -#: ../java/build/Countries.java:129 +#: ../java/build/Countries.java:122 msgid "Comoros" msgstr "" -#: ../java/build/Countries.java:130 +#: ../java/build/Countries.java:123 msgid "Saint Kitts and Nevis" msgstr "" -#: ../java/build/Countries.java:131 +#: ../java/build/Countries.java:124 msgid "The Democratic People's Republic of Korea" msgstr "" -#: ../java/build/Countries.java:132 +#: ../java/build/Countries.java:125 msgid "Republic of Korea" msgstr "" -#: ../java/build/Countries.java:133 +#: ../java/build/Countries.java:126 msgid "Kuwait" msgstr "" -#: ../java/build/Countries.java:134 +#: ../java/build/Countries.java:127 msgid "Cayman Islands" msgstr "" -#: ../java/build/Countries.java:135 +#: ../java/build/Countries.java:128 msgid "Kazakhstan" msgstr "" -#: ../java/build/Countries.java:136 +#: ../java/build/Countries.java:129 msgid "Lao People's Democratic Republic" msgstr "" -#: ../java/build/Countries.java:137 +#: ../java/build/Countries.java:130 msgid "Lebanon" msgstr "" -#: ../java/build/Countries.java:138 +#: ../java/build/Countries.java:131 msgid "Saint Lucia" msgstr "" -#: ../java/build/Countries.java:139 +#: ../java/build/Countries.java:132 msgid "Liechtenstein" msgstr "" -#: ../java/build/Countries.java:140 +#: ../java/build/Countries.java:133 msgid "Sri Lanka" msgstr "" -#: ../java/build/Countries.java:141 +#: ../java/build/Countries.java:134 msgid "Liberia" msgstr "" -#: ../java/build/Countries.java:142 +#: ../java/build/Countries.java:135 msgid "Lesotho" msgstr "" -#: ../java/build/Countries.java:143 +#: ../java/build/Countries.java:136 msgid "Lithuania" msgstr "" -#: ../java/build/Countries.java:144 +#: ../java/build/Countries.java:137 msgid "Luxembourg" msgstr "" -#: ../java/build/Countries.java:145 +#: ../java/build/Countries.java:138 msgid "Latvia" msgstr "" -#: ../java/build/Countries.java:146 +#: ../java/build/Countries.java:139 msgid "Libyan Arab Jamahiriya" msgstr "" -#: ../java/build/Countries.java:147 +#: ../java/build/Countries.java:140 msgid "Morocco" msgstr "" -#: ../java/build/Countries.java:148 +#: ../java/build/Countries.java:141 msgid "Monaco" msgstr "" -#: ../java/build/Countries.java:149 +#: ../java/build/Countries.java:142 msgid "Republic of Moldova" msgstr "" -#: ../java/build/Countries.java:150 +#: ../java/build/Countries.java:143 msgid "Montenegro" msgstr "" -#: ../java/build/Countries.java:151 +#: ../java/build/Countries.java:144 msgid "Saint Martin" msgstr "" -#: ../java/build/Countries.java:152 +#: ../java/build/Countries.java:145 msgid "Madagascar" msgstr "" -#: ../java/build/Countries.java:153 +#: ../java/build/Countries.java:146 msgid "Marshall Islands" msgstr "" -#: ../java/build/Countries.java:154 +#: ../java/build/Countries.java:147 msgid "The Former Yugoslav Republic of Macedonia" msgstr "" -#: ../java/build/Countries.java:155 +#: ../java/build/Countries.java:148 msgid "Mali" msgstr "" -#: ../java/build/Countries.java:156 +#: ../java/build/Countries.java:149 msgid "Myanmar" msgstr "" -#: ../java/build/Countries.java:157 +#: ../java/build/Countries.java:150 msgid "Mongolia" msgstr "" -#: ../java/build/Countries.java:158 +#: ../java/build/Countries.java:151 msgid "Macao" msgstr "" -#: ../java/build/Countries.java:159 +#: ../java/build/Countries.java:152 msgid "Northern Mariana Islands" msgstr "" -#: ../java/build/Countries.java:160 +#: ../java/build/Countries.java:153 msgid "Martinique" msgstr "" -#: ../java/build/Countries.java:161 +#: ../java/build/Countries.java:154 msgid "Mauritania" msgstr "" -#: ../java/build/Countries.java:162 +#: ../java/build/Countries.java:155 msgid "Montserrat" msgstr "" -#: ../java/build/Countries.java:163 +#: ../java/build/Countries.java:156 msgid "Malta" msgstr "" -#: ../java/build/Countries.java:164 +#: ../java/build/Countries.java:157 msgid "Mauritius" msgstr "" -#: ../java/build/Countries.java:165 +#: ../java/build/Countries.java:158 msgid "Maldives" msgstr "" -#: ../java/build/Countries.java:166 +#: ../java/build/Countries.java:159 msgid "Malawi" msgstr "" -#: ../java/build/Countries.java:167 +#: ../java/build/Countries.java:160 msgid "Mexico" msgstr "" -#: ../java/build/Countries.java:168 +#: ../java/build/Countries.java:161 msgid "Malaysia" msgstr "" -#: ../java/build/Countries.java:169 +#: ../java/build/Countries.java:162 msgid "Mozambique" msgstr "" -#: ../java/build/Countries.java:170 +#: ../java/build/Countries.java:163 msgid "Namibia" msgstr "" -#: ../java/build/Countries.java:171 +#: ../java/build/Countries.java:164 msgid "New Caledonia" msgstr "" -#: ../java/build/Countries.java:172 +#: ../java/build/Countries.java:165 msgid "Niger" msgstr "" -#: ../java/build/Countries.java:173 +#: ../java/build/Countries.java:166 msgid "Norfolk Island" msgstr "" -#: ../java/build/Countries.java:174 +#: ../java/build/Countries.java:167 msgid "Nigeria" msgstr "" -#: ../java/build/Countries.java:175 +#: ../java/build/Countries.java:168 msgid "Nicaragua" msgstr "" -#: ../java/build/Countries.java:176 +#: ../java/build/Countries.java:169 msgid "Netherlands" msgstr "" -#: ../java/build/Countries.java:177 +#: ../java/build/Countries.java:170 msgid "Norway" msgstr "" -#: ../java/build/Countries.java:178 +#: ../java/build/Countries.java:171 msgid "Nepal" msgstr "" -#: ../java/build/Countries.java:179 +#: ../java/build/Countries.java:172 msgid "Nauru" msgstr "" -#: ../java/build/Countries.java:180 +#: ../java/build/Countries.java:173 msgid "Niue" msgstr "" -#: ../java/build/Countries.java:181 +#: ../java/build/Countries.java:174 msgid "New Zealand" msgstr "" -#: ../java/build/Countries.java:182 +#: ../java/build/Countries.java:175 msgid "Oman" msgstr "" -#: ../java/build/Countries.java:183 +#: ../java/build/Countries.java:176 msgid "Panama" msgstr "" -#: ../java/build/Countries.java:184 +#: ../java/build/Countries.java:177 msgid "Peru" msgstr "" -#: ../java/build/Countries.java:185 +#: ../java/build/Countries.java:178 msgid "French Polynesia" msgstr "" -#: ../java/build/Countries.java:186 +#: ../java/build/Countries.java:179 msgid "Papua New Guinea" msgstr "" -#: ../java/build/Countries.java:187 +#: ../java/build/Countries.java:180 msgid "Philippines" msgstr "" -#: ../java/build/Countries.java:188 +#: ../java/build/Countries.java:181 msgid "Pakistan" msgstr "" -#: ../java/build/Countries.java:189 +#: ../java/build/Countries.java:182 msgid "Poland" msgstr "" -#: ../java/build/Countries.java:190 +#: ../java/build/Countries.java:183 msgid "Saint Pierre and Miquelon" msgstr "" -#: ../java/build/Countries.java:191 +#: ../java/build/Countries.java:184 msgid "Pitcairn Islands" msgstr "" -#: ../java/build/Countries.java:192 +#: ../java/build/Countries.java:185 msgid "Puerto Rico" msgstr "" -#: ../java/build/Countries.java:193 +#: ../java/build/Countries.java:186 msgid "Palestinian Territory" msgstr "" -#: ../java/build/Countries.java:194 +#: ../java/build/Countries.java:187 msgid "Portugal" msgstr "" -#: ../java/build/Countries.java:195 +#: ../java/build/Countries.java:188 msgid "Palau" msgstr "" -#: ../java/build/Countries.java:196 +#: ../java/build/Countries.java:189 msgid "Paraguay" msgstr "" -#: ../java/build/Countries.java:197 +#: ../java/build/Countries.java:190 msgid "Qatar" msgstr "" -#: ../java/build/Countries.java:198 +#: ../java/build/Countries.java:191 msgid "Réunion" msgstr "" -#: ../java/build/Countries.java:199 +#: ../java/build/Countries.java:192 msgid "Romania" msgstr "" -#: ../java/build/Countries.java:200 +#: ../java/build/Countries.java:193 msgid "Serbia" msgstr "" -#: ../java/build/Countries.java:201 +#: ../java/build/Countries.java:194 msgid "Russian Federation" msgstr "" -#: ../java/build/Countries.java:202 +#: ../java/build/Countries.java:195 msgid "Rwanda" msgstr "" -#: ../java/build/Countries.java:203 +#: ../java/build/Countries.java:196 msgid "Saudi Arabia" msgstr "" -#: ../java/build/Countries.java:204 +#: ../java/build/Countries.java:197 msgid "Solomon Islands" msgstr "" -#: ../java/build/Countries.java:205 +#: ../java/build/Countries.java:198 msgid "Seychelles" msgstr "" -#: ../java/build/Countries.java:206 +#: ../java/build/Countries.java:199 msgid "Sudan" msgstr "" -#: ../java/build/Countries.java:207 +#: ../java/build/Countries.java:200 msgid "Sweden" msgstr "" -#: ../java/build/Countries.java:208 +#: ../java/build/Countries.java:201 msgid "Singapore" msgstr "" -#: ../java/build/Countries.java:209 +#: ../java/build/Countries.java:202 msgid "Saint Helena" msgstr "" -#: ../java/build/Countries.java:210 +#: ../java/build/Countries.java:203 msgid "Slovenia" msgstr "" -#: ../java/build/Countries.java:211 +#: ../java/build/Countries.java:204 msgid "Svalbard and Jan Mayen" msgstr "" -#: ../java/build/Countries.java:212 +#: ../java/build/Countries.java:205 msgid "Slovakia" msgstr "" -#: ../java/build/Countries.java:213 +#: ../java/build/Countries.java:206 msgid "Sierra Leone" msgstr "" -#: ../java/build/Countries.java:214 +#: ../java/build/Countries.java:207 msgid "San Marino" msgstr "" -#: ../java/build/Countries.java:215 +#: ../java/build/Countries.java:208 msgid "Senegal" msgstr "" -#: ../java/build/Countries.java:216 +#: ../java/build/Countries.java:209 msgid "Somalia" msgstr "" -#: ../java/build/Countries.java:217 +#: ../java/build/Countries.java:210 msgid "Suriname" msgstr "" -#: ../java/build/Countries.java:218 +#: ../java/build/Countries.java:211 msgid "Sao Tome and Principe" msgstr "" -#: ../java/build/Countries.java:219 +#: ../java/build/Countries.java:212 msgid "El Salvador" msgstr "" -#: ../java/build/Countries.java:220 +#: ../java/build/Countries.java:213 msgid "Syrian Arab Republic" msgstr "" -#: ../java/build/Countries.java:221 +#: ../java/build/Countries.java:214 msgid "Swaziland" msgstr "" -#: ../java/build/Countries.java:222 +#: ../java/build/Countries.java:215 msgid "Turks and Caicos Islands" msgstr "" -#: ../java/build/Countries.java:223 +#: ../java/build/Countries.java:216 msgid "Chad" msgstr "" -#: ../java/build/Countries.java:224 +#: ../java/build/Countries.java:217 msgid "French Southern Territories" msgstr "" -#: ../java/build/Countries.java:225 +#: ../java/build/Countries.java:218 msgid "Togo" msgstr "" -#: ../java/build/Countries.java:226 +#: ../java/build/Countries.java:219 msgid "Thailand" msgstr "" -#: ../java/build/Countries.java:227 +#: ../java/build/Countries.java:220 msgid "Tajikistan" msgstr "" -#: ../java/build/Countries.java:228 +#: ../java/build/Countries.java:221 msgid "Tokelau" msgstr "" -#: ../java/build/Countries.java:229 +#: ../java/build/Countries.java:222 msgid "Timor-Leste" msgstr "" -#: ../java/build/Countries.java:230 +#: ../java/build/Countries.java:223 msgid "Turkmenistan" msgstr "" -#: ../java/build/Countries.java:231 +#: ../java/build/Countries.java:224 msgid "Tunisia" msgstr "" -#: ../java/build/Countries.java:232 +#: ../java/build/Countries.java:225 msgid "Tonga" msgstr "" -#: ../java/build/Countries.java:233 +#: ../java/build/Countries.java:226 msgid "Turkey" msgstr "" -#: ../java/build/Countries.java:234 +#: ../java/build/Countries.java:227 msgid "Trinidad and Tobago" msgstr "" -#: ../java/build/Countries.java:235 +#: ../java/build/Countries.java:228 msgid "Tuvalu" msgstr "" -#: ../java/build/Countries.java:236 +#: ../java/build/Countries.java:229 msgid "Taiwan" msgstr "" -#: ../java/build/Countries.java:237 +#: ../java/build/Countries.java:230 msgid "United Republic of Tanzania" msgstr "" -#: ../java/build/Countries.java:238 +#: ../java/build/Countries.java:231 msgid "Ukraine" msgstr "" -#: ../java/build/Countries.java:239 +#: ../java/build/Countries.java:232 msgid "Uganda" msgstr "" -#: ../java/build/Countries.java:240 +#: ../java/build/Countries.java:233 msgid "United States Minor Outlying Islands" msgstr "" -#: ../java/build/Countries.java:241 +#: ../java/build/Countries.java:234 msgid "United States" msgstr "" -#: ../java/build/Countries.java:242 +#: ../java/build/Countries.java:235 msgid "Uruguay" msgstr "" -#: ../java/build/Countries.java:243 +#: ../java/build/Countries.java:236 msgid "Uzbekistan" msgstr "" -#: ../java/build/Countries.java:244 +#: ../java/build/Countries.java:237 msgid "Holy See (Vatican City State)" msgstr "" -#: ../java/build/Countries.java:245 +#: ../java/build/Countries.java:238 msgid "Saint Vincent and the Grenadines" msgstr "" -#: ../java/build/Countries.java:246 +#: ../java/build/Countries.java:239 msgid "Venezuela" msgstr "" -#: ../java/build/Countries.java:247 ../java/build/Countries.java:248 +#: ../java/build/Countries.java:240 ../java/build/Countries.java:241 msgid "Virgin Islands" msgstr "" -#: ../java/build/Countries.java:249 +#: ../java/build/Countries.java:242 msgid "Viet Nam" msgstr "" -#: ../java/build/Countries.java:250 +#: ../java/build/Countries.java:243 msgid "Vanuatu" msgstr "" -#: ../java/build/Countries.java:251 +#: ../java/build/Countries.java:244 msgid "Wallis and Futuna" msgstr "" -#: ../java/build/Countries.java:252 +#: ../java/build/Countries.java:245 msgid "Samoa" msgstr "" -#: ../java/build/Countries.java:253 +#: ../java/build/Countries.java:246 msgid "Yemen" msgstr "" -#: ../java/build/Countries.java:254 +#: ../java/build/Countries.java:247 msgid "Mayotte" msgstr "" -#: ../java/build/Countries.java:255 +#: ../java/build/Countries.java:248 msgid "South Africa" msgstr "" -#: ../java/build/Countries.java:256 +#: ../java/build/Countries.java:249 msgid "Zambia" msgstr "" -#: ../java/build/Countries.java:257 +#: ../java/build/Countries.java:250 msgid "Zimbabwe" msgstr "" -#: ../java/src/net/i2p/router/web/CSSHelper.java:75 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:39 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41 +#: ../java/src/net/i2p/router/web/CSSHelper.java:118 +#: ../java/src/net/i2p/router/web/HomeHelper.java:33 #: ../java/strings/Strings.java:29 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:133 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:265 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:205 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:205 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:205 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:210 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:205 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:203 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:205 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:225 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:195 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:207 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:209 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:211 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:213 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:204 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:222 msgid "I2P Router Console" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:52 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:51 msgid "Error updating the configuration - please see the error logs" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:62 -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:306 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:297 msgid "Configuration saved successfully" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:64 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:421 -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:308 -#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:91 +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:63 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:427 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:299 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:96 msgid "" "Error saving the configuration (applied but not saved) - please see the " "error logs" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:36 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:364 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:437 msgid "Save Client Configuration" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:40 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:434 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:438 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:507 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:511 msgid "Save Interface Configuration" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:44 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:454 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:527 msgid "Save WebApp Configuration" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:48 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:468 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:541 msgid "Save Plugin Configuration" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:52 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:476 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:480 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:553 msgid "Install Plugin" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:56 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:482 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:55 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:555 msgid "Update All Installed Plugins" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:92 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:95 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 #, java-format -msgid "Deleted plugin {0}" +msgid "Error stopping plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:94 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:100 #, java-format -msgid "Error deleting plugin {0}" +msgid "Deleted plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:114 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:102 #, java-format -msgid "Stopped plugin {0}" +msgid "Error deleting plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:116 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:122 #, java-format -msgid "Error stopping plugin {0}" +msgid "Stopped plugin {0}" msgstr "" #. label (IE) -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:146 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:264 msgid "Start" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:157 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:165 +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:106 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 -#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:37 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:35 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:143 msgid "Unsupported" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:203 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:211 msgid "New client added" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:215 msgid "" "Client configuration saved successfully - restart required to take effect." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:222 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:246 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:230 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:243 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:254 msgid "Bad client index." msgstr "" #. #. What do we do here? #. -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:229 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:237 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:248 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:259 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:103 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:362 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:389 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:508 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:425 msgid "Client" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:229 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:237 msgid "stopped" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:299 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:248 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:305 msgid "started" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:259 msgid "deleted" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:275 msgid "WebApp configuration saved." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:290 msgid "Plugin configuration saved." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:299 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:305 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:130 msgid "WebApp" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:301 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 msgid "Failed to start" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:312 msgid "Failed to find server." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:312 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:318 msgid "No plugin URL specified." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:322 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:328 #, java-format msgid "No update URL specified for {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:331 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:344 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:349 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:362 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:367 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:337 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:350 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:355 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:368 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:373 msgid "Plugin or update download already in progress." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:340 msgid "Updating all plugins" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:353 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:126 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:359 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:140 #, java-format msgid "Downloading plugin from {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:371 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:377 #, java-format msgid "Checking plugin {0} for updates" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:381 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:387 #, java-format msgid "Started plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:383 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:389 #, java-format msgid "Error starting plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:419 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:425 msgid "" "Interface configuration saved successfully - restart required to take effect." msgstr "" @@ -1951,7 +2031,7 @@ msgid "Edit" msgstr "" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 msgid "Add Client" msgstr "" @@ -1982,8 +2062,9 @@ msgid "Plugin" msgstr "" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:167 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:191 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:290 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:319 msgid "Version" msgstr "" @@ -2004,7 +2085,8 @@ msgid "License" msgstr "" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:213 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81 +#: ../java/src/net/i2p/router/web/HomeHelper.java:35 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174 msgid "Website" msgstr "" @@ -2018,12 +2100,12 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:271 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:381 msgid "Check for updates" msgstr "" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:272 -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Update" msgstr "" @@ -2036,13 +2118,75 @@ msgstr "" msgid "Delete" msgstr "" +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:25 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:26 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:855 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:455 +msgid "Delete selected" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:26 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:27 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:874 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:437 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:453 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:461 +msgid "Add item" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:27 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:459 +msgid "Restore defaults" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:28 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:30 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:405 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:439 +msgid "Save" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:33 +msgid "Home page changed" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:53 +msgid "Restored default settings" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:65 +msgid "No name entered" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:70 +msgid "No URL entered" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:83 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:85 +msgid "Added" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigHomeHandler.java:100 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:111 +msgid "Removed" +msgstr "" + #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:425 msgid "Add key" msgstr "" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:423 msgid "Delete key" msgstr "" @@ -2084,7 +2228,7 @@ msgstr "" msgid "Log overrides updated" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160 +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:161 msgid "Log configuration saved" msgstr "" @@ -2107,7 +2251,7 @@ msgstr "" #. http://www.dhs.gov/xinfoshare/programs/Copy_of_press_release_0046.shtm #. but pink instead of yellow for WARN #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 -#: ../java/src/net/i2p/router/web/LogsHelper.java:103 +#: ../java/src/net/i2p/router/web/LogsHelper.java:106 msgid "CRIT" msgstr "" @@ -2116,21 +2260,23 @@ msgid "DEBUG" msgstr "" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 -#: ../java/src/net/i2p/router/web/LogsHelper.java:105 +#: ../java/src/net/i2p/router/web/LogsHelper.java:108 msgid "ERROR" msgstr "" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 -#: ../java/src/net/i2p/router/web/LogsHelper.java:109 +#: ../java/src/net/i2p/router/web/LogsHelper.java:112 msgid "INFO" msgstr "" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 -#: ../java/src/net/i2p/router/web/LogsHelper.java:107 +#: ../java/src/net/i2p/router/web/LogsHelper.java:110 msgid "WARN" msgstr "" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88 +#: ../java/src/net/i2p/router/web/HomeHelper.java:192 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:809 msgid "Remove" msgstr "" @@ -2145,15 +2291,56 @@ msgid "Bandwidth" msgstr "" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:210 +msgid "Home Page" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343 msgid "Network" msgstr "" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:351 -#: ../java/strings/Strings.java:72 -msgid "Tunnels" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:288 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:289 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:282 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:295 +msgid "Summary Bar" msgstr "" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 @@ -2161,161 +2348,168 @@ msgid "UI" msgstr "" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:196 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:491 +#: ../java/strings/Strings.java:72 +msgid "Tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21 msgid "Clients" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:397 msgid "Keyring" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21 msgid "Logging" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:225 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:377 #: ../java/strings/Strings.java:67 msgid "Peers" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:388 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:410 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 msgid "Stats" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:21 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:22 msgid "Advanced" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:58 -#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:54 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:31 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:388 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:334 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:368 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:472 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:409 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:406 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:482 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:444 msgid "Save changes" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:141 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:136 msgid "Rechecking router reachability..." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:174 msgid "Updating IP address" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:198 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193 msgid "Disabling TCP completely" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:203 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:198 msgid "Updating inbound TCP address to" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:208 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:203 msgid "Disabling inbound TCP" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:210 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 msgid "Updating inbound TCP address to auto" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:216 msgid "Updating inbound TCP port to" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:224 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:219 msgid "Updating inbound TCP port to auto" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:236 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:231 msgid "Updating UDP port from" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:236 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:231 msgid "to" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:252 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:247 msgid "Gracefully restarting into Hidden Router Mode" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:254 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:249 msgid "Gracefully restarting to exit Hidden Router Mode" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:263 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:258 msgid "Enabling UPnP, restart required to take effect" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:265 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:260 msgid "Disabling UPnP, restart required to take effect" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:273 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268 msgid "Enabling laptop mode" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:275 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:270 msgid "Disabling laptop mode" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:282 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:277 msgid "Disabling UDP" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:284 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:279 msgid "Enabling UDP" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:286 msgid "Requiring SSU introducers" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:354 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:345 #, java-format msgid "The hostname or IP {0} is not publicly routable" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:357 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:348 #, java-format msgid "The hostname or IP {0} is invalid" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:383 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:374 msgid "Updating bandwidth share percentage" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:413 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:404 msgid "Updated bandwidth limits" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:38 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:46 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:56 #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62 msgid "unknown" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:182 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:171 msgid "bits per second" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:183 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172 #, java-format msgid "or {0} bytes per month maximum" msgstr "" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:415 msgid "Ban peer until restart" msgstr "" @@ -2335,7 +2529,7 @@ msgid "Invalid peer" msgstr "" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:417 msgid "Unban peer" msgstr "" @@ -2348,7 +2542,7 @@ msgid "is not currently banned" msgstr "" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:443 msgid "Adjust peer bonuses" msgstr "" @@ -2361,27 +2555,27 @@ msgid "Bad capacity value" msgstr "" #: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:480 msgid "Save changes and reseed now" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:25 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 msgid "Reseeding is already in progress" msgstr "" #. skip the nonce checking in ReseedHandler -#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:28 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:27 msgid "Starting reseed process" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:89 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:94 msgid "Configuration saved successfully." msgstr "" #. Normal browsers send value, IE sends button label #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:34 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:174 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:393 msgid "Shutdown immediately" msgstr "" @@ -2402,7 +2596,7 @@ msgstr "" #. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns #. give the UI time to respond #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:47 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:134 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:142 msgid "Restart" msgstr "" @@ -2429,7 +2623,7 @@ msgid "Restart in {0}" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:169 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:391 msgid "Shutdown gracefully" msgstr "" @@ -2442,7 +2636,7 @@ msgid "Shutdown immediately! boom bye bye bad bwoy" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:179 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:395 msgid "Cancel graceful shutdown" msgstr "" @@ -2451,7 +2645,7 @@ msgid "Graceful shutdown cancelled" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:182 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:407 msgid "Graceful restart" msgstr "" @@ -2460,7 +2654,7 @@ msgid "Graceful restart requested" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:188 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:409 msgid "Hard restart" msgstr "" @@ -2485,51 +2679,56 @@ msgid "Rekeying after graceful shutdown" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:202 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:435 msgid "Run I2P on startup" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:204 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:437 msgid "Don't run I2P on startup" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:206 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:382 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:455 msgid "Dump threads" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:213 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:390 +#, java-format +msgid "Threads dumped to {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:463 msgid "View console on startup" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:215 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:216 msgid "Console is to be shown on startup" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:392 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:465 msgid "Do not view console on startup" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:218 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:219 msgid "Console is not to be shown on startup" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:227 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:228 msgid "Service installed" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:229 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:230 msgid "Warning: unable to install the service" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:236 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:237 msgid "Service removed" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:238 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:239 msgid "Warning: unable to remove the service" msgstr "" @@ -2551,6 +2750,69 @@ msgid "" "href=\"graphs.jsp\">Graphs Page</a>" msgstr "" +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:28 +msgid "Save order" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:35 +msgid "Refresh interval changed" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:37 +#, java-format +msgid "Refresh interval must be at least {0} seconds" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:39 +msgid "Refresh interval must be a number" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:42 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:417 +msgid "Restore full default" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:44 +msgid "Full summary bar default restored." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:45 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:49 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:141 +msgid "Summary bar will refresh shortly." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:46 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:419 +msgid "Restore minimal default" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:48 +msgid "Minimal summary bar default restored." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:65 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:87 +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:135 +msgid "Order must be an integer" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:72 +msgid "No section selected" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:77 +msgid "No order entered" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:133 +msgid "Moved" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigSummaryHandler.java:140 +msgid "Saved order of sections." +msgstr "" + #. the count isn't really correct anyway, since we don't check for actual changes #. addFormNotice("Updated settings for " + updated + " pools."); #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:136 @@ -2562,7 +2824,7 @@ msgid "Exploratory tunnel configuration saved successfully." msgstr "" #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:143 -#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:37 +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:51 msgid "" "Error saving the configuration (applied but not saved) - please see the " "error logs." @@ -2586,7 +2848,7 @@ msgstr[1] "" msgstr[2] "" #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:43 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:35 msgid "Exploratory tunnels" msgstr "" @@ -2640,83 +2902,95 @@ msgstr "" msgid "Outbound options" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:32 +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:46 msgid "Theme change saved." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:34 +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:48 msgid "Refresh the page to view." msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:62 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:25 +msgid "Set theme universally across all apps" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:69 msgid "Arabic" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:62 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:69 msgid "Czech" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:62 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:69 msgid "Danish" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70 msgid "English" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70 msgid "Estonian" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70 msgid "Finnish" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70 msgid "German" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:63 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70 +msgid "Greek" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:70 msgid "Spanish" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71 msgid "Dutch" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71 msgid "French" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71 +msgid "Hungarian" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71 msgid "Italian" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:64 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:71 msgid "Polish" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:65 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:72 msgid "Portuguese" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:65 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:72 msgid "Russian" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:65 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:72 msgid "Swedish" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:66 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:73 msgid "Chinese" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:66 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:73 msgid "Ukrainian" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:66 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:73 msgid "Vietnamese" msgstr "" @@ -2761,7 +3035,7 @@ msgstr "" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:151 #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:112 -#: ../java/src/net/i2p/router/web/GraphHelper.java:190 +#: ../java/src/net/i2p/router/web/GraphHelper.java:361 msgid "Never" msgstr "" @@ -2805,278 +3079,558 @@ msgid "" "button on your browser. Please resubmit." msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:117 +#: ../java/src/net/i2p/router/web/GraphHelper.java:159 msgid "Combined bandwidth graph" msgstr "" #. e.g. "statname for 60m" -#: ../java/src/net/i2p/router/web/GraphHelper.java:130 +#: ../java/src/net/i2p/router/web/GraphHelper.java:172 +#: ../java/src/net/i2p/router/web/GraphHelper.java:221 #, java-format msgid "{0} for {1}" msgstr "" -#. FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java -#: ../java/src/net/i2p/router/web/GraphHelper.java:152 -msgid "All times are UTC." +#: ../java/src/net/i2p/router/web/GraphHelper.java:223 +#, java-format +msgid "ending {0} ago" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:169 -msgid "Configure Graph Display" +#: ../java/src/net/i2p/router/web/GraphHelper.java:238 +msgid "Larger" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:169 -msgid "Select Stats" +#: ../java/src/net/i2p/router/web/GraphHelper.java:244 +msgid "Smaller" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:173 -msgid "Periods" +#: ../java/src/net/i2p/router/web/GraphHelper.java:250 +msgid "Taller" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:174 -msgid "Plot averages" +#: ../java/src/net/i2p/router/web/GraphHelper.java:256 +msgid "Shorter" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:175 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:367 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360 -msgid "or" +#: ../java/src/net/i2p/router/web/GraphHelper.java:262 +msgid "Wider" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:175 +#: ../java/src/net/i2p/router/web/GraphHelper.java:268 +msgid "Narrower" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:275 +msgid "Larger interval" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:281 +msgid "Smaller interval" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:288 +msgid "Previous interval" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:299 +msgid "Next interval" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:305 +#: ../java/src/net/i2p/router/web/GraphHelper.java:345 +msgid "Plot averages" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:305 +#: ../java/src/net/i2p/router/web/GraphHelper.java:346 msgid "plot events" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:176 +#: ../java/src/net/i2p/router/web/GraphHelper.java:308 +msgid "All times are UTC." +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:340 +msgid "Configure Graph Display" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:340 +msgid "Select Stats" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:344 +msgid "Periods" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:440 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:433 +msgid "or" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:347 msgid "Image sizes" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:176 +#: ../java/src/net/i2p/router/web/GraphHelper.java:347 msgid "width" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:177 +#: ../java/src/net/i2p/router/web/GraphHelper.java:348 msgid "height" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:177 -#: ../java/src/net/i2p/router/web/GraphHelper.java:178 +#: ../java/src/net/i2p/router/web/GraphHelper.java:348 +#: ../java/src/net/i2p/router/web/GraphHelper.java:349 msgid "pixels" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:179 +#: ../java/src/net/i2p/router/web/GraphHelper.java:350 msgid "Refresh delay" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:194 +#: ../java/src/net/i2p/router/web/GraphHelper.java:365 msgid "Store graph data on disk?" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:200 +#: ../java/src/net/i2p/router/web/GraphHelper.java:371 msgid "Save settings and redraw graphs" msgstr "" -#: ../java/src/net/i2p/router/web/GraphHelper.java:255 +#: ../java/src/net/i2p/router/web/GraphHelper.java:426 msgid "Graph settings saved" msgstr "" -#: ../java/src/net/i2p/router/web/LogsHelper.java:35 -#: ../java/src/net/i2p/router/web/LogsHelper.java:69 +#: ../java/src/net/i2p/router/web/HomeHelper.java:27 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:252 +msgid "Addressbook" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:27 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:250 +msgid "Manage your I2P hosts file here (I2P domain name resolution)" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:28 +msgid "Configure Bandwidth" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:28 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:314 +msgid "I2P Bandwidth Configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:29 +msgid "Configure Language" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:29 +msgid "Console Language Selection" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:30 +msgid "Customize Home Page" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:30 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:330 +msgid "I2P Home Page Configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:31 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:160 +msgid "Anonymous webmail client" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:31 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:162 +msgid "Email" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:32 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +msgid "I2P Router Help" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:33 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:146 +msgid "Router Console" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:34 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 +msgid "Built-in anonymous BitTorrent Client" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:34 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:168 +msgid "Torrents" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:35 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:172 +msgid "Local web server" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:39 +msgid "Bug Reports" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:39 +msgid "Bug tracker" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:40 +msgid "The Italian Bittorrent Resource" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:41 +msgid "Dev Forum" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:41 +msgid "Development forum" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:42 +#: ../java/src/net/i2p/router/web/HomeHelper.java:54 +msgid "Bittorrent tracker" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:42 +msgid "diftracker" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:43 +msgid "I2P Applications" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:44 +msgid "FAQ" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:44 +msgid "Frequently Asked Questions" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:45 +msgid "Community forum" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:45 +msgid "Forum" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:46 +msgid "" +"A public anonymous Git hosting site - supports pulling via Git and HTTP and " +"pushing via SSH" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:46 +msgid "Anonymous Git Hosting" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:47 +msgid "Microblog" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:47 +msgid "Your premier microblogging service on I2P" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:48 +msgid "Javadocs" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:48 +#: ../java/src/net/i2p/router/web/HomeHelper.java:57 +msgid "Technical documentation" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:50 +msgid "Debian and Tahoe-LAFS repositories" +msgstr "" + +#. _x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S + I + "education.png" + S + +#: ../java/src/net/i2p/router/web/HomeHelper.java:50 +msgid "killyourtv.i2p" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:51 +msgid "I2P Pastebin" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:51 +msgid "Pastebin" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:52 +msgid "I2P News" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:53 +msgid "Add-on directory" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:53 +msgid "Plugins" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:54 +msgid "Postman's Tracker" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:55 +msgid "I2P home page" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:55 +msgid "Project Website" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:56 +msgid "I2P Network Statistics" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:57 +msgid "Technical Docs" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:58 +msgid "Trac Wiki" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:59 +msgid "Ugha's Wiki" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:60 +msgid "Seedless and the Robert BitTorrent applications" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:60 +msgid "Sponge's main site" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:101 +msgid "The HTTP proxy is not up" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:103 +#, java-format +msgid "Your browser is not properly configured to use the HTTP proxy at {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:194 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:811 +msgid "Name" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:196 +msgid "URL" +msgstr "" + +#: ../java/src/net/i2p/router/web/HomeHelper.java:214 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:857 +msgid "Add" +msgstr "" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:29 +#: ../java/src/net/i2p/router/web/LogsHelper.java:72 msgid "File location" msgstr "" -#: ../java/src/net/i2p/router/web/LogsHelper.java:66 +#: ../java/src/net/i2p/router/web/LogsHelper.java:69 msgid "File not found" msgstr "" -#: ../java/src/net/i2p/router/web/LogsHelper.java:84 +#: ../java/src/net/i2p/router/web/LogsHelper.java:87 msgid "No log messages" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:79 -msgid "Network Database RouterInfo Lookup" +#: ../java/src/net/i2p/router/web/NetDbHelper.java:19 +msgid "Summary" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94 -#: ../java/strings/Strings.java:68 -msgid "Router" +#. 0 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:20 +msgid "Local Router" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94 -msgid "not found in network database" +#. 1 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:21 +msgid "Router Lookup" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 -msgid "Network Database Contents" +#. 2 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:22 +msgid "All Routers" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 -msgid "View RouterInfo" +#. 3 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:23 +msgid "All Routers with Full Stats" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 +#. 4 +#. 5 +#: ../java/src/net/i2p/router/web/NetDbHelper.java:25 msgid "LeaseSets" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92 +#: ../java/strings/Strings.java:68 +msgid "Router" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92 +msgid "not found in network database" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 msgid "LeaseSet" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:137 msgid "Local" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:139 msgid "Unpublished" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:142 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:140 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:147 msgid "Destination" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:157 #, java-format msgid "Expires in {0}" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:154 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:159 #, java-format msgid "Expired {0} ago" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:174 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157 msgid "Gateway" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:174 msgid "Lease" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:176 msgid "Tunnel" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 -msgid "View LeaseSets" -msgstr "" - -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:232 msgid "Not initialized" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226 -msgid "Routers" -msgstr "" - -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228 -msgid "Show all routers" -msgstr "" - -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230 -msgid "Show all routers with full stats" -msgstr "" - -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:283 msgid "Network Database Router Statistics" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:290 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:304 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:322 msgid "Count" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:304 msgid "Transports" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:322 msgid "Country" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:367 msgid "Our info" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:369 msgid "Peer info for" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:371 msgid "Full entry" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:119 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:557 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:152 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:630 msgid "Hidden" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 msgid "Updated" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:379 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:382 #, java-format msgid "{0} ago" msgstr "" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:381 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:385 msgid "Published" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 msgid "Address(es)" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:400 msgid "cost" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425 msgid "Hidden or starting up" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425 msgid "SSU" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:425 msgid "SSU with introducers" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426 msgid "NTCP" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426 msgid "NTCP and SSU" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:426 msgid "NTCP and SSU with introducers" msgstr "" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:133 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:131 #, java-format msgid "News last updated {0} ago." msgstr "" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:139 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:137 #, java-format msgid "News last checked {0} ago." msgstr "" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:148 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:146 msgid "Hide news" msgstr "" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:151 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:149 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:642 msgid "Show news" msgstr "" @@ -3096,184 +3650,200 @@ msgstr[2] "" msgid "Plugin update check complete" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:85 +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:81 #, java-format msgid "Cannot check, plugin {0} is not installed" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:155 +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:151 #, java-format msgid "Checking for update of plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:185 +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:181 #, java-format msgid "New plugin version {0} is available" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:188 +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:184 #, java-format msgid "No new version is available for plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:198 +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:194 #, java-format msgid "Update check failed for plugin {0}" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:147 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:125 +#, java-format +msgid "Attempting to install from file {0}" +msgstr "" + +#. This is actually what String.isEmpty() does, so it should be safe. +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:129 +#, java-format +msgid "No file specified {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:136 +#, java-format +msgid "Failed to install from file {0}, copy failed." +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:162 msgid "Downloading plugin" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:154 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:244 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:169 #, java-format msgid "{0}B transferred" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:161 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 msgid "Plugin downloaded" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:182 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:415 #, java-format msgid "Cannot create plugin directory {0}" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:175 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:297 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:191 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:302 #, java-format msgid "from {0}" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:185 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 #, java-format msgid "Plugin from {0} is corrupt" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:196 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:212 #, java-format msgid "Plugin from {0} does not contain the required configuration file" msgstr "" #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:209 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 #, java-format msgid "Plugin from {0} contains an invalid key" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:233 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:243 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:259 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273 #, java-format msgid "Plugin signature verification of {0} failed" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:272 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:288 #, java-format msgid "Plugin from {0} has invalid name or version" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 #, java-format msgid "Plugin {0} has mismatched versions" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301 #, java-format msgid "This plugin requires I2P version {0} or higher" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:309 #, java-format msgid "This plugin requires Java version {0} or higher" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:302 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:318 msgid "" "Downloaded plugin is for new installs only, but the plugin is already " "installed" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:314 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:329 msgid "Installed plugin does not contain the required configuration file" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:337 msgid "Signature of downloaded plugin does not match installed plugin" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:329 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:336 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:343 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:358 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:366 #, java-format msgid "Plugin requires Jetty version {0} or higher" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:358 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 #, java-format msgid "Plugin requires Jetty version {0} or lower" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:377 -msgid "Plugin is for upgrades only, but the plugin is not installed" +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382 +#, java-format +msgid "Cannot copy plugin to directory {0}" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:390 -#, java-format -msgid "Failed to install plugin in {0}" +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:392 +msgid "Plugin will be installed on next restart." msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:398 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:410 +msgid "Plugin is for upgrades only, but the plugin is not installed" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:423 #, java-format -msgid "Plugin {0} installed, router restart required" +msgid "Failed to install plugin in {0}" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:400 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:427 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:430 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:458 #, java-format msgid "Plugin {0} installed" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:418 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:449 #, java-format msgid "Plugin {0} installed and started" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:421 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:452 #, java-format msgid "Plugin {0} installed but failed to start, check logs" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:423 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:454 #, java-format msgid "Plugin {0} installed but failed to start" msgstr "" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:435 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:466 #, java-format msgid "Failed to download plugin from {0}" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72 -msgid "Peer Profiles" -msgstr "" - -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 +#. buf.append("<h2>").append(_("Peer Profiles")).append("</h2>\n<p>"); +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 #, java-format msgid "Showing 1 recent profile." msgid_plural "Showing {0} recent profiles." @@ -3281,7 +3851,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 #, java-format msgid "Hiding 1 older profile." msgid_plural "Hiding {0} older profiles." @@ -3289,7 +3859,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:87 #, java-format msgid "Hiding 1 standard profile." msgid_plural "Hiding {0} standard profiles." @@ -3297,194 +3867,205 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:92 msgid "Groups (Caps)" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:362 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:93 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:435 msgid "Speed" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:94 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:275 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:439 msgid "Capacity" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:95 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:277 msgid "Integration" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:135 msgid "Fast, High Capacity" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:136 +#: ../java/src/net/i2p/router/web/ProfilesHelper.java:11 msgid "High Capacity" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:137 msgid "Standard" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:138 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:172 msgid "Failing" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:252 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:140 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:416 msgid "Integrated" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:173 msgid "Unreachable" msgstr "" #. hide if < 10% -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:180 msgid "Test Fails" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177 -msgid "profile" -msgstr "" - #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186 -msgid "Floodfill and Integrated Peers" +msgid "profile" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:205 msgid "Caps" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:206 msgid "Integ. Value" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:207 msgid "Last Heard About" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:208 msgid "Last Heard From" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:209 msgid "Last Good Send" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:210 msgid "Last Bad Send" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:211 msgid "10m Resp. Time" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:212 msgid "1h Resp. Time" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:213 msgid "1d Resp. Time" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:214 msgid "Last Good Lookup" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:215 msgid "Last Bad Lookup" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:216 msgid "Last Good Store" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:217 msgid "Last Bad Store" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:218 msgid "1h Fail Rate" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:205 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:219 msgid "1d Fail Rate" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:272 msgid "Thresholds" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:274 msgid "fast peers" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:276 msgid "high capacity peers" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:278 msgid " well integrated peers" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280 msgid "as determined by the profile organizer" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:280 msgid "groups" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281 msgid "capabilities in the netDb, not used to determine profiles" msgstr "" #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:281 #: ../java/strings/Strings.java:81 msgid "caps" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:282 msgid "" "peak throughput (bytes per second) over a 1 minute period that the peer has " "sustained in a single tunnel" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:282 msgid "speed" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:283 msgid "capacity" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:283 msgid "how many tunnels can we ask them to join in an hour?" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:284 msgid "how many new peers have they told us about lately?" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:284 msgid "integration" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:265 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:285 msgid "is the peer banned, or unreachable, or failing tunnel tests?" msgstr "" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:265 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:285 msgid "status" msgstr "" +#. 0 +#: ../java/src/net/i2p/router/web/ProfilesHelper.java:12 +msgid "Floodfill " +msgstr "" + +#. 2 +#: ../java/src/net/i2p/router/web/ProfilesHelper.java:14 +msgid "All" +msgstr "" + +#: ../java/src/net/i2p/router/web/SearchHelper.java:74 +msgid "Select search engine" +msgstr "" + #: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64 #, java-format msgid "Temporary ban expiring in {0}" @@ -3499,37 +4080,37 @@ msgstr "" msgid "unban now" msgstr "" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:303 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:313 msgid "Bandwidth usage" msgstr "" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:313 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:323 msgid "Outbound Bytes/sec" msgstr "" #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3); -#: ../java/src/net/i2p/router/web/StatSummarizer.java:315 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:325 msgid "Inbound Bytes/sec" msgstr "" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:318 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:319 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:320 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:321 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:328 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:329 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:330 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:331 msgid "Bps" msgstr "" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:318 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:328 msgid "Out average" msgstr "" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:319 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:321 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:142 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:329 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:331 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:150 msgid "max" msgstr "" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:320 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:330 msgid "In average" msgstr "" @@ -3585,7 +4166,7 @@ msgid "Lifetime average frequency" msgstr "" #: ../java/src/net/i2p/router/web/StatsGenerator.java:144 -#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:233 #, java-format msgid "1 event" msgid_plural "{0} events" @@ -3622,355 +4203,398 @@ msgstr "" msgid "No events" msgstr "" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:210 msgid "Average event count" msgstr "" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:212 msgid "Events in peak period" msgstr "" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:220 msgid "Graph Data" msgstr "" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:222 msgid "Graph Event Count" msgstr "" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:225 msgid "Export Data as XML" msgstr "" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:230 msgid "Lifetime average value" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:45 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:142 msgid "I2P Router Help & FAQ" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:47 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:144 msgid "Help & FAQ" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:59 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:152 msgid "" "Configure startup of clients and webapps (services); manually start dormant " "services" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:61 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:154 msgid "I2P Services" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:67 -msgid "Anonymous webmail client" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69 -msgid "Email" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:73 -msgid "Built-in anonymous BitTorrent Client" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75 -msgid "Torrents" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:79 -msgid "Local web server" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:89 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:186 msgid "Configure I2P Router" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:188 msgid "I2P Internals" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:97 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:194 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:489 msgid "View existing tunnels and tunnel build status" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:103 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:223 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:200 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:375 msgid "Show all current peer connections" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:109 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:206 msgid "Show recent peer performance profiles" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:208 msgid "Profiles" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:115 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:212 msgid "Show list of all known I2P routers" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:214 msgid "NetDB" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:121 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:218 msgid "Health Report" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:220 msgid "Logs" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:134 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 msgid "Graph router performance" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:136 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233 msgid "Graphs" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:238 msgid "Textual router performance statistics" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:375 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:244 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:411 msgid "Local Destinations" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:246 #: ../java/strings/Strings.java:62 msgid "I2PTunnel" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:153 -msgid "Manage your I2P hosts file here (I2P domain name resolution)" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:155 -msgid "Addressbook" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:268 +msgid "General" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:170 -msgid "I2P Router Help" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:273 +msgid "" +"Your Local Identity is your unique I2P router identity, similar to an ip " +"address but tailored to I2P. " msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:172 -msgid "General" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:274 +msgid "Never disclose this to anyone, as it can reveal your real world ip." msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:177 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276 msgid "Local Identity" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:280 msgid "Your unique I2P router identity is" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:284 msgid "never reveal it to anyone" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:187 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:286 msgid "show" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:290 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:316 +msgid "The version of the I2P software we are running" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:300 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:326 msgid "How long we've been running for this session" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:201 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:329 msgid "Uptime" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:208 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:341 msgid "" "Help with configuring your firewall and router for optimal I2P performance" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:356 +msgid "Configure I2P Updates" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:358 +msgid "I2P Update" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:383 +msgid "Peers we've been talking to in the last few minutes/last hour" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 msgid "Active" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:395 +msgid "The number of peers available for building client tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398 msgid "Fast" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:246 -msgid "High capacity" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404 +msgid "The number of peers available for building exploratory tunnels" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 -msgid "Known" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:407 +msgid "High capacity" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:273 -msgid "Help with firewall configuration" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:413 +msgid "The number of peers available for network database inquiries" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 -msgid "Check network connection and NAT/firewall" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422 +msgid "The total number of peers in our network database" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:295 -msgid "Reseed" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:425 +msgid "Known" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:312 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:445 msgid "Configure router bandwidth allocation" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:314 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:447 msgid "Bandwidth in/out" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:334 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:467 msgid "Total" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:341 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:474 msgid "Used" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:356 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:496 +msgid "" +"Used for building and testing tunnels, and communicating with floodfill peers" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:499 msgid "Exploratory" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:368 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:505 +msgid "Tunnels we are using to provide or access services on the network" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:514 +msgid "" +"Tunnels we are participating in, directly contributing bandwith to the " +"network" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:517 msgid "Participating" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:374 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:523 +msgid "" +"The ratio of tunnel hops we provide to tunnel hops we use - a value greater " +"than 1.00 indicates a positive contribution to the network" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:526 msgid "Share ratio" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:380 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:539 msgid "What's in the router's job queue?" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:382 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:541 msgid "Congestion" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:387 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:546 +msgid "Indicates router performance" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:549 msgid "Job lag" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:393 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:555 +msgid "Indicates how quickly outbound messages to other I2P routers are sent" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:558 msgid "Message delay" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:400 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:565 +msgid "Round trip time for a tunnel test" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:568 msgid "Tunnel lag" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:407 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:575 +msgid "Queued requests from other routers to participate in tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:578 msgid "Backlog" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:110 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:613 +msgid "News & Updates" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:143 msgid "ERR-Client Manager I2CP Error - check logs" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:117 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:150 #, java-format msgid "ERR-Clock Skew of {0}" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:126 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:533 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:155 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:188 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:626 +msgid "Testing" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:162 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:606 msgid "OK" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:127 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:163 msgid "ERR-Private TCP Address" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:129 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:165 msgid "ERR-SymmetricNAT" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:132 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:168 msgid "WARN-Firewalled with Inbound TCP Enabled" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:134 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:170 msgid "WARN-Firewalled and Floodfill" msgstr "" #. if (_context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0) #. return _("WARN-Firewalled and Fast"); -#: ../java/src/net/i2p/router/web/SummaryHelper.java:137 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:537 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:173 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:610 msgid "Firewalled" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:139 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:175 msgid "" "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and " "restart" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:145 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:181 msgid "ERR-No Active Peers, Check Network Connection and Firewall" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:148 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:184 msgid "ERR-UDP Disabled and Inbound TCP host/port not set" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:150 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:186 msgid "WARN-Firewalled with UDP Disabled" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:152 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:553 -msgid "Testing" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryHelper.java:375 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:411 msgid "Add/remove/edit & control your client and server tunnels" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:387 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:423 msgid "Server" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:391 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:427 msgid "Show tunnels" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:402 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:438 msgid "Leases expired" msgstr "" #. red or yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:402 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:403 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:438 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:439 msgid "Rebuilding" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:403 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:439 msgid "ago" msgstr "" #. green light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:406 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:442 msgid "Ready" msgstr "" #. yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:446 msgid "Building" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:446 msgid "Building tunnels" msgstr "" @@ -3978,13 +4602,13 @@ msgstr "" #. nicely under 'local destinations' in the summary bar #. note that if the wording changes in i2ptunnel.config, we have to #. keep the old string here as well for existing installs -#: ../java/src/net/i2p/router/web/SummaryHelper.java:426 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:462 #: ../java/strings/Strings.java:36 msgid "shared clients" msgstr "" #. Note to translators: parameter is a version, e.g. "0.8.4" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:640 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:676 #, java-format msgid "Download {0} Update" msgstr "" @@ -3992,147 +4616,178 @@ msgstr "" #. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" #. <br> is optional, to help the browser make the lines even in the button #. If the translation is shorter than the English, you should probably not include <br> -#: ../java/src/net/i2p/router/web/SummaryHelper.java:648 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:684 #, java-format msgid "Download Unsigned<br>Update {0}" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:110 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:709 +msgid "Help with firewall configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:711 +msgid "Check network connection and NAT/firewall" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:730 +msgid "Reseed" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:813 +msgid "Order" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:830 +msgid "Top" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:843 +msgid "Down" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:848 +msgid "Bottom" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:860 +msgid "Select a section to add" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:118 #, java-format msgid "events in {0}" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:112 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:120 #, java-format msgid "averaged for {0}" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:122 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:130 msgid "Events per period" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:141 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:149 msgid "avg" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:143 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:151 msgid "now" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:43 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:323 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:35 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:57 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:398 msgid "configure" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:55 msgid "Client tunnels for" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:59 msgid "dead" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 msgid "Participating tunnels" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:66 msgid "Receive on" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:75 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67 msgid "Expiration" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:75 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:67 msgid "Send on" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:76 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:68 msgid "Rate" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:76 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:68 msgid "Role" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:76 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:68 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157 msgid "Usage" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:114 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:106 msgid "grace period" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:124 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:116 msgid "Outbound Endpoint" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:118 msgid "Inbound Gateway" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:128 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:170 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:120 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:163 msgid "Participant" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:133 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:125 #, java-format msgid "Limited display to the {0} tunnels with the highest usage" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:134 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126 msgid "Inactive participating tunnels" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:135 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:226 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:219 msgid "Lifetime bandwidth usage" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:164 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:157 msgid "Expiry" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:167 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:160 msgid "Participants" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:173 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:166 msgid "Endpoint" msgstr "" +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:206 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:213 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220 msgid "Build in progress" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:213 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:206 msgid "inbound" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:213 msgid "outbound" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:225 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:218 msgid "No tunnels; waiting for the grace period to end." msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:227 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220 msgid "in" msgstr "" -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:228 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:221 msgid "out" msgstr "" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:143 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:146 msgid "Updating" msgstr "" @@ -4140,8 +4795,8 @@ msgstr "" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:261 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:285 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:266 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:290 msgid "Update downloaded" msgstr "" @@ -4151,22 +4806,22 @@ msgid "Unsigned update file from {0} is corrupt" msgstr "" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:280 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:285 msgid "Restarting" msgstr "" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:287 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:292 msgid "Click Restart to install" msgstr "" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:289 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:294 msgid "Click Shutdown and restart to install" msgstr "" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:291 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:296 #, java-format msgid "Version {0}" msgstr "" @@ -4176,27 +4831,33 @@ msgstr "" msgid "Failed copy to {0}" msgstr "" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:184 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:187 #, java-format msgid "Updating from {0}" msgstr "" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:253 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:243 +#, java-format +msgid "{0} downloaded" +msgstr "" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:258 #, java-format msgid "No new version found at {0}" msgstr "" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:280 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:285 msgid "Update verified" msgstr "" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:306 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:311 #, java-format msgid "Transfer failed from {0}" msgstr "" #. wars for ConfigClientsHelper #: ../java/strings/Strings.java:12 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:154 msgid "addressbook" msgstr "" @@ -4421,314 +5082,335 @@ msgstr "" msgid "itag2" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:137 msgid "configure bandwidth" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:232 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:245 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:232 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:269 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:239 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:230 -msgid "Summary Bar" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:140 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:144 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:151 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:164 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:160 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:144 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:144 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:144 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:144 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:144 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:141 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:141 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:144 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:157 +msgid "Router is down" msgstr "" #. We have intl defined when this is included, but not when compiled standalone. -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:245 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:258 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:245 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:244 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:255 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:282 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:252 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:288 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:308 msgid "Refresh (s)" msgstr "" #. ditto -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:249 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:262 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:249 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:259 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:286 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:256 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:254 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:312 msgid "Enable" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:270 -msgid "I2P Bandwidth Configuration" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:355 msgid "Bandwidth limiter" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357 msgid "" "I2P will work best if you configure your rates to match the speed of your " "internet connection." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 msgid "KBps In" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 msgid "KBps Out" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:390 msgid "Share" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:368 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:336 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:408 msgid "NOTE" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 #, java-format msgid "You have configured I2P to share only {0} KBps." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:373 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:402 msgid "I2P requires at least 12KBps to enable sharing. " msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:374 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 msgid "" "Please enable sharing (participating in tunnels) by configuring more " "bandwidth. " msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:404 msgid "" "It improves your anonymity by creating cover traffic, and helps the network." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:406 #, java-format msgid "You have configured I2P to share {0} KBps." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 msgid "" "The higher the share bandwidth the more you improve your anonymity and help " "the network." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 msgid "Advanced network configuration page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:386 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:332 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:356 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:436 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:452 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:466 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:478 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:348 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:366 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:470 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:405 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:404 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:369 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:509 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:551 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:457 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:393 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:442 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:437 msgid "Cancel" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:121 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:137 msgid "config advanced" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:271 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:314 msgid "I2P Advanced Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:355 msgid "Advanced I2P Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:365 msgid "Some changes may require a restart to take effect." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:139 msgid "config clients" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:346 msgid "I2P Client Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:412 msgid "Client Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:414 msgid "" "The Java clients listed below are started by the router and run in the same " "JVM." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:420 msgid "To change other client options, edit the file" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:354 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:432 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:450 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:505 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:523 msgid "All changes require restart to take effect." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439 msgid "Advanced Client Interface Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:443 msgid "External I2CP (I2P Client Protocol) Interface Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:449 msgid "Enabled without SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:382 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455 msgid "Enabled with SSL required" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461 msgid "Disabled - Clients outside this Java process may not connect" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:390 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:463 msgid "I2CP Port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:394 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:467 msgid "I2CP Interface" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:410 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:483 msgid "Authorization" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:489 msgid "Require username and password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:418 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:491 msgid "Username" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:422 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:495 msgid "Password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:400 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:406 msgid "The default settings will work for most people." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:428 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:501 msgid "Any changes made here must also be configured in the external client." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:503 msgid "Many clients do not support SSL or authorization." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:440 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:513 msgid "WebApp Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:442 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:515 msgid "" "The Java web applications listed below are started by the webConsole client " "and run in the same JVM as the router. They are usually web applications " @@ -4738,7 +5420,7 @@ msgid "" "all (e.g. addressbook)." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:444 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:517 msgid "" "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 " @@ -4746,658 +5428,683 @@ msgid "" "preferred method." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:458 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:531 msgid "Plugin Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:533 msgid "The plugins listed below are started by the webConsole client." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:470 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:543 msgid "Plugin Installation" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:545 msgid "To install a plugin, enter the download URL:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:139 +msgid "config home" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:397 +msgid "Default Home Page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:403 +msgid "Use old home page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:411 +msgid "Search Engines" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:431 +msgid "Recommended Eepsites" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:447 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:386 +msgid "Local Services" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:139 msgid "config keyring" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:257 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:330 msgid "I2P Keyring Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:399 msgid "The router keyring is used to decrypt encrypted leaseSets." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:402 msgid "" "The keyring may contain keys for local or remote encrypted destinations." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:408 msgid "Manual Keyring Addition" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:410 msgid "Enter keys for encrypted remote destinations here." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:413 msgid "Keys for local destinations must be entered on the" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:415 msgid "I2PTunnel page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:417 msgid "Dest. name, hash, or full key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:419 msgid "Encryption Key" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:121 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:137 msgid "config logging" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:271 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:314 msgid "I2P Logging Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:355 msgid "Configure I2P Logging Options" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357 msgid "Log file" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:361 msgid "(the symbol '@' will be replaced during log rotation)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:363 msgid "Log record format" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:367 msgid "" "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:369 msgid "Log date format" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:373 msgid "" "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' " "= millisecond)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:375 msgid "Max log file size" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:379 msgid "Default log level" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:356 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:383 msgid "" "(DEBUG and INFO are not recommended defaults, as they will drastically slow " "down your router)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:385 msgid "Log level overrides" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:389 msgid "New override" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:139 msgid "config networking" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:270 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:343 msgid "I2P Network Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:398 msgid "IP and Transport Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:402 msgid "There is help below." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:404 msgid "UPnP Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:408 msgid "Enable UPnP to open firewall ports" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:410 msgid "UPnP status" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:412 msgid "IP Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:414 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:490 msgid "Externally reachable hostname or IP address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:418 msgid "Use all auto-detect methods" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:422 msgid "Disable UPnP IP address detection" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:426 msgid "Ignore local interface IP address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:430 msgid "Use SSU IP address detection only" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:361 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:508 msgid "Specify hostname or IP" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:367 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:440 msgid "Select Interface" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:381 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:454 msgid "Hidden mode - do not publish IP" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:456 msgid "(prevents participating traffic)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:458 msgid "Action when IP changes" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:462 msgid "" "Laptop mode - Change router identity and UDP port when IP changes for " "enhanced anonymity" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:391 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:464 msgid "Experimental" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:393 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:466 msgid "UDP Configuration:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:468 msgid "UDP port:" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:518 msgid "Completely disable" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:476 msgid "(select only if behind a firewall that blocks outbound UDP)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:488 msgid "TCP Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:494 msgid "Use auto-detected IP address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:423 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:455 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:496 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:528 msgid "currently" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:500 msgid "if we are not firewalled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:504 msgid "Always use auto-detected IP address (Not firewalled)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:514 msgid "Disable inbound (Firewalled)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:447 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:520 msgid "" "(select only if behind a firewall that throttles or blocks outbound TCP)" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:449 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:522 msgid "Externally reachable TCP port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:453 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:526 msgid "Use the same port configured for UDP" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:534 msgid "Specify Port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:538 msgid "Notes" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:468 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:541 msgid "" "a) Do not reveal your port numbers to anyone! b) Changing these settings " "will restart your router." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:547 msgid "Configuration Help" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:476 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:598 msgid "" "While I2P will work fine behind most firewalls, your speeds and network " "integration will generally improve if the I2P port is forwarded for both UDP " "and TCP." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:551 msgid "" "If you can, please poke a hole in your firewall to allow unsolicited UDP and " "TCP packets to reach you." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:553 msgid "" "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole " "punching with \"SSU introductions\" to relay traffic." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:482 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:555 msgid "" "Most of the options above are for special situations, for example where UPnP " "does not work correctly, or a firewall not under your control is doing harm." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:484 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:557 msgid "Certain firewalls such as symmetric NATs may not work well with I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:566 msgid "" "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect " "the external IP address and forward ports." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:495 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:568 msgid "UPnP support is beta, and may not work for any number of reasons" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:570 msgid "No UPnP-compatible device present" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:572 msgid "UPnP disabled on the device" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:501 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:574 msgid "Software firewall interference with UPnP" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:503 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:576 msgid "Bugs in the device's UPnP implementation" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:505 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:578 msgid "Multiple firewall/routers in the internet connection path" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:507 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:580 msgid "UPnP device change, reset, or address change" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:509 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:582 msgid "Review the UPnP status here." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:511 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:584 msgid "" "UPnP may be enabled or disabled above, but a change requires a router " "restart to take effect." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:513 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:586 msgid "Hostnames entered above will be published in the network database." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:515 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:588 msgid "They are <b>not private</b>." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:590 msgid "" "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:519 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:592 msgid "" "If you specify the wrong IP address or hostname, or do not properly " "configure your NAT or firewall, your network performance will degrade " "substantially." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:594 msgid "When in doubt, leave the settings at the defaults." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:523 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:596 msgid "Reachability Help" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:601 msgid "" "If you think you have opened up your firewall and I2P still thinks you are " "firewalled, remember that you may have multiple firewalls, for example both " "software packages and external hardware routers." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:531 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:604 msgid "" "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help " "diagnose the problem." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:535 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:608 msgid "Your UDP port does not appear to be firewalled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:612 msgid "Your UDP port appears to be firewalled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:614 msgid "" "As the firewall detection methods are not 100% reliable, this may " "occasionally be displayed in error." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:616 msgid "" "However, if it appears consistently, you should check whether both your " "external and internal firewalls are open for your port." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:618 msgid "" "I2P will work fine when firewalled, there is no reason for concern. When " "firewalled, the router uses \"introducers\" to relay inbound connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:547 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:620 msgid "" "However, you will get more participating traffic and help the network more " "if you can open your firewall(s)." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:622 msgid "" "If you think you have already done so, remember that you may have both a " "hardware and a software firewall, or be behind an additional, institutional " "firewall you cannot control." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:551 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:624 msgid "" "Also, some routers cannot correctly forward both TCP and UDP on a single " "port, or may have other limitations or bugs that prevent them from passing " "traffic through to I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:628 msgid "The router is currently testing whether your UDP port is firewalled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:632 msgid "" "The router is not configured to publish its address, therefore it does not " "expect incoming connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:561 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:634 msgid "" "Hidden mode is automatically enabled for added protection in certain " "countries." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:563 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:636 msgid "WARN - Firewalled and Fast" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:638 msgid "" "You have configured I2P to share more than 128KBps of bandwidth, but you are " "firewalled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:567 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:640 msgid "" "While I2P will work fine in this configuration, if you really have over " "128KBps of bandwidth to share, it will be much more helpful to the network " "if you open your firewall." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:569 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:642 msgid "WARN - Firewalled and Floodfill" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:571 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:644 msgid "" "You have configured I2P to be a floodfill router, but you are firewalled." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:573 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:646 msgid "" "For best participation as a floodfill router, you should open your firewall." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:575 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:648 msgid "WARN - Firewalled with Inbound TCP Enabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:577 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:650 msgid "" "You have configured inbound TCP, however your UDP port is firewalled, and " "therefore it is likely that your TCP port is firewalled as well." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:579 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:652 msgid "" "If your TCP port is firewalled with inbound TCP enabled, routers will not be " "able to contact you via TCP, which will hurt the network." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:581 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:654 msgid "Please open your firewall or disable inbound TCP above." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:583 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:656 msgid "WARN - Firewalled with UDP Disabled" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:585 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:658 msgid "You have configured inbound TCP, however you have disabled UDP." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:660 msgid "" "You appear to be firewalled on TCP, therefore your router cannot accept " "inbound connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:589 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:662 msgid "Please open your firewall or enable UDP." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:591 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:664 msgid "ERR - Clock Skew" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:593 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:666 msgid "" "Your system's clock is skewed, which will make it difficult to participate " "in the network." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:595 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:668 msgid "Correct your clock setting if this error persists." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:597 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:670 msgid "ERR - Private TCP Address" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:672 msgid "" "You must never advertise an unroutable IP address such as 127.0.0.1 or " "192.168.1.1 as your external address." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:601 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:674 msgid "Correct the address or disable inbound TCP above." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:603 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:676 msgid "ERR - SymmetricNAT" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:678 msgid "I2P detected that you are firewalled by a Symmetric NAT." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:607 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:680 msgid "" "I2P does not work well behind this type of firewall. You will probably not " "be able to accept inbound connections, which will limit your participation " "in the network." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:609 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:682 msgid "" "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config " "and restart" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:611 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:684 msgid "I2P was unable to bind to port 8887 or other configured port." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:613 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:686 msgid "" "Check to see if another program is using the configured port. If so, stop " "that program or configure I2P to use a different port." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:615 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:688 msgid "" "This may be a transient error, if the other program is no longer using the " "port." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:617 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:690 msgid "However, a restart is always required after this error." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:619 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:692 msgid "ERR - UDP Disabled and Inbound TCP host/port not set" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:621 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:694 msgid "" "You have not configured inbound TCP with a hostname and port above, however " "you have disabled UDP." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:623 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:696 msgid "Therefore your router cannot accept inbound connections." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:625 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:698 msgid "Please configure a TCP host and port above or enable UDP." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:627 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:700 msgid "ERR - Client Manager I2CP Error - check logs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:629 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:702 msgid "This is usually due to a port 7654 conflict. Check the logs to verify." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:631 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:704 msgid "" "Do you have another I2P instance running? Stop the conflicting program and " "restart I2P." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:139 msgid "config peers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:257 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:330 msgid "I2P Peer Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:405 msgid "Manual Peer Controls" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:407 msgid "Router Hash" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:411 msgid "Manually Ban / Unban a Peer" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:413 msgid "" "Banning will prevent the participation of this peer in tunnels you create." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:423 msgid "Adjust Profile Bonuses" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:425 msgid "" "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 " @@ -5405,655 +6112,734 @@ msgid "" "displayed on the" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:427 msgid "profiles page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:372 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:445 msgid "Banned Peers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:393 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:466 msgid "Banned IPs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:139 msgid "config reseeding" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:270 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:343 msgid "I2P Reseeding Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:400 msgid "Reseeding Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:402 msgid "" "Reseeding is the bootstrapping process used to find other routers when you " "first install I2P, or when your router has too few router references " "remaining." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:404 msgid "" "If reseeding has failed, you should first check your network connection." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:408 msgid "" "Change these only if HTTP is blocked by a restrictive firewall, reseed has " "failed, and you have access to an HTTP proxy." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:410 #, java-format msgid "See {0} for instructions on reseeding manually." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:410 msgid "the FAQ" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:412 msgid "Reseed URL Selection" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:416 msgid "Try SSL first then non-SSL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:420 msgid "Use SSL only" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:424 msgid "Use non-SSL only" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:426 msgid "Reseed URLs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:430 msgid "Enable HTTP Proxy?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:434 msgid "HTTP Proxy Host" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:438 msgid "HTTP Proxy Port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:442 msgid "Use HTTP Proxy Authorization?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:373 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:446 msgid "HTTP Proxy Username" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:450 msgid "HTTP Proxy Password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:381 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:454 msgid "Enable HTTPS Proxy?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:458 msgid "HTTPS Proxy Host" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:462 msgid "HTTPS Proxy Port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:393 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:466 msgid "Use HTTPS Proxy Authorization?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:470 msgid "HTTPS Proxy Username" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:401 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:474 msgid "HTTPS Proxy Password" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:139 msgid "config service" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:257 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330 msgid "I2P Service Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:385 msgid "Shutdown the router" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:387 msgid "" "Graceful shutdown lets the router satisfy the agreements it has already made " "before shutting down, but may take a few minutes." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:389 msgid "" "If you need to kill the router immediately, that option is available as well." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:399 msgid "" "If you want the router to restart itself after shutting down, you can choose " "one of the following." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:401 msgid "" "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." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:403 msgid "" "A graceful restart will take a few minutes (but your peers will appreciate " "your patience), while a hard restart does so immediately." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:405 msgid "" "After tearing down the router, it will wait 1 minute before starting back up " "again." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:415 msgid "Systray integration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:417 msgid "" "On the windows platform, there is a small application to sit in the system " "tray, allowing you to view the router's status" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:419 msgid "" "(later on, I2P client applications will be able to integrate their own " "functionality into the system tray as well)." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:421 msgid "If you are on windows, you can either enable or disable that icon here." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:423 msgid "Show systray icon" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:425 msgid "Hide systray icon" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:427 msgid "Run on startup" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:356 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:429 msgid "" "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." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:431 msgid "If you prefer the command line, you can also run the " msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:366 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:430 msgid "Note" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:368 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:441 msgid "" "If you are running I2P as service right now, removing it will shut down your " "router immediately." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:443 msgid "" "You may want to consider shutting down gracefully, as above, then running " "uninstall_i2p_service_winnt.bat." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:374 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:447 msgid "Debugging" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:449 msgid "View the job queue" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:453 msgid "" "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 <a href=" "\"logs.jsp#servicelogs\">wrapper.log</a>." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:459 msgid "Launch browser on router startup?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:461 msgid "" "I2P's main configuration interface is this web console, so for your " "convenience I2P can launch a web browser on startup pointing at" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:121 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:139 +msgid "config summary bar" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:330 +msgid "I2P Summary Bar Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:401 +msgid "Refresh Interval" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:407 +msgid "seconds" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:411 +msgid "Customize Summary Bar" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:137 msgid "config stats" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304 msgid "I2P Stats Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:355 msgid "Configure I2P Stat Collection" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:357 msgid "Enable full stats?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:364 msgid "change requires restart to take effect" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373 msgid "Stat file" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:344 +#. shouldShowLog +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:382 msgid "Filter" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:346 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395 msgid "toggle all" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:403 msgid "Log" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:411 msgid "Graph" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:400 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:466 msgid "Advanced filter" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:139 msgid "config tunnels" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:270 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343 msgid "I2P Tunnel Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:410 msgid "The default settings work for most people." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:414 msgid "There is a fundamental tradeoff between anonymity and performance." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:417 msgid "" "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 " "hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely " "reduce performance or reliability." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:420 msgid "High CPU and/or high outbound bandwidth usage may result." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:423 msgid "Change these settings with care, and adjust them if you have problems." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:433 msgid "" "Exploratory tunnel setting changes are stored in the router.config file." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:436 msgid "Client tunnel changes are temporary and are not saved." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:438 msgid "To make permanent client tunnel changes see the" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:367 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:440 msgid "i2ptunnel page" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:137 msgid "config UI" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:270 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314 msgid "I2P UI Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353 msgid "Router Console Theme" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:374 msgid "Theme selection disabled for Internet Explorer, sorry." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:376 msgid "" "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." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:379 msgid "Router Console Language" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:385 msgid "" "Please contribute to the router console translation project! Contact the " "developers in #i2p-dev on IRC to help." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:389 msgid "Apply" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:137 msgid "config update" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:257 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:304 msgid "I2P Update Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 msgid "Check for I2P and news updates" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:363 msgid "News & I2P Updates" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367 msgid "Check for news updates" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369 msgid "News Updates" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:377 msgid "Update In Progress" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385 msgid "News URL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:389 msgid "Refresh frequency" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:395 msgid "Update policy" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:401 msgid "Update through the eepProxy?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:374 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:405 msgid "eepProxy host" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:409 msgid "eepProxy port" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:415 msgid "Update URLs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:419 msgid "Trusted keys" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:392 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:423 msgid "Update with unsigned development builds?" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:427 msgid "Unsigned Build URL" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:402 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:433 msgid "Updates will be dispatched via your package manager." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:408 -msgid "Save" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:136 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:136 +msgid "home" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 -msgid "Internal Error" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:354 +msgid "Welcome to I2P" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:131 -msgid "Router Console" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:321 +msgid "I2P Addressbook" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:323 +msgid "Open in new tab" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:327 +msgid "Your browser does not support iFrames." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:329 +msgid "Click here to continue." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:144 +msgid "Internal Error" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:150 msgid "Configuration" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:157 msgid "Sorry! There has been an internal error." msgstr "" #. note to translators - both parameters are URLs -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:161 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:335 #, java-format msgid "Please report bugs on {0} or {1}." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:151 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:164 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:339 msgid "" "You may use the username \"guest\" and password \"guest\" if you do not wish " "to register." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:153 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:168 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:341 msgid "Please include this information in bug reports" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:155 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:170 msgid "Error Details" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:157 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:172 #, java-format msgid "Error {0}" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:177 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:191 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:331 msgid "I2P Version and Running Environment" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:390 msgid "" "Note that system information, log timestamps, and log messages may provide " "clues to your location; please review everything you include in a bug report." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:131 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:148 msgid "Page Not Found" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:319 msgid "" "Sorry! You appear to be requesting a non-existent Router Console page or " "resource." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:321 msgid "Error 404" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:279 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:326 msgid "not found" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:120 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:138 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:136 msgid "graphs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:324 msgid "I2P Performance Graphs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:119 -msgid "home" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:312 +msgid "" +"Click a flag to select a language. Click 'configure language' below to " +"change it later." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:361 -msgid "Welcome to I2P" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:362 +msgid "Search I2P" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:382 +msgid "Eepsites of Interest" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:154 +msgid "i2p tunnel manager" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:322 +msgid "I2P Tunnel Manager" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:138 msgid "Jar File Dump" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:136 msgid "job queue" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:303 msgid "I2P Router Job Queue" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:138 msgid "logs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:329 msgid "I2P Router Logs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:392 msgid "Critical Logs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:396 msgid "Router Logs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:402 msgid "Service (Wrapper) Logs" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:119 -msgid "network database summary" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:136 +msgid "network database" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:256 -msgid "I2P Network Database Summary" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:303 +msgid "I2P Network Database" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:123 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:142 msgid "WebApp Not Found" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:260 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:333 msgid "Web Application Not Running" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:335 msgid "The requested web application is not running." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:264 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:337 msgid "" "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</" "a> to start it." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:136 msgid "peer connections" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:303 msgid "I2P Network Peers" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:136 msgid "peer profiles" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:303 msgid "I2P Network Peer Profiles" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:136 msgid "statistics" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:316 msgid "I2P Router Statistics" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:264 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:301 #, java-format msgid "Disable {0} Refresh" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:154 +msgid "torrents" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:321 +msgid "I2P Torrent Downloader" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:136 msgid "tunnel summary" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:303 msgid "I2P Tunnel Summary" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:119 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:136 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:303 msgid "Peer Profile" msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:283 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:326 #, java-format msgid "Profile for peer {0}" msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:154 +msgid "webmail" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:321 +msgid "I2P Webmail" +msgstr "" diff --git a/apps/routerconsole/locale/messages_en.po b/apps/routerconsole/locale/messages_en.po index 830a7919c4adb90b0a6563550ee27846c4e94967..e482ae5e549c5d5aebc3abf5a7ccc30832ed7eb3 100644 --- a/apps/routerconsole/locale/messages_en.po +++ b/apps/routerconsole/locale/messages_en.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P routerconsole\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-25 19:38+0000\n" +"POT-Creation-Date: 2012-09-06 09:09+0000\n" "PO-Revision-Date: 2010-06-15 14:09+0100\n" "Last-Translator: duck <duck@mail.i2p>\n" "Language-Team: duck <duck@mail.i2p>\n" @@ -26,7 +26,7 @@ msgstr "" #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1387 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1396 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -35,7 +35,7 @@ msgstr[1] "" #. seconds #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1391 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1400 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -44,7 +44,7 @@ msgstr[1] "" #. minutes #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1395 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1404 #, java-format msgid "1 min" msgid_plural "{0} min" @@ -53,20 +53,20 @@ msgstr[1] "" #. hours #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1399 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1408 #, java-format msgid "1 hour" msgid_plural "{0} hours" msgstr[0] "" msgstr[1] "" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1401 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1410 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:341 msgid "n/a" msgstr "" #. days -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1404 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1413 #, java-format msgid "1 day" msgid_plural "{0} days" @@ -278,7 +278,7 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:753 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2061 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2063 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 @@ -293,7 +293,7 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:754 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067 msgid "Dir" msgstr "" @@ -319,13 +319,13 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:755 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2066 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2068 msgid "Idle" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:756 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2071 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2073 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:157 msgid "In/Out" msgstr "" @@ -340,14 +340,14 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:757 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2076 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2078 #: ../java/src/net/i2p/router/web/SummaryHelper.java:835 msgid "Up" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2078 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2080 msgid "Skew" msgstr "" @@ -382,7 +382,7 @@ msgid "The round trip time in milliseconds" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2088 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2090 msgid "Dev" msgstr "" @@ -402,7 +402,7 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:759 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2095 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2097 msgid "TX" msgstr "" @@ -412,7 +412,7 @@ msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2097 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2099 msgid "RX" msgstr "" @@ -421,7 +421,7 @@ msgid "The total number of packets received from the peer" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2100 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102 msgid "Dup TX" msgstr "" @@ -430,7 +430,7 @@ msgid "The total number of packets retransmitted to the peer" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2104 msgid "Dup RX" msgstr "" @@ -565,12 +565,12 @@ msgid "NTCP connections" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:749 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2057 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2059 msgid "Limit" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:750 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2058 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2060 msgid "Timeout" msgstr "" @@ -583,13 +583,13 @@ msgid "Backlogged?" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:776 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2120 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2122 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88 msgid "Inbound" msgstr "" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:778 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2122 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2124 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:88 msgid "Outbound" msgstr "" @@ -599,112 +599,112 @@ msgstr "" msgid "peers" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2056 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2058 msgid "UDP connections" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2063 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065 msgid "Sort by peer hash" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2065 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067 msgid "Direction/Introduction" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2067 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2069 msgid "Sort by idle inbound" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2069 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2071 msgid "Sort by idle outbound" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2072 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2074 msgid "Sort by inbound rate" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2074 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2076 msgid "Sort by outbound rate" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2077 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2079 msgid "Sort by connection uptime" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2079 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2081 msgid "Sort by clock skew" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2082 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2084 msgid "Sort by congestion window" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2084 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2086 msgid "Sort by slow start threshold" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2087 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2089 msgid "Sort by round trip time" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2089 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2091 msgid "Sort by round trip time deviation" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2091 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2093 msgid "Sort by retransmission timeout" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2094 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2096 msgid "Sort by outbound maximum transmit unit" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2096 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2098 msgid "Sort by packets sent" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2098 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2100 msgid "Sort by packets received" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2101 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103 msgid "Sort by packets retransmitted" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2105 msgid "Sort by packets received more than once" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2124 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2126 msgid "We offered to introduce them" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2126 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2128 msgid "They offered to introduce us" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2130 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2132 msgid "Choked" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2138 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2140 msgid "1 fail" msgstr "" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2140 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2142 #, java-format msgid "{0} fails" msgstr "" #. 1 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2146 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2148 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171 #: ../java/src/net/i2p/router/web/ProfilesHelper.java:13 msgid "Banned" msgstr "" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2276 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2278 msgid "SUMMARY" msgstr "" diff --git a/apps/sam/java/src/net/i2p/sam/SAMBridge.java b/apps/sam/java/src/net/i2p/sam/SAMBridge.java index 114f9dd6015857672328666c7db28f3a4b24e447..aa798b8f3d6940165daaab0a3b4b4f6377ded1f9 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMBridge.java +++ b/apps/sam/java/src/net/i2p/sam/SAMBridge.java @@ -252,7 +252,7 @@ public class SAMBridge implements Runnable { } SAMBridge bridge = new SAMBridge(host, port, opts, keyfile); I2PAppThread t = new I2PAppThread(bridge, "SAMListener"); - if (Boolean.valueOf(System.getProperty("sam.shutdownOnOOM", "false")).booleanValue()) { + if (Boolean.parseBoolean(System.getProperty("sam.shutdownOnOOM"))) { t.addOOMEventThreadListener(new I2PAppThread.OOMEventListener() { public void outOfMemory(OutOfMemoryError err) { err.printStackTrace(); diff --git a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java index 39836c53f55f93db47d47f5d386b95988245ba4d..6a86a915cd0ca6e04e91328306013ee6ee38f78c 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java @@ -134,7 +134,7 @@ public class SAMStreamSession { socketMgr.addDisconnectListener(new DisconnectListener()); - forceFlush = Boolean.valueOf(allprops.getProperty(PROP_FORCE_FLUSH, DEFAULT_FORCE_FLUSH)).booleanValue(); + forceFlush = Boolean.parseBoolean(allprops.getProperty(PROP_FORCE_FLUSH, DEFAULT_FORCE_FLUSH)); boolean canReceive = false; if (dir.equals("BOTH")) { diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java index 69f0bb857161d8ca2fc450dbe1347da70375baa1..2b24d090958fc06a28b4b67e76376fc9572b7718 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnThrottler.java @@ -15,8 +15,8 @@ import net.i2p.util.SimpleTimer; */ class ConnThrottler { private final ObjectCounter<Hash> counter; - private final int _max; - private final int _totalMax; + private volatile int _max; + private volatile int _totalMax; private final AtomicInteger _currentTotal; /* @@ -27,17 +27,21 @@ class ConnThrottler { ConnThrottler(int max, int totalMax, long period) { _max = max; _totalMax = totalMax; - if (max > 0) - this.counter = new ObjectCounter<Hash>(); - else - this.counter = null; - if (totalMax > 0) - _currentTotal = new AtomicInteger(); - else - _currentTotal = null; + this.counter = new ObjectCounter<Hash>(); + _currentTotal = new AtomicInteger(); SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), period); } + /* + * @param max per-peer, 0 for unlimited + * @param totalMax for all peers, 0 for unlimited + * @since 0.9.3 + */ + public void updateLimits(int max, int totalMax) { + _max = max; + _totalMax = totalMax; + } + /** * Checks both individual and total. Increments before checking. */ 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 29a05512f71737526e42be160bc264582b281042..99909b6b30c49c2f1ebbd5454518215402d1c144 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java @@ -87,7 +87,7 @@ class Connection { /** wait up to 5 minutes after disconnection so we can ack/close packets */ public static final int DISCONNECT_TIMEOUT = 5*60*1000; - private static final long DEFAULT_CONNECT_TIMEOUT = 60*1000; + public static final int DEFAULT_CONNECT_TIMEOUT = 60*1000; private static final long MAX_CONNECT_TIMEOUT = 2*60*1000; public static final int MAX_WINDOW_SIZE = 128; @@ -549,7 +549,15 @@ class Connection { public void setInbound() { _isInbound = true; } public boolean isInbound() { return _isInbound; } + + /** + * Always true at the start, even if we haven't gotten a reply on an + * outbound connection. Only set to false on disconnect. + * For outbound, use getHighestAckedThrough() >= 0 also, + * to determine if the connection is up. + */ public boolean getIsConnected() { return _connected; } + public boolean getHardDisconnected() { return _hardDisconnected; } public boolean getResetSent() { return _resetSent; } public long getResetSentOn() { return _resetSentOn; } @@ -1017,7 +1025,7 @@ class Connection { @Override public String toString() { - StringBuilder buf = new StringBuilder(128); + StringBuilder buf = new StringBuilder(256); buf.append("[Connection "); if (_receiveStreamId > 0) buf.append(Packet.toId(_receiveStreamId)); @@ -1075,6 +1083,7 @@ class Connection { buf.append(" close received ").append(DataHelper.formatDuration(_context.clock().now() - getCloseReceivedOn())).append(" ago"); buf.append(" sent: ").append(1 + _lastSendId.get()); buf.append(" rcvd: ").append(1 + _inputStream.getHighestBlockId() - missing); + buf.append(" ackThru ").append(_highestAckedThrough); buf.append(" maxWin ").append(getOptions().getMaxWindowSize()); buf.append(" MTU ").append(getOptions().getMaxMessageSize()); 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 3547b55440a552747264ff9720395832bcf59fec..7a9529e5e211352026b4798c3c04dce17a31d0d9 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; import java.util.concurrent.ConcurrentHashMap; import net.i2p.I2PAppContext; @@ -12,6 +13,8 @@ import net.i2p.client.I2PSession; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.SessionKey; +import net.i2p.util.ConcurrentHashSet; +import net.i2p.util.ConvertToHash; import net.i2p.util.Log; import net.i2p.util.SimpleTimer2; @@ -35,21 +38,28 @@ class ConnectionManager { private final ConcurrentHashMap<Long, Connection> _connectionByInboundId; /** Ping ID (Long) to PingRequest */ private final Map<Long, PingRequest> _pendingPings; - private boolean _throttlersInitialized; - private int _maxConcurrentStreams; + private volatile boolean _throttlersInitialized; private final ConnectionOptions _defaultOptions; private volatile int _numWaiting; private long _soTimeout; - private ConnThrottler _minuteThrottler; - private ConnThrottler _hourThrottler; - private ConnThrottler _dayThrottler; + private volatile ConnThrottler _minuteThrottler; + private volatile ConnThrottler _hourThrottler; + private volatile ConnThrottler _dayThrottler; /** since 0.9, each manager instantiates its own timer */ private final SimpleTimer2 _timer; + /** cache of the property to detect changes */ + private static volatile String _currentBlacklist = ""; + private static final Set<Hash> _globalBlacklist = new ConcurrentHashSet(); - public ConnectionManager(I2PAppContext context, I2PSession session, int maxConcurrent, ConnectionOptions defaultOptions) { + /** @since 0.9.3 */ + public static final String PROP_BLACKLIST = "i2p.streaming.blacklist"; + + /** + * Manage all conns for this session + */ + public ConnectionManager(I2PAppContext context, I2PSession session, ConnectionOptions defaultOptions) { _context = context; _session = session; - _maxConcurrentStreams = maxConcurrent; _defaultOptions = defaultOptions; _log = _context.logManager().getLog(ConnectionManager.class); _connectionByInboundId = new ConcurrentHashMap(32); @@ -128,21 +138,42 @@ class ConnectionManager { public void setAllowIncomingConnections(boolean allow) { _connectionHandler.setActive(allow); - if (allow && !_throttlersInitialized) { - _throttlersInitialized = true; - if (_defaultOptions.getMaxConnsPerMinute() > 0 || _defaultOptions.getMaxTotalConnsPerMinute() > 0) { + if (allow) { + synchronized(this) { + if (!_throttlersInitialized) { + updateOptions(); + _throttlersInitialized = true; + } + } + } + } + + /* + * Update the throttler options + * @since 0.9.3 + */ + public synchronized void updateOptions() { + if ((_defaultOptions.getMaxConnsPerMinute() > 0 || _defaultOptions.getMaxTotalConnsPerMinute() > 0) && + _minuteThrottler == null) { _context.statManager().createRateStat("stream.con.throttledMinute", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 }); _minuteThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerMinute(), _defaultOptions.getMaxTotalConnsPerMinute(), 60*1000); + } else if (_minuteThrottler != null) { + _minuteThrottler.updateLimits(_defaultOptions.getMaxConnsPerMinute(), _defaultOptions.getMaxTotalConnsPerMinute()); } - if (_defaultOptions.getMaxConnsPerHour() > 0 || _defaultOptions.getMaxTotalConnsPerHour() > 0) { + if ((_defaultOptions.getMaxConnsPerHour() > 0 || _defaultOptions.getMaxTotalConnsPerHour() > 0) && + _hourThrottler == null) { _context.statManager().createRateStat("stream.con.throttledHour", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 }); _hourThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerHour(), _defaultOptions.getMaxTotalConnsPerHour(), 60*60*1000); + } else if (_hourThrottler != null) { + _hourThrottler.updateLimits(_defaultOptions.getMaxConnsPerHour(), _defaultOptions.getMaxTotalConnsPerHour()); } - if (_defaultOptions.getMaxConnsPerDay() > 0 || _defaultOptions.getMaxTotalConnsPerDay() > 0) { + if ((_defaultOptions.getMaxConnsPerDay() > 0 || _defaultOptions.getMaxTotalConnsPerDay() > 0) && + _dayThrottler == null) { _context.statManager().createRateStat("stream.con.throttledDay", "Dropped for conn limit", "Stream", new long[] { 5*60*1000 }); _dayThrottler = new ConnThrottler(_defaultOptions.getMaxConnsPerDay(), _defaultOptions.getMaxTotalConnsPerDay(), 24*60*60*1000); + } else if (_dayThrottler != null) { + _dayThrottler.updateLimits(_defaultOptions.getMaxConnsPerDay(), _defaultOptions.getMaxTotalConnsPerDay()); } - } } /** @return if we should accept connections */ @@ -177,7 +208,7 @@ class ConnectionManager { //} if (locked_tooManyStreams()) { _log.logAlways(Log.WARN, "Refusing connection since we have exceeded our max of " - + _maxConcurrentStreams + " connections"); + + _defaultOptions.getMaxConns() + " connections"); reject = true; } else { // this may not be right if more than one is enabled @@ -209,6 +240,7 @@ class ConnectionManager { Hash h = from.calculateHash(); if ((_hourThrottler != null && _hourThrottler.isThrottled(h)) || (_dayThrottler != null && _dayThrottler.isThrottled(h)) || + _globalBlacklist.contains(h) || (_defaultOptions.isAccessListEnabled() && !_defaultOptions.getAccessList().contains(h)) || (_defaultOptions.isBlacklistEnabled() && _defaultOptions.getBlacklist().contains(h))) { // A signed RST packet + ElGamal + session tags is fairly expensive, so @@ -267,16 +299,17 @@ class ConnectionManager { long remaining = expiration - _context.clock().now(); if (remaining <= 0) { _log.logAlways(Log.WARN, "Refusing to connect since we have exceeded our max of " - + _maxConcurrentStreams + " connections"); + + _defaultOptions.getMaxConns() + " connections"); _numWaiting--; return null; } if (locked_tooManyStreams()) { + int max = _defaultOptions.getMaxConns(); // allow a full buffer of pending/waiting streams - if (_numWaiting > _maxConcurrentStreams) { + if (_numWaiting > max) { _log.logAlways(Log.WARN, "Refusing connection since we have exceeded our max of " - + _maxConcurrentStreams + " and there are " + _numWaiting + + max + " and there are " + _numWaiting + " waiting already"); _numWaiting--; return null; @@ -320,8 +353,9 @@ class ConnectionManager { * @return too many */ private boolean locked_tooManyStreams() { - if (_maxConcurrentStreams <= 0) return false; - if (_connectionByInboundId.size() < _maxConcurrentStreams) return false; + int max = _defaultOptions.getMaxConns(); + if (max <= 0) return false; + if (_connectionByInboundId.size() < max) return false; int active = 0; for (Connection con : _connectionByInboundId.values()) { if (con.getIsConnected()) @@ -332,7 +366,7 @@ class ConnectionManager { _log.info("More than 100 connections! " + active + " total: " + _connectionByInboundId.size()); - return (active >= _maxConcurrentStreams); + return (active >= max); } /** @@ -398,6 +432,32 @@ class ConnectionManager { if (_defaultOptions.isBlacklistEnabled() && _defaultOptions.getBlacklist().contains(h)) return "blacklisted"; + String hashes = _context.getProperty(PROP_BLACKLIST, ""); + if (!_currentBlacklist.equals(hashes)) { + // rebuild _globalBlacklist when property changes + synchronized(_globalBlacklist) { + if (hashes.length() > 0) { + Set<Hash> newSet = new HashSet(); + StringTokenizer tok = new StringTokenizer(hashes, ",; "); + while (tok.hasMoreTokens()) { + String hashstr = tok.nextToken(); + Hash hh = ConvertToHash.getHash(hashstr); + if (hh != null) + newSet.add(hh); + else + _log.error("Bad blacklist entry: " + hashstr); + } + _globalBlacklist.addAll(newSet); + _globalBlacklist.retainAll(newSet); + _currentBlacklist = hashes; + } else { + _globalBlacklist.clear(); + _currentBlacklist = ""; + } + } + } + if (hashes.length() > 0 && _globalBlacklist.contains(h)) + return "blacklisted globally"; return null; } 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 95eef4687a81f862b87a6faaab32c753c21fd09c..aac78d99369a55e1828dc8c6b388abcd711ac707 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java @@ -14,6 +14,8 @@ import net.i2p.util.Log; /** * Define the current options for the con (and allow custom tweaking midstream) * + * TODO many of these are not per-connection options, and should be migrated + * somewhere so they aren't copied for every connection */ class ConnectionOptions extends I2PSocketOptionsImpl { private int _connectDelay; @@ -47,6 +49,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl { private int _maxTotalConnsPerMinute; private int _maxTotalConnsPerHour; private int _maxTotalConnsPerDay; + private int _maxConns; // NOTE - almost all the options are below, but see // I2PSocketOptions in ministreaming for a few more @@ -90,6 +93,12 @@ class ConnectionOptions extends I2PSocketOptionsImpl { public static final String PROP_MAX_TOTAL_CONNS_DAY = "i2p.streaming.maxTotalConnsPerDay"; /** @since 0.9.1 */ public static final String PROP_ENFORCE_PROTO = "i2p.streaming.enforceProtocol"; + /** + * how many streams will we allow at once? + * @since 0.9.3 moved from I2PSocketManagerFull + */ + public static final String PROP_MAX_STREAMS = "i2p.streaming.maxConcurrentStreams"; + private static final int TREND_COUNT = 3; static final int INITIAL_WINDOW_SIZE = 6; @@ -308,6 +317,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl { _maxTotalConnsPerMinute = opts.getMaxTotalConnsPerMinute(); _maxTotalConnsPerHour = opts.getMaxTotalConnsPerHour(); _maxTotalConnsPerDay = opts.getMaxTotalConnsPerDay(); + _maxConns = opts.getMaxConns(); } /** @@ -333,8 +343,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl { DEFAULT_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR)); setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, DEFAULT_SLOW_START_GROWTH_RATE_FACTOR)); - // overrides default in super() - setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT)); + // overrides default in super()... why? + //setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT)); setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS)); setEnforceProtocol(getBool(opts, PROP_ENFORCE_PROTO, DEFAULT_ENFORCE_PROTO)); initLists(opts); @@ -344,6 +354,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl { _maxTotalConnsPerMinute = getInt(opts, PROP_MAX_TOTAL_CONNS_MIN, 0); _maxTotalConnsPerHour = getInt(opts, PROP_MAX_TOTAL_CONNS_HOUR, 0); _maxTotalConnsPerDay = getInt(opts, PROP_MAX_TOTAL_CONNS_DAY, 0); + _maxConns = getInt(opts, PROP_MAX_STREAMS, 0); } /** @@ -388,9 +399,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl { setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, DEFAULT_SLOW_START_GROWTH_RATE_FACTOR)); if (opts.containsKey(PROP_CONNECT_TIMEOUT)) - // wow 5 minutes!!! FIXME!! // overrides default in super() - setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT)); + setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DEFAULT_CONNECT_TIMEOUT)); if (opts.containsKey(PROP_ANSWER_PINGS)) setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS)); if (opts.containsKey(PROP_ENFORCE_PROTO)) @@ -408,6 +418,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl { _maxTotalConnsPerHour = getInt(opts, PROP_MAX_TOTAL_CONNS_HOUR, 0); if (opts.containsKey(PROP_MAX_TOTAL_CONNS_DAY)) _maxTotalConnsPerDay = getInt(opts, PROP_MAX_TOTAL_CONNS_DAY, 0); + if (opts.containsKey(PROP_MAX_STREAMS)) + _maxConns = getInt(opts, PROP_MAX_STREAMS, 0); } /** @@ -660,6 +672,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl { public int getMaxTotalConnsPerMinute() { return _maxTotalConnsPerMinute; } public int getMaxTotalConnsPerHour() { return _maxTotalConnsPerHour; } public int getMaxTotalConnsPerDay() { return _maxTotalConnsPerDay; } + /** @since 0.9.3; no public setter */ + public int getMaxConns() { return _maxConns; } public boolean isAccessListEnabled() { return _accessListEnabled; } public boolean isBlacklistEnabled() { return _blackListEnabled; } @@ -691,7 +705,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl { String hashes = opts.getProperty(PROP_ACCESS_LIST); if (hashes == null) return; - StringTokenizer tok = new StringTokenizer(hashes, ", "); + StringTokenizer tok = new StringTokenizer(hashes, ",; "); while (tok.hasMoreTokens()) { String hashstr = tok.nextToken(); Hash h = ConvertToHash.getHash(hashstr); @@ -749,7 +763,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl { if (opts == null) return defaultVal; String val = opts.getProperty(name); if (val == null) return defaultVal; - return Boolean.valueOf(val).booleanValue(); + return Boolean.parseBoolean(val); } /**** 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 cfc0bf7838a23bd5a963b6b81f52cd6721c299c8..dc16811913c41acd45c2a4a600ae48fee6fa5a14 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java @@ -36,7 +36,6 @@ public class I2PSocketManagerFull implements I2PSocketManager { private final ConnectionOptions _defaultOptions; private long _acceptTimeout; private String _name; - private int _maxStreams; private static int __managerId = 0; private final ConnectionManager _connectionManager; @@ -54,9 +53,6 @@ public class I2PSocketManagerFull implements I2PSocketManager { throw new UnsupportedOperationException(); } - /** how many streams will we allow at once? */ - public static final String PROP_MAX_STREAMS = "i2p.streaming.maxConcurrentStreams"; - /** * @deprecated use 4-arg constructor * @throws UnsupportedOperationException always @@ -79,19 +75,10 @@ public class I2PSocketManagerFull implements I2PSocketManager { _session = session; _log = _context.logManager().getLog(I2PSocketManagerFull.class); - _maxStreams = -1; - try { - String num = (opts != null ? opts.getProperty(PROP_MAX_STREAMS, "-1") : "-1"); - _maxStreams = Integer.parseInt(num); - } catch (NumberFormatException nfe) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Invalid max # of concurrent streams, defaulting to unlimited", nfe); - _maxStreams = -1; - } _name = name + " " + (++__managerId); _acceptTimeout = ACCEPT_TIMEOUT_DEFAULT; _defaultOptions = new ConnectionOptions(opts); - _connectionManager = new ConnectionManager(_context, _session, _maxStreams, _defaultOptions); + _connectionManager = new ConnectionManager(_context, _session, _defaultOptions); _serverSocket = new I2PServerSocketFull(this); if (_log.shouldLog(Log.INFO)) { @@ -182,6 +169,7 @@ public class I2PSocketManagerFull implements I2PSocketManager { if (_log.shouldLog(Log.WARN)) _log.warn("Changing options from:\n " + _defaultOptions + "\nto:\n " + options); _defaultOptions.updateAll((ConnectionOptions) options); + _connectionManager.updateOptions(); } /** @@ -244,7 +232,7 @@ public class I2PSocketManagerFull implements I2PSocketManager { // the following blocks unless connect delay > 0 Connection con = _connectionManager.connect(peer, opts); if (con == null) - throw new TooManyStreamsException("Too many streams (max " + _maxStreams + ")"); + throw new TooManyStreamsException("Too many streams, max " + _defaultOptions.getMaxConns()); I2PSocketFull socket = new I2PSocketFull(con); con.setSocket(socket); if (con.getConnectionError() != null) { 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 17918a6e129219842da6e374e4b5c2f8dd09c5e2..1dd473907aa165f1e8e63a32c41a76e6722e0458 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/SchedulerChooser.java @@ -29,7 +29,7 @@ class SchedulerChooser { TaskScheduler scheduler = _schedulers.get(i); if (scheduler.accept(con)) { //if (_log.shouldLog(Log.DEBUG)) - // _log.debug("Scheduling for " + con + " with " + scheduler.getClass().getName()); + // _log.debug("Scheduling for " + con + " with " + scheduler.getClass().getSimpleName()); return scheduler; } } diff --git a/apps/susidns/locale/messages_cs.po b/apps/susidns/locale/messages_cs.po index 973dc4a2a6baff0f2ac523dfe96bc33555f2e307..4bf68cfc8cf9dcd686ac2d3e26aaaeee46463365 100644 --- a/apps/susidns/locale/messages_cs.po +++ b/apps/susidns/locale/messages_cs.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-17 11:41+0000\n" +"POT-Creation-Date: 2012-09-12 11:58+0000\n" "PO-Revision-Date: 2012-02-12 22:15+0000\n" "Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n" "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n" @@ -19,58 +19,58 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:131 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:130 #, java-format msgid "Host name \"{0}\" contains illegal character {1}" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:144 -#: ../src/java/src/i2p/susi/dns/AddressBean.java:146 -#: ../src/java/src/i2p/susi/dns/AddressBean.java:153 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:143 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:145 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:152 #, java-format msgid "Host name cannot start with \"{0}\"" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:148 -#: ../src/java/src/i2p/susi/dns/AddressBean.java:150 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:147 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:149 #, java-format msgid "Host name cannot end with \"{0}\"" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:155 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:154 #, java-format msgid "Host name cannot contain \"{0}\"" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:158 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:157 #, java-format msgid "" "Host name \"{0}\" requires conversion to ASCII but the conversion library is " "unavailable in this JVM" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:210 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:218 msgid "None" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:218 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:226 msgid "Hashcash" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:220 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:228 msgid "Hidden" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:222 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:230 msgid "Signed" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressBean.java:224 +#: ../src/java/src/i2p/susi/dns/AddressBean.java:232 #, java-format msgid "Type {0}" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:233 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:202 #, java-format msgid "One result for search within filtered list." msgid_plural "{0} results for search within filtered list." @@ -78,7 +78,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:237 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 #, java-format msgid "Filtered list contains 1 entry." msgid_plural "Fltered list contains {0} entries." @@ -86,7 +86,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:242 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:211 #, java-format msgid "One result for search." msgid_plural "{0} results for search." @@ -94,7 +94,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:251 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:220 #, java-format msgid "Address book contains 1 entry." msgid_plural "Address book contains {0} entries." @@ -102,97 +102,97 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:267 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:236 #, java-format msgid "Showing {0} of {1}" msgstr "Zobrazuji {0} z {1}" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:231 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:392 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:257 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:227 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:412 msgid "Add" msgstr "Přídat" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288 -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:299 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:231 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:243 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:390 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:257 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:268 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:227 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:239 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:410 msgid "Replace" msgstr "Nahradit" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:298 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:242 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:267 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:238 #, java-format msgid "Host name {0} is already in address book, unchanged." msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:300 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:244 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:269 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:240 #, java-format msgid "" "Host name {0} is already in address book with a different destination. Click " "\"Replace\" to overwrite." msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:257 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:282 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:253 #, java-format msgid "Destination added for {0}." msgstr "Přídán cíl pro {0}" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:315 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:259 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:284 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:255 #, java-format msgid "Destination changed for {0}." msgstr "Cíl pro {0} změněn." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:317 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:261 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:286 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:257 msgid "Warning - host name does not end with \".i2p\"" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:322 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:269 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:291 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:265 msgid "Invalid Base 64 destination." msgstr "Neplatný cíl ve formátu Base 64." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:328 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:275 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:297 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:271 #, java-format msgid "Invalid host name \"{0}\"." msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:331 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:278 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:300 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:274 msgid "Please enter a host name and destination" msgstr "Prosím vložte jméno hostitele a cíl." #. clear search when deleting -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:335 -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:356 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:282 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:307 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:258 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:325 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:278 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:303 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:274 msgid "Delete Entry" msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:335 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:282 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:334 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:278 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:351 msgid "Delete Selected" msgstr "Zvoleno smazání" #. parameter is a host name -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:349 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:299 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:318 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:295 #, java-format msgid "Destination {0} deleted." msgstr "Cíl {0} byl smazán." #. parameter will always be >= 2 -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:352 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:302 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:321 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:298 #, java-format msgid "1 destination deleted." msgid_plural "{0} destinations deleted." @@ -200,35 +200,35 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:354 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:304 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:323 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:300 msgid "No entries selected to delete." msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:362 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:311 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:331 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:307 msgid "Address book saved." msgstr "" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:365 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:334 msgid "ERROR: Could not write addressbook file." msgstr "" "Chyba: nepodařilo se zapsat do souboru knihy kontaktů. Zkontrolujte " "přístupová práva k souboru a místo na disku." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:370 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:339 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:148 -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:315 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:156 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:311 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:128 msgid "" "Invalid form submission, probably because you used the \"back\" or \"reload" "\" button on your browser. Please resubmit." msgstr "" #: ../src/java/src/i2p/susi/dns/ConfigBean.java:139 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:131 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:103 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:153 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:145 msgid "Save" msgstr "Uložit" @@ -237,9 +237,9 @@ msgid "Configuration saved." msgstr "Nastavení uloženo." #: ../src/java/src/i2p/susi/dns/ConfigBean.java:142 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:150 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:122 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:151 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:143 msgid "Reload" msgstr "" @@ -247,35 +247,35 @@ msgstr "" msgid "Configuration reloaded." msgstr "" -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:105 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:101 #, java-format msgid "{0} address book in {1} database" msgstr "" -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:252 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:248 msgid "Manually added via SusiDNS" msgstr "" -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:266 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:262 #, java-format msgid "Failed to add Destination for {0} to naming service {1}" msgstr "" -#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:290 +#: ../src/java/src/i2p/susi/dns/NamingServiceBean.java:286 #, java-format msgid "Failed to delete Destination for {0} from naming service {1}" msgstr "" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:115 msgid "" "Subscriptions saved, updating addressbook from subscription sources now." msgstr "" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:148 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:120 msgid "Subscriptions saved." msgstr "" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:152 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:124 msgid "Subscriptions reloaded." msgstr "" @@ -283,415 +283,423 @@ msgstr "" msgid "address book" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:143 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:120 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:105 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:121 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:120 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:147 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:125 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:141 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:116 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:132 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:117 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:133 msgid "Overview" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:107 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:127 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:118 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:116 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:119 msgid "Address books" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:109 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:129 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:120 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:118 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:121 msgid "private" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:111 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:131 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:122 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:120 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:123 msgid "master" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:113 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:133 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:124 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:122 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:125 msgid "router" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:115 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:135 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:126 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:124 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:127 msgid "published" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:117 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:143 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:137 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:128 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:126 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:129 msgid "Subscriptions" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141 -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:119 -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105 -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:139 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:128 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:131 msgid "Configuration" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:123 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:149 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:134 msgid "Address book" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:150 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:128 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:154 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:139 msgid "Storage" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:169 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:172 msgid "Filter" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:172 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:175 msgid "other" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:174 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177 msgid "all" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:185 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:191 msgid "Current filter" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:190 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:196 msgid "clear filter" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:201 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:205 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:209 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:213 msgid "Search" msgstr "Hledat" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:238 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:246 msgid "Name" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:240 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:248 msgid "Links" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:242 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:384 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:250 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:250 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:404 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:266 msgid "Destination" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:273 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:286 msgid "Mark for deletion" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:292 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307 msgid "Base 32 address" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:296 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:311 msgid "More information on this entry" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:299 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314 msgid "details" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:332 -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:388 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:349 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:408 msgid "Cancel" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:365 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:383 msgid "This address book is empty." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:378 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:398 msgid "Add new destination" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:380 -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:155 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:400 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:165 msgid "Host Name" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:119 msgid "configuration" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:155 msgid "Hints" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:157 msgid "" "File and directory paths here are relative to the addressbook's working " "directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P" "\\addressbook\\ (Windows)." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:159 msgid "" "If you want to manually add lines to an addressbook, add them to the private " "or master addressbooks." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 msgid "" "The router addressbook and the published addressbook are updated by the " "addressbook application." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162 msgid "" "When you publish your addressbook, ALL destinations from the master and " "router addressbooks appear there." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:163 msgid "" "Use the private addressbook for private destinations, these are not " "published." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:165 msgid "Options" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:167 msgid "File containing the list of subscriptions URLs (no need to change)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:169 msgid "Update interval in hours" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:171 msgid "" "Your public hosts.txt file (choose a path within your webserver document " "root)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:173 msgid "Your hosts.txt (don't change)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:175 msgid "Your personal addressbook, these hosts will be published" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:177 msgid "Your private addressbook, it is never published" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:179 msgid "Port for your eepProxy (no need to change)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:181 msgid "Hostname for your eepProxy (no need to change)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:183 msgid "Whether to update the published addressbook" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:185 msgid "" "File containing the etags header from the fetched subscription URLs (no need " "to change)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:187 msgid "" "File containing the modification timestamp for each fetched subscription URL " "(no need to change)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:170 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:189 msgid "File to log activity to (change to /dev/null if you like)" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:103 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:191 +msgid "Name of the theme to use (defaults to 'light')" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:110 msgid "addressbook" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:171 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:181 msgid "Encoded Name" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:187 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:197 msgid "Base 32 Address" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:197 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:207 +msgid "Base 64 Hash" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:213 msgid "Address Helper" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:204 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:220 msgid "link" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:208 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:224 msgid "Public Key" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:210 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:226 msgid "ElGamal 2048 bit" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:214 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:230 msgid "Signing Key" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:216 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:232 msgid "DSA 1024 bit" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:220 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:236 msgid "Certificate" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:242 msgid "Added Date" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:232 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:248 msgid "Source" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:238 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:254 msgid "Last Modified" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:244 +#: ../src/tmp/i2p/susi/dns/jsp/details_jsp.java:260 msgid "Notes" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:110 msgid "Introduction" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:132 msgid "What is the addressbook?" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:134 msgid "The addressbook application is part of your I2P installation." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:135 msgid "" "It regularly updates your hosts.txt file from distributed sources or " "\"subscriptions\"." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:137 msgid "" "In the default configuration, the address book is only subscribed to www." "i2p2.i2p." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:138 msgid "" "Subscribing to additional sites is easy, just add them to your <a href=" "\"subscriptions\">subscriptions</a> file." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:140 msgid "" "For more information on naming in I2P, see <a href=\"http://www.i2p2.i2p/" "naming.html\">the overview on www.i2p2.i2p</a>." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:142 msgid "How does the addressbook application work?" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:144 msgid "" "The addressbook application regularly polls your subscriptions and merges " "their content into your \"router\" address book." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:145 msgid "" "Then it merges your \"master\" address book into the router address book as " "well." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:146 msgid "" "If configured, the router address book is now written to the \"published\" " "address book, which will be publicly available if you are running an eepsite." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:148 msgid "" "The router also uses a private address book (not shown in the picture), " "which is not merged or published." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:149 msgid "" "Hosts in the private address book can be accessed by you but their addresses " "are never distributed to others." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:150 msgid "" "The private address book can also be used for aliases of hosts in your other " "address books." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:111 msgid "subscriptions" msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:147 msgid "The subscription file contains a list of i2p URLs." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:148 msgid "" "The addressbook application regularly checks this list for new eepsites." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:149 msgid "Those URLs refer to published hosts.txt files." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:150 msgid "" "The default subscription is the hosts.txt from www.i2p2.i2p, which is " "updated infrequently." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:151 msgid "" "So it is a good idea to add additional subscriptions to sites that have the " "latest addresses." msgstr "" -#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:144 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:153 msgid "See the FAQ for a list of subscription URLs." msgstr "" diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp index 61487f8116e4af65f5e08ff6e72f28ef82f881ed..38cc7bf8608ad6c24621120548d8acf8b9cf9696 100644 --- a/apps/susidns/src/jsp/addressbook.jsp +++ b/apps/susidns/src/jsp/addressbook.jsp @@ -202,8 +202,8 @@ ${book.loadBookMessages} </p> </div></form> -<hr> <div id="footer"> +<hr> <p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005</p> </div> </div> diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp index 95e904c3a3f9b5530d3b30cc7c88490c7afcd6d1..d0978416e587a79de12138b0167c65ab9d55e3b1 100644 --- a/apps/susidns/src/jsp/config.jsp +++ b/apps/susidns/src/jsp/config.jsp @@ -134,8 +134,9 @@ <%=intl._("Name of the theme to use (defaults to 'light')")%> </li> </ul> -</div><hr> +</div> <div id="footer"> +<hr> <p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005 </p> </div> </div> diff --git a/apps/susidns/src/jsp/details.jsp b/apps/susidns/src/jsp/details.jsp index 42aa32f86baf056b3367779ea11b75fc0b43a803..59978810e0fec5e5f89f44efd261d5b8842a8b16 100644 --- a/apps/susidns/src/jsp/details.jsp +++ b/apps/susidns/src/jsp/details.jsp @@ -143,8 +143,8 @@ } } %> -<hr> <div id="footer"> +<hr> <p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005</p> </div> </div> diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp index d90a4d76399e3d7590e9f6bd51805675a9cd899a..20bf15104552779f4b81e413058128f671768be8 100644 --- a/apps/susidns/src/jsp/index.jsp +++ b/apps/susidns/src/jsp/index.jsp @@ -88,8 +88,8 @@ </p> <center><img src="/themes/susidns/images/how.png" border="0" alt="address book working scheme" title="How the address book works" class="illustrate" /></center> </div> -<hr> <div id="footer"> +<hr> <p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005</p> </div> </div> diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp index e16a6747361ab3567db2478c5b135499493900a0..b0f66ac7b85df71ab5452dbb7cff0a169844132d 100644 --- a/apps/susidns/src/jsp/subscriptions.jsp +++ b/apps/susidns/src/jsp/subscriptions.jsp @@ -85,8 +85,9 @@ <%=intl._("So it is a good idea to add additional subscriptions to sites that have the latest addresses.")%> <a href="http://www.i2p2.i2p/faq.html#subscriptions"><%=intl._("See the FAQ for a list of subscription URLs.")%></a> </p> -</div><hr> +</div> <div id="footer"> +<hr> <p class="footer">susidns v${version.version} © <a href="${version.url}">susi</a> 2005</p> </div> </div> diff --git a/apps/susimail/locale/messages_cs.po b/apps/susimail/locale/messages_cs.po index c6d7e441a146f86f1c960bbd5f7a2d7ef355ee68..dfcfd60f8d25af60fd2737f04022aeb4b744ce95 100644 --- a/apps/susimail/locale/messages_cs.po +++ b/apps/susimail/locale/messages_cs.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-17 11:41+0000\n" +"POT-Creation-Date: 2012-09-12 11:58+0000\n" "PO-Revision-Date: 2012-02-12 20:53+0000\n" "Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n" "Language-Team: Czech (http://www.transifex.net/projects/p/I2P/language/cs/)\n" @@ -19,150 +19,150 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: src/src/i2p/susi/webmail/WebMail.java:455 +#: src/src/i2p/susi/webmail/WebMail.java:445 msgid "unknown" msgstr "neznámý" -#: src/src/i2p/susi/webmail/WebMail.java:474 +#: src/src/i2p/susi/webmail/WebMail.java:464 msgid "Warning: no transfer encoding found, fallback to 7bit." msgstr "Upozornění: nebylo nalezeno žádné kódování přenosu, použiji 7 bitové" -#: src/src/i2p/susi/webmail/WebMail.java:479 +#: src/src/i2p/susi/webmail/WebMail.java:469 #, java-format msgid "No encoder found for encoding \\''{0}\\''." msgstr "Nebyl nalezen žádný enkodér pro kódování \\''{0}\\''." -#: src/src/i2p/susi/webmail/WebMail.java:485 +#: src/src/i2p/susi/webmail/WebMail.java:475 msgid "Warning: no charset found, fallback to US-ASCII." msgstr "Upozornění: nebyla nalezena žádná znaková sada, použiji US-ASCII" -#: src/src/i2p/susi/webmail/WebMail.java:499 +#: src/src/i2p/susi/webmail/WebMail.java:489 #, java-format msgid "Charset \\''{0}\\'' not supported." msgstr "Znaková sada \\''{0}\\'' není podporována." -#: src/src/i2p/susi/webmail/WebMail.java:503 +#: src/src/i2p/susi/webmail/WebMail.java:493 #, java-format msgid "Part ({0}) not shown, because of {1}" msgstr "Část ({0}) nemohla být zobrazena, protože {1}" -#: src/src/i2p/susi/webmail/WebMail.java:526 +#: src/src/i2p/susi/webmail/WebMail.java:516 msgid "Download" msgstr "Stáhnout" -#: src/src/i2p/susi/webmail/WebMail.java:526 +#: src/src/i2p/susi/webmail/WebMail.java:516 msgid "File is packed into a zipfile for security reasons." msgstr "Soubor je z bezpečnostních důvodů zazipován." -#: src/src/i2p/susi/webmail/WebMail.java:526 +#: src/src/i2p/susi/webmail/WebMail.java:516 #, java-format msgid "attachment ({0})." msgstr "příloha ({0})." -#: src/src/i2p/susi/webmail/WebMail.java:530 +#: src/src/i2p/susi/webmail/WebMail.java:520 #, java-format msgid "Attachment ({0})." msgstr "Příloha ({0})." -#: src/src/i2p/susi/webmail/WebMail.java:580 +#: src/src/i2p/susi/webmail/WebMail.java:570 msgid "Need username for authentication." msgstr "K autentizaci je nutno zadat uživatelské jméno (username)." -#: src/src/i2p/susi/webmail/WebMail.java:584 +#: src/src/i2p/susi/webmail/WebMail.java:574 msgid "Need password for authentication." msgstr "K autentizaci je nutno zadat uživatelské jméno (password)." -#: src/src/i2p/susi/webmail/WebMail.java:588 +#: src/src/i2p/susi/webmail/WebMail.java:578 msgid "Need hostname for connect." msgstr "Pro připojení je nutno zadat jméno hosta (hostname)." -#: src/src/i2p/susi/webmail/WebMail.java:593 +#: src/src/i2p/susi/webmail/WebMail.java:583 msgid "Need port number for pop3 connect." msgstr "Zadejte číslo portu pro POP3." -#: src/src/i2p/susi/webmail/WebMail.java:600 +#: src/src/i2p/susi/webmail/WebMail.java:590 msgid "POP3 port number is not in range 0..65535." msgstr "Číslo portu pro POP3 musí být v rozmezí 0 až 65535." -#: src/src/i2p/susi/webmail/WebMail.java:606 +#: src/src/i2p/susi/webmail/WebMail.java:596 msgid "POP3 port number is invalid." msgstr "Číslo POP3 portu je neplatné." -#: src/src/i2p/susi/webmail/WebMail.java:612 +#: src/src/i2p/susi/webmail/WebMail.java:602 msgid "Need port number for smtp connect." msgstr "Zadejte číslo portup pro smtm." -#: src/src/i2p/susi/webmail/WebMail.java:619 +#: src/src/i2p/susi/webmail/WebMail.java:609 msgid "SMTP port number is not in range 0..65535." msgstr "Číslo portu pro SMTP musí být v rozmezí 0 až 65535." -#: src/src/i2p/susi/webmail/WebMail.java:625 +#: src/src/i2p/susi/webmail/WebMail.java:615 msgid "SMTP port number is invalid." msgstr "Číslo SMTP portu je neplatné." -#: src/src/i2p/susi/webmail/WebMail.java:672 +#: src/src/i2p/susi/webmail/WebMail.java:662 msgid "User logged out." msgstr "Uživatel se odhlásil." -#: src/src/i2p/susi/webmail/WebMail.java:676 +#: src/src/i2p/susi/webmail/WebMail.java:666 msgid "Internal error, lost connection." msgstr "Nastala vnitřní chyba, spojení bylo ztraceno." -#: src/src/i2p/susi/webmail/WebMail.java:772 +#: src/src/i2p/susi/webmail/WebMail.java:762 #, java-format msgid "On {0} {1} wrote:" msgstr "K {0} {1} napsal:" -#: src/src/i2p/susi/webmail/WebMail.java:819 +#: src/src/i2p/susi/webmail/WebMail.java:809 msgid "begin forwarded mail" msgstr "začátek přeposlaného mailu" -#: src/src/i2p/susi/webmail/WebMail.java:841 +#: src/src/i2p/susi/webmail/WebMail.java:831 msgid "end forwarded mail" msgstr "konec přeposlaného mailu" -#: src/src/i2p/susi/webmail/WebMail.java:848 -#: src/src/i2p/susi/webmail/WebMail.java:1720 +#: src/src/i2p/susi/webmail/WebMail.java:838 +#: src/src/i2p/susi/webmail/WebMail.java:1731 msgid "Could not fetch mail body." msgstr "Nepodařilo se načíst obsah mailu." -#: src/src/i2p/susi/webmail/WebMail.java:876 +#: src/src/i2p/susi/webmail/WebMail.java:866 msgid "Message id not valid." msgstr "Identifikátor zprávy není platný." -#: src/src/i2p/susi/webmail/WebMail.java:959 +#: src/src/i2p/susi/webmail/WebMail.java:949 #, java-format msgid "No Encoding found for {0}" msgstr "Nebylo nalezeno kódování pro {0}" -#: src/src/i2p/susi/webmail/WebMail.java:963 +#: src/src/i2p/susi/webmail/WebMail.java:953 #, java-format msgid "Could not encode data: {0}" msgstr "Nezdařilo se překódovat data: {0}" -#: src/src/i2p/susi/webmail/WebMail.java:968 +#: src/src/i2p/susi/webmail/WebMail.java:958 #, java-format msgid "Error reading uploaded file: {0}" msgstr "Chyba při čtení nahraného souboru: {0}" -#: src/src/i2p/susi/webmail/WebMail.java:1046 +#: src/src/i2p/susi/webmail/WebMail.java:1036 msgid "Error parsing download parameter." msgstr "Chyba při zpracování parametru stahování." -#: src/src/i2p/susi/webmail/WebMail.java:1090 +#: src/src/i2p/susi/webmail/WebMail.java:1080 msgid "Invalid pagesize number, resetting to default value." msgstr "Neplatné hodnota velikosti stránky, použiji výchozí hodnotu." -#: src/src/i2p/susi/webmail/WebMail.java:1114 +#: src/src/i2p/susi/webmail/WebMail.java:1104 msgid "No messages marked for deletion." msgstr "Žádné zprávy nebyly označeny k smazání." -#: src/src/i2p/susi/webmail/WebMail.java:1134 +#: src/src/i2p/susi/webmail/WebMail.java:1124 #, java-format msgid "Error deleting message: {0}" msgstr "Chyba při mazání zprávy: {0}" -#: src/src/i2p/susi/webmail/WebMail.java:1145 +#: src/src/i2p/susi/webmail/WebMail.java:1135 #, java-format msgid "1 message deleted." msgid_plural "{0} messages deleted." @@ -170,12 +170,12 @@ msgstr[0] "Počet smazaných zpráv: 1" msgstr[1] "Počet smazaných zpráv: {0}" msgstr[2] "Počet smazaných zpráv: {0}" -#: src/src/i2p/susi/webmail/WebMail.java:1267 -#: src/src/i2p/susi/webmail/WebMail.java:1604 +#: src/src/i2p/susi/webmail/WebMail.java:1278 +#: src/src/i2p/susi/webmail/WebMail.java:1615 msgid "Login" msgstr "Login" -#: src/src/i2p/susi/webmail/WebMail.java:1269 +#: src/src/i2p/susi/webmail/WebMail.java:1280 #, java-format msgid "1 Message" msgid_plural "{0} Messages" @@ -183,197 +183,197 @@ msgstr[0] "zpráv: 1" msgstr[1] "zpráv: {0}" msgstr[2] "zpráv: {0}" -#: src/src/i2p/susi/webmail/WebMail.java:1271 +#: src/src/i2p/susi/webmail/WebMail.java:1282 msgid "Show Message" msgstr "Ukázat zprávu" -#: src/src/i2p/susi/webmail/WebMail.java:1333 +#: src/src/i2p/susi/webmail/WebMail.java:1344 #, java-format msgid "Error decoding content: {0}" msgstr "Chyba při dekódování obsahu: {0}" -#: src/src/i2p/susi/webmail/WebMail.java:1338 +#: src/src/i2p/susi/webmail/WebMail.java:1349 msgid "Error decoding content: No encoder found." msgstr "Chyba při dekódování obsahu: nebyl nalezen žádný enkodér." -#: src/src/i2p/susi/webmail/WebMail.java:1385 +#: src/src/i2p/susi/webmail/WebMail.java:1396 msgid "no subject" msgstr "žádný předmět" -#: src/src/i2p/susi/webmail/WebMail.java:1402 +#: src/src/i2p/susi/webmail/WebMail.java:1413 msgid "Found no valid sender address." msgstr "Nebyla nalezena platná adresa odesílatele." -#: src/src/i2p/susi/webmail/WebMail.java:1408 +#: src/src/i2p/susi/webmail/WebMail.java:1419 #, java-format msgid "Found no valid address in \\''{0}\\''." msgstr "V \\''{0}\\'' nebyla nalezena platná adresa odesílatele." -#: src/src/i2p/susi/webmail/WebMail.java:1427 +#: src/src/i2p/susi/webmail/WebMail.java:1438 msgid "No recipients found." msgstr "Nebyli nalezeni žádní příjemci." -#: src/src/i2p/susi/webmail/WebMail.java:1434 +#: src/src/i2p/susi/webmail/WebMail.java:1445 msgid "Quoted printable encoder not available." msgstr "Enkodér pro tisk není dostupný." -#: src/src/i2p/susi/webmail/WebMail.java:1439 +#: src/src/i2p/susi/webmail/WebMail.java:1450 msgid "Header line encoder not available." msgstr "Není dostupný enkodér " -#: src/src/i2p/susi/webmail/WebMail.java:1490 +#: src/src/i2p/susi/webmail/WebMail.java:1501 msgid "Mail sent." msgstr "Zpráva odeslána." -#: src/src/i2p/susi/webmail/WebMail.java:1529 +#: src/src/i2p/susi/webmail/WebMail.java:1540 msgid "Send" msgstr "Odeslat" -#: src/src/i2p/susi/webmail/WebMail.java:1530 +#: src/src/i2p/susi/webmail/WebMail.java:1541 msgid "Cancel" msgstr "Zrušit" -#: src/src/i2p/susi/webmail/WebMail.java:1531 +#: src/src/i2p/susi/webmail/WebMail.java:1542 msgid "Delete Attachment" msgstr "Smazat přílohu" -#: src/src/i2p/susi/webmail/WebMail.java:1532 -#: src/src/i2p/susi/webmail/WebMail.java:1626 -#: src/src/i2p/susi/webmail/WebMail.java:1707 +#: src/src/i2p/susi/webmail/WebMail.java:1543 +#: src/src/i2p/susi/webmail/WebMail.java:1637 +#: src/src/i2p/susi/webmail/WebMail.java:1718 msgid "Reload Config" msgstr "Opětovně načíst nastavení" -#: src/src/i2p/susi/webmail/WebMail.java:1533 -#: src/src/i2p/susi/webmail/WebMail.java:1627 -#: src/src/i2p/susi/webmail/WebMail.java:1708 +#: src/src/i2p/susi/webmail/WebMail.java:1544 +#: src/src/i2p/susi/webmail/WebMail.java:1638 +#: src/src/i2p/susi/webmail/WebMail.java:1719 msgid "Logout" msgstr "Odhlásit" -#: src/src/i2p/susi/webmail/WebMail.java:1556 -#: src/src/i2p/susi/webmail/WebMail.java:1712 +#: src/src/i2p/susi/webmail/WebMail.java:1567 +#: src/src/i2p/susi/webmail/WebMail.java:1723 msgid "From:" msgstr "Od:" -#: src/src/i2p/susi/webmail/WebMail.java:1557 +#: src/src/i2p/susi/webmail/WebMail.java:1568 msgid "To:" msgstr "Komu:" -#: src/src/i2p/susi/webmail/WebMail.java:1558 +#: src/src/i2p/susi/webmail/WebMail.java:1569 msgid "Cc:" msgstr "Cc:" -#: src/src/i2p/susi/webmail/WebMail.java:1559 +#: src/src/i2p/susi/webmail/WebMail.java:1570 msgid "Bcc:" msgstr "Bcc:" -#: src/src/i2p/susi/webmail/WebMail.java:1560 -#: src/src/i2p/susi/webmail/WebMail.java:1714 +#: src/src/i2p/susi/webmail/WebMail.java:1571 +#: src/src/i2p/susi/webmail/WebMail.java:1725 msgid "Subject:" msgstr "Předmět:" -#: src/src/i2p/susi/webmail/WebMail.java:1561 +#: src/src/i2p/susi/webmail/WebMail.java:1572 msgid "Bcc to self" msgstr "Bcc sobě" -#: src/src/i2p/susi/webmail/WebMail.java:1564 +#: src/src/i2p/susi/webmail/WebMail.java:1575 msgid "New Attachment:" msgstr "Nová příloha" -#: src/src/i2p/susi/webmail/WebMail.java:1564 +#: src/src/i2p/susi/webmail/WebMail.java:1575 msgid "Upload File" msgstr "Nahrát soubor" -#: src/src/i2p/susi/webmail/WebMail.java:1570 +#: src/src/i2p/susi/webmail/WebMail.java:1581 msgid "Attachments:" msgstr "Přílohy" #. current postman hq length limits 16/12, new postman version 32/32 -#: src/src/i2p/susi/webmail/WebMail.java:1593 +#: src/src/i2p/susi/webmail/WebMail.java:1604 msgid "User" msgstr "Uživatel" -#: src/src/i2p/susi/webmail/WebMail.java:1594 +#: src/src/i2p/susi/webmail/WebMail.java:1605 msgid "Password" msgstr "Heslo" -#: src/src/i2p/susi/webmail/WebMail.java:1599 +#: src/src/i2p/susi/webmail/WebMail.java:1610 msgid "Host" msgstr "Host" -#: src/src/i2p/susi/webmail/WebMail.java:1600 +#: src/src/i2p/susi/webmail/WebMail.java:1611 msgid "POP3-Port" msgstr "POP3-Port" -#: src/src/i2p/susi/webmail/WebMail.java:1601 +#: src/src/i2p/susi/webmail/WebMail.java:1612 msgid "SMTP-Port" msgstr "SMTP-Port" -#: src/src/i2p/susi/webmail/WebMail.java:1604 +#: src/src/i2p/susi/webmail/WebMail.java:1615 msgid "Reset" msgstr "Restartovat" -#: src/src/i2p/susi/webmail/WebMail.java:1605 +#: src/src/i2p/susi/webmail/WebMail.java:1616 msgid "Learn about I2P mail" msgstr "Více o I2P mailu" -#: src/src/i2p/susi/webmail/WebMail.java:1606 +#: src/src/i2p/susi/webmail/WebMail.java:1617 msgid "Create Account" msgstr "Vytvořit účet" -#: src/src/i2p/susi/webmail/WebMail.java:1618 +#: src/src/i2p/susi/webmail/WebMail.java:1629 msgid "Really delete the marked messages?" msgstr "Opravdu vymazat označené zprávy?" -#: src/src/i2p/susi/webmail/WebMail.java:1618 +#: src/src/i2p/susi/webmail/WebMail.java:1629 msgid "Yes, really delete them!" msgstr "Ano, chci je opravdu vymazat!" -#: src/src/i2p/susi/webmail/WebMail.java:1620 -#: src/src/i2p/susi/webmail/WebMail.java:1699 +#: src/src/i2p/susi/webmail/WebMail.java:1631 +#: src/src/i2p/susi/webmail/WebMail.java:1710 msgid "New" msgstr "Nová" -#: src/src/i2p/susi/webmail/WebMail.java:1621 -#: src/src/i2p/susi/webmail/WebMail.java:1700 +#: src/src/i2p/susi/webmail/WebMail.java:1632 +#: src/src/i2p/susi/webmail/WebMail.java:1711 msgid "Reply" msgstr "Odpovědět" -#: src/src/i2p/susi/webmail/WebMail.java:1622 -#: src/src/i2p/susi/webmail/WebMail.java:1701 +#: src/src/i2p/susi/webmail/WebMail.java:1633 +#: src/src/i2p/susi/webmail/WebMail.java:1712 msgid "Reply All" msgstr "Odpovědět všem" -#: src/src/i2p/susi/webmail/WebMail.java:1623 -#: src/src/i2p/susi/webmail/WebMail.java:1702 +#: src/src/i2p/susi/webmail/WebMail.java:1634 +#: src/src/i2p/susi/webmail/WebMail.java:1713 msgid "Forward" msgstr "Přeposlat" -#: src/src/i2p/susi/webmail/WebMail.java:1624 -#: src/src/i2p/susi/webmail/WebMail.java:1703 +#: src/src/i2p/susi/webmail/WebMail.java:1635 +#: src/src/i2p/susi/webmail/WebMail.java:1714 msgid "Delete" msgstr "Smazat" -#: src/src/i2p/susi/webmail/WebMail.java:1625 +#: src/src/i2p/susi/webmail/WebMail.java:1636 msgid "Check Mail" msgstr "Zkontrolovat mail" -#: src/src/i2p/susi/webmail/WebMail.java:1629 +#: src/src/i2p/susi/webmail/WebMail.java:1640 msgid "Sender" msgstr "Odesílatel" -#: src/src/i2p/susi/webmail/WebMail.java:1630 +#: src/src/i2p/susi/webmail/WebMail.java:1641 msgid "Subject" msgstr "Předmět" -#: src/src/i2p/susi/webmail/WebMail.java:1631 +#: src/src/i2p/susi/webmail/WebMail.java:1642 msgid "Date" msgstr "Datum" -#: src/src/i2p/susi/webmail/WebMail.java:1632 +#: src/src/i2p/susi/webmail/WebMail.java:1643 msgid "Size" msgstr "Velikost" -#: src/src/i2p/susi/webmail/WebMail.java:1658 +#: src/src/i2p/susi/webmail/WebMail.java:1669 #, java-format msgid "1 Byte" msgid_plural "{0} Bytes" @@ -381,69 +381,69 @@ msgstr[0] "bajtů: 1" msgstr[1] "bajtů: {0}" msgstr[2] "bajtů: {0}" -#: src/src/i2p/susi/webmail/WebMail.java:1663 +#: src/src/i2p/susi/webmail/WebMail.java:1674 msgid "Mark All" msgstr "Označit vše" -#: src/src/i2p/susi/webmail/WebMail.java:1664 +#: src/src/i2p/susi/webmail/WebMail.java:1675 msgid "Invert Selection" msgstr "Invertovat výběr" -#: src/src/i2p/susi/webmail/WebMail.java:1665 +#: src/src/i2p/susi/webmail/WebMail.java:1676 msgid "Clear" msgstr "Smazat" -#: src/src/i2p/susi/webmail/WebMail.java:1668 -#: src/src/i2p/susi/webmail/WebMail.java:1669 +#: src/src/i2p/susi/webmail/WebMail.java:1679 +#: src/src/i2p/susi/webmail/WebMail.java:1680 msgid "First" msgstr "První" -#: src/src/i2p/susi/webmail/WebMail.java:1668 -#: src/src/i2p/susi/webmail/WebMail.java:1669 -#: src/src/i2p/susi/webmail/WebMail.java:1704 +#: src/src/i2p/susi/webmail/WebMail.java:1679 +#: src/src/i2p/susi/webmail/WebMail.java:1680 +#: src/src/i2p/susi/webmail/WebMail.java:1715 msgid "Previous" msgstr "Předchozí" -#: src/src/i2p/susi/webmail/WebMail.java:1670 +#: src/src/i2p/susi/webmail/WebMail.java:1681 #, java-format msgid "Page {0} of {1}" msgstr "Stránka {0}/{1}" -#: src/src/i2p/susi/webmail/WebMail.java:1672 -#: src/src/i2p/susi/webmail/WebMail.java:1673 +#: src/src/i2p/susi/webmail/WebMail.java:1683 +#: src/src/i2p/susi/webmail/WebMail.java:1684 msgid "Last" msgstr "Poslední" -#: src/src/i2p/susi/webmail/WebMail.java:1672 -#: src/src/i2p/susi/webmail/WebMail.java:1673 -#: src/src/i2p/susi/webmail/WebMail.java:1705 +#: src/src/i2p/susi/webmail/WebMail.java:1683 +#: src/src/i2p/susi/webmail/WebMail.java:1684 +#: src/src/i2p/susi/webmail/WebMail.java:1716 msgid "Next" msgstr "Další" -#: src/src/i2p/susi/webmail/WebMail.java:1676 +#: src/src/i2p/susi/webmail/WebMail.java:1687 msgid "Pagesize:" msgstr "Velikost stránky:" -#: src/src/i2p/susi/webmail/WebMail.java:1677 +#: src/src/i2p/susi/webmail/WebMail.java:1688 msgid "Set" msgstr "Nastavit" -#: src/src/i2p/susi/webmail/WebMail.java:1687 +#: src/src/i2p/susi/webmail/WebMail.java:1698 msgid "Really delete this message?" msgstr "Opravdu chcete smazat tuto zprávu?" -#: src/src/i2p/susi/webmail/WebMail.java:1687 +#: src/src/i2p/susi/webmail/WebMail.java:1698 msgid "Yes, really delete it!" msgstr "Ano, opravdu ji chci smazat!" -#: src/src/i2p/susi/webmail/WebMail.java:1706 +#: src/src/i2p/susi/webmail/WebMail.java:1717 msgid "Back to Folder" msgstr "Zpět do složky" -#: src/src/i2p/susi/webmail/WebMail.java:1713 +#: src/src/i2p/susi/webmail/WebMail.java:1724 msgid "Date:" msgstr "Datum:" -#: src/src/i2p/susi/webmail/WebMail.java:1724 +#: src/src/i2p/susi/webmail/WebMail.java:1735 msgid "Could not fetch mail." msgstr "Nepodařilo se stáhnout mail." diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java index 1d2b71eea367622873d92fd1ce6860ead7d83255..6760e058768241356c72068faf5c44823bd4088a 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java @@ -1316,7 +1316,7 @@ public class WebMail extends HttpServlet else if( sessionObject.state == STATE_NEW ) showCompose( out, sessionObject, request ); - out.println( "</form><hr><p class=\"footer\">susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " © 2004-2005 <a href=\"mailto:susi23@mail.i2p\">susi</a></div></body>\n</html>"); + out.println( "</form><div id=\"footer\"><hr><p class=\"footer\">susimail v0." + version +" " + ( RELEASE ? "release" : "development" ) + " © 2004-2005 <a href=\"mailto:susi23@mail.i2p\">susi</a></div></div></body>\n</html>"); out.flush(); } } 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 f966533f3ca5df36ec83a8e539196e030d02e5a6..a6b608d90095d5dd8808b5d7139486b36c8d95b1 100644 --- a/apps/systray/java/src/net/i2p/apps/systray/SysTray.java +++ b/apps/systray/java/src/net/i2p/apps/systray/SysTray.java @@ -49,7 +49,7 @@ public class SysTray implements SysTrayMenuListener { _browserString = _configFile.getProperty("browser", "default"); _portString = _configFile.getProperty("port", "7657"); - _showIcon = Boolean.valueOf(_configFile.getProperty("visible", "true")).booleanValue(); + _showIcon = Boolean.parseBoolean(_configFile.getProperty("visible", "true")); //if (!(new File("router.config")).exists()) // openRouterConsole("http://localhost:" + _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 f93f0876a2cb2479484d33403cc6eeddfa8fa2ea..aeb159aa3baa77c892b217079087f5197c00269b 100644 --- a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java +++ b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java @@ -43,6 +43,32 @@ public class UrlLauncher { private static final int MAX_WAIT_TIME = 5*60*1000; private static final int MAX_TRIES = 99; + /** + * Browsers to try IN-ORDER + */ + private static final String[] BROWSERS = { + // 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. + "sensible-browser", + // another one that opens a preferred browser + "xdg-open", + // Try x-www-browser directly + "x-www-browser", + // general graphical browsers + "defaultbrowser", // puppy linux + "opera -newpage", + "firefox", + "mozilla", + "netscape", + "konqueror", + "galeon", + // Text Mode Browsers only below here + "www-browser", + "links", + "lynx" + }; + /** * Prevent bad user experience by waiting for the server to be there * before launching the browser. @@ -156,7 +182,7 @@ public class UrlLauncher { if (bufferedReader != null) try { bufferedReader.close(); } catch (IOException ioe) {} } - if (_shellCommand.executeSilentAndWaitTimed(browserString + " " + url, 5)) + if (_shellCommand.executeSilentAndWaitTimed(browserString + ' ' + url, 5)) return true; } else { @@ -164,48 +190,10 @@ 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; - - if (_shellCommand.executeSilentAndWaitTimed("firefox " + url, 5)) - return true; - - if (_shellCommand.executeSilentAndWaitTimed("mozilla " + url, 5)) - return true; - - if (_shellCommand.executeSilentAndWaitTimed("netscape " + url, 5)) - return true; - - if (_shellCommand.executeSilentAndWaitTimed("konqueror " + url, 5)) - return true; - - 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; - - if (_shellCommand.executeSilentAndWaitTimed("lynx " + url, 5)) - return true; - + for (int i = 0; i < BROWSERS.length; i++) { + if (_shellCommand.executeSilentAndWaitTimed(BROWSERS[i] + ' ' + url, 5)) + return true; + } } return false; } diff --git a/build.properties b/build.properties index 68df584f3d23708fa72468c4d6b1fff8884fbecf..1850622730ce722f179f7d263e29a2e41e2d7337 100644 --- a/build.properties +++ b/build.properties @@ -30,7 +30,7 @@ build.built-by=unknown require.gettext=true # Additional classpath if required -#javac.classpathe=/PATH/TO/pack200.jar +#javac.classpath=/PATH/TO/pack200.jar # Optional compiler args # This one keeps gcj a lot quieter diff --git a/build.xml b/build.xml index d0555659aeeca7e1dad1267f83de1ff6039ec86c..c819e242cb4b47d2692801239951b40c246081e9 100644 --- a/build.xml +++ b/build.xml @@ -981,18 +981,22 @@ <target name="pack200"> <!-- pack200 will only pack to a .pack file, and only from a .jar file, so we put another .jar on the end --> + <!-- can't pack an empty jar or one without classes, it will fail to unpack on Java 5; + - see http://bugs.sun.com/view_bug.do?bug_id=6712743 + --> <!-- *nix here --> <exec executable="sh" osfamily="unix" failonerror="true"> <arg value="-c" /> - <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" /> + <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do if [ $i = pkg-temp/lib/jasper-compiler.jar -o $i = pkg-temp/lib/jbigi.jar ]; then continue; fi; echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" /> </exec> <exec executable="sh" osfamily="mac" failonerror="true"> <arg value="-c" /> - <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" /> + <arg value="for i in pkg-temp/lib/*.jar pkg-temp/webapps/*war; do if [ $i = pkg-temp/lib/jasper-compiler.jar -o $i = pkg-temp/lib/jbigi.jar ]; then continue; fi; echo pack200 $i; mv $i $i.jar; pack200 -g $i.pack $i.jar; rm -f $i.jar; done" /> </exec> <!-- windoz here : i admit, i hate escaped symbols in xml, indeed = =! --> <exec executable="cmd" osfamily="windows" failonerror="true"> <arg value="/c" /> + <!-- TODO implement fix above --> <arg value="for %i in (pkg-temp\webapps\*.war) do move %i %i.jar && pack200 -g pkg-temp\webapps\%~ni.war.pack %i.jar && del %i.jar" /> </exec> <exec executable="cmd" osfamily="windows" failonerror="true"> diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java index 2c59dcfd1fa4f52df49128cbfbe42af3328e27f4..b295c3ac134cb1e69df0b8d953ca8c800b90f371 100644 --- a/core/java/src/freenet/support/CPUInformation/CPUID.java +++ b/core/java/src/freenet/support/CPUInformation/CPUID.java @@ -260,7 +260,7 @@ public class CPUID { private static final void loadNative() { try{ String wantedProp = System.getProperty("jcpuid.enable", "true"); - boolean wantNative = Boolean.valueOf(wantedProp).booleanValue(); + boolean wantNative = Boolean.parseBoolean(wantedProp); if (wantNative) { boolean loaded = loadGeneric(); if (loaded) { diff --git a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java index 46e994695da8676803e6436d713e6dac58218276..1a2ec48921aa18b2719705609b12896681512ae3 100644 --- a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java +++ b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.concurrent.LinkedBlockingQueue; import net.i2p.I2PAppContext; +import net.i2p.util.I2PThread; import net.i2p.util.Log; /** @@ -53,7 +54,7 @@ public class AsyncFortunaStandalone extends FortunaStandalone implements Runnabl for (int i = 0; i < _bufferCount; i++) _emptyBuffers.offer(new AsyncBuffer(_bufferSize)); _isRunning = true; - _refillThread = new Thread(this, "PRNG"); + _refillThread = new I2PThread(this, "PRNG"); _refillThread.setDaemon(true); _refillThread.setPriority(Thread.MIN_PRIORITY+1); _refillThread.start(); diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 968bed9d39003a7311d875f11ba496e6423601bd..33be4db7098c9b442b1fc746141e09755a599447 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -16,7 +16,7 @@ package net.i2p; public class CoreVersion { /** deprecated */ public final static String ID = "Monotone"; - public final static String VERSION = "0.9.1"; + public final static String VERSION = "0.9.2"; 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 be42467f459f7ea4e019ef575beda34f2e252cb1..bd1085f180ab1e02de137ab6867f9468432a1a7e 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -64,7 +64,7 @@ import net.i2p.util.I2PProperties.I2PPropertyCallback; * contexts should build their own context as soon as possible (within the main(..)) * so that any referenced components will latch on to that context instead of * instantiating a new one. However, there are situations in which both can be - * relevent. + * relevant. * */ public class I2PAppContext { @@ -113,13 +113,13 @@ public class I2PAppContext { private volatile boolean _simpleTimerInitialized; private volatile boolean _simpleTimer2Initialized; protected final Set<Runnable> _shutdownTasks; - private File _baseDir; - private File _configDir; - private File _routerDir; - private File _pidDir; - private File _logDir; - private File _appDir; - private File _tmpDir; + private final File _baseDir; + private final File _configDir; + private final File _routerDir; + private final File _pidDir; + private final File _logDir; + private final File _appDir; + private volatile File _tmpDir; // split up big lock on this to avoid deadlocks private final Object _lock1 = new Object(), _lock2 = new Object(), _lock3 = new Object(), _lock4 = new Object(), _lock5 = new Object(), _lock6 = new Object(), _lock7 = new Object(), _lock8 = new Object(), @@ -196,25 +196,14 @@ public class I2PAppContext { * Will only apply if there is no global context now. */ private I2PAppContext(boolean doInit, Properties envProps) { - if (doInit) { - synchronized (I2PAppContext.class) { - if (_globalAppContext == null) { - _globalAppContext = this; - } else { - System.out.println("Warning - New context not replacing old one, you now have a second one"); - (new Exception("I did it")).printStackTrace(); - } - } - } + synchronized (I2PAppContext.class) { _overrideProps = new I2PProperties(); if (envProps != null) _overrideProps.putAll(envProps); _shutdownTasks = new ConcurrentHashSet(32); - initializeDirs(); _portMapper = new PortMapper(this); - } - /** + /* * Directories. These are all set at instantiation and will not be changed by * subsequent property changes. * All properties, if set, should be absolute paths. @@ -259,7 +248,7 @@ public class I2PAppContext { * All dirs except the base are created if they don't exist, but the creation will fail silently. * @since 0.7.6 */ - private void initializeDirs() { + String s = getProperty("i2p.dir.base", System.getProperty("user.dir")); _baseDir = new File(s); @@ -321,6 +310,16 @@ public class I2PAppContext { System.err.println("PID directory: " + _pidDir.getAbsolutePath()); System.err.println("Temp directory: " + getTempDir().getAbsolutePath()); ******/ + + if (doInit) { + if (_globalAppContext == null) { + _globalAppContext = this; + } else { + System.out.println("Warning - New context not replacing old one, you now have a second one"); + (new Exception("I did it")).printStackTrace(); + } + } + } // synch } /** @@ -707,6 +706,9 @@ public class I2PAppContext { * There is absolutely no good reason to make this context specific, * other than for consistency, and perhaps later we'll want to * include some stats. + * + * DEPRECATED - non-standard and used only by SSU. + * To be moved from context to SSU. */ public HMACGenerator hmac() { if (!_hmacInitialized) diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java index 598ddf1f90f244c9130c7d3455b2ee859c399724..661ea2fff3f935904a3f40b8d0c0209ab205c8e3 100644 --- a/core/java/src/net/i2p/client/I2PSession.java +++ b/core/java/src/net/i2p/client/I2PSession.java @@ -278,7 +278,7 @@ public interface I2PSession { /** * A raw (unsigned) datagram - * @since 0.9.1 + * @since 0.9.2 */ public static final int PROTO_DATAGRAM_RAW = 18; } diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java index c3b993e4af08cf94e65414c1224043d46aee22aa..69fc300788b288bb2bf6608808630bf621234ed9 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl.java +++ b/core/java/src/net/i2p/client/I2PSessionImpl.java @@ -219,7 +219,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa // auto-add auth if required, not set in the options, and we are not in the same JVM if ((!_context.isRouterContext()) && - Boolean.valueOf(_context.getProperty("i2cp.auth")).booleanValue() && + _context.getBooleanProperty("i2cp.auth") && ((!options.containsKey("i2cp.username")) || (!options.containsKey("i2cp.password")))) { String configUser = _context.getProperty("i2cp.username"); String configPW = _context.getProperty("i2cp.password"); @@ -349,7 +349,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa _queue = mgr.connect(); _reader = new QueuedI2CPMessageReader(_queue, this); } else { - if (Boolean.valueOf(_options.getProperty(PROP_ENABLE_SSL)).booleanValue()) + if (Boolean.parseBoolean(_options.getProperty(PROP_ENABLE_SSL))) _socket = I2CPSSLSocketFactory.createSocket(_context, _hostname, _portNum); else _socket = new Socket(_hostname, _portNum); @@ -976,8 +976,8 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa private void startIdleMonitor() { _isReduced = false; - boolean reduce = Boolean.valueOf(_options.getProperty("i2cp.reduceOnIdle")).booleanValue(); - boolean close = Boolean.valueOf(_options.getProperty("i2cp.closeOnIdle")).booleanValue(); + boolean reduce = Boolean.parseBoolean(_options.getProperty("i2cp.reduceOnIdle")); + boolean close = Boolean.parseBoolean(_options.getProperty("i2cp.closeOnIdle")); if (reduce || close) { updateActivity(); _context.simpleScheduler().addEvent(new SessionIdleTimer(_context, this, reduce, close), SessionIdleTimer.MINIMUM_TIME); diff --git a/core/java/src/net/i2p/client/I2PSessionImpl2.java b/core/java/src/net/i2p/client/I2PSessionImpl2.java index 02371eea3478222a513094219990e1f2e84ff98b..a71d7f0997e08fedd4f181a06593017396c77b5d 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl2.java +++ b/core/java/src/net/i2p/client/I2PSessionImpl2.java @@ -111,7 +111,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { return false; String p = getOptions().getProperty("i2cp.gzip"); if (p != null) - return Boolean.valueOf(p).booleanValue(); + return Boolean.parseBoolean(p); return SHOULD_COMPRESS; } diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/I2PSimpleSession.java index 2ada1c26f4c591628ca5de45b171af534b503e78..9962c325d7df13d346416297bfc6443e65e13e5d 100644 --- a/core/java/src/net/i2p/client/I2PSimpleSession.java +++ b/core/java/src/net/i2p/client/I2PSimpleSession.java @@ -63,7 +63,7 @@ class I2PSimpleSession extends I2PSessionImpl2 { _queue = mgr.connect(); _reader = new QueuedI2CPMessageReader(_queue, this); } else { - if (Boolean.valueOf(getOptions().getProperty(PROP_ENABLE_SSL)).booleanValue()) + if (Boolean.parseBoolean(getOptions().getProperty(PROP_ENABLE_SSL))) _socket = I2CPSSLSocketFactory.createSocket(_context, _hostname, _portNum); else _socket = new Socket(_hostname, _portNum); diff --git a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java index cf4dfb604c4688d21a9bcdd85b472e062f39ecf0..30d8e61870a62f8e6e6b13c53a1d321c29dee798 100644 --- a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java +++ b/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java @@ -74,7 +74,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.parseBoolean(session.getOptions().getProperty("i2cp.encryptLeaseSet")); String sk = session.getOptions().getProperty("i2cp.leaseSetKey"); if (encrypt && sk != null) { SessionKey key = new SessionKey(); diff --git a/core/java/src/net/i2p/crypto/DSAEngine.java b/core/java/src/net/i2p/crypto/DSAEngine.java index e26031fd761829c2145a0b08f29896ca3f3ed83a..62e2e6384a57322ae58b58088b988ff9bbc0e711 100644 --- a/core/java/src/net/i2p/crypto/DSAEngine.java +++ b/core/java/src/net/i2p/crypto/DSAEngine.java @@ -311,6 +311,7 @@ public class DSAEngine { * Reads the stream until EOF. Does not close the stream. * * @return hash SHA-1 hash, NOT a SHA-256 hash + * @deprecated unused */ public SHA1Hash calculateHash(InputStream in) { MessageDigest digest = SHA1.getInstance(); diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java index e5f9a346674bb76f103d63594f7536badbbead82..2f9e04b36bfcb217cfed8f84d0cee43adaeab04e 100644 --- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java +++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java @@ -744,7 +744,7 @@ public class TransientSessionKeyManager extends SessionKeyManager { total += size; buf.append("<li><b>ID: ").append(ts.getID()) .append(" Received:</b> ").append(DataHelper.formatDuration2(now - ts.getDate())).append(" ago with "); - buf.append(size).append(" tags remaining</li>"); + buf.append(size).append('/').append(ts.getOriginalSize()).append(" tags remaining</li>"); } buf.append("</ul></td></tr>\n"); out.write(buf.toString()); @@ -774,7 +774,7 @@ public class TransientSessionKeyManager extends SessionKeyManager { total += size; buf.append("<li><b>ID: ").append(ts.getID()) .append(" Sent:</b> ").append(DataHelper.formatDuration2(now - ts.getDate())).append(" ago with "); - buf.append(size).append(" tags remaining; acked? ").append(ts.getAcked()).append("</li>"); + buf.append(size).append('/').append(ts.getOriginalSize()).append(" tags remaining; acked? ").append(ts.getAcked()).append("</li>"); } buf.append("</ul></td></tr>\n"); out.write(buf.toString()); @@ -1084,6 +1084,7 @@ public class TransientSessionKeyManager extends SessionKeyManager { private final SessionKey _key; private final long _date; private final int _id; + private final int _origSize; //private Exception _createdBy; /** did we get an ack for this tagset? Only for outbound tagsets */ private boolean _acked; @@ -1095,6 +1096,7 @@ public class TransientSessionKeyManager extends SessionKeyManager { _key = key; _date = date; _id = id; + _origSize = tags.size(); //if (true) { // long now = I2PAppContext.getGlobalContext().clock().now(); // _createdBy = new Exception("Created by: key=" + _key.toBase64() + " on " @@ -1108,6 +1110,11 @@ public class TransientSessionKeyManager extends SessionKeyManager { return _date; } + /** @since 0.9.3 for debugging */ + public long getOriginalSize() { + return _origSize; + } + //void setDate(long when) { // _date = when; //} diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 2a6aca2bfd318c23b9aea25bfcc6ad6c98162247..04ec793fd2ba3b00516d8dc09862f7792857a3a8 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -77,6 +77,7 @@ public class DataHelper { "ihost2", "iport2", "ikey2", "itag2", // RouterInfo options "caps", "coreVersion", "netId", "router.version", + "netdb.knownLeaseSets", "netdb.knownRouters", "stat_bandwidthReceiveBps.60m", "stat_bandwidthSendBps.60m", "stat_tunnel.buildClientExpire.60m", @@ -388,8 +389,6 @@ public class DataHelper { * - Leading whitespace is not trimmed * - '=' is the only key-termination character (not ':' or whitespace) * - * Note that the escaping of \r or \n was probably a mistake and should be taken out. - * */ public static void loadProps(Properties props, File file) throws IOException { loadProps(props, file, false); @@ -448,20 +447,40 @@ public class DataHelper { * Writes the props to the file, unsorted (unless props is an OrderedProperties) * Note that this does not escape the \r or \n that are unescaped in loadProps() above. * As of 0.8.1, file will be mode 600. + * + * Leading or trailing whitespace in values is not checked but + * will be trimmed by loadProps() + * + * @throws IllegalArgumentException if a key contains any of "#=\n" or starts with ';', + * or a value contains '#' or '\n' */ public static void storeProps(Properties props, File file) throws IOException { PrintWriter out = null; + IllegalArgumentException iae = null; try { out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8"))); out.println("# NOTE: This I2P config file must use UTF-8 encoding"); for (Map.Entry entry : props.entrySet()) { String name = (String) entry.getKey(); String val = (String) entry.getValue(); + if (name.contains("#") || + name.contains("=") || + name.contains("\n") || + name.startsWith(";") || + val.contains("#") || + val.contains("\n")) { + if (iae == null) + iae = new IllegalArgumentException("Invalid character (one of \"#;=\\n\") in key or value: \"" + + name + "\" = \"" + val + '\"'); + continue; + } out.println(name + "=" + val); } } finally { if (out != null) out.close(); } + if (iae != null) + throw iae; } /** diff --git a/core/java/src/net/i2p/data/Hash.java b/core/java/src/net/i2p/data/Hash.java index a0f63459a3380772be333589d525afd95d933522..add8235a6aa8a9456c4b67b62e06e724898109c2 100644 --- a/core/java/src/net/i2p/data/Hash.java +++ b/core/java/src/net/i2p/data/Hash.java @@ -30,6 +30,7 @@ public class Hash extends SimpleDataStructure { /** * Pull from cache or return new + * @throws IllegalArgumentException if data is not the correct number of bytes * @since 0.8.3 */ public static Hash create(byte[] data) { @@ -38,6 +39,7 @@ public class Hash extends SimpleDataStructure { /** * Pull from cache or return new + * @throws AIOOBE if not enough bytes * @since 0.8.3 */ public static Hash create(byte[] data, int off) { diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java index b38d5f6a057802d456a1dd85f60e0a6d7265caad..9f980716f5be68f354be8a91c8661b824673a882 100644 --- a/core/java/src/net/i2p/data/RouterInfo.java +++ b/core/java/src/net/i2p/data/RouterInfo.java @@ -637,7 +637,8 @@ public class RouterInfo extends DatabaseEntry { } /** - * Print out routerinfos from files specified on the command line + * Print out routerinfos from files specified on the command line. + * Exits 1 if any RI is invalid, fails signature, etc. * @since 0.8 */ public static void main(String[] args) { @@ -645,23 +646,29 @@ public class RouterInfo extends DatabaseEntry { System.err.println("Usage: RouterInfo file ..."); System.exit(1); } + boolean fail = false; for (int i = 0; i < args.length; i++) { RouterInfo ri = new RouterInfo(); InputStream is = null; try { is = new java.io.FileInputStream(args[i]); ri.readBytes(is); - if (ri.isValid()) + if (ri.isValid()) { System.out.println(ri.toString()); - else + } else { System.err.println("Router info " + args[i] + " is invalid"); + fail = true; + } } catch (Exception e) { System.err.println("Error reading " + args[i] + ": " + e); + fail = true; } finally { if (is != null) { try { is.close(); } catch (IOException ioe) {} } } } + if (fail) + System.exit(1); } } diff --git a/core/java/src/net/i2p/util/Addresses.java b/core/java/src/net/i2p/util/Addresses.java index c9c5a5e87cba4b516a236371c529694bce661a59..c824c5f7d063c6f18f54be4f4cb2dc30cad3db04 100644 --- a/core/java/src/net/i2p/util/Addresses.java +++ b/core/java/src/net/i2p/util/Addresses.java @@ -10,7 +10,6 @@ import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; -import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.SortedSet; @@ -154,6 +153,26 @@ public abstract class Addresses { return "(bad IP length " + addr.length + "):" + port; } } + + /** + * Convenience method to convert and validate a port String + * without throwing an exception. + * Does not trim. + * + * @return 1-65535 or 0 if invalid + * @since 0.9.3 + */ + public static int getPort(String port) { + int rv = 0; + if (port != null) { + try { + int iport = Integer.parseInt(port); + if (iport > 0 && iport <= 65535) + rv = iport; + } catch (NumberFormatException nfe) {} + } + return rv; + } /** * Textual IP to bytes, because InetAddress.getByName() is slow. @@ -184,6 +203,9 @@ public abstract class Addresses { * Caches numeric host names only. * Will resolve but not cache DNS host names. * + * Unlike InetAddress.getByName(), we do NOT allow numeric IPs + * of the form d.d.d, d.d, or d, as these are almost certainly mistakes. + * * @param host DNS or IPv4 or IPv6 host name; if null returns null * @return IP or null * @since 0.9.3 @@ -197,8 +219,11 @@ public abstract class Addresses { } if (rv == null) { try { + boolean isIPv4 = host.replaceAll("[0-9\\.]", "").length() == 0; + if (isIPv4 && host.replaceAll("[0-9]", "").length() != 3) + return null; rv = InetAddress.getByName(host).getAddress(); - if (host.replaceAll("[0-9\\.]", "").length() == 0 || + if (isIPv4 || host.replaceAll("[0-9a-fA-F:]", "").length() == 0) { synchronized (_IPAddress) { _IPAddress.put(host, rv); diff --git a/core/java/src/net/i2p/util/ConvertToHash.java b/core/java/src/net/i2p/util/ConvertToHash.java index 182ae7cfaa3c16f5ca44d8c7bf4a5f4c7d4e3aaf..f1d9d9db6f9d758c71799184d10a171117632fdb 100644 --- a/core/java/src/net/i2p/util/ConvertToHash.java +++ b/core/java/src/net/i2p/util/ConvertToHash.java @@ -4,6 +4,7 @@ import java.util.Locale; import net.i2p.I2PAppContext; import net.i2p.data.Base32; +import net.i2p.data.Base64; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -14,6 +15,7 @@ import net.i2p.data.Hash; * Base64 dest * Base64 dest.i2p * Base64 Hash + * Base64 Hash.i2p * Base32 Hash * Base32 desthash.b32.i2p * example.i2p @@ -30,52 +32,54 @@ public class ConvertToHash { public static Hash getHash(String peer) { if (peer == null) return null; - Hash h = new Hash(); String peerLC = peer.toLowerCase(Locale.US); // b64 hash if (peer.length() == 44 && !peerLC.endsWith(".i2p")) { - try { - h.fromBase64(peer); - } catch (DataFormatException dfe) {} + byte[] b = Base64.decode(peer); + if (b != null && b.length == Hash.HASH_LENGTH) + return Hash.create(b); + } + // b64 hash.i2p + if (peer.length() == 48 && peerLC.endsWith(".i2p")) { + byte[] b = Base64.decode(peer.substring(0, 44)); + if (b != null && b.length == Hash.HASH_LENGTH) + return Hash.create(b); } // b64 dest.i2p - if (h.getData() == null && peer.length() >= 520 && peerLC.endsWith(".i2p")) { + if (peer.length() >= 520 && peerLC.endsWith(".i2p")) { try { Destination d = new Destination(); d.fromBase64(peer.substring(0, peer.length() - 4)); - h = d.calculateHash(); + return d.calculateHash(); } catch (DataFormatException dfe) {} } // b64 dest - if (h.getData() == null && peer.length() >= 516 && !peerLC.endsWith(".i2p")) { + if (peer.length() >= 516 && !peerLC.endsWith(".i2p")) { try { Destination d = new Destination(); d.fromBase64(peer); - h = d.calculateHash(); + return 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")) { + if (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); + return Hash.create(b); } // b32 hash - if (h.getData() == null && peer.length() == 52 && !peerLC.endsWith(".i2p")) { + if (peer.length() == 52 && !peerLC.endsWith(".i2p")) { byte[] b = Base32.decode(peer); if (b != null && b.length == Hash.HASH_LENGTH) - h.setData(b); + return Hash.create(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; + Destination d = I2PAppContext.getGlobalContext().namingService().lookup(peer); + if (d != null) + return d.calculateHash(); + + return null; } } diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index 689b046f92832a1aad85c7b7b90e87061e4489c8..f2f3e6dc240ef058e5ad389809e7976de5df8d39 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -66,7 +66,7 @@ public class LogManager { //public final static String DEFAULT_DATEFORMAT = "HH:mm:ss.SSS"; /** blank means default short date and medium time for the locale - see DateFormat */ public final static String DEFAULT_DATEFORMAT = ""; - public final static String DEFAULT_FILENAME = "logs/log-#.txt"; + public final static String DEFAULT_FILENAME = "logs/log-@.txt"; public final static String DEFAULT_FILESIZE = "10m"; public final static boolean DEFAULT_DISPLAYONSCREEN = true; public final static int DEFAULT_CONSOLEBUFFERSIZE = 20; @@ -159,8 +159,8 @@ public class LogManager { if (_writer != null) return; _writer = new LogWriter(this); - // NOT an I2PThread, as it contains logging and we end up with problems - Thread t = new Thread(_writer, "LogWriter"); + // if you enable logging in I2PThread again, you MUST change this back to Thread + Thread t = new I2PThread(_writer, "LogWriter"); t.setDaemon(true); t.start(); } @@ -349,9 +349,9 @@ public class LogManager { String filenameOverride = _context.getProperty(FILENAME_OVERRIDE_PROP); if (filenameOverride != null) - _baseLogfilename = filenameOverride; + setBaseLogfilename(filenameOverride); else - _baseLogfilename = config.getProperty(PROP_FILENAME, DEFAULT_FILENAME); + setBaseLogfilename(config.getProperty(PROP_FILENAME, DEFAULT_FILENAME)); _fileSize = getFileSize(config.getProperty(PROP_FILESIZE, DEFAULT_FILESIZE)); _rotationLimit = -1; @@ -591,7 +591,8 @@ public class LogManager { } public void setBaseLogfilename(String filenamePattern) { - _baseLogfilename = filenamePattern; + // '#' is a comment character in loadProps/storeProps + _baseLogfilename = filenamePattern.replace('#', '@'); } public int getFileSize() { @@ -692,18 +693,30 @@ public class LogManager { } *****/ - public void shutdown() { + /** + * Flush any pending records to disk. + * Blocking up to 250 ms. + * @since 0.9.3 + */ + public void flush() { if (_writer != null) { - //_log.log(Log.WARN, "Shutting down logger"); - // try to prevent out-of-order logging at shutdown - synchronized (_writer) { - _writer.notifyAll(); - } - if (!_records.isEmpty()) { + int i = 50; + while ((!_records.isEmpty()) && i-- > 0) { + synchronized (_writer) { + _writer.notifyAll(); + } try { - Thread.sleep(250); + Thread.sleep(5); } catch (InterruptedException ie) {} } + } + } + + public void shutdown() { + if (_writer != null) { + //_log.log(Log.WARN, "Shutting down logger"); + // try to prevent out-of-order logging at shutdown + flush(); // this could generate out-of-order messages _writer.flushRecords(false); _writer.stopWriting(); diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java index a8e8329d847106b346c48f85ce212c8fba6c1025..c3cc0170e9c6637aeaddf97ba6b1b7dc45ae2f54 100644 --- a/core/java/src/net/i2p/util/LogWriter.java +++ b/core/java/src/net/i2p/util/LogWriter.java @@ -81,15 +81,18 @@ class LogWriter implements Runnable { dupCount++; } else { if (dupCount > 0) { - writeRecord(dupMessage(dupCount, last)); + writeRecord(dupMessage(dupCount, last, false)); + _manager.getBuffer().add(dupMessage(dupCount, last, true)); dupCount = 0; } writeRecord(rec); } last = rec; } - if (dupCount > 0) - writeRecord(dupMessage(dupCount, last)); + if (dupCount > 0) { + writeRecord(dupMessage(dupCount, last, false)); + _manager.getBuffer().add(dupMessage(dupCount, last, true)); + } try { if (_currentOut != null) _currentOut.flush(); @@ -113,12 +116,13 @@ class LogWriter implements Runnable { } /** - * Write a msg with the date stamp of the last duplicate + * Return a msg with the date stamp of the last duplicate * @since 0.9.3 */ - private String dupMessage(int dupCount, LogRecord lastRecord) { - return LogRecordFormatter.getWhen(_manager, lastRecord) + " ^^^ " + - _(dupCount, "1 similar message omitted", "{0} similar messages omitted") + " ^^^\n"; + private String dupMessage(int dupCount, LogRecord lastRecord, boolean reverse) { + String arrows = reverse ? "↓↓↓" : "^^^"; + return LogRecordFormatter.getWhen(_manager, lastRecord) + ' ' + arrows + ' ' + + _(dupCount, "1 similar message omitted", "{0} similar messages omitted") + ' ' + arrows + '\n'; } private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; diff --git a/core/java/src/net/i2p/util/NativeBigInteger.java b/core/java/src/net/i2p/util/NativeBigInteger.java index e1a5c0bbc4c3113bb9018d546cae46ed003d3d58..5b03d687ac4bfe71a8be2667f34f483b6016588c 100644 --- a/core/java/src/net/i2p/util/NativeBigInteger.java +++ b/core/java/src/net/i2p/util/NativeBigInteger.java @@ -449,7 +449,7 @@ public class NativeBigInteger extends BigInteger { private static final void loadNative() { try{ String wantedProp = System.getProperty("jbigi.enable", "true"); - boolean wantNative = Boolean.valueOf(wantedProp).booleanValue(); + boolean wantNative = Boolean.parseBoolean(wantedProp); if (wantNative) { debug("trying loadGeneric"); boolean loaded = loadGeneric("jbigi"); diff --git a/core/java/src/net/i2p/util/SimpleByteCache.java b/core/java/src/net/i2p/util/SimpleByteCache.java index b41f9ad9b5bf87acedd4aebd7ad8d591b262732f..1623fcb14840359f0ee1f818dcadb2a27f4541fe 100644 --- a/core/java/src/net/i2p/util/SimpleByteCache.java +++ b/core/java/src/net/i2p/util/SimpleByteCache.java @@ -16,7 +16,7 @@ import java.util.concurrent.LinkedBlockingQueue; */ public final class SimpleByteCache { - private static final Map<Integer, SimpleByteCache> _caches = new ConcurrentHashMap(8); + private static final ConcurrentHashMap<Integer, SimpleByteCache> _caches = new ConcurrentHashMap(8); private static final int DEFAULT_SIZE = 64; @@ -45,7 +45,9 @@ public final class SimpleByteCache { SimpleByteCache cache = _caches.get(sz); if (cache == null) { cache = new SimpleByteCache(cacheSize, size); - _caches.put(sz, cache); + SimpleByteCache old = _caches.putIfAbsent(sz, cache); + if (old != null) + cache = old; } cache.resize(cacheSize); return cache; @@ -86,7 +88,7 @@ public final class SimpleByteCache { * @since 0.9.2 */ private Queue<byte[]> createQueue() { - if (_maxCached <= MAX_FOR_ABQ) + if (_entrySize <= MAX_FOR_ABQ) return new ArrayBlockingQueue(_maxCached); return new LinkedBlockingQueue(_maxCached); } diff --git a/core/java/src/net/i2p/util/SocketTimeout.java b/core/java/src/net/i2p/util/SocketTimeout.java index 3a8f57400b3713c028a45c1a3a18ba52857c4ce0..e5c02d5c9713e2cf96f83d895814c5650aa329fd 100644 --- a/core/java/src/net/i2p/util/SocketTimeout.java +++ b/core/java/src/net/i2p/util/SocketTimeout.java @@ -7,7 +7,7 @@ import java.util.Date; /** * This should be deprecated. - * It is only used by EepGet, and it uses the inefficient SimpleTimer. + * It is only used by EepGet. * The only advantage seems to be a total timeout period, which is the second * argument to EepGet.fetch(headerTimeout, totalTimeout, inactivityTimeout), * which is most likely always set to -1. @@ -15,14 +15,16 @@ import java.util.Date; * Use socket.setsotimeout instead? */ public class SocketTimeout extends SimpleTimer2.TimedEvent { - private Socket _targetSocket; - private long _startTime; - private long _inactivityDelay; - private long _lastActivity; - private long _totalTimeoutTime; - private boolean _cancelled; - private Runnable _command; + private volatile Socket _targetSocket; + private final long _startTime; + private volatile long _inactivityDelay; + private volatile long _lastActivity; + private volatile long _totalTimeoutTime; + private volatile boolean _cancelled; + private volatile Runnable _command; + public SocketTimeout(long delay) { this(null, delay); } + public SocketTimeout(Socket socket, long delay) { super(SimpleTimer2.getInstance()); _inactivityDelay = delay; @@ -32,6 +34,7 @@ public class SocketTimeout extends SimpleTimer2.TimedEvent { _totalTimeoutTime = -1; schedule(delay); } + public void timeReached() { if (_cancelled) return; @@ -53,25 +56,29 @@ public class SocketTimeout extends SimpleTimer2.TimedEvent { _cancelled = true; return super.cancel(); } + public void setSocket(Socket s) { _targetSocket = s; } public void resetTimer() { _lastActivity = System.currentTimeMillis(); } public void setInactivityTimeout(long timeout) { _inactivityDelay = timeout; } + public void setTotalTimeoutPeriod(long timeoutPeriod) { if (timeoutPeriod > 0) _totalTimeoutTime = _startTime + timeoutPeriod; else _totalTimeoutTime = -1; } + public void setTimeoutCommand(Runnable job) { _command = job; } private static final SimpleDateFormat _fmt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.SSS"); private static String ts(long when) { synchronized (_fmt) { return _fmt.format(new Date(when)); } } + @Override public String toString() { StringBuilder buf = new StringBuilder(); - buf.append("started on "); + buf.append("SocketTimeout started on "); buf.append(ts(_startTime)); - buf.append("idle for "); + buf.append(" idle for "); buf.append(System.currentTimeMillis() - _lastActivity); buf.append("ms "); if (_totalTimeoutTime > 0) diff --git a/core/java/src/net/i2p/util/SystemVersion.java b/core/java/src/net/i2p/util/SystemVersion.java index 4e965b23fb0d3d81c6f17c13262081c62c20ff8a..d43cddc8987442b48ce84e520cf7f10c22fd2116 100644 --- a/core/java/src/net/i2p/util/SystemVersion.java +++ b/core/java/src/net/i2p/util/SystemVersion.java @@ -84,4 +84,12 @@ public abstract class SystemVersion { public static int getAndroidVersion() { return _androidSDK; } + + /** + * Is the wrapper present? + * Same as I2PAppContext.hasWrapper() + */ + public static boolean hasWrapper() { + return System.getProperty("wrapper.version") != null; + } } diff --git a/debian/patches/0004-oom-listener.patch b/debian/patches/0004-oom-listener.patch index f803b8d9ef342fe990ab8f6dcaf2fde763d78034..1a29b8b124c99a56fa60b66c76bb0c7eed52d782 100644 --- a/debian/patches/0004-oom-listener.patch +++ b/debian/patches/0004-oom-listener.patch @@ -1,11 +1,11 @@ --- a/router/java/src/net/i2p/router/tasks/OOMListener.java +++ b/router/java/src/net/i2p/router/tasks/OOMListener.java -@@ -33,7 +33,7 @@ - // gobble - } - } -- log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config"); -+ log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in /etc/i2p/wrapper.config"); - _context.router().shutdown(Router.EXIT_OOM); - } - } +@@ -46,7 +46,7 @@ + log.log(Log.CRIT, "free mem: " + Runtime.getRuntime().freeMemory() + + " total mem: " + Runtime.getRuntime().totalMemory()); + if (_context.hasWrapper()) +- log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config"); ++ log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in /etc/i2p/wrapper.config"); + } catch (OutOfMemoryError oome) {} + try { + ThreadDump.dump(_context, 1); diff --git a/history.txt b/history.txt index dc55406905ce29a3cf4d04056c560fd4041571fe..7beabaf2fe29a73919063b159042230e988d7063 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,220 @@ +2012-10-09 zzz + * Console, i2ptunnel: Warn on low ports + * NetDB: Increase floodfills again + * RouterInfo: Exit 1 on error in main() + * SSU: + - Add peer test throttling + - Peer test packet count fixes + - Adjust peer test timeouts and add backoff + - Reject relays and peer tests from same /16 + - More peer test cleanup and log tweaks + * Transports: + - Enforce minimum peer port + - Warn on low router ports + +2012-10-08 zzz + * SSU: + - Fix relay request handling bug from -10 + - Fix peer test reply handling bug from -10 + - Fix NPE from -6 + +2012-10-07 zzz + * I2PAppContext: Improved synching in constructor + * i2ptunnel: + - Set default read timeout in standard server + - Reduce header timeout, enforce total header timeout + in IRC and HTTP servers (ticket #723) + * Logs: + - Flush buffers in logs.jsp + - Add dup message to buffers, was in file only + * Streaming: Don't ignore option or force connect timeout to 5 minutes + * UPnP: Workaround NPE (ticket #728) + +2012-10-06 zzz + * configlogging.jsp: Fix IAE + * error500.jsp: Fix whitespace + * i2psnark: + - Add allocating and checking indications + - Add bandwidth message at startup + - More checks at torrent creation + * SSU: + - Throttle outbound destroys on shutdown + - Limit outbound introduction offers + - Validate port/IP in received peer tests + +2012-10-05 zzz + * configservice.jsp: Add GC button + * DataHelper: Sanity checks in storeProps(), use + storeProps() for router config again + * SSU: + - More synchronization fixes + - Reduce chance of dup acks in a single message + - Reduce max unsent acks to 50 + - Use last ack time in ping decision too + - Reduce ack delay + * TunnelPoolManager: Fix early NPE (ticket #724) + +2012-10-03 zzz + * NTCP: Reduce conLock contention + * SSU: + - Increase max outbound establishments based on bandwidth + - Synchronization fix for Java 5 + - Use multiple buffer sizes in OutboundMessageState to + reduce memory usage + - Adjust skew calculation, synchronize too + - Ping loop improvements + +2012-10-02 zzz + * I2CP: Delay after sending disconnect message to + help it get through + * i2psnark: Fix delete download message + * i2ptunnel: Fix log message + * NTCP: Only set keepalive if firewalled + * OOMListener: Dump threads on OOM + * PRNG, LogWriter: Use I2PThread to catch OOM + * SimpleByteCache: Fix ABQ/LBQ selection + * SSU: + - Fix memory leak in _peersByRemoteHost map caused by not + removing peers that change IP or port + - Send keepalives if firewalled + - Handle peers that change ports on an established session + - Synchronize adds and drops + - Don't use peers with high RTTs in clock skew calculation + - Reduce initial RTT/RTO + +2012-09-28 zzz + * i2psnark: + - Fix bugs in rarest-first tracking + - Fix requesting of partial piece when there are multiple seeds + - Synch fix in BitField + * i2ptunnel: Fix wrong server IP in log message + * peers.jsp: Remove SSU "Dev" column + * SessionKeyManager: Store original tagset size for debugging + * Streaming: Don't send RST on globally-blackisted conns + +2012-09-26 zzz + * Addresses: Reject numeric IPs of the form n, n.n, and n.n.n + * Console, i2ptunnel: More validation of address and port in forms + * ConvertToHash: + - Add support for b64hash.i2p + - Cleanup and use cache + * i2psnark: Enable DHT by default + * RFC822Date: Synchronization fix + * Streaming: + - Implement changing connection limits on a running session + - Implement global blacklist + +2012-09-25 zzz + * Context: Make files final + * EventLog: Fix IAE on portable + * Jetty: Add non-NIO selector option (ticket #715) + * OutboundEstablishState: Cleanup (ticket #671) + * SimpleByteCache: Concurrent fix + * UPnP: Cleanup & final + * URLLauncher: Add xdg-open (ticket #717) + +2012-09-21 zzz + * BuildHandler: Use CoDel for inbound queue + * ByteCache: + - Prevent release of wrong size + - Move all 16/32 byte users to SimpleByteCache + - Increase SimpleByteCache default size. + * ClientConnectionRunner: + - Run HandleJob and MessageReceivedJob inline for speed + - Remove payload from message map if availability announce fails + - Cleanups + * ClientManager: + - Concurrent client map for faster lookup + - Add by-hash client map for faster lookup by hash + * ClientWriterRunner: Limit queue size + * Clock: Synchronization, log large shifts to event log + * Console: Mark all restarts on graphs using the event log. + * FortunaRandomSource: + - Fix bug that wasted entropy in nextInt() + - Improved synchronization + * GarlicMessage: + - Add notes about GarlicMessageHandler and HandleGarlicMessageJob + being unused in practice + * I2CP: + - Limit router/client queue sizes and queue wait times + - Buffer output streams + * i2psnark: + - Implement blacklist for unreachable DHT peers + - Reduce threshold for unreachable + - Use ByteCache for chunks in/out + * IP Lookup: + - Add caching in RouterAddress with secondary caching + in Addresses; use caches to speed up transport bids, + blocklist checks, geoip lookups, and profile organizer + checks (ticket #707) + - Limit IP cache size in TransportImpl + - Clear caches at shutdown + * JobQueue: Reduce lock contention + * LHMCache: New util, replacing several private versions + * LogWriter: + - Duplicate log message removal + - Increase buffer time + * NTCP: Move NTCPConnection outbound queue to CoDelPriority + * OutNetMessage: + - Centralize priority definitions + - Raise netdb store and reply priority + * Router: + - Boost priority of shutdown thread + - Replace ident log with new, general-purpose event log; + use for stops, starts, and updates, and others. + - New AQM CoDel queue utilities + - Startup/shutdown synchronization fixes + * RouterAddress: Remove unused expiration field to save space + * SimpleTimer (ticket #653): + - Move all remaining uses to SimpleTimer2 + - Deprecate + * SSU: + - Move MessageReceiver, UDPSender and UDPReceiver queues to CoDel + - Separate PeerState outbound message list into a queue for unsent messages + and a list for sent messages awaiting ack + - Implement PeerState outbound queue as CoDelPriority + - Implement backlogged indication like in NTCP + - Increase initial and max RTO + - Don't count ack-only packets in bandwidth allocation + * Streaming: Don't send a RST to an hour/day limited peer, + or blacklisted, or non-whitelisted, to not waste outbound bandwidth + * SystemVersion: New util, to consolidate duplicate code, + and determine Java version on Android + * TunnelGateway: + - Refactor TunnelGateway.Pending to its own file PendingGatewayMesasge + - Move OBGW queue to CoDelPriority + - Move IBGW queue to CoDel + - Limit queue sizes + - Add stat for overflow + - Remove some stats + - Change pumper to LinkedHashSet for efficiency + (like NTCP Reader/Writer) + - Limit messages pumped per cycle to increase + round-robin fairness + - Implement pushback from a backlogged transport + queue to the pre-fragmentation queue + - Comment out some unused code + +* 2012-09-21 0.9.2 released + +2012-09-15 zzz + * Build: Fix unpack problem on Java 5: http://forum.i2p/viewtopic.php?t=7334 + +2012-09-14 zzz + * SSU: Fix shutdown NPE (ticket #709) + +2012-09-13 kytv + * Update geoip.txt based on Maxmind GeoLite Country database from 2012-09-05 + +2012-09-12 kytv + * Czech translation updates from Transifex + +2012-09-10 meeh + * Added fix for startup issues on newer versions of launchd (osx startup scripts) + +2012-09-05 meeh + * Added startup scripts for osx + 2012-09-04 zzz * I2PTunnelServer: Clean shutdown after session exception * OutNetMessage: Speedup after profiling (ticket #707 - thx dg, kytv, zab) diff --git a/installer/install.xml b/installer/install.xml index 8d5bfac0f13af3647ca5be5c257a17e031e3acaa..5bdb2e4ad807e3db967633d73c488157f5b10c10 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -4,7 +4,7 @@ <info> <appname>i2p</appname> - <appversion>0.9.1</appversion> + <appversion>0.9.2</appversion> <authors> <author name="I2P" email="http://forum.i2p2.de/"/> </authors> @@ -137,10 +137,7 @@ <parsable targetfile="$INSTALL_PATH/eepget.bat" type="shell" os="windows" /> <parsable targetfile="$INSTALL_PATH/runplain.sh" type="shell"> <os family="unix" /> </parsable> <parsable targetfile="$INSTALL_PATH/Start I2P Router.app/Contents/MacOS/i2prouter" type="shell" os="mac" /> - <parsable targetfile="$INSTALL_PATH/net.i2p.router.plist.template" type="shell" os="mac" /> - <parsable targetfile="$INSTALL_PATH/install_i2p_service_osx.command" type="shell" os="mac" /> - <parsable targetfile="$INSTALL_PATH/uninstall_i2p_service_osx.command" type="shell" os="mac" /> - + <conditions> <condition type="variable" id="is64bit"> <name>SYSTEM_sun_arch_data_model</name> @@ -190,7 +187,7 @@ <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" /> <args><arg value="$INSTALL_PATH/Start I2P Router.app" /></args></executable> <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" /> - <args><arg value="$INSTALL_PATH/net.i2p.router.plist" /></args></executable> + <args><arg value="$INSTALL_PATH/net.i2p.router.plist.template" /></args></executable> <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" /> <args><arg value="$INSTALL_PATH/install_i2p_service_osx.command" /></args></executable> <executable targetfile="$INSTALL_PATH/installer/delete.jar" type="jar" stage="postinstall" keep="true" failure="warn"> <os family="windows" /> diff --git a/installer/resources/eepsite/jetty.xml b/installer/resources/eepsite/jetty.xml index 51af5537980d98079877d1f5bdb029d6a99f8b05..ba30a55ebd8264e540799807a8eeaf874ad8fb1d 100644 --- a/installer/resources/eepsite/jetty.xml +++ b/installer/resources/eepsite/jetty.xml @@ -12,7 +12,7 @@ <!-- * port: Default 7658 in the addConnector section --> <!-- * docroot: Change the ResourceBase in the contexts/base-context.xml file --> <!-- to serve files from a different location. --> -<!-- * threads: Raise MinThreads and/or MaxThreads in the addListener section --> +<!-- * threads: Raise maximumPoolSize in the ThreadPool section --> <!-- if you have a high-traffic site and get a lot of warnings. --> <!-- * Uncomment the addWebApplications section to use to enable --> <!-- war files placed in the webapps/ dir. --> @@ -65,7 +65,8 @@ --> <!-- Optional Java 5 bounded threadpool with job queue - Requests above the max will be rejected + Requests above the max will be rejected and logged. + High-traffic sites should increase maximumPoolSize. TODO: would be nice to use the 5-arg constructor but how do you use an Enum as the TimeUnit argument? Alternatively, make a custom class where we can @@ -75,7 +76,7 @@ <New class="org.mortbay.thread.concurrent.ThreadPool"> <Arg type="int">0</Arg> <Set name="corePoolSize">1</Set> - <Set name="maximumPoolSize">16</Set> + <Set name="maximumPoolSize">24</Set> </New> </Set> @@ -89,6 +90,8 @@ <!-- Use this connector for many frequently idle connections and for threadless continuations. + Not recommended on Java 5 - comment out and uncomment the + SocketConnector below. --> <Call name="addConnector"> <Arg> @@ -106,6 +109,24 @@ </Arg> </Call> + <!-- Recommended to use this connector on Java 5, as + Jetty 6 and Java 5 NIO don't play well together. + --> + <!-- + <Call name="addConnector"> + <Arg> + <New class="org.mortbay.jetty.bio.SocketConnector"> + <Set name="host">127.0.0.1</Set> + <Set name="port">7658</Set> + <Set name="maxIdleTime">60000</Set> + <Set name="Acceptors">1</Set> + <Set name="statsOn">false</Set> + <Set name="confidentialPort">8443</Set> + </New> + </Arg> + </Call> + --> + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- To add a HTTPS SSL listener --> <!-- see jetty-ssl.xml to add an ssl connector. use --> diff --git a/installer/resources/geoip.txt b/installer/resources/geoip.txt index f7ecfe073a54cc2ef6af998f3a5f365104000b4c..e68f00da836aa68b4bed665e4f0662d769f7d92c 100644 --- a/installer/resources/geoip.txt +++ b/installer/resources/geoip.txt @@ -1,5 +1,5 @@ # Last updated based on Maxmind GeoLite Country -# dated 2012-07-04 +# dated 2012-09-05 # Script borrowed from Tor # # wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip @@ -296,11 +296,16 @@ 84459520,84471807,RU 84471808,84473855,IQ 84473856,84475903,HU -84475904,84541439,DE +84475904,84545535,DE +84545536,84549631,GB +84549632,84551679,GE +84551680,84557823,DE 84557824,84574207,GB 84574208,84576255,FR 84576256,84582399,GB 84582400,84590591,DE +84590592,84592639,NL +84592640,84594687,ES 84594688,84598783,DE 84598784,84600831,IQ 84600832,84602879,GB @@ -312,7 +317,7 @@ 84619264,84621311,DE 84621312,84623359,GR 84623360,84627455,RU -84627456,84629503,GB +84627456,84631551,GB 84631552,84639743,IT 84639744,84672511,TR 84672512,84934655,RO @@ -375,9 +380,11 @@ 86177792,86179839,LI 86179840,86220799,RU 86220800,86222847,JE -86222848,86224895,RU +86222848,86223871,NL +86223872,86224895,RU 86224896,86226943,NL 86226944,86228991,SE +86228992,86231039,BE 86231040,86233087,ES 86233088,86235135,RO 86235136,86237183,ES @@ -385,17 +392,35 @@ 86245376,86376447,OM 86376448,86409215,AE 86409216,86441983,HU -86441984,86442723,FR +86441984,86442700,FR +86442701,86442702,CH +86442703,86442723,FR 86442724,86442724,PL 86442725,86444319,FR 86444320,86444323,ES 86444324,86446427,FR 86446428,86446431,DE -86446432,86454335,FR -86454336,86454339,DE -86454340,86456195,FR +86446432,86447095,FR +86447096,86447103,ES +86447104,86449363,FR +86449364,86449367,DE +86449368,86454335,FR +86454336,86454343,DE +86454344,86456195,FR 86456196,86456211,DE -86456212,86474751,FR +86456212,86456351,FR +86456352,86456367,CH +86456368,86457087,FR +86457088,86457091,DE +86457092,86469691,FR +86469692,86469695,DE +86469696,86474307,FR +86474308,86474311,DE +86474312,86474475,FR +86474476,86474479,DE +86474480,86474527,FR +86474528,86474531,DE +86474532,86474751,FR 86474752,86482943,HR 86482944,86484991,RU 86484992,86487039,NL @@ -487,7 +512,9 @@ 87568384,87570431,GB 87570432,87572479,ES 87572480,87588863,MD -87588864,87590911,GB +87588864,87590143,GB +87590144,87590399,US +87590400,87590911,GB 87590912,87592959,RU 87592960,87597055,DK 87597056,87599103,ES @@ -591,6 +618,7 @@ 90478592,90480639,GB 90480640,90482687,YE 90482688,90484735,GB +90484736,90488831,NO 90488832,90497023,BY 90497024,90499071,NL 90499072,90501119,IT @@ -622,6 +650,7 @@ 90720256,90722303,IQ 90722304,90724351,FI 90724352,90726399,CH +90726400,90728447,FR 90728448,90730495,DE 90730496,90734591,NL 90734592,90736639,SY @@ -630,12 +659,267 @@ 90740736,90742783,NL 90742784,90750975,BG 90750976,90753023,FR +90753024,90755071,RU +90755072,90757119,PL +90757120,90759167,AT +90759168,90761215,NL +90761216,90763263,KZ +90763264,90765311,IL +90765312,90767359,PL 90767360,90832895,UA 90832896,90898431,EU 90898432,90963967,RO 90963968,91226111,SA 91226112,92274687,IR 92274688,92536831,RU +92536832,92602367,NL +92602368,92604415,BA +92604416,92606463,PL +92606464,92608511,GB +92608512,92610559,PS +92610560,92612607,CH +92612608,92614655,GB +92614656,92618751,IT +92618752,92635135,NL +92635136,92643327,BA +92643328,92645375,GE +92645376,92651519,GB +92651520,92659711,SE +92659712,92663807,AZ +92663808,92665855,GB +92665856,92667903,PL +92667904,92669951,BE +92669952,92671999,GB +92672000,92674047,DE +92674048,92676095,CH +92676096,92680191,ES +92680192,92684287,AZ +92684288,92688383,PL +92688384,92690431,AM +92690432,92692479,IE +92692480,92694527,FR +92694528,92696575,RS +92696576,92698623,ES +92698624,92700671,IT +92700672,92717055,IR +92717056,92719103,SE +92719104,92721151,SY +92721152,92723199,PL +92723200,92725247,RU +92725248,92733439,SY +92733440,92734735,FR +92734736,92734739,DE +92734740,92798975,FR +92798976,93323263,RU +93323264,93335551,CH +93335552,93339647,IL +93339648,93343743,RU +93343744,93347839,GB +93347840,93356031,RU +93356032,93358079,IR +93358080,93360127,FR +93360128,93362175,ES +93362176,93364223,GB +93364224,93368319,IT +93368320,93370367,GB +93370368,93372415,IT +93372416,93388799,GR +93388800,93415423,CH +93415424,93417471,CZ +93417472,93419519,IR +93419520,93421567,IT +93421568,93425663,DE +93425664,93427711,GI +93427712,93429759,NO +93429760,93431807,RU +93431808,93433855,ES +93433856,93437951,DE +93437952,93454335,RU +93454336,93585407,DE +93585408,93626367,GB +93626368,93634559,CH +93634560,93650943,HU +93650944,93652991,CH +93652992,93655039,GB +93655040,93667327,CH +93667328,93675519,BA +93675520,93679615,IQ +93679616,93681663,LU +93681664,93683711,UA +93683712,93685759,AT +93685760,93687807,BE +93687808,93690367,RU +93690368,93691903,GB +93691904,93693951,PL +93693952,93695999,IE +93696000,93700095,FR +93700096,93702143,PL +93702144,93704191,RU +93704192,93708287,UA +93708288,93712383,DE +93712384,93714431,HU +93714432,93749247,GB +93749248,93753343,IT +93753344,93755391,IE +93755392,93765631,GB +93765632,93782015,SE +93782016,93847551,GB +93847552,93880319,GE +93880320,93888511,IT +93888512,93890559,PL +93890560,93892607,ES +93892608,93894655,GB +93894656,93896703,US +93896704,93904895,GB +93904896,93906943,LV +93906944,93908991,BA +93908992,93911039,IT +93911040,93913087,AE +93913088,93929471,NL +93929472,93939711,GB +93939712,93941759,NO +93941760,93945855,CH +93945856,93962239,UA +93962240,93972479,GB +93972480,93974527,EE +93974528,93976575,CH +93976576,93978623,GB +93978624,94175231,RO +94175232,94191615,EE +94191616,94193663,GB +94193664,94195711,SI +94195712,94199807,NL +94199808,94207999,IT +94208000,94240767,RO +94240768,94257151,PT +94257152,94261247,IT +94261248,94263295,ES +94263296,94265343,GB +94265344,94273535,RU +94273536,94289919,DE +94289920,94291967,NO +94291968,94294015,FR +94294016,94296063,EU +94296064,94298111,ES +94298112,94300159,GB +94300160,94302207,RU +94302208,94306303,FR +94306304,94308351,AT +94308352,94310399,ES +94310400,94312447,GE +94312448,94314495,DE +94314496,94316543,NL +94316544,94318591,IE +94318592,94320639,IR +94320640,94330879,DE +94330880,94337023,RU +94337024,94339071,GB +94339072,94355455,ES +94355456,94357503,NL +94357504,94361599,GB +94361600,94363647,PT +94363648,94365695,GB +94365696,94367743,HU +94367744,94369791,ES +94369792,94371839,TR +94371840,94502911,IR +94502912,94568447,OM +94568448,94633983,RO +94633984,94896127,RU +94896128,95158271,IT +95158272,95166463,RU +95166464,95168511,RS +95168512,95170559,NL +95170560,95174655,GB +95174656,95191039,IT +95191040,95195135,CH +95195136,95197183,PT +95197184,95203327,GB +95203328,95205375,FR +95205376,95207423,PL +95207424,95211519,GR +95211520,95213567,IT +95213568,95215615,NL +95215616,95354879,PL +95354880,95363071,DE +95363072,95365119,IT +95365120,95367167,ES +95367168,95369215,IT +95369216,95371263,GB +95371264,95375359,IT +95375360,95377407,NL +95377408,95387647,RU +95387648,95420415,DE +95420416,95551487,TR +95551488,95555583,AZ +95555584,95557631,GB +95557632,95559679,RU +95559680,95561727,NL +95561728,95563775,IT +95563776,95567871,SK +95567872,95569919,NL +95569920,95571967,SE +95571968,95574015,RU +95574016,95576063,IT +95576064,95580159,GB +95580160,95582207,NL +95582208,95584255,IT +95584256,95617023,GE +95617024,95625215,LV +95625216,95635455,IE +95635456,95637503,GB +95637504,95641599,DK +95641600,95645695,GB +95645696,95647743,SE +95647744,95649791,FR +95649792,95666175,IT +95666176,95668223,FR +95668224,95682559,DE +95682560,95944703,UA +95944704,96075775,PL +96075776,96143359,DE +96143360,96145407,GE +96145408,96149503,GB +96149504,96151551,ES +96151552,96153599,RU +96153600,96155647,PL +96155648,96157695,CH +96157696,96165887,RU +96165888,96174079,FR +96174080,96206847,HU +96206848,96337919,RU +96337920,96403455,IR +96403456,96468991,AZ +96468992,96731135,RO +96731136,96796671,DE +96796672,96862207,AZ +96862208,96894975,GB +96894976,96897023,CZ +96897024,96899071,GB +96899072,96903167,AT +96903168,96911359,IR +96919552,96923647,IT +96923648,96925695,JO +96925696,96927743,MT +96927744,96960511,GB +96960512,96964607,DE +96964608,96968703,NL +96968704,96972799,LT +96972800,96974847,DE +96974848,96985087,RU +96985088,96987135,ES +96987136,96989183,UA +96989184,96993279,DE +96993280,97001471,NL +97001472,97009663,RU +97009664,97058815,IR +97058816,97091583,PL +97091584,97189887,IR +97189888,97255423,GR +97255424,97320959,HU +97320960,97386495,ES +97386496,97419263,RU +97419264,97435647,HU 100663296,121195295,US 121195296,121195327,IT 121195328,134693119,US @@ -1192,9 +1476,9 @@ 332132120,332132127,IL 332132128,344260607,US 344260608,344261119,GB -344261120,344261631,US -344261632,344261887,EU -344261888,344262655,US +344261120,344261778,US +344261779,344261779,EU +344261780,344262655,US 344262656,344262911,GB 344262912,344268817,US 344268818,344268818,EU @@ -1708,7 +1992,8 @@ 520488960,520489983,IT 520489984,520491007,RU 520491008,520493567,GB -520493568,520494335,FR +520493568,520494079,A1 +520494080,520494335,FR 520494336,520494591,TR 520494592,520495103,CH 520495104,520496383,DE @@ -2166,6 +2451,7 @@ 531169280,531177471,KZ 531177472,531179519,GB 531179520,531181567,FR +531181568,531183615,NO 531183616,531185663,NL 531185664,531193855,TR 531193856,531194303,IE @@ -2286,7 +2572,8 @@ 531695616,531697663,LT 531697664,531699711,GB 531699712,531701759,CZ -531701760,531703807,NL +531701760,531703551,NL +531703552,531703807,IQ 531703808,531705855,IT 531705856,531707903,ES 531707904,531709951,GR @@ -2897,7 +3184,9 @@ 533837824,533839871,DE 533839872,533856255,IS 533856256,533858303,FR -533858304,533859583,HU +533858304,533859231,HU +533859232,533859263,TR +533859264,533859583,HU 533859584,533859839,BG 533859840,533860095,HU 533860096,533860351,AT @@ -3468,9 +3757,7 @@ 623052800,623054847,RS 623054848,623058943,FI 623058944,623067135,RO -623067136,623067136,RS -623067137,623069182,AL -623069183,623069183,RS +623067136,623069183,AL 623069184,623071231,GB 623071232,623073279,FI 623073280,623075327,GB @@ -5317,7 +5604,9 @@ 624658384,624658387,DE 624658388,624658391,FR 624658392,624658399,PL -624658400,624658527,FR +624658400,624658479,FR +624658480,624658483,DE +624658484,624658527,FR 624658528,624658535,GB 624658536,624658539,ES 624658540,624658543,IE @@ -5682,7 +5971,7 @@ 624665556,624665559,FR 624665560,624665567,IE 624665568,624665587,FR -624665588,624665591,ES +624665588,624665591,DE 624665592,624665595,FR 624665596,624665599,PL 624665600,624665607,FR @@ -6509,9 +6798,12 @@ 624683728,624683743,ES 624683744,624683759,FR 624683760,624683775,PL -624683776,624683783,FR -624683784,624683787,CZ -624683788,624683799,FR +624683776,624683777,FR +624683778,624683781,DE +624683782,624683783,FR +624683784,624683785,CZ +624683786,624683789,DE +624683790,624683799,FR 624683800,624683803,FI 624683804,624683807,IT 624683808,624683811,ES @@ -6682,7 +6974,9 @@ 624686000,624686003,LT 624686004,624686007,PL 624686008,624686015,ES -624686016,624689151,FR +624686016,624689076,FR +624689077,624689078,BE +624689079,624689151,FR 624689152,624691199,DE 624691200,624693247,FR 624693248,624695295,RU @@ -6918,7 +7212,10 @@ 629882890,629882890,A1 629882891,629883135,GB 629883136,629883391,AU -629883392,629884927,GB +629883392,629883903,GB +629883904,629884159,AU +629884160,629884671,GB +629884672,629884927,AU 629884928,629886975,PL 629886976,629889023,RU 629889024,629891071,IT @@ -7124,7 +7421,9 @@ 635105280,635107327,NL 635107328,635109375,DE 635109376,635174911,FI -635174912,635183103,GB +635174912,635179713,GB +635179714,635179714,A1 +635179715,635183103,GB 635183104,635185151,NL 635185152,635187199,IT 635187200,635191295,FR @@ -7167,7 +7466,9 @@ 635240448,635256831,IR 635256832,635273215,GB 635273216,635281407,UA -635281408,635285503,RO +635281408,635283455,RO +635283456,635284479,DE +635284480,635285503,US 635285504,635287551,ME 635287552,635289599,RU 635289600,635291647,DE @@ -7505,6 +7806,7 @@ 635717632,635719679,NL 635719680,635723775,RU 635723776,635725823,ES +635725824,635727871,NO 635727872,635729919,RU 635729920,635748351,DE 635748352,635764735,IE @@ -7593,7 +7895,9 @@ 637329408,637337599,AT 637337600,637403135,NO 637403136,637534207,IR -637534208,642695167,US +637534208,641765375,US +641765376,641765887,CA +641765888,642695167,US 642695168,642696191,A1 642696192,642795519,US 642795520,642796031,A1 @@ -7794,6 +8098,7 @@ 692961280,692963327,TZ 692963328,692965375,ZA 692965376,692967423,CM +692967424,692968447,KE 692968448,692969471,CD 692969472,692971519,TZ 692973568,692975615,MZ @@ -7826,7 +8131,6 @@ 693007360,693008383,NE 693008384,693009407,CF 693009408,693010431,GH -693010432,693011455,ZA 693011456,693012479,SZ 693012480,693013503,TG 693013504,693014527,ZA @@ -7956,7 +8260,6 @@ 696928256,696930303,BW 696930304,696932351,RW 696932352,696933375,BJ -696933376,696934399,TZ 696934400,696942591,BF 696942592,696950783,MR 696950784,696958975,NG @@ -7997,9 +8300,8 @@ 700284928,700293119,GH 700293120,700301311,EG 700301312,700309503,CD -700309504,700314367,DJ -700314368,700314623,US -700314624,700317695,DJ +700309504,700313599,DJ +700313600,700317695,US 700317696,700325887,NG 700325888,700334079,ZW 700334080,700335103,BJ @@ -8015,7 +8317,6 @@ 700366848,700375039,UG 700375040,700376063,CM 700376064,700377087,NE -700377088,700378111,KE 700378112,700379135,MG 700379136,700380159,NG 700380160,700381183,BW @@ -8040,8 +8341,7 @@ 700414976,700432383,ZA 700432384,700434431,KE 700434432,700436479,LS -700436480,700438527,UG -700438528,700442623,KE +700440576,700442623,KE 700442624,700444671,ZW 700444672,700446719,GH 700446720,700447743,SL @@ -8474,8 +8774,9 @@ 772886528,772888575,FR 772888576,772890623,GB 772890624,772892671,RU -772892672,772892927,DE -772892928,772892959,GB +772892672,772892672,GB +772892673,772892926,DE +772892927,772894719,GB 772894720,772896767,PL 772896768,772898815,RS 772898816,772900863,TR @@ -8715,7 +9016,9 @@ 773304320,773308415,RU 773308416,773312511,IT 773312512,773316607,DE -773316608,773320703,RU +773316608,773318399,RU +773318400,773318655,GB +773318656,773320703,RU 773320704,773324799,FR 773324800,773586943,ES 773586944,773588991,IT @@ -8884,7 +9187,9 @@ 773834752,773836799,GB 773836800,773838847,FR 773838848,773840895,DE -773840896,773847039,GB +773840896,773843967,GB +773843968,773844991,EU +773844992,773847039,GB 773847040,773849087,IT 773849088,773857279,IR 773857280,773865471,DK @@ -9317,9 +9622,10 @@ 775094272,775127039,RO 775127040,775149566,IE 775149567,775149567,NL -775149568,775157759,IE -775157760,775159551,JP -775159552,775159807,IE +775149568,775149764,IE +775149765,775149765,SG +775149766,775151615,IE +775151616,775159807,JP 775159808,775192575,SA 775192576,775225343,RU 775225344,775258111,SY @@ -10135,7 +10441,9 @@ 778679104,778679123,PL 778679124,778679127,FR 778679128,778679151,DE -778679152,778679215,FR +778679152,778679212,FR +778679213,778679213,FI +778679214,778679215,FR 778679216,778679231,PT 778679232,778679263,ES 778679264,778679267,IT @@ -11132,7 +11440,9 @@ 780729600,780729855,JM 780729856,780730111,JO 780730112,780730367,JP -780730368,780779519,IE +780730368,780756724,IE +780756725,780756725,EU +780756726,780779519,IE 780779520,780783615,NL 780783616,780785663,GB 780785664,780787711,DE @@ -11582,6 +11892,7 @@ 783775744,783777791,AL 783777792,783779839,RU 783779840,783781887,DK +783781888,783783935,NL 783783936,783785983,DE 783785984,783788031,RU 783788032,783790079,NO @@ -12140,7 +12451,11 @@ 788523008,788525055,KZ 788525056,788527103,IT 788527104,788529151,GB -788529152,795231487,CA +788529152,792330239,CA +792330240,792723455,ES +792723456,793247743,CA +793247744,793313279,NZ +793313280,795231487,CA 795231488,795231743,US 795231744,795233023,CA 795233024,795233279,US @@ -12403,9 +12718,12 @@ 889192448,897238054,DE 897238055,897238055,EU 897238056,905969663,DE -905969664,922157055,US +905969664,921204905,US +921204906,921204906,BR +921204907,922157055,US 922157056,922222591,IE -922222592,956301311,US +922222592,922353663,JP +922353664,956301311,US 956301312,959447039,EU 959447040,959512575,US 959512576,960629507,EU @@ -12771,9 +13089,7 @@ 1024184320,1024188415,MY 1024188416,1024196607,VN 1024196608,1024229375,IN -1024229376,1024255743,JP -1024255744,1024255999,US -1024256000,1024262143,JP +1024229376,1024262143,JP 1024262144,1024327679,SG 1024327680,1024344063,US 1024344064,1024352255,SG @@ -18729,7 +19045,9 @@ 1049016848,1049016863,FR 1049016864,1049017983,DE 1049017984,1049018047,GE -1049018048,1049020127,DE +1049018048,1049018367,DE +1049018368,1049018623,EU +1049018624,1049020127,DE 1049020128,1049020135,FR 1049020136,1049021343,DE 1049021344,1049021375,US @@ -18963,7 +19281,9 @@ 1049985024,1050017791,IT 1050017792,1050041087,KW 1050041088,1050041599,US -1050041600,1050083327,KW +1050041600,1050047994,KW +1050047995,1050047995,US +1050047996,1050083327,KW 1050083328,1050148863,ES 1050148864,1050157055,CY 1050157056,1050173439,RU @@ -21499,9 +21819,7 @@ 1062222976,1062223039,PH 1062223040,1062244311,US 1062244312,1062244319,PH -1062244320,1062250495,US -1062250496,1062251519,UM -1062251520,1062262783,US +1062244320,1062262783,US 1062262784,1062263039,PH 1062263040,1062378767,US 1062378768,1062378783,CA @@ -21833,7 +22151,9 @@ 1070729472,1070729727,CA 1070729728,1070805559,US 1070805560,1070805567,VG -1070805568,1071100159,US +1070805568,1070849407,US +1070849408,1070849423,A1 +1070849424,1071100159,US 1071100160,1071100415,PR 1071100416,1071100927,US 1071100928,1071101951,PR @@ -21842,7 +22162,9 @@ 1071136768,1071141887,US 1071141888,1071142911,HK 1071142912,1071144959,US -1071144960,1071151103,GB +1071144960,1071149200,GB +1071149201,1071149201,LB +1071149202,1071151103,GB 1071151104,1071153151,LB 1071153152,1071157247,US 1071157248,1071158271,SG @@ -22134,7 +22456,9 @@ 1072938240,1072938495,VG 1072938496,1072938751,CA 1072938752,1072939007,US -1072939008,1072939519,CA +1072939008,1072939263,CA +1072939264,1072939311,US +1072939312,1072939519,CA 1072939520,1072940031,US 1072940032,1072955391,CA 1072955392,1073022975,US @@ -25897,9 +26221,7 @@ 1086476608,1086910335,US 1086910336,1086910463,LB 1086910464,1086922751,US -1086922752,1086923007,CA -1086923008,1086923263,NG -1086923264,1086930943,CA +1086922752,1086930943,CA 1086930944,1086941831,US 1086941832,1086941835,CA 1086941836,1086942079,US @@ -25926,7 +26248,9 @@ 1087444224,1087444479,GB 1087444480,1087464945,US 1087464946,1087464949,GB -1087464950,1087467291,US +1087464950,1087466489,US +1087466490,1087466493,GB +1087466494,1087467291,US 1087467292,1087467295,BR 1087467296,1087495519,US 1087495520,1087495535,TW @@ -26030,7 +26354,9 @@ 1089058304,1089058439,TW 1089058440,1089058440,EU 1089058441,1089058559,TW -1089058560,1089154847,US +1089058560,1089153535,US +1089153536,1089153791,A1 +1089153792,1089154847,US 1089154848,1089154855,VE 1089154856,1089154915,US 1089154916,1089154932,AU @@ -26200,7 +26526,11 @@ 1090146304,1090150399,CA 1090150400,1090172495,US 1090172496,1090172511,GB -1090172512,1090207743,US +1090172512,1090195086,US +1090195087,1090195087,A1 +1090195088,1090197111,US +1090197112,1090197112,A1 +1090197113,1090207743,US 1090207744,1090215935,CA 1090215936,1090355199,US 1090355200,1090356327,CA @@ -26238,9 +26568,7 @@ 1090448256,1090453503,CA 1090453504,1090497903,US 1090497904,1090497919,AU -1090497920,1090499583,US -1090499584,1090499839,A2 -1090499840,1091683357,US +1090497920,1091683357,US 1091683358,1091683367,GB 1091683368,1091683407,US 1091683408,1091683417,BE @@ -26786,7 +27114,13 @@ 1094565888,1094568046,CA 1094568047,1094568061,MO 1094568062,1094582271,CA -1094582272,1095314943,US +1094582272,1094662271,US +1094662272,1094662303,CN +1094662304,1094669635,US +1094669636,1094669639,HK +1094669640,1094670795,US +1094670796,1094670799,CN +1094670800,1095314943,US 1095314944,1095314944,A1 1095314945,1095450623,US 1095450624,1095467007,BS @@ -27353,7 +27687,7 @@ 1106814976,1107220223,US 1107220224,1107220239,FI 1107220240,1107240191,US -1107240192,1107240447,A1 +1107240192,1107240447,A2 1107240448,1107241215,US 1107241216,1107241343,CN 1107241344,1107241471,US @@ -27761,7 +28095,9 @@ 1112432640,1112440831,CA 1112440832,1112530943,US 1112530944,1112539135,CA -1112539136,1112900287,US +1112539136,1112899769,US +1112899770,1112899770,A1 +1112899771,1112900287,US 1112900288,1112900351,GB 1112900352,1112900711,US 1112900712,1112900719,MV @@ -28139,7 +28475,9 @@ 1117829376,1117829631,GR 1117829632,1117831359,US 1117831360,1117831423,A2 -1117831424,1117978623,US +1117831424,1117964727,US +1117964728,1117964735,UM +1117964736,1117978623,US 1117978624,1117979503,CA 1117979504,1117979519,US 1117979520,1117982639,CA @@ -28416,9 +28754,7 @@ 1118796544,1118796799,GB 1118796800,1118797063,US 1118797064,1118797071,CR -1118797072,1118819327,US -1118819328,1118820607,A1 -1118820608,1118961663,US +1118797072,1118961663,US 1118961664,1118962831,A2 1118962832,1118962839,SA 1118962840,1118962847,NG @@ -29092,7 +29428,9 @@ 1120380272,1120380415,US 1120380416,1120380431,VG 1120380432,1120380447,CA -1120380448,1120380479,US +1120380448,1120380453,US +1120380454,1120380454,CA +1120380455,1120380479,US 1120380480,1120380639,CA 1120380640,1120380655,US 1120380656,1120380659,CA @@ -33186,7 +33524,9 @@ 1160974592,1160974623,HK 1160974624,1161019391,US 1161019392,1161035775,CA -1161035776,1161293823,US +1161035776,1161052671,US +1161052672,1161052927,GB +1161052928,1161293823,US 1161293824,1161297919,CA 1161297920,1161298303,US 1161298304,1161298311,IL @@ -35083,9 +35423,9 @@ 1177164864,1177164895,CA 1177164896,1177164927,US 1177164928,1177164943,CA -1177164944,1177165058,US -1177165059,1177165059,A1 -1177165060,1177165311,US +1177164944,1177165055,US +1177165056,1177165087,CA +1177165088,1177165311,US 1177165312,1177165823,CA 1177165824,1177167743,US 1177167744,1177167751,LB @@ -37543,9 +37883,7 @@ 1247072720,1247072735,NL 1247072736,1247073791,US 1247073792,1247074303,A2 -1247074304,1247087871,US -1247087872,1247088127,A1 -1247088128,1247123455,US +1247074304,1247123455,US 1247123456,1247123711,GB 1247123712,1247123967,US 1247123968,1247124223,LU @@ -37840,7 +38178,12 @@ 1249460672,1249460687,CA 1249460688,1249474559,US 1249474560,1249475583,CA -1249475584,1249484799,US +1249475584,1249479167,US +1249479168,1249479423,FR +1249479424,1249479679,US +1249479680,1249479935,CH +1249479936,1249480191,HK +1249480192,1249484799,US 1249484800,1249486847,CA 1249486848,1249492735,US 1249492736,1249492991,CA @@ -39327,7 +39670,19 @@ 1280098304,1280102399,PR 1280102400,1280131071,US 1280131072,1280139263,CA -1280139264,1287611402,US +1280139264,1286389759,US +1286389760,1286390271,A1 +1286390272,1286390527,US +1286390528,1286390783,A1 +1286390784,1286391295,US +1286391296,1286391807,A1 +1286391808,1286393855,US +1286393856,1286394623,A1 +1286394624,1286395391,US +1286395392,1286396159,A1 +1286396160,1286398975,US +1286398976,1286399487,A1 +1286399488,1287611402,US 1287611403,1287611403,A1 1287611404,1287612122,US 1287612123,1287612136,SE @@ -39618,8 +39973,22 @@ 1296594944,1296596991,RU 1296596992,1296599039,DE 1296599040,1296601087,RU -1296601088,1296603135,DE -1296603136,1296605183,NL +1296601088,1296601247,DE +1296601248,1296601263,NL +1296601264,1296601271,DE +1296601272,1296601343,NL +1296601344,1296601407,DE +1296601408,1296601599,NL +1296601600,1296601615,DE +1296601616,1296601631,NL +1296601632,1296601663,DE +1296601664,1296601727,NL +1296601728,1296601735,DE +1296601736,1296601744,NL +1296601745,1296601751,DE +1296601752,1296602112,NL +1296602113,1296602447,DE +1296602448,1296605183,NL 1296605184,1296606271,AT 1296606272,1296606335,DE 1296606336,1296606367,AT @@ -40102,7 +40471,10 @@ 1307069696,1307069919,DE 1307069920,1307074559,EU 1307074560,1307082751,SA -1307082752,1307090943,RU +1307082752,1307092991,RU +1307092992,1307095039,GB +1307095040,1307097087,SA +1307097088,1307099135,RU 1307099136,1307107327,RO 1307107328,1307115519,DE 1307115520,1307123711,RU @@ -42891,7 +43263,9 @@ 1347210936,1347211111,GB 1347211112,1347211119,IE 1347211120,1347215359,GB -1347215360,1347219967,RU +1347215360,1347219644,RU +1347219645,1347219645,KW +1347219646,1347219967,RU 1347219968,1347220479,US 1347220480,1347222015,RU 1347222016,1347222271,US @@ -43254,8 +43628,7 @@ 1347452928,1347455930,BG 1347455931,1347455931,A1 1347455932,1347461119,BG -1347461120,1347461375,US -1347461376,1347462579,AL +1347461120,1347462579,AL 1347462580,1347462583,RS 1347462584,1347462591,AL 1347462592,1347462607,RS @@ -43934,7 +44307,9 @@ 1352010240,1352010495,US 1352010496,1352011447,DE 1352011448,1352011455,IT -1352011456,1352038695,DE +1352011456,1352031618,DE +1352031619,1352031619,EU +1352031620,1352038695,DE 1352038696,1352038699,US 1352038700,1352041471,DE 1352041472,1352041727,US @@ -44504,7 +44879,8 @@ 1357340160,1357340415,DE 1357340416,1357342719,GB 1357342720,1357342975,PL -1357342976,1357344767,EU +1357342976,1357343231,GB +1357343232,1357344767,EU 1357344768,1357346815,CA 1357346816,1357347839,FR 1357347840,1357348095,PL @@ -44812,7 +45188,7 @@ 1357900544,1357900799,NL 1357900800,1357901823,DE 1357901824,1357902335,EU -1357902336,1357902847,A2 +1357902336,1357902847,PL 1357902848,1357903359,GB 1357903360,1357903615,DE 1357903616,1357904383,EU @@ -45388,9 +45764,10 @@ 1358843904,1358847999,MT 1358848000,1358856191,RU 1358856192,1358860287,DE -1358860288,1358861311,GB -1358861312,1358861567,EU -1358861568,1358861823,DE +1358860288,1358860835,GB +1358860836,1358860836,EU +1358860837,1358861311,GB +1358861312,1358861823,DE 1358861824,1358862335,FR 1358862336,1358862847,US 1358862848,1358863103,DK @@ -45861,6 +46238,8 @@ 1360576512,1360580607,GB 1360580608,1360584703,UA 1360584704,1360588799,IT +1360588800,1360590847,RS +1360590848,1360592895,IE 1360592896,1360596991,RU 1360596992,1360601087,CZ 1360601088,1360605183,BY @@ -46007,7 +46386,8 @@ 1361035264,1361035627,US 1361035628,1361035631,DZ 1361035632,1361039359,US -1361039360,1361043455,PL +1361039360,1361041407,IE +1361041408,1361043455,PL 1361043456,1361051647,IR 1361051648,1362100223,ES 1362100224,1362395135,FR @@ -47197,6 +47577,22 @@ 1368440320,1369440255,GB 1369440256,1369473023,DE 1369473024,1369505791,HU +1369505792,1369509887,RO +1369509888,1369518079,RU +1369518080,1369520127,RO +1369520128,1369520639,LI +1369520640,1369520895,FR +1369520896,1369521151,RO +1369521152,1369521663,SK +1369521664,1369521919,PL +1369521920,1369522175,RU +1369522176,1369530367,CZ +1369530368,1369530879,DK +1369530880,1369531391,RU +1369531392,1369534975,PL +1369534976,1369535231,RU +1369535232,1369535487,AT +1369535488,1369538559,RU 1369538560,1369554943,DK 1369554944,1369559039,PL 1369559040,1369563135,RU @@ -47305,7 +47701,8 @@ 1371996672,1371996927,GA 1371996928,1371997183,A2 1371997184,1371997439,KE -1371997440,1371998207,NG +1371997440,1371997695,A2 +1371997696,1371998207,NG 1371998208,1371998463,CD 1371998464,1371998719,NG 1371998720,1372000255,A2 @@ -47531,7 +47928,9 @@ 1375081216,1375207423,BE 1375207424,1375268095,FR 1375268096,1375268351,RE -1375268352,1375731711,FR +1375268352,1375705984,FR +1375705985,1375705985,EU +1375705986,1375731711,FR 1375731712,1375798335,GB 1375798336,1375798351,IE 1375798352,1375852543,GB @@ -48076,7 +48475,7 @@ 1385275392,1385283583,IT 1385283584,1385285631,DE 1385285632,1385287679,GB -1385287680,1385291775,A2 +1385287680,1385291775,EU 1385291776,1385299967,TR 1385299968,1385308159,BG 1385308160,1385309439,BE @@ -49760,6 +50159,9 @@ 1406861312,1406869503,RU 1406869504,1406877695,GB 1406877696,1406885887,NL +1406885888,1406887935,RO +1406887936,1406889983,DE +1406889984,1406894079,CH 1406894080,1406902271,RU 1406902272,1406910463,AT 1406910464,1406918655,SE @@ -51337,215 +51739,7 @@ 1410711552,1410719743,BG 1410719744,1410727935,RU 1410727936,1410736127,BG -1410736128,1410736383,AL -1410736384,1410736384,RS -1410736385,1410736638,AL -1410736639,1410736639,RS -1410736640,1410736751,AL -1410736752,1410736767,RS -1410736768,1410736895,AL -1410736896,1410736896,RS -1410736897,1410736911,AL -1410736912,1410736928,RS -1410736929,1410737407,AL -1410737408,1410737415,RS -1410737416,1410737423,AL -1410737424,1410737431,RS -1410737432,1410737439,AL -1410737440,1410737535,RS -1410737536,1410737663,AL -1410737664,1410737664,RS -1410737665,1410737918,AL -1410737919,1410737920,RS -1410737921,1410738174,AL -1410738175,1410738175,RS -1410738176,1410738215,AL -1410738216,1410738223,RS -1410738224,1410738247,AL -1410738248,1410738263,RS -1410738264,1410738295,AL -1410738296,1410738304,RS -1410738305,1410738310,AL -1410738311,1410738320,RS -1410738321,1410738326,AL -1410738327,1410738328,RS -1410738329,1410738334,AL -1410738335,1410738351,RS -1410738352,1410738359,AL -1410738360,1410738384,RS -1410738385,1410738390,AL -1410738391,1410738431,RS -1410738432,1410738447,AL -1410738448,1410738559,RS -1410738560,1410738718,AL -1410738719,1410738720,RS -1410738721,1410738734,AL -1410738735,1410738735,RS -1410738736,1410738751,AL -1410738752,1410738752,RS -1410738753,1410738766,AL -1410738767,1410738768,RS -1410738769,1410738782,AL -1410738783,1410738800,RS -1410738801,1410738814,AL -1410738815,1410738816,RS -1410738817,1410738830,AL -1410738831,1410738832,RS -1410738833,1410738846,AL -1410738847,1410738864,RS -1410738865,1410738878,AL -1410738879,1410738896,RS -1410738897,1410738902,AL -1410738903,1410738912,RS -1410738913,1410738927,AL -1410738928,1410738943,RS -1410738944,1410738967,AL -1410738968,1410739023,RS -1410739024,1410739031,AL -1410739032,1410739200,RS -1410739201,1410739326,AL -1410739327,1410739328,RS -1410739329,1410739390,AL -1410739391,1410739391,RS -1410739392,1410739471,AL -1410739472,1410739472,RS -1410739473,1410739486,AL -1410739487,1410739520,RS -1410739521,1410739534,AL -1410739535,1410739543,RS -1410739544,1410739550,AL -1410739551,1410739568,RS -1410739569,1410739582,AL -1410739583,1410739583,RS -1410739584,1410739599,AL -1410739600,1410739616,RS -1410739617,1410739630,AL -1410739631,1410739647,RS -1410739648,1410739679,AL -1410739680,1410739696,RS -1410739697,1410739710,AL -1410739711,1410739712,RS -1410739713,1410739719,AL -1410739720,1410739720,RS -1410739721,1410739727,AL -1410739728,1410739728,RS -1410739729,1410739734,AL -1410739735,1410739736,RS -1410739737,1410739742,AL -1410739743,1410739744,RS -1410739745,1410739750,AL -1410739751,1410739752,RS -1410739753,1410739759,AL -1410739760,1410739776,RS -1410739777,1410739783,AL -1410739784,1410739791,RS -1410739792,1410739799,AL -1410739800,1410739807,RS -1410739808,1410739879,AL -1410739880,1410739887,RS -1410739888,1410739919,AL -1410739920,1410739927,RS -1410739928,1410739959,AL -1410739960,1410739967,RS -1410739968,1410739995,AL -1410739996,1410739999,RS -1410740000,1410740003,AL -1410740004,1410740007,RS -1410740008,1410740043,AL -1410740044,1410740047,RS -1410740048,1410740122,AL -1410740123,1410740123,RS -1410740124,1410740171,AL -1410740172,1410740175,RS -1410740176,1410740238,AL -1410740239,1410740239,RS -1410740240,1410740335,AL -1410740336,1410740343,RS -1410740344,1410740471,AL -1410740472,1410740479,RS -1410740480,1410740507,AL -1410740508,1410740511,RS -1410740512,1410740515,AL -1410740516,1410740519,RS -1410740520,1410740591,AL -1410740592,1410740595,RS -1410740596,1410740643,AL -1410740644,1410740647,RS -1410740648,1410740675,AL -1410740676,1410740679,RS -1410740680,1410740695,AL -1410740696,1410740699,RS -1410740700,1410740734,AL -1410740735,1410740735,RS -1410740736,1410740759,AL -1410740760,1410740767,RS -1410740768,1410740871,AL -1410740872,1410740879,RS -1410740880,1410740911,AL -1410740912,1410740919,RS -1410740920,1410740931,AL -1410740932,1410740935,RS -1410740936,1410740943,AL -1410740944,1410740991,RS -1410740992,1410741303,AL -1410741304,1410741304,RS -1410741305,1410741311,AL -1410741312,1410741327,RS -1410741328,1410741343,AL -1410741344,1410741351,RS -1410741352,1410741463,AL -1410741464,1410741471,RS -1410741472,1410742279,AL -1410742280,1410742287,RS -1410742288,1410742303,AL -1410742304,1410742319,RS -1410742320,1410742351,AL -1410742352,1410742359,RS -1410742360,1410742415,AL -1410742416,1410742527,RS -1410742528,1410742907,AL -1410742908,1410742911,RS -1410742912,1410742923,AL -1410742924,1410742927,RS -1410742928,1410742931,AL -1410742932,1410742939,RS -1410742940,1410742952,AL -1410742953,1410742955,RS -1410742956,1410742963,AL -1410742964,1410742971,RS -1410742972,1410742975,AL -1410742976,1410742979,RS -1410742980,1410742996,AL -1410742997,1410742999,RS -1410743000,1410743059,AL -1410743060,1410743063,RS -1410743064,1410743075,AL -1410743076,1410743079,RS -1410743080,1410743095,AL -1410743096,1410743107,RS -1410743108,1410743111,AL -1410743112,1410743119,RS -1410743120,1410743127,AL -1410743128,1410743295,RS -1410743296,1410743551,AL -1410743552,1410743775,RS -1410743776,1410743783,AL -1410743784,1410743807,RS -1410743808,1410743967,AL -1410743968,1410744031,RS -1410744032,1410744063,AL -1410744064,1410744083,RS -1410744084,1410744087,AL -1410744088,1410744107,RS -1410744108,1410744119,AL -1410744120,1410744135,RS -1410744136,1410744139,AL -1410744140,1410744155,RS -1410744156,1410744163,AL -1410744164,1410744167,RS -1410744168,1410744171,AL -1410744172,1410744191,RS -1410744192,1410744319,AL +1410736128,1410744319,RS 1410744320,1410744575,FR 1410744576,1410744831,A2 1410744832,1410745087,FR @@ -53597,7 +53791,7 @@ 1432092672,1432100863,RU 1432100864,1432109055,CZ 1432109056,1432117247,GB -1432117248,1432117759,CY +1432117248,1432125439,CY 1432125440,1432131607,NL 1432131608,1432131615,PH 1432131616,1432131679,NL @@ -53721,7 +53915,9 @@ 1433608192,1433610239,EU 1433610240,1433612287,US 1433612288,1433614335,GB -1433614336,1433615359,DE +1433614336,1433615027,DE +1433615028,1433615028,EU +1433615029,1433615359,DE 1433615360,1433615871,FR 1433615872,1433616383,GB 1433616384,1433619455,AE @@ -53770,6 +53966,7 @@ 1433837568,1433839615,DE 1433839616,1433841663,GB 1433841664,1433843711,RU +1433843712,1433845759,HR 1433845760,1433847807,BG 1433847808,1433849855,SE 1433849856,1433851903,BE @@ -54396,7 +54593,7 @@ 1442791424,1442795519,LV 1442795520,1442799615,DE 1442799616,1442803711,LT -1442803712,1442807807,UA +1442803712,1442807807,RO 1442807808,1442811903,BG 1442811904,1442815999,AT 1442816000,1442820095,BG @@ -56267,8 +56464,8 @@ 1490049888,1490049919,CZ 1490049920,1490049983,PL 1490049984,1490053375,CZ -1490053376,1490054400,PL -1490054401,1490059263,CZ +1490053376,1490054143,PL +1490054144,1490059263,CZ 1490059264,1490075647,DE 1490075648,1490092031,GB 1490092032,1490108415,DE @@ -56770,6 +56967,7 @@ 1500218112,1500218367,CZ 1500218368,1500219391,DE 1500219392,1500219647,FR +1500219648,1500221439,RU 1500221440,1500223487,SK 1500223488,1500225535,PL 1500225536,1500227583,DE @@ -58375,7 +58573,10 @@ 1533540352,1533542399,AT 1533542400,1533607935,HU 1533607936,1533640703,LV -1533640704,1533657087,RU +1533640704,1533659135,RU +1533659136,1533661183,LV +1533661184,1533663231,SE +1533663232,1533665279,NL 1533665280,1533667327,GB 1533667328,1533669375,RU 1533669376,1533671423,DE @@ -59072,24 +59273,9 @@ 1534849024,1534853119,NL 1534853120,1534918655,UA 1534918656,1534984191,GB -1534984192,1534989855,SE -1534989856,1534990063,ES -1534990064,1534990079,SE -1534990080,1534990335,ES -1534990336,1534999551,SE -1534999552,1535004671,ES -1535004672,1535006719,SE -1535006720,1535007231,ES -1535007232,1535008767,SE -1535008768,1535014911,ES -1535014912,1535017983,SE -1535017984,1535019519,ES -1535019520,1535020543,SE -1535020544,1535021055,ES -1535021056,1535022079,SE -1535022080,1535023103,ES -1535023104,1535024127,SE -1535024128,1535049727,ES +1534984192,1534985727,ES +1534985728,1534986239,SE +1534986240,1535049727,ES 1535049728,1535115263,SK 1535115264,1535197183,AT 1535197184,1535246335,SE @@ -60380,7 +60566,9 @@ 1539842048,1539844095,PL 1539844096,1539846143,UA 1539846144,1539847167,NL -1539847168,1539849215,UA +1539847168,1539849471,UA +1539849472,1539849727,GB +1539849728,1539850239,RU 1539850240,1539851263,LV 1539851264,1539852287,PL 1539852288,1539853311,UA @@ -60398,6 +60586,7 @@ 1539864576,1539865599,RO 1539865600,1539866623,UA 1539866624,1539867647,IT +1539867648,1539868671,RO 1539868672,1539869695,UA 1539869696,1539870719,ES 1539870720,1539871743,IL @@ -60878,6 +61067,7 @@ 1540339712,1540340735,PL 1540340736,1540341247,CZ 1540341248,1540341759,BG +1540341760,1540342271,GB 1540342272,1540342783,UA 1540342784,1540343295,ES 1540343296,1540343807,GB @@ -61820,6 +62010,7 @@ 1540714240,1540714495,RO 1540714496,1540714751,NL 1540714752,1540715263,RU +1540715264,1540715519,NL 1540715520,1540715775,DE 1540715776,1540716031,UA 1540716032,1540716287,PL @@ -62136,6 +62327,7 @@ 1540906752,1540907007,BG 1540907008,1540907263,RU 1540907264,1540907519,MD +1540907520,1540907775,TR 1540907776,1540908031,PL 1540908032,1540908287,NL 1540908288,1540908543,DK @@ -62828,6 +63020,8 @@ 1541225984,1541226495,LV 1541226496,1541227007,UA 1541227008,1541227519,FI +1541227520,1541227775,RU +1541227776,1541228031,NL 1541228032,1541228543,RU 1541228544,1541229055,CZ 1541229056,1541229567,UA @@ -63646,7 +63840,7 @@ 1541706752,1541707263,RU 1541707264,1541707519,CH 1541707520,1541707775,NL -1541707776,1541708799,RU +1541707776,1541708799,DE 1541708800,1541709823,PL 1541709824,1541710335,RU 1541710336,1541710847,IL @@ -64110,7 +64304,8 @@ 1541960192,1541960703,NL 1541960704,1541961727,UA 1541961728,1541962751,RU -1541962752,1541963263,GB +1541962752,1541963007,A1 +1541963008,1541963263,GB 1541963264,1541963519,RU 1541963520,1541964031,UA 1541964032,1541964287,RU @@ -64263,8 +64458,7 @@ 1542048768,1542049279,PL 1542049280,1542049791,BE 1542049792,1542050815,CZ -1542050816,1542051071,CH -1542051072,1542051327,RU +1542050816,1542051327,RU 1542051328,1542051839,LV 1542051840,1542053887,RU 1542053888,1542054399,NL @@ -64546,6 +64740,7 @@ 1542223360,1542223871,UA 1542223872,1542224127,RU 1542224128,1542224383,UA +1542224384,1542224639,DE 1542224640,1542224895,DK 1542224896,1542225151,RU 1542225152,1542225407,PL @@ -64683,8 +64878,7 @@ 1542303232,1542303743,EU 1542303744,1542303999,GB 1542304000,1542304255,FR -1542304256,1542304511,RU -1542304768,1542305279,RU +1542304256,1542305279,RU 1542305280,1542305791,UA 1542305792,1542306047,FR 1542306048,1542306303,GB @@ -64797,12 +64991,13 @@ 1542375168,1542375423,BG 1542375424,1542376447,RU 1542376448,1542376959,BG +1542376960,1542377215,DK 1542377216,1542377471,RU 1542377472,1542377983,GB 1542377984,1542378495,RU 1542378496,1542378751,DK 1542378752,1542379007,RU -1542379008,1542379519,GB +1542379008,1542379519,A1 1542379520,1542379775,PL 1542379776,1542380031,RU 1542380032,1542380287,RO @@ -64834,6 +65029,7 @@ 1542393088,1542393343,BG 1542393344,1542393599,IR 1542393600,1542394879,RU +1542394880,1542395135,DE 1542395136,1542395391,ES 1542395392,1542395647,RU 1542395648,1542395903,AT @@ -64852,12 +65048,17 @@ 1542402048,1542403071,RU 1542403072,1542403327,CH 1542403328,1542403583,UA +1542403584,1542404095,IR 1542404096,1542405375,RU 1542405376,1542405631,PL 1542405632,1542405887,GB 1542405888,1542406143,RU +1542406144,1542406655,ES 1542406656,1542407167,PL 1542407168,1542408191,RU +1542408192,1542408703,GB +1542408704,1542408959,UA +1542408960,1542409215,CH 1542409216,1542410239,UA 1542410240,1542411263,RU 1542411264,1542411519,DE @@ -64936,6 +65137,7 @@ 1542446080,1542447871,RO 1542447872,1542448639,RU 1542448640,1542448895,RO +1542448896,1542449151,AT 1542449152,1542450175,UA 1542450176,1542450687,CZ 1542450688,1542451199,RU @@ -64947,6 +65149,7 @@ 1542454272,1542454783,NO 1542454784,1542455039,PL 1542455040,1542455295,SE +1542455296,1542455551,CH 1542455552,1542455807,RO 1542455808,1542456319,GB 1542456320,1542456831,RO @@ -65020,7 +65223,267 @@ 1542496768,1542497279,RU 1542497280,1542497535,DE 1542497536,1542497791,CZ -1542498304,1542499327,RU +1542497792,1542498303,IT +1542498304,1542499583,RU +1542499584,1542499839,ES +1542499840,1542500095,GB +1542500096,1542500351,UA +1542500352,1542500607,GB +1542500608,1542500863,RO +1542500864,1542501119,GB +1542501120,1542501375,RU +1542501376,1542502399,IR +1542502400,1542502655,RO +1542502656,1542503423,DK +1542503424,1542503679,RO +1542503680,1542503935,DK +1542503936,1542504447,UA +1542504448,1542504703,GB +1542504704,1542504959,PL +1542504960,1542505215,SE +1542505216,1542505471,NO +1542505472,1542506495,PL +1542506496,1542507007,NL +1542507008,1542507263,RU +1542507264,1542507519,CY +1542507520,1542508543,NO +1542508544,1542509567,RU +1542509568,1542510079,CY +1542510080,1542510591,RU +1542510592,1542510847,SI +1542510848,1542511103,DE +1542511104,1542511871,RU +1542511872,1542512127,GB +1542512128,1542512383,RU +1542512384,1542512639,PL +1542512640,1542512895,GB +1542512896,1542513151,RU +1542513152,1542513663,GB +1542513664,1542513919,FR +1542513920,1542514175,GB +1542514176,1542514687,IT +1542514688,1542515199,RU +1542515200,1542515711,IL +1542515712,1542516223,RO +1542516224,1542516735,PL +1542516736,1542516991,NL +1542516992,1542517247,FR +1542517248,1542517759,RU +1542517760,1542518015,UA +1542518016,1542518271,SK +1542518272,1542518783,LV +1542518784,1542519807,PL +1542519808,1542520319,SE +1542520320,1542520575,PL +1542520576,1542520831,BG +1542520832,1542521343,GB +1542521344,1542521599,PL +1542521600,1542521855,PT +1542521856,1542522111,UA +1542522112,1542522367,PL +1542522368,1542522879,NL +1542522880,1542523903,CZ +1542523904,1542525951,RU +1542525952,1542526463,IR +1542526464,1542526719,RU +1542526720,1542526975,CZ +1542526976,1542527999,PL +1542528000,1542528255,LU +1542528256,1542528511,NL +1542528512,1542528767,BE +1542528768,1542531583,PL +1542531584,1542531839,FR +1542531840,1542532095,RU +1542532096,1542532351,DE +1542532352,1542533119,RU +1542533120,1542534143,PL +1542534144,1542534399,DE +1542534400,1542534655,HR +1542534656,1542535167,DE +1542535168,1542535423,GB +1542535424,1542535679,FR +1542535680,1542536191,RU +1542536192,1542537215,PL +1542537216,1542538239,LV +1542538240,1542538751,RU +1542538752,1542539007,GB +1542539008,1542539263,UA +1542539264,1542540287,DE +1542540288,1542540799,IT +1542540800,1542541055,GB +1542541056,1542541311,BE +1542541312,1542542335,UA +1542542336,1542542847,RU +1542542848,1542543359,GB +1542543360,1542544383,RU +1542544384,1542544639,IR +1542544640,1542544895,UA +1542544896,1542545407,GR +1542545408,1542586367,UA +1542586368,1542594559,AZ +1542594560,1542597631,RU +1542597632,1542598143,IR +1542598144,1542599679,RO +1542599680,1542600703,UA +1542600704,1542602751,PL +1542602752,1542627327,MD +1542627328,1542627583,NL +1542627584,1542627839,RU +1542627840,1542628095,FR +1542628096,1542630399,RU +1542630400,1542630655,GB +1542630656,1542630911,DE +1542630912,1542631423,PL +1542631424,1542635519,RU +1542635520,1542637567,UA +1542637568,1542639615,NO +1542639616,1542640639,UA +1542640640,1542640895,DE +1542640896,1542641151,RU +1542641152,1542641663,IN +1542641664,1542641919,RO +1542641920,1542642175,AE +1542642176,1542642431,PL +1542642432,1542642687,RU +1542642688,1542643199,PL +1542643200,1542643455,UA +1542643456,1542643711,NL +1542643712,1542660095,UA +1542660096,1542668287,RU +1542668288,1542668799,NL +1542668800,1542669311,PL +1542669312,1542669567,RU +1542669568,1542669823,NO +1542669824,1542670079,DE +1542670080,1542670335,CH +1542670336,1542671359,ES +1542671360,1542671871,FR +1542671872,1542672383,RS +1542672384,1542681087,RU +1542681088,1542681343,GB +1542681344,1542683135,RU +1542683136,1542683391,SK +1542683392,1542683647,RS +1542683648,1542684159,RU +1542684160,1542684671,IR +1542684672,1542692863,RU +1542692864,1542696959,IR +1542696960,1542701055,RU +1542701056,1542709247,UA +1542709248,1542717439,RU +1542717440,1542733823,UA +1542733824,1542734847,RU +1542734848,1542735103,GB +1542735104,1542735359,UA +1542735360,1542735871,PL +1542735872,1542742015,RU +1542742016,1542746111,RO +1542746112,1542747135,RU +1542747136,1542747391,TR +1542747392,1542747647,GB +1542747648,1542748159,UA +1542748160,1542749183,SK +1542749184,1542749439,UA +1542749440,1542749695,DE +1542749696,1542749951,GB +1542749952,1542758399,UA +1542758400,1542763519,RU +1542763520,1542763775,DE +1542763776,1542764031,BG +1542764032,1542764543,RU +1542764544,1542766591,PL +1542766592,1542770687,RU +1542770688,1542774783,PL +1542774784,1542775039,NL +1542775040,1542775295,PL +1542775296,1542775807,TR +1542775808,1542776063,RU +1542776064,1542776319,GB +1542776320,1542776831,PL +1542776832,1542777855,UA +1542777856,1542778367,GB +1542778368,1542778623,FR +1542778624,1542778879,GB +1542778880,1542780159,RU +1542780416,1542780927,GB +1542780928,1542781951,PL +1542781952,1542782975,RU +1542782976,1542791167,CZ +1542791168,1542801407,RU +1542801408,1542803455,UA +1542803456,1542805503,PL +1542805504,1542807551,RO +1542807552,1542815743,UA +1542815744,1542823935,RU +1542823936,1542832127,RO +1542832128,1542832383,BG +1542832384,1542832639,SI +1542832640,1542832895,LV +1542832896,1542833151,GR +1542833152,1542836735,RO +1542836736,1542837247,RU +1542837248,1542837503,GB +1542837504,1542837759,UA +1542837760,1542838015,RS +1542838016,1542838271,DE +1542838272,1542838783,UA +1542838784,1542839039,DK +1542839040,1542839295,PL +1542839296,1542839551,DE +1542839552,1542839807,UA +1542839808,1542840063,CY +1542840064,1542848511,UA +1542848512,1542849535,RU +1542849536,1542850559,UA +1542850560,1542851583,GB +1542851584,1542851839,BG +1542851840,1542852095,LU +1542852096,1542852351,KW +1542852352,1542852607,PL +1542852608,1542855167,RU +1542855168,1542856191,GB +1542856192,1542856703,RU +1542856704,1542864895,UA +1542864896,1542868991,PL +1542868992,1542875135,RU +1542875136,1542877183,PL +1542877184,1542881279,RU +1542881280,1542889471,UA +1542889472,1542891519,RU +1542891520,1542892543,PL +1542892544,1542900223,RO +1542900224,1542900479,DE +1542900480,1542901759,RO +1542901760,1542903807,PL +1542903808,1542904319,RO +1542904320,1542904575,IL +1542904576,1542904831,RU +1542904832,1542914047,UA +1542914048,1542922239,RU +1542922240,1542930431,UA +1542930432,1542930943,CZ +1542930944,1542931455,IR +1542931456,1542932479,RU +1542932480,1542932735,LV +1542932736,1542932991,GB +1542932992,1542933247,NO +1542933248,1542933503,FR +1542933504,1542938623,UA +1542938624,1542950911,RU +1542950912,1542951423,DE +1542951424,1542951679,RO +1542951680,1542951935,PL +1542951936,1542955007,RU +1542955008,1542963199,UA +1542963200,1542970623,RU +1542970624,1542970879,UA +1542970880,1542971391,RU +1542971392,1542972415,UA +1542972416,1542973439,NO +1542973440,1542975487,RU +1542975488,1542977535,RO +1542977536,1542978559,RU +1542978560,1542978815,PL 1543503872,1545601023,GB 1545601024,1545673167,SE 1545673168,1545673175,FI @@ -65652,6 +66115,7 @@ 1566312448,1566314495,IE 1566314496,1566316543,BE 1566316544,1566317567,NO +1566317568,1566318591,NL 1566318592,1566320639,RU 1566320640,1566321151,DE 1566321152,1566321407,NL @@ -66256,6 +66720,7 @@ 1571686400,1571688447,GB 1571688448,1571690495,CH 1571690496,1571691519,GE +1571691520,1571692543,PL 1571692544,1571694591,FR 1571694592,1571696639,LU 1571696640,1571700735,RU @@ -66619,6 +67084,7 @@ 1572827136,1572829183,NO 1572829184,1572831231,FI 1572831232,1572831487,BH +1572831488,1572833279,NL 1572833280,1572835327,ES 1572835328,1572837375,IE 1572837376,1572839423,DK @@ -67432,7 +67898,9 @@ 1582153728,1582170111,SA 1582170112,1582186495,CH 1582186496,1582194207,TR -1582194208,1582194431,GB +1582194208,1582194271,GB +1582194272,1582194303,CY +1582194304,1582194431,GB 1582194432,1582202879,TR 1582202880,1582219263,PL 1582219264,1582252031,RU @@ -67721,8 +68189,8 @@ 1585400064,1585400319,IL 1585400320,1585400575,GB 1585400576,1585400831,FR -1585400832,1585401087,DE -1585401088,1585401343,NL +1585400832,1585401088,DE +1585401089,1585401343,NL 1585401344,1585401599,DE 1585401600,1585401855,GB 1585401856,1585403903,IT @@ -67827,7 +68295,9 @@ 1586356224,1586372607,RU 1586372608,1586380799,JO 1586380800,1586388991,GB -1586388992,1586397183,ES +1586388992,1586389518,ES +1586389519,1586389774,US +1586389775,1586397183,ES 1586397184,1586399231,LV 1586399232,1586401279,RU 1586401280,1586403327,IT @@ -68267,7 +68737,9 @@ 1596456960,1596588031,PL 1596588032,1596719103,BG 1596719104,1596850175,IE -1596850176,1596981247,CZ +1596850176,1596901375,CZ +1596901376,1596905471,BY +1596905472,1596981247,CZ 1596981248,1597243391,PL 1597243392,1597505535,RU 1597505536,1597767679,KZ @@ -68365,8 +68837,8 @@ 1602230271,1602230271,DE 1602230272,1602232319,DK 1602232320,1602234367,CH -1602234368,1602234591,FR -1602234592,1602234623,GB +1602234368,1602234607,FR +1602234608,1602234623,GB 1602234624,1602234703,FR 1602234704,1602234848,GB 1602234849,1602234895,FR @@ -68455,9 +68927,7 @@ 1602351104,1602353151,CZ 1602353152,1602355199,ES 1602355200,1602357247,GB -1602357248,1602357503,FR -1602357504,1602357759,A1 -1602357760,1602359295,FR +1602357248,1602359295,FR 1602359296,1602361343,DE 1602361344,1602363391,FI 1602363392,1602365439,LV @@ -68545,7 +69015,9 @@ 1602846720,1602879487,GE 1602879488,1602895871,FR 1602895872,1602896127,MQ -1602896128,1602912255,FR +1602896128,1602896924,FR +1602896925,1602896925,RE +1602896926,1602912255,FR 1602912256,1603010559,RU 1603010560,1603014655,FR 1603014656,1603018751,RU @@ -68554,7 +69026,9 @@ 1603026944,1603031039,SE 1603031040,1603035135,RU 1603035136,1603039231,SY -1603039232,1603043327,RS +1603039232,1603042559,RS +1603042560,1603042687,A1 +1603042688,1603043327,RS 1603043328,1603047423,IT 1603047424,1603051519,RU 1603051520,1603055615,JO @@ -68570,7 +69044,9 @@ 1603080704,1603082751,DE 1603082752,1603083007,ES 1603083008,1603083263,UA -1603083264,1603084031,DE +1603083264,1603083567,DE +1603083568,1603083823,LU +1603083824,1603084031,DE 1603084032,1603086847,IT 1603086848,1603087103,DE 1603087104,1603088383,IT @@ -68893,7 +69369,9 @@ 1605124960,1605125119,GB 1605125120,1605125247,US 1605125248,1605125263,GB -1605125264,1605125279,DE +1605125264,1605125267,DE +1605125268,1605125269,EU +1605125270,1605125279,DE 1605125280,1605125335,GB 1605125336,1605125343,US 1605125344,1605125375,GB @@ -68909,7 +69387,9 @@ 1605128704,1605129215,GB 1605129216,1605129727,US 1605129728,1605130239,GB -1605130240,1605130271,US +1605130240,1605130244,US +1605130245,1605130245,EU +1605130246,1605130271,US 1605130272,1605130295,GB 1605130296,1605130303,US 1605130304,1605130367,GB @@ -69033,7 +69513,7 @@ 1607929856,1607930879,SE 1607930880,1607933951,PL 1607933952,1607934975,DE -1607934976,1607935999,UA +1607934976,1607937023,UA 1607937024,1607938047,LV 1607938048,1607939071,UA 1607939072,1607940095,PL @@ -69041,12 +69521,14 @@ 1607941120,1607942143,ES 1607942144,1607944191,RU 1607944192,1607945215,FR +1607945216,1607946239,PL 1607946240,1607947263,UA 1607947264,1607948287,RU 1607948288,1607949311,GB 1607949312,1607950335,UA 1607950336,1607952383,RU 1607952384,1607953407,UA +1607953408,1607954431,RU 1607954432,1607956479,UA 1607956480,1607957503,ES 1607957504,1607958527,UA @@ -69056,19 +69538,27 @@ 1607962624,1607963647,UA 1607963648,1607965695,RU 1607965696,1607966719,UA +1607966720,1607967743,IR 1607967744,1607968767,UA 1607968768,1607969791,SE +1607969792,1607970047,RU +1607970048,1607970303,IR +1607970304,1607970815,GB 1607970816,1607972863,RU 1607972864,1607974911,NL 1607974912,1607976959,PL 1607976960,1607980031,RU 1607980032,1607981055,DE 1607981056,1607982079,UA +1607982080,1607982847,RO +1607982848,1607983103,UA 1607983104,1607984127,GB +1607984128,1607985151,RU 1607985152,1607986175,PL 1607986176,1607987199,UA +1607987200,1607988223,CZ 1607988224,1607989247,KG -1607990272,1607991295,RU +1607989248,1607991295,RU 1607991296,1608122367,UA 1608122368,1608253439,RO 1608253440,1608384511,RU @@ -69204,7 +69694,9 @@ 1632358656,1632358775,CA 1632358776,1632358783,US 1632358784,1632362495,CA -1632362496,1634414591,US +1632362496,1632587007,US +1632587008,1632587263,A1 +1632587264,1634414591,US 1634414592,1634418687,CA 1634418688,1634447359,US 1634447360,1634451455,CA @@ -70248,7 +70740,9 @@ 1728346112,1728346367,AU 1728346368,1728346623,NZ 1728346624,1728347135,AU -1728347136,1728348159,SG +1728347136,1728347147,SG +1728347148,1728347148,AP +1728347149,1728348159,SG 1728348160,1728349183,VN 1728349184,1728349951,AU 1728349952,1728350207,NP @@ -70662,7 +71156,6 @@ 1728734208,1728735231,SG 1728735232,1728736255,ID 1728736256,1728736511,HK -1728736512,1728736767,IN 1728736768,1728737023,ID 1728737024,1728737279,CN 1728737280,1728738303,JP @@ -70817,6 +71310,48 @@ 1728869376,1728870399,IN 1728870400,1728871423,PK 1728871424,1728872447,IN +1728872448,1728873471,AU +1728873472,1728874495,IN +1728874496,1728875519,CN +1728875520,1728876543,HK +1728876544,1728877567,MY +1728877568,1728878591,HK +1728878592,1728879615,MY +1728879616,1728880127,IN +1728880128,1728880383,JP +1728880384,1728880639,MY +1728880640,1728881663,KH +1728881664,1728881919,ID +1728881920,1728882175,AU +1728882176,1728882431,BD +1728882432,1728882687,ID +1728882688,1728883711,IN +1728883712,1728885759,BD +1728885760,1728886783,JP +1728886784,1728887807,CN +1728887808,1728888831,AU +1728888832,1728889855,IN +1728889856,1728890879,JP +1728890880,1728891903,SG +1728891904,1728892927,BD +1728892928,1728893439,BN +1728893440,1728893695,SG +1728893696,1728893951,IN +1728893952,1728894975,SG +1728894976,1728895999,HK +1728896000,1728897023,ID +1728897024,1728898047,JP +1728898048,1728899071,BD +1728899072,1728900095,CN +1728900096,1728901119,BD +1728901120,1728901375,ID +1728901376,1728901631,AU +1728901632,1728902143,ID +1728902144,1728902399,SG +1728902400,1728902655,IN +1728902656,1728902911,MY +1728902912,1728903167,BD +1728903168,1728905215,KR 1728905216,1728905471,FJ 1728905472,1728905727,PK 1728905728,1728907263,IN @@ -70832,9 +71367,54 @@ 1728919552,1728920575,AU 1728920576,1728921599,JP 1728921600,1728922623,AF -1728922624,1728924671,AU +1728922624,1728924415,AU +1728924416,1728924671,MY 1728924672,1728925695,VN -1728925696,1728926719,AU +1728925696,1728927743,AU +1728927744,1728928767,LA +1728928768,1728929791,JP +1728929792,1728930815,IN +1728930816,1728931839,AU +1728931840,1728932863,JP +1728932864,1728933887,IN +1728933888,1728934911,JP +1728934912,1728935935,NZ +1728935936,1728936959,MY +1728936960,1728937983,CN +1728937984,1728939007,SG +1728939008,1728939519,MY +1728939520,1728939775,PH +1728939776,1728940031,IN +1728940032,1728942079,JP +1728942080,1728943103,CN +1728943104,1728944127,BD +1728944128,1728945151,JP +1728945152,1728946175,BD +1728946176,1728947199,KR +1728947200,1728949247,JP +1728949248,1728950271,SG +1728950272,1728950783,HK +1728950784,1728951551,IN +1728951552,1728951807,ID +1728951808,1728952063,SG +1728952064,1728952319,IN +1728952320,1728953343,AU +1728953344,1728954367,HK +1728954368,1728955391,JP +1728955392,1728956415,CN +1728956416,1728957439,ID +1728957440,1728959487,JP +1728959488,1728960511,TH +1728960512,1728961279,AU +1728961280,1728961535,IN +1728961536,1728962559,JP +1728962560,1728963583,BD +1728963584,1728964607,TH +1728964608,1728965631,HK +1728965632,1728966655,BD +1728966656,1728967679,IN +1728967680,1728968703,CN +1728968704,1728970751,JP 1728970752,1728971007,FJ 1728971008,1728971263,AU 1728971264,1728971519,IN @@ -70856,6 +71436,119 @@ 1728982784,1728985087,AU 1728985088,1728986111,TW 1728986112,1728987135,PH +1728987136,1728988159,AU +1728988160,1728989183,NZ +1728989184,1728990207,BD +1728990208,1728991231,SG +1728991232,1728992255,BD +1728992256,1728993279,CN +1728993280,1728994303,PG +1728994304,1728995327,AU +1728995328,1728996095,IN +1728996096,1728996351,SG +1728996352,1728997375,HK +1728997376,1728998399,PH +1728998400,1728998655,ID +1728998656,1728998911,BD +1728998912,1728999423,ID +1728999424,1729000447,CN +1729000448,1729001471,HK +1729001472,1729003519,IN +1729003520,1729004543,BD +1729004544,1729006591,CN +1729006592,1729007615,NZ +1729007616,1729008639,HK +1729008640,1729010687,JP +1729010688,1729011711,CN +1729011712,1729012735,IN +1729012736,1729013759,TH +1729013760,1729014783,NZ +1729014784,1729015807,AU +1729015808,1729016831,JP +1729016832,1729017855,IN +1729017856,1729018111,MY +1729018112,1729018367,SG +1729018368,1729018879,AU +1729018880,1729019903,IN +1729019904,1729020159,ID +1729020160,1729020415,BD +1729020416,1729020671,PH +1729020672,1729020927,ID +1729020928,1729021951,JP +1729021952,1729022975,AU +1729022976,1729023999,BD +1729024000,1729025023,IN +1729025024,1729026047,SG +1729026048,1729027071,NZ +1729027072,1729028095,HK +1729028096,1729029119,SG +1729029120,1729029375,AU +1729029376,1729029631,ID +1729029632,1729029887,AU +1729029888,1729030143,PK +1729030144,1729031167,IN +1729031168,1729032191,SG +1729032192,1729033215,CN +1729033216,1729034239,SG +1729034240,1729035263,KH +1729035264,1729036287,AU +1729036288,1729037311,JP +1729037312,1729039359,CN +1729039360,1729040383,JP +1729040384,1729041407,CN +1729041408,1729044479,HK +1729044480,1729045503,JP +1729045504,1729046015,ID +1729046016,1729046271,HK +1729046272,1729046527,JP +1729046528,1729047551,BD +1729047552,1729048575,AU +1729048576,1729049599,VN +1729049600,1729050623,IN +1729050624,1729051647,JP +1729051648,1729053695,IN +1729053696,1729054719,JP +1729054720,1729055231,AU +1729055232,1729055487,IN +1729055488,1729055743,NZ +1729055744,1729056767,JP +1729056768,1729057791,IN +1729057792,1729058815,HK +1729058816,1729059839,TH +1729059840,1729060863,JP +1729060864,1729061887,CN +1729061888,1729062911,SG +1729062912,1729063935,MY +1729063936,1729064959,JP +1729064960,1729065983,PG +1729065984,1729067007,JP +1729067008,1729068031,HK +1729068032,1729068287,IN +1729068288,1729068543,SG +1729068544,1729069055,NZ +1729069056,1729070079,AU +1729070080,1729071103,HK +1729071104,1729072127,MY +1729072128,1729072895,BD +1729072896,1729073151,ID +1729073152,1729074175,TH +1729074176,1729075199,AU +1729075200,1729076223,NZ +1729076224,1729076735,AU +1729076736,1729076991,HK +1729076992,1729077247,IN +1729077248,1729078271,JP +1729078272,1729079295,BD +1729079296,1729080319,AU +1729080320,1729081343,ID +1729081344,1729081599,IN +1729081600,1729082111,AU +1729082368,1729084415,HK +1729084416,1729085439,JP +1729085440,1729087487,HK +1729087488,1729088511,CN +1729088512,1729090559,AU +1729090560,1729091583,JP 1729495040,1729519615,CN 1729519616,1729520639,HK 1729520640,1729527807,CN @@ -71144,7 +71837,8 @@ 1744218368,1744218623,ID 1744218624,1744219135,IN 1744219136,1744220159,PH -1744220160,1744221183,HK +1744220160,1744220927,HK +1744220928,1744221183,JP 1744221184,1744222207,NZ 1744222208,1744222719,ID 1744222720,1744223231,AU @@ -71166,8 +71860,8 @@ 1744235520,1744236543,KR 1744236544,1744237567,IN 1744237568,1744238591,HK -1744238592,1744239103,US -1744239104,1744239615,NZ +1744238592,1744238847,US +1744238848,1744239615,NZ 1744239616,1744240639,JP 1744240640,1744241663,AU 1744241664,1744242687,JP @@ -71237,6 +71931,14 @@ 1744304128,1744305151,AU 1744305152,1744306175,PH 1769996288,1772093439,MA +1776680960,1776812031,KE +1776812032,1776877567,NA +1776877568,1776943103,ZA +1777061888,1777063935,SD +1777063936,1777065983,MZ +1777065984,1777070079,GQ +1777070080,1777074175,BW +1777074176,1777139711,ZA 1777205248,1777336319,SD 1777336320,1778384895,ZA 1778384896,1778385151,CN @@ -71357,76 +72059,13 @@ 1796325632,1796514244,US 1796514245,1796514245,A1 1796514246,1803550719,US -1807745024,1815805951,US -1815805952,1815806207,FR +1807745024,1815806207,US 1815806208,1815806463,A1 -1815806464,1815806527,US -1815806528,1815806559,GB -1815806560,1815806719,US -1815806720,1815806847,GB -1815806848,1815806917,US -1815806918,1815806925,AR -1815806926,1815807103,US -1815807104,1815807135,SC -1815807136,1815807199,US -1815807200,1815807231,GB -1815807232,1815807302,US -1815807303,1815807312,DE -1815807313,1815807679,US -1815807680,1815807743,GB -1815807744,1815807775,SC -1815807776,1815807776,US -1815807777,1815807794,GB -1815807795,1815807839,US -1815807840,1815807935,GB -1815807936,1815807999,US +1815806464,1815807999,US 1815808000,1815808255,A1 -1815808256,1815808292,US -1815808293,1815808300,GB -1815808301,1815808304,US -1815808305,1815808314,GB -1815808315,1815808393,US -1815808394,1815808404,GB -1815808405,1815808586,US -1815808587,1815808598,AE -1815808599,1815808656,US +1815808256,1815808656,US 1815808657,1815808657,A1 -1815808658,1815808719,US -1815808720,1815808731,GB -1815808732,1815808737,US -1815808738,1815808758,GB -1815808759,1815808767,US -1815808768,1815808831,SC -1815808832,1815808844,US -1815808845,1815808857,GB -1815808858,1815808874,US -1815808875,1815808883,GB -1815808884,1815808895,US -1815808896,1815808959,SC -1815808960,1815809005,US -1815809006,1815809015,GB -1815809016,1815809196,US -1815809197,1815809205,IE -1815809206,1815809319,US -1815809320,1815809327,NL -1815809328,1815809328,US -1815809329,1815809337,SE -1815809338,1815809439,US -1815809440,1815809471,SC -1815809472,1815809503,DK -1815809504,1815809504,US -1815809505,1815809513,GB -1815809514,1815809535,US -1815809536,1815809599,SC -1815809600,1815809644,US -1815809645,1815809654,AN -1815809655,1815809664,US -1815809665,1815809686,DK -1815809687,1815809702,US -1815809703,1815809721,DK -1815809722,1815809766,US -1815809767,1815809784,DK -1815809785,1815822335,US +1815808658,1815822335,US 1815822336,1815826431,CA 1815826432,1815871487,US 1815871488,1815879679,CA @@ -71607,6 +72246,8 @@ 1823432704,1823465471,US 1823465472,1823469567,CA 1823469568,1823735807,US +1823735808,1823866879,CA +1823866880,1823997951,US 1824522240,1826955551,US 1826955552,1826955559,AD 1826955560,1828716543,US @@ -71625,7 +72266,9 @@ 1832779776,1832812543,FR 1832812544,1832845311,RU 1832845312,1832878079,BH -1832878080,1832910847,RU +1832878080,1832878412,RU +1832878413,1832878413,BH +1832878414,1832910847,RU 1832910848,1833172991,IL 1833172992,1833177087,GB 1833177088,1833179135,RU @@ -72170,7 +72813,8 @@ 1839794736,1839794751,CH 1839794752,1839794815,GB 1839794816,1839794847,MY -1839794848,1839795151,GB +1839794848,1839794879,CH +1839794880,1839795151,GB 1839795152,1839795167,US 1839795168,1839796607,GB 1839796608,1839796671,US @@ -72599,7 +73243,9 @@ 1844168704,1844169471,SE 1844169472,1844169487,AF 1844169488,1844169519,US -1844169520,1844169599,SE +1844169520,1844169567,SE +1844169568,1844169583,US +1844169584,1844169599,SE 1844169600,1844169647,US 1844169648,1844169655,AF 1844169656,1844169663,SE @@ -73422,7 +74068,7 @@ 1921861632,1921863679,SG 1921865728,1921867775,ID 1921867776,1921871871,AU -1921871872,1921875967,NZ +1921871872,1921875967,US 1921875968,1921892351,CN 1921892352,1921896447,AU 1921896448,1921898495,SG @@ -73471,7 +74117,9 @@ 1932156928,1932161023,JP 1932161024,1932163071,TW 1932163072,1932165119,PH -1932165120,1932197887,SG +1932165120,1932182523,SG +1932182524,1932182524,AP +1932182525,1932197887,SG 1932197888,1932263423,TW 1932263424,1933574143,CN 1933574144,1933639679,AU @@ -74347,7 +74995,17 @@ 2022313984,2022318079,NZ 2022318080,2022319135,AU 2022319136,2022319151,SG -2022319152,2022326271,AU +2022319152,2022319359,AU +2022319360,2022319615,IN +2022319616,2022320127,AU +2022320128,2022320383,HK +2022320384,2022321151,AU +2022321152,2022321407,SG +2022321408,2022322175,AU +2022322176,2022322431,JP +2022322432,2022323199,AU +2022323200,2022323455,KR +2022323456,2022326271,AU 2022326272,2022330367,VN 2022330368,2022334463,MY 2022334464,2022342655,IN @@ -74584,7 +75242,9 @@ 2056794112,2056796159,BD 2056796160,2056806399,JP 2056806400,2056814591,KR -2056814592,2056818943,JP +2056814592,2056817727,JP +2056817728,2056817791,AU +2056817792,2056818943,JP 2056818944,2056818993,MY 2056818994,2056818994,AP 2056818995,2056819199,MY @@ -74874,7 +75534,9 @@ 2083471360,2083487743,JP 2083487744,2083504127,AU 2083504128,2083520511,JP -2083520512,2084569087,KR +2083520512,2083966719,KR +2083966720,2083966975,JP +2083966976,2084569087,KR 2084569088,2084732927,CN 2084732928,2084741119,SG 2084741120,2084743167,ID @@ -74900,8 +75562,7 @@ 2087462912,2087464959,CN 2087464960,2087467007,KH 2087467008,2087469055,JP -2087469056,2087481343,HK -2087481344,2087485439,SG +2087469056,2087485439,HK 2087485440,2087501823,TW 2087501824,2087518207,JP 2087518208,2087519231,TH @@ -75021,7 +75682,9 @@ 2098115072,2098122495,JP 2098122496,2098122751,US 2098122752,2098200575,JP -2098200576,2098724863,IN +2098200576,2098623239,IN +2098623240,2098623240,PG +2098623241,2098724863,IN 2098724864,2098987007,TH 2098987008,2099183615,JP 2099183616,2099199999,MO @@ -75521,7 +76184,7 @@ 2189164544,2189230079,US 2189230080,2189295615,CH 2189295616,2189492223,US -2189492224,2189557759,CZ +2189492224,2189557759,CA 2189557760,2189623295,AU 2189623296,2189754367,US 2189754368,2189819903,DE @@ -75620,7 +76283,9 @@ 2195456000,2195521535,AU 2195521536,2195652607,US 2195652608,2195718143,CH -2195718144,2195783679,US +2195718144,2195742719,US +2195742720,2195742743,GB +2195742744,2195783679,US 2195783680,2196045823,DK 2196045824,2196111359,SE 2196111360,2196439039,FI @@ -75995,7 +76660,9 @@ 2258594816,2258596095,AU 2258596096,2258596351,HK 2258596352,2258596863,AP -2258596864,2258597375,AU +2258596864,2258597293,AU +2258597294,2258597294,PG +2258597295,2258597375,AU 2258597376,2258597439,HK 2258597440,2258598079,AU 2258598080,2258598087,TW @@ -76086,7 +76753,9 @@ 2265710848,2265776127,CA 2265776128,2266169343,US 2266169344,2266234879,CA -2266234880,2276786175,US +2266234880,2266694655,US +2266694656,2266694911,SG +2266694912,2276786175,US 2276786176,2276851711,CA 2276851712,2277769215,US 2277769216,2277834751,GB @@ -76098,7 +76767,9 @@ 2281023488,2281023743,IN 2281023744,2282226019,US 2282226020,2282226020,AP -2282226021,2282226943,US +2282226021,2282226243,US +2282226244,2282226245,AP +2282226246,2282226943,US 2282226944,2282227199,AP 2282227200,2282264063,US 2282264064,2282264319,EU @@ -76643,7 +77314,10 @@ 2365456384,2365521919,US 2365521920,2365587455,CN 2365587456,2365589503,JO -2365589504,2365591551,A2 +2365589504,2365590527,US +2365590528,2365591039,NO +2365591040,2365591455,US +2365591456,2365591551,NO 2365591552,2365593599,DE 2365593600,2365595647,NL 2365595648,2365603839,GB @@ -76656,7 +77330,9 @@ 2365638656,2365640703,FR 2365640704,2365644799,GB 2365644800,2365652991,NO -2365652992,2366032895,DE +2365652992,2365983487,DE +2365983488,2365983519,EU +2365983520,2366032895,DE 2366032896,2366033151,GB 2366033152,2366111743,DE 2366111744,2366144511,MT @@ -76936,7 +77612,9 @@ 2382422016,2382426111,JM 2382426112,2382430207,US 2382430208,2382626815,CA -2382626816,2382659583,US +2382626816,2382675967,US +2382675968,2382684159,CA +2382684160,2382692351,US 2382692352,2383085567,CA 2383085568,2383151103,US 2383151104,2385903615,CA @@ -76961,7 +77639,12 @@ 2387542016,2387607551,US 2387607552,2388328447,CA 2388328448,2388393983,US -2388393984,2390818815,CA +2388393984,2389245951,CA +2389245952,2389311487,US +2389311488,2389639167,CA +2389639168,2389704703,US +2389704704,2390818815,CA +2390818816,2390884351,US 2390884352,2390995455,CA 2390995456,2391015423,US 2391015424,2394947583,CA @@ -77190,7 +77873,9 @@ 2429943808,2430009343,HK 2430009344,2432172031,US 2432172032,2432237567,BE -2432237568,2432630783,US +2432237568,2432616448,US +2432616449,2432617472,NL +2432617473,2432630783,US 2432630784,2432696319,CN 2432696320,2433247231,NL 2433247232,2433247487,GB @@ -77595,7 +78280,9 @@ 2466232320,2466234367,ES 2466234368,2466242559,RU 2466242560,2466250751,GE -2466250752,2466643967,US +2466316288,2466323475,US +2466323476,2466323477,IN +2466323478,2466643967,US 2466643968,2466709503,KR 2466709504,2466775039,HU 2466775040,2466840575,HK @@ -77863,9 +78550,13 @@ 2500175872,2500175879,RO 2500175880,2500199471,US 2500199472,2500199475,IE -2500199476,2500235775,US +2500199476,2500225553,US +2500225554,2500225561,ES +2500225562,2500235775,US 2500235776,2500236031,GB -2500236032,2500238383,US +2500236032,2500236837,US +2500236838,2500236838,ES +2500236839,2500238383,US 2500238384,2500238399,DE 2500238400,2500238463,US 2500238464,2500238527,DE @@ -77882,8 +78573,8 @@ 2500616704,2500636735,US 2500636736,2500636799,GB 2500636800,2500646911,US -2500646912,2500647167,ES -2500647168,2500719615,US +2500646912,2500647935,ES +2500647936,2500719615,US 2500719616,2500720639,IE 2500720640,2501574655,US 2501574656,2501640191,KZ @@ -78045,7 +78736,8 @@ 2524315648,2524512255,US 2524512256,2524643327,CN 2524643328,2524963071,US -2524963072,2524963327,GB +2524963072,2524963311,GB +2524963312,2524963327,EU 2524963328,2524971007,US 2524971008,2525036543,ES 2525036544,2525102079,EU @@ -78155,9 +78847,67 @@ 2547187712,2547318783,GB 2547318784,2547515391,US 2547515392,2547515399,DK -2547516416,2547517439,CH -2547519488,2547523583,CH -2547523584,2547527679,SE +2547517440,2547519487,GB +2548039680,2548563967,GB +2548563968,2548826111,IR +2548826112,2548834303,AT +2548834304,2548842495,GB +2548842496,2548858879,RU +2548858880,2548867071,NL +2548867072,2548875263,IQ +2548875264,2548877311,KZ +2548877312,2548879359,SE +2548879360,2548883455,GB +2548883456,2548887551,SK +2548887552,2548891647,MK +2548891648,2548928511,BG +2548928512,2548932607,KZ +2548932608,2548934655,NL +2548934656,2548936703,RU +2548936704,2548940799,SE +2548940800,2548948991,ES +2548948992,2548951039,CZ +2548951040,2548953087,GB +2548953088,2548955135,RU +2548955136,2548957183,DE +2548957184,2549612543,IR +2549612544,2549614591,SE +2549614592,2549616639,IT +2549616640,2549618687,BE +2549618688,2549620735,DE +2549620736,2549624831,PL +2549624832,2549626879,BE +2549626880,2549628927,PL +2549628928,2549637119,RO +2549637120,2549641215,BH +2549641216,2549645311,RU +2549645312,2549678079,RO +2549678080,2549698559,GB +2549698560,2549700607,PL +2549700608,2549702655,EU +2549702656,2549704703,UA +2549704704,2549706751,CZ +2549706752,2549710847,NO +2549710848,2549743615,CZ +2549743616,2549809151,TR +2549809152,2549874687,BG +2549874688,2549876735,GB +2549876736,2549878783,NO +2549878784,2549880831,DE +2549880832,2549882879,SE +2549882880,2549884927,CH +2549884928,2549891071,DE +2549891072,2549899263,RU +2549899264,2549901311,PS +2549901312,2549903359,RU +2549903360,2549905407,ES +2549905408,2549907455,NL +2549907456,2549923839,DE +2549923840,2549927935,BG +2549927936,2549929983,HR +2549929984,2549932031,DE +2549932032,2549940223,HR +2549940224,2550136831,RO 2550136832,2554227967,US 2554227968,2554228223,EU 2554228224,2554462207,US @@ -78190,7 +78940,17 @@ 2556493824,2556559359,US 2556559360,2556624895,AU 2556624896,2556690431,KR -2556690432,2556755967,US +2556690432,2556703871,US +2556703872,2556703935,SG +2556703936,2556715719,US +2556715720,2556715727,HK +2556715728,2556716159,US +2556716160,2556716175,HK +2556716176,2556742071,US +2556742072,2556742079,GB +2556742080,2556742327,US +2556742328,2556742335,GB +2556742336,2556755967,US 2556755968,2556821503,HK 2556821504,2556887039,SG 2556887040,2557018111,HK @@ -78279,7 +79039,9 @@ 2585853952,2585985023,JP 2585985024,2587018239,US 2587018240,2587018495,IE -2587018496,2587951103,US +2587018496,2587067647,US +2587067648,2587067903,GB +2587067904,2587951103,US 2600534016,2600665087,US 2600665088,2600730623,CA 2600730624,2600796159,NO @@ -78338,7 +79100,9 @@ 2609381376,2609446911,GB 2609446912,2609512447,DK 2609512448,2609643519,US -2609643520,2609708799,GB +2609643520,2609677815,GB +2609677816,2609677817,EU +2609677818,2609708799,GB 2609708800,2609709055,AP 2609709056,2609840127,US 2609840128,2609971199,AU @@ -78390,7 +79154,9 @@ 2616770304,2616770559,EU 2616770560,2616786943,US 2616786944,2616852479,GB -2616852480,2616918015,DE +2616852480,2616885527,DE +2616885528,2616885529,EU +2616885530,2616918015,DE 2616983552,2617049087,US 2617049088,2617114623,IT 2617114624,2617180159,US @@ -78865,7 +79631,9 @@ 2677407744,2677473279,US 2677473280,2677538815,FR 2677538816,2677604351,FI -2677604352,2677669887,US +2677604352,2677644347,US +2677644348,2677644348,EU +2677644349,2677669887,US 2677669888,2677735423,DE 2677735424,2677800959,US 2677800960,2677866495,CH @@ -79822,7 +80590,9 @@ 2705522688,2705588223,ES 2705588224,2705596159,US 2705596160,2705596415,CA -2705596416,2705784831,US +2705596416,2705691647,US +2705691648,2705692671,GB +2705692672,2705784831,US 2705784832,2705850367,GB 2705850368,2705915903,ES 2705915904,2706046975,GB @@ -80033,7 +80803,9 @@ 2751660032,2751716351,AT 2751716352,2751716607,US 2751716608,2751725567,AT -2751725568,2751791103,SE +2751725568,2751729951,SE +2751729952,2751729953,EU +2751729954,2751791103,SE 2751791104,2751856639,FI 2751856640,2751922175,GB 2751922176,2751987711,FR @@ -80556,7 +81328,9 @@ 2817933057,2817933058,CA 2817933059,2817986303,US 2817986304,2817986559,AP -2817986560,2818038537,US +2817986560,2818003722,US +2818003723,2818003723,EU +2818003724,2818038537,US 2818038538,2818038538,AP 2818038539,2818310143,US 2818310144,2818375679,AR @@ -80735,8 +81509,8 @@ 2853830656,2854617087,US 2854617088,2854682623,MY 2854748160,2855469055,US -2855469056,2855481343,PY -2855481344,2855485439,AR +2855469056,2855483391,PY +2855483392,2855485439,AR 2855485440,2855501823,UY 2855501824,2855534591,AR 2855534592,2855706623,US @@ -80772,9 +81546,7 @@ 2863857664,2863923199,SG 2863923200,2864844799,US 2864844800,2864845055,NL -2864845056,2864848895,US -2864848896,2864849151,GB -2864849152,2865417457,US +2864845056,2865417457,US 2865417458,2865417458,GB 2865417459,2865577983,US 2865577984,2865610751,BE @@ -80864,6 +81636,17 @@ 2871001088,2871066623,SE 2871066624,2871083007,CH 2871083008,2871099391,RO +2871099392,2871101439,NL +2871101440,2871103487,CZ +2871103488,2871105535,GB +2871105536,2871107583,FR +2871107584,2871111679,GB +2871111680,2871115775,DE +2871115776,2871123967,GB +2871123968,2871126015,NL +2871126016,2871128063,ES +2871128064,2871130111,BH +2871130112,2871132159,RU 2871132160,2872049663,CN 2872049664,2873098239,IN 2873098240,2873884671,US @@ -80881,6 +81664,7 @@ 2882469888,2882535423,SG 2882535424,2883583999,CN 2883584000,2885681151,VN +2885681152,2886729727,US 2894069760,2894921727,US 2894921728,2895118335,GB 2895118336,2895301887,US @@ -80948,7 +81732,11 @@ 2902492672,2902493183,IN 2902493184,2902507519,US 2902507520,2902515711,CA -2902515712,2904555519,US +2902515712,2902564399,US +2902564400,2902564415,CN +2902564416,2902564687,US +2902564688,2902564703,AU +2902564704,2904555519,US 2904555520,2904817663,CA 2904817664,2905350729,US 2905350730,2905350730,A1 @@ -81015,7 +81803,9 @@ 2905473024,2905481215,CA 2905481216,2913992703,US 2913992704,2914516991,CA -2914516992,2915250175,US +2914516992,2915096014,US +2915096015,2915096015,A1 +2915096016,2915250175,US 2915250176,2915254271,CA 2915254272,2915274751,US 2915274752,2915274815,PL @@ -81654,7 +82444,9 @@ 2918287360,2918289407,GB 2918289408,2918314216,US 2918314217,2918314217,GB -2918314218,2918371327,US +2918314218,2918348114,US +2918348115,2918348115,A1 +2918348116,2918371327,US 2918371328,2918375423,CA 2918375424,2918391807,US 2918391808,2918395903,CA @@ -83157,9 +83949,7 @@ 2947598336,2947602431,AU 2947602432,2947603455,NZ 2947603456,2947604479,TH -2947604480,2947609855,HK -2947609856,2947610111,AF -2947610112,2947612671,HK +2947604480,2947612671,HK 2947612672,2947678207,JP 2947678208,2947743743,CN 2947743744,2947809279,JP @@ -83721,7 +84511,9 @@ 2954829824,2954829827,BE 2954829828,2954829831,NL 2954829832,2954829839,DE -2954829840,2954829875,FR +2954829840,2954829843,FR +2954829844,2954829847,DE +2954829848,2954829875,FR 2954829876,2954829879,GB 2954829880,2954829887,FR 2954829888,2954829903,PL @@ -84071,7 +84863,9 @@ 2954835408,2954835415,FR 2954835416,2954835419,CH 2954835420,2954835423,GB -2954835424,2954835487,DE +2954835424,2954835451,DE +2954835452,2954835455,ES +2954835456,2954835487,DE 2954835488,2954835511,FR 2954835512,2954835519,ES 2954835520,2954835539,PL @@ -84632,7 +85426,8 @@ 2954844096,2954844127,IT 2954844128,2954844143,FR 2954844144,2954844147,NL -2954844148,2954844175,FR +2954844148,2954844151,DE +2954844152,2954844175,FR 2954844176,2954844179,DE 2954844180,2954844183,NL 2954844184,2954844187,GB @@ -84826,7 +85621,9 @@ 2954855440,2954855455,LT 2954855456,2954855479,FR 2954855480,2954855487,IT -2954855488,2954855523,GB +2954855488,2954855507,GB +2954855508,2954855511,DE +2954855512,2954855523,GB 2954855524,2954855527,DE 2954855528,2954855535,PT 2954855536,2954855551,FR @@ -85668,10 +86465,7 @@ 2954897408,2954899455,DE 2954899456,2954901503,ES 2954901504,2954903551,IT -2954903552,2954905599,NL -2954905600,2954907647,IE -2954907648,2954909695,GB -2954909696,2954911743,DE +2954903552,2954911743,JP 2954911744,2954919423,NL 2954919424,2954919935,IE 2954919936,2954928127,RU @@ -85687,8 +86481,7 @@ 2954948608,2954950655,RU 2954950656,2954952703,ES 2954952704,2955018239,TR -2955018240,2955026431,FR -2955026432,2955034623,NL +2955018240,2955034623,JP 2955034624,2955051007,IE 2955051008,2955067391,NL 2955067392,2955069439,IE @@ -85944,7 +86737,11 @@ 2957203456,2957205503,FR 2957205504,2957213695,PS 2957213696,2957221887,FR -2957221888,2957228031,GB +2957221888,2957223365,GB +2957223366,2957223366,A1 +2957223367,2957223641,GB +2957223642,2957223642,A1 +2957223643,2957228031,GB 2957228032,2957230079,DK 2957230080,2957238271,RS 2957238272,2957240319,CZ @@ -86110,8 +86907,8 @@ 2959767552,2959769599,RS 2959769600,2959777791,RU 2959777792,2959783935,LV -2959783936,2959785983,SK -2959785984,2959794175,UA +2959783936,2959788031,SK +2959788032,2959794175,UA 2959794176,2959796223,IL 2959796224,2959804415,RU 2959804416,2959806463,RO @@ -86151,8 +86948,21 @@ 2959968256,2959970303,RS 2959970304,2959974399,RU 2959974400,2959976447,PL -2959976448,2959998975,UA -2960031744,2960035839,RU +2959976448,2960015359,UA +2960015360,2960023551,RU +2960023552,2960024575,IT +2960024576,2960024831,SA +2960024832,2960025087,RU +2960025088,2960025599,UA +2960025600,2960025855,NL +2960025856,2960026111,FR +2960026112,2960026623,RO +2960026624,2960027647,IR +2960027648,2960028671,RO +2960028672,2960029183,NO +2960029184,2960029439,GB +2960029440,2960029695,KW +2960029696,2960035839,RU 2960035840,2960039935,PL 2960039936,2960054271,RU 2960054272,2960056319,RO @@ -86208,8 +87018,7 @@ 2960347136,2960349183,PL 2960349184,2960351231,RU 2960351232,2960353279,UA -2960353280,2960367615,RU -2960367616,2960369663,DE +2960353280,2960369663,RU 2960369664,2960371711,IT 2960371712,2960383999,RU 2960384000,2960388095,RO @@ -86221,7 +87030,11 @@ 2960416768,2960424959,SK 2960424960,2960427007,RO 2960427008,2960429055,RU -2960433152,2960441343,RU +2960429056,2960429311,BG +2960429312,2960429567,NL +2960429568,2960430079,UA +2960430080,2960431103,PL +2960431104,2960441343,RU 2960441344,2960443391,UA 2960443392,2960445439,PL 2960445440,2960449535,RU @@ -86256,7 +87069,7 @@ 2960629760,2960646143,RU 2960646144,2960648191,KZ 2960648192,2960650239,UA -2960650240,2960652287,CZ +2960650240,2960652287,RU 2960652288,2960654335,PS 2960654336,2960658431,RU 2960658432,2960660479,US @@ -86275,6 +87088,53 @@ 2960732160,2960736255,RU 2960736256,2960738303,ES 2960738304,2960740351,UA +2960740352,2960742399,PL +2960742400,2960744447,NO +2960744448,2960748543,RO +2960748544,2960752639,PL +2960752640,2960769023,RU +2960769024,2960773119,UA +2960773120,2960777215,RU +2960777216,2960785407,UA +2960785408,2960793599,RU +2960793600,2960797695,CZ +2960797696,2960805887,RU +2960805888,2960807935,KZ +2960807936,2960834559,UA +2960834560,2960835071,GB +2960835072,2960835583,CH +2960835584,2960836351,IT +2960836352,2960836607,PL +2960836608,2960839167,RU +2960839168,2960839679,IR +2960839680,2960846847,PL +2960846848,2960847871,UA +2960847872,2960848383,PL +2960848384,2960848639,GB +2960848640,2960850943,RU +2960850944,2960859135,MD +2960859136,2960863231,RO +2960863232,2960863487,DE +2960863488,2960863743,RU +2960863744,2960863999,GB +2960864000,2960864255,DE +2960864256,2960864767,GB +2960864768,2960865279,DE +2960865280,2960865535,RU +2960865536,2960865791,HR +2960865792,2960866303,GB +2960866304,2960866815,PL +2960866816,2960867071,GB +2960867072,2960867327,FR +2960867328,2960883711,IR +2960883712,2960904191,RU +2960904192,2960906239,RS +2960906240,2960907263,RU +2960907264,2960907775,UA +2960907776,2960908031,GB +2960908032,2960908287,PL +2960908288,2960916479,KG +2960916480,2960924671,UA 2961178624,2965372927,FR 2965372928,2965766143,RU 2965766144,2965897215,DE @@ -86323,7 +87183,9 @@ 2967707648,2967709695,PL 2967709696,2967711743,IT 2967711744,2967715839,RU -2967715840,2967724031,GB +2967715840,2967718721,GB +2967718722,2967718722,A1 +2967718723,2967724031,GB 2967724032,2967728127,CY 2967728128,2967730175,GB 2967730176,2967732223,CZ @@ -86728,7 +87590,9 @@ 2988444192,2988444199,FR 2988444200,2988444203,FI 2988444204,2988444207,NL -2988444208,2988444415,FR +2988444208,2988444208,FR +2988444209,2988444209,FI +2988444210,2988444415,FR 2988444416,2988444679,ES 2988444680,2988444687,FR 2988444688,2988444695,LT @@ -87783,7 +88647,7 @@ 2988484608,2988484775,FR 2988484776,2988484783,PL 2988484784,2988484831,FR -2988484832,2988484847,PL +2988484832,2988484847,GB 2988484848,2988484863,FR 2988484864,2988484879,NL 2988484880,2988484883,GB @@ -88338,7 +89202,7 @@ 2988501760,2988502039,FR 2988502040,2988502047,CZ 2988502048,2988502051,FR -2988502052,2988502055,FI +2988502052,2988502055,PL 2988502056,2988502059,GB 2988502060,2988502063,IT 2988502064,2988502067,FR @@ -90783,7 +91647,8 @@ 2988555212,2988555215,DE 2988555216,2988555519,FR 2988555520,2988555527,IE -2988555528,2988555531,ES +2988555528,2988555528,DE +2988555529,2988555531,ES 2988555532,2988555535,FR 2988555536,2988555543,ES 2988555544,2988555559,FR @@ -90815,7 +91680,7 @@ 2988556196,2988556199,FR 2988556200,2988556203,CZ 2988556204,2988556207,FI -2988556208,2988556211,PT +2988556208,2988556211,DE 2988556212,2988556215,FR 2988556216,2988556219,LT 2988556220,2988556223,FI @@ -91342,7 +92207,9 @@ 2991179264,2991179327,A1 2991179328,2991182591,SE 2991182592,2991182847,A1 -2991182848,2991183871,SE +2991182848,2991183071,SE +2991183072,2991183103,A1 +2991183104,2991183871,SE 2991183872,2991185919,A1 2991185920,2991185951,GB 2991185952,2991185967,NL @@ -91602,7 +92469,9 @@ 2995044352,2995046399,ES 2995046400,2995048447,RU 2995048448,2995050495,NL -2995050496,2995052543,AL +2995050496,2995050561,AL +2995050562,2995050562,RS +2995050563,2995052543,AL 2995052544,2995056639,DK 2995056640,2995058687,DE 2995058688,2995060735,SE @@ -92448,7 +93317,9 @@ 3025637632,3025637887,MY 3025637888,3025638399,IN 3025638400,3025638655,SG -3025638656,3025649151,IN +3025638656,3025647359,IN +3025647360,3025647615,AU +3025647616,3025649151,IN 3025649152,3025649663,HK 3025649664,3025666047,IN 3025666048,3025928191,CN @@ -92682,14 +93553,20 @@ 3038511104,3038773247,AR 3039035392,3039166463,DO 3039297536,3039363071,PY +3039363072,3039395839,BZ 3039428608,3039494143,CL 3039690752,3039821823,AR 3039821824,3040346111,CO -3040870400,3041001471,PE -3041132544,3041263615,CO +3040870400,3041132543,PE +3041132544,3041394687,CO 3041394688,3041656831,CL 3041918976,3044016127,AR 3044016128,3044081663,EC +3044147200,3044155391,GT +3044163584,3044171775,BO +3044196352,3044204543,AR +3044212736,3044245503,HN +3044278272,3044540415,AR 3044802560,3045064703,PY 3045064704,3047161855,CO 3047161856,3047292927,CL @@ -92699,9 +93576,14 @@ 3048341504,3048472575,PA 3048472576,3048734719,VE 3048996864,3049029631,TT -3049062400,3049078783,CR +3049062400,3049078271,CR +3049078272,3049078527,MX +3049078528,3049095167,CR +3049095168,3049103359,GT 3049119744,3049127935,HN 3049193472,3049259007,PA +3049259008,3049521151,CR +3049783296,3050045439,CL 3053453312,3054501887,ID 3054501888,3054534655,HK 3054534656,3054537727,PH @@ -92801,7 +93683,9 @@ 3063988224,3064004607,JP 3064004608,3064012799,LK 3064020992,3064023039,JP -3064023040,3064024063,SG +3064023040,3064023551,SG +3064023552,3064023807,JP +3064023808,3064024063,SG 3064024064,3064025087,JP 3064025088,3064029183,VN 3064029184,3064135679,KR @@ -93126,7 +94010,11 @@ 3094020096,3094085631,CA 3094085632,3096444927,US 3096444928,3096969215,CA -3096969216,3097130139,US +3096969216,3097124223,US +3097124224,3097124231,AE +3097124232,3097124303,US +3097124304,3097124311,AE +3097124312,3097130139,US 3097130140,3097130140,A1 3097130141,3097493503,US 3097493504,3097755647,CA @@ -93325,7 +94213,9 @@ 3120691200,3120693247,CO 3120693248,3120726015,BO 3120726016,3120734207,HN -3120742400,3120758783,PY +3120742400,3120754687,PY +3120754688,3120755711,CR +3120756736,3120757759,PA 3120758784,3120824319,EC 3120824320,3120840703,CR 3120840704,3120857087,AR @@ -93345,8 +94235,8 @@ 3121872896,3122003967,CL 3122003968,3122135039,AR 3122135040,3122282495,VE -3122282496,3122286591,AR -3122286592,3122290687,US +3122282496,3122284543,AR +3122284544,3122290687,US 3122290688,3122292735,AR 3122292736,3122294783,US 3122294784,3122298879,CR @@ -93357,10 +94247,12 @@ 3122675712,3122692095,SV 3122692096,3122700287,HN 3122700288,3122716671,CR -3122716672,3122720767,HN -3122720768,3122722815,GT +3122716672,3122722815,HN 3122722816,3122724863,SV -3122724864,3122741247,AR +3122724864,3122726911,US +3122726912,3122732031,AR +3122732032,3122733055,US +3122733056,3122741247,AR 3122741248,3122757631,DO 3122757632,3122774015,EC 3122774016,3122790399,AR @@ -93378,7 +94270,12 @@ 3124760760,3124781055,AR 3124789248,3124822015,CR 3124822016,3124838399,EC -3124838400,3124848639,AR +3124838400,3124840447,AR +3124840448,3124842495,CL +3124842496,3124844543,AR +3124844544,3124845567,BZ +3124845568,3124846591,CR +3124846592,3124848639,AR 3124848640,3124849663,PA 3124849664,3124850687,AR 3124850688,3124854783,HN @@ -93436,6 +94333,11 @@ 3131834368,3132096511,CL 3132096512,3132227583,CR 3132227584,3132293119,EC +3132293120,3132309503,HN +3132309504,3132313599,CR +3132317696,3132321791,CO +3132321792,3132325887,PA +3132325888,3132358655,SR 3132358656,3132489727,CO 3132489728,3132555263,AR 3132620800,3132915711,VE @@ -94230,7 +95132,7 @@ 3163170432,3163170463,DE 3163170464,3163170495,US 3163170496,3163170527,BG -3163170528,3163170559,HR +3163170528,3163170559,AE 3163170560,3163170591,DE 3163170592,3163170623,BR 3163170624,3163170655,GR @@ -94429,7 +95331,11 @@ 3163184504,3163184505,DE 3163184506,3163184506,PL 3163184507,3163184509,GR -3163184510,3163188804,DE +3163184510,3163186534,DE +3163186535,3163186535,FR +3163186536,3163186673,DE +3163186674,3163186674,FR +3163186675,3163188804,DE 3163188805,3163188806,AR 3163188807,3163188807,DE 3163188808,3163188810,AR @@ -94525,7 +95431,9 @@ 3164930048,3164932095,IE 3164932096,3164934143,FR 3164934144,3164936191,PL -3164936192,3164938239,LT +3164936192,3164937749,LT +3164937750,3164937750,FR +3164937751,3164938239,LT 3164938240,3164946431,FR 3164946432,3164946435,PL 3164946436,3164946439,PT @@ -95671,7 +96579,9 @@ 3187910656,3187914751,CL 3187914752,3187916799,BO 3187916800,3187933183,CO -3187933184,3187949567,GT +3187933184,3187947983,GT +3187947984,3187947987,HN +3187947988,3187949567,GT 3187949568,3187953663,AN 3187953664,3187955711,CL 3187955712,3187957759,CR @@ -95794,7 +96704,17 @@ 3191607808,3191608319,CL 3191608320,3191611391,CO 3191611392,3191619583,VE -3191619584,3191734271,CO +3191619584,3191676927,CO +3191676928,3191685119,AR +3191685120,3191685631,CO +3191685632,3191685887,US +3191685888,3191691263,CO +3191691264,3191693311,US +3191693312,3191699455,CO +3191699456,3191701503,US +3191701504,3191727103,CO +3191727104,3191727359,AR +3191727360,3191734271,CO 3191734272,3191799807,SV 3191799808,3191865343,EC 3191865344,3191930879,UY @@ -95808,10 +96728,25 @@ 3193176064,3193307135,CO 3193307136,3193438207,SV 3193438208,3193569279,AN -3193569280,3193634815,CO +3193569280,3193622783,CO +3193622784,3193623039,EC +3193623040,3193634815,CO 3193634816,3193700351,CL -3193700352,3193733119,HN -3193733120,3193765887,AR +3193700352,3193724927,HN +3193729024,3193733119,CU +3193733120,3193735423,AR +3193735424,3193735679,US +3193735680,3193736191,AR +3193736192,3193736447,US +3193736448,3193737983,AR +3193737984,3193738239,US +3193738240,3193739263,AR +3193739264,3193739519,US +3193739520,3193741311,AR +3193741312,3193741567,US +3193741568,3193747839,AR +3193747840,3193747967,US +3193747968,3193765887,AR 3193765888,3193774079,TT 3193774080,3193775103,PA 3193775104,3193776127,GY @@ -95847,9 +96782,13 @@ 3194077184,3194085375,CO 3194085376,3194093567,VE 3194093568,3194126335,SR -3194126336,3194130431,AR +3194126336,3194128383,AR +3194128384,3194129407,PE +3194129408,3194130431,AR 3194130432,3194134527,BR -3194134528,3194140671,AR +3194134528,3194135551,AR +3194135552,3194136575,GT +3194136576,3194140671,AR 3194140672,3194142719,CR 3194142720,3194159103,CL 3194159104,3194165247,HN @@ -95867,7 +96806,9 @@ 3194368000,3194370047,BO 3194370048,3194372095,PA 3194372096,3194380287,HT -3194380288,3194388479,BZ +3194380288,3194381439,BZ +3194381440,3194381567,US +3194381568,3194388479,BZ 3194388480,3194396671,PE 3194396672,3194413055,CO 3194413056,3194421247,CL @@ -95881,7 +96822,8 @@ 3194466304,3194467327,AR 3194467328,3194468351,DO 3194468352,3194469375,US -3194469376,3194470399,CR +3194469376,3194469631,CA +3194469632,3194470399,CR 3194470400,3194486783,AR 3194486784,3194494975,BO 3194494976,3194507263,AR @@ -95942,15 +96884,17 @@ 3194769408,3194773503,PE 3194781696,3194798079,CL 3194798080,3194799103,AR -3194799104,3194802175,GY +3194799104,3194804223,GY +3194804224,3194805247,AR +3194805248,3194806271,CR 3194806272,3194830847,AR 3194830848,3194839039,PA 3194839040,3194863615,CO 3194863616,3194871807,HN +3194871808,3194879999,BO 3194880000,3194896383,DO 3194896384,3194904575,CO -3194904576,3194908671,CL -3194912768,3194925055,CL +3194904576,3194925055,CL 3194925056,3194929151,AR 3194929152,3194937343,EC 3194937344,3194945535,AR @@ -95975,10 +96919,12 @@ 3195101184,3195109375,CR 3195109376,3195125759,AR 3195125760,3195133951,PE +3195133952,3195138047,AR 3195138048,3195139071,DO 3195139072,3195140095,CL 3195140096,3195142143,CR 3195142144,3195150335,VE +3195150336,3195158527,CL 3195158528,3195199487,AR 3195199488,3195201535,PY 3195203584,3195205631,VE @@ -96002,6 +96948,7 @@ 3195600896,3195633663,CL 3195633664,3195641855,CO 3195641856,3195645951,PY +3195645952,3195650047,AR 3195650048,3195654143,GT 3195658240,3195662335,VE 3195662336,3195666431,AN @@ -96011,6 +96958,7 @@ 3195707392,3195711487,PA 3195715584,3195731967,AR 3195731968,3195736063,EC +3195738112,3195740159,HN 3195740160,3195744255,PA 3195744256,3195748351,EC 3195748352,3195752447,CL @@ -96100,7 +97048,9 @@ 3200614400,3200647167,AR 3200647168,3201302527,VE 3201302528,3201433599,CL -3201433600,3201499135,AR +3201433600,3201441791,AR +3201441792,3201442047,US +3201442048,3201499135,AR 3201499136,3201515519,CL 3201515520,3201522687,AR 3201522688,3201531903,CR @@ -96119,9 +97069,11 @@ 3201630208,3201695743,TT 3201695744,3201761279,EC 3201761280,3201826815,CL -3201826816,3201884159,AR -3201884160,3201888255,VE -3201888256,3201925119,AR +3201826816,3201875967,AR +3201875968,3201880063,CO +3201880064,3201884159,AR +3201884160,3201888511,VE +3201888512,3201925119,AR 3201925120,3201957887,CL 3201957888,3202088959,PA 3202088960,3202220031,AR @@ -96143,7 +97095,8 @@ 3203535872,3203536383,PA 3203536384,3203537919,CO 3203537920,3203538431,GT -3203538432,3203538943,CO +3203538432,3203538687,PA +3203538688,3203538943,CO 3203538944,3203539967,BZ 3203539968,3203547135,CO 3203547136,3203549183,PA @@ -96151,7 +97104,9 @@ 3203661824,3203923967,AR 3203923968,3204448255,CO 3221233664,3221237759,US -3221291008,3221422079,US +3221291008,3221334269,US +3221334270,3221334270,DZ +3221334271,3221422079,US 3221487616,3221560319,US 3221560320,3221561343,GB 3221561344,3221562367,US @@ -96335,8 +97290,7 @@ 3223227904,3223228159,CA 3223229184,3223229695,US 3223229696,3223229951,CA -3223240448,3223240703,US -3223242752,3223243007,US +3223240448,3223243007,US 3223243264,3223243519,CA 3223244288,3223245311,US 3223249408,3223249663,CA @@ -96399,7 +97353,9 @@ 3223422464,3223422719,US 3223422720,3223422975,JP 3223422976,3223424767,US -3223424768,3223435007,FR +3223424768,3223432191,FR +3223432192,3223433215,US +3223433216,3223435007,FR 3223435008,3223437311,US 3223437312,3223447551,CH 3223447552,3223447807,US @@ -97015,7 +97971,7 @@ 3225796096,3225796351,US 3225805824,3225806847,US 3225807360,3225807615,DE -3225810688,3225810943,US +3225808896,3225812991,US 3225812992,3225827071,FR 3225827072,3225827327,US 3225827328,3225843711,FR @@ -97561,8 +98517,7 @@ 3227794688,3227794943,GB 3227794944,3227795199,US 3227795200,3227795455,NO -3227795456,3227797503,US -3227798528,3227798783,US +3227795456,3227798783,US 3227798784,3227799039,TH 3227799040,3227799295,GB 3227799296,3227799551,US @@ -97847,7 +98802,9 @@ 3228364288,3228364543,AT 3228364800,3228368895,US 3228368896,3228404735,DE -3228404736,3228405247,FR +3228404736,3228404863,FR +3228404864,3228404895,EU +3228404896,3228405247,FR 3228405248,3228405503,KR 3228405504,3228405759,SG 3228405760,3228406015,IN @@ -98165,7 +99122,7 @@ 3229969408,3229969663,PT 3229969664,3229969919,AT 3229969920,3229970431,FI -3229971456,3229972735,US +3229970432,3229972735,US 3229972736,3229972991,SE 3229972992,3229975295,US 3229975296,3229975551,GB @@ -98789,7 +99746,7 @@ 3231507456,3231508479,US 3231508992,3231509247,US 3231510272,3231510527,GB -3231510528,3231511551,US +3231510528,3231512575,US 3231512576,3231512831,LU 3231513088,3231513343,US 3231513600,3231514623,US @@ -98828,7 +99785,9 @@ 3231562752,3231563007,US 3231563008,3231563263,CH 3231563264,3231563519,ZA -3231580160,3231588863,US +3231580160,3231583231,US +3231583232,3231584255,CA +3231584256,3231588863,US 3231588864,3231589119,GB 3231589120,3231591679,US 3231591680,3231591935,AU @@ -99037,7 +99996,9 @@ 3232090624,3232092671,SE 3232092672,3232093183,GB 3232093184,3232093439,US -3232093440,3232093695,GB +3232093440,3232093675,GB +3232093676,3232093676,EU +3232093677,3232093695,GB 3232093696,3232093951,AP 3232093952,3232094207,GB 3232094208,3232094719,CH @@ -99102,7 +100063,10 @@ 3232567296,3232571391,NZ 3232571392,3232579583,US 3232595968,3232598015,GB -3232628736,3232645119,US +3232629248,3232629759,US +3232629760,3232630783,CA +3232630784,3232634879,US +3232636928,3232645119,US 3232645120,3232647167,AT 3232661504,3232694271,JP 3232694272,3232702463,US @@ -99131,6 +100095,7 @@ 3232813056,3232820223,SE 3232820224,3232820479,IE 3232820480,3232825343,SE +3232890880,3233021951,US 3233285120,3233285375,US 3233480704,3233484799,US 3233484800,3233488895,ES @@ -99360,7 +100325,9 @@ 3233803008,3233803263,CA 3233803264,3233808383,US 3233808384,3233873919,TW -3233873920,3233907711,US +3233873920,3233903743,US +3233903744,3233903807,EU +3233903808,3233907711,US 3233907712,3233907967,AP 3233907968,3233914879,US 3233914880,3233915135,AP @@ -99455,7 +100422,9 @@ 3234267136,3234271231,US 3234271232,3234275327,PT 3234275328,3234279423,AU -3234283520,3234316287,US +3234283520,3234310367,US +3234310368,3234310371,HK +3234310372,3234312703,US 3234332672,3234349055,US 3234349056,3234353151,NZ 3234365440,3234367487,US @@ -99498,7 +100467,9 @@ 3234592512,3234592767,TH 3234592768,3234611199,US 3234611200,3234615295,A1 -3234615296,3234725887,US +3234615296,3234645247,US +3234645248,3234645759,A1 +3234645760,3234725887,US 3234726144,3234726399,CA 3234726400,3234726911,US 3234727936,3234733055,US @@ -99869,7 +100840,9 @@ 3237622016,3237622271,AP 3237622272,3237634309,US 3237634310,3237634310,GB -3237634311,3237647103,US +3237634311,3237634602,US +3237634603,3237634603,EU +3237634604,3237647103,US 3237647104,3237647359,AU 3237647360,3237658623,US 3237675008,3237681663,US @@ -99921,8 +100894,8 @@ 3238043648,3238043903,NL 3238043904,3238044159,DK 3238044160,3238044671,KZ -3238044672,3238045695,DE -3238045696,3238047743,RU +3238044672,3238045183,FI +3238045184,3238047743,RU 3238047744,3238048255,GB 3238048256,3238048767,RU 3238048768,3238049791,CH @@ -100833,10 +101806,29 @@ 3240104704,3240104959,NL 3240104960,3240105215,RU 3240105216,3240105471,UA -3240105472,3240109055,GB +3240105472,3240107583,GB +3240107584,3240107599,EU +3240107600,3240109055,GB 3240109056,3240109567,PL 3240109568,3240112639,GB -3240120320,3240125439,GB +3240112640,3240112895,PL +3240112896,3240113151,AT +3240113152,3240113407,LV +3240113408,3240113663,TR +3240113664,3240113919,RU +3240113920,3240114175,TR +3240114176,3240114431,CZ +3240114432,3240114687,UA +3240114688,3240114943,RO +3240114944,3240115199,PL +3240115200,3240116223,RU +3240116224,3240116479,DE +3240116480,3240116735,DK +3240116736,3240117247,RO +3240117248,3240118271,RU +3240118272,3240120319,ES +3240120320,3240120831,IR +3240120832,3240125439,GB 3240125440,3240125695,RO 3240125696,3240165375,GB 3240165376,3240165887,PL @@ -100900,6 +101892,7 @@ 3240197632,3240198143,CZ 3240198144,3240198655,CH 3240198656,3240199167,RO +3240199168,3240199679,RU 3240199680,3240200191,NL 3240200192,3240200703,RO 3240200704,3240201215,GB @@ -101061,6 +102054,7 @@ 3240308736,3240309759,CZ 3240309760,3240310783,NO 3240310784,3240311807,GB +3240311808,3240312063,PL 3240312064,3240312319,RU 3240312320,3240312575,IR 3240312576,3240312831,RU @@ -101106,6 +102100,7 @@ 3240410368,3240410623,AT 3240410624,3240410879,PT 3240410880,3240411135,NO +3240411136,3240419327,RO 3240419328,3240419839,GB 3240419840,3240420095,AT 3240420096,3240420351,DE @@ -101333,7 +102328,10 @@ 3240812544,3240813567,IT 3240813568,3240814591,PL 3240814592,3240818687,IT -3240818688,3240820735,NL +3240818688,3240819715,NL +3240819716,3240819716,EU +3240819717,3240820735,NL +3240820736,3240820799,FR 3240820800,3240820863,GB 3240820864,3240820991,PL 3240820992,3240823807,IT @@ -101984,7 +102982,7 @@ 3244853760,3244854015,TR 3244854016,3244854271,NL 3244854272,3244854527,GB -3244854784,3244855295,RU +3244854528,3244855295,RU 3244855296,3244855551,GB 3244855552,3244855807,UA 3244855808,3244856063,DE @@ -102074,6 +103072,7 @@ 3244879872,3244880127,SI 3244880128,3244880383,RU 3244880384,3244880639,UA +3244880640,3244880895,RU 3244880896,3244881151,PL 3244881152,3244881407,RU 3244881408,3244881663,DK @@ -102673,7 +103672,9 @@ 3245232640,3245232895,BG 3245232896,3245233151,IT 3245233152,3245233407,DK -3245233408,3245233663,CH +3245233408,3245233452,CH +3245233453,3245233453,EU +3245233454,3245233663,CH 3245233664,3245233919,GR 3245233920,3245234175,DK 3245234176,3245234431,GB @@ -102988,6 +103989,7 @@ 3247054592,3247054847,DE 3247054848,3247063039,SI 3247063040,3247063295,FR +3247063296,3247063551,PL 3247063552,3247063807,DE 3247063808,3247064063,BG 3247064064,3247064319,DE @@ -103243,7 +104245,9 @@ 3247286992,3247287895,NL 3247287896,3247287903,DE 3247287904,3247288319,NL -3247288320,3247302655,DE +3247288320,3247299363,DE +3247299364,3247299364,EU +3247299365,3247302655,DE 3247302656,3247302791,NL 3247302792,3247302799,DE 3247302800,3247303343,NL @@ -103434,7 +104438,9 @@ 3247779648,3247779839,IE 3247779840,3247783935,DE 3247783936,3247792127,GB -3247792128,3247800319,FR +3247792128,3247794438,FR +3247794439,3247794439,EU +3247794440,3247800319,FR 3247800320,3247816703,DK 3247816704,3247817471,BE 3247817472,3247817727,CH @@ -103454,6 +104460,8 @@ 3247835136,3247836159,GB 3247836160,3247837183,CZ 3247837184,3247838207,ES +3247838208,3247838463,RU +3247838464,3247838719,PL 3247838720,3247839231,NO 3247839232,3247839743,CZ 3247839744,3247840255,GB @@ -104058,7 +105066,18 @@ 3250257152,3250257663,AT 3250257664,3250257919,PL 3250257920,3250258175,EU -3250258176,3250323199,AT +3250258176,3250271231,AT +3250271232,3250271743,PL +3250271744,3250271999,LB +3250272000,3250272255,GB +3250272256,3250274303,SK +3250274304,3250276351,PL +3250276352,3250276607,GB +3250276608,3250276863,RU +3250276864,3250277375,IT +3250277376,3250278399,UA +3250278400,3250279423,RU +3250279424,3250323199,AT 3250323200,3250323455,RU 3250323456,3250323711,PL 3250323712,3250324479,SA @@ -104078,7 +105097,7 @@ 3250357856,3250357871,EE 3250357872,3250357879,CH 3250357880,3250357887,SE -3250357888,3250357895,DK +3250357888,3250357903,DK 3250357904,3250357919,FR 3250357920,3250357927,PL 3250357952,3250358015,GB @@ -104244,7 +105263,9 @@ 3250749440,3250749695,GH 3250749696,3250749951,EU 3250749952,3250750463,RO -3250750464,3250751487,FR +3250750464,3250750537,FR +3250750538,3250750541,EU +3250750542,3250751487,FR 3250751488,3250751999,DE 3250752000,3250752511,CH 3250752512,3250753023,BG @@ -104437,6 +105458,7 @@ 3251169280,3251170047,PL 3251170048,3251170303,NO 3251170304,3251170559,CH +3251170560,3251170815,BG 3251170816,3251171327,RU 3251171328,3251171839,DE 3251171840,3251172095,RO @@ -105466,7 +106488,9 @@ 3253402368,3253402623,JP 3253402624,3253403647,SE 3253403648,3253403903,PL -3253403904,3253409791,SE +3253403904,3253405563,SE +3253405564,3253405564,EU +3253405565,3253409791,SE 3253409792,3253410047,GB 3253410048,3253411327,SE 3253411328,3253411583,NO @@ -105521,7 +106545,7 @@ 3253605376,3253606399,UA 3253606400,3253606655,PL 3253606656,3253606911,TR -3253606912,3253607167,DE +3253606912,3253607423,DE 3253607424,3253608447,NG 3253608448,3253610495,UA 3253610496,3253611519,PL @@ -105628,6 +106652,8 @@ 3253710848,3253711359,DK 3253711360,3253712383,UA 3253712384,3253712895,MD +3253712896,3253713151,PL +3253713152,3253713407,DE 3253713408,3253713919,NL 3253713920,3253714431,AT 3253714432,3253714943,RO @@ -105649,6 +106675,7 @@ 3253723648,3253724159,AT 3253724160,3253724671,UA 3253724672,3253725183,RO +3253725440,3253725695,RU 3253725696,3253726207,UA 3253726208,3253726719,RO 3253726720,3253727231,UA @@ -105751,7 +106778,9 @@ 3253964800,3253965311,SE 3253965312,3253966335,PL 3253966336,3253966847,DE -3253966848,3253968895,UA +3253966848,3253967359,UA +3253967360,3253967871,PL +3253967872,3253968895,UA 3253968896,3253969407,DE 3253969408,3253969919,AT 3253969920,3253970431,NL @@ -106428,7 +107457,9 @@ 3255279088,3255279103,LU 3255279104,3255279639,BE 3255279640,3255279647,LU -3255279648,3255280031,BE +3255279648,3255280018,BE +3255280019,3255280019,EU +3255280020,3255280031,BE 3255280032,3255280039,LU 3255280040,3255280047,BE 3255280048,3255280055,LU @@ -106605,7 +107636,9 @@ 3255426560,3255426815,FR 3255426816,3255427071,PL 3255427072,3255431167,RU -3255431168,3255436543,GB +3255431168,3255434720,GB +3255434721,3255434721,EU +3255434722,3255436543,GB 3255436544,3255436799,NL 3255436800,3255437055,DE 3255437056,3255437311,GB @@ -107003,6 +108036,7 @@ 3256899584,3256915455,GB 3256915456,3256915967,SE 3256915968,3256945663,GB +3256945664,3256945919,SI 3256945920,3256946175,GB 3256946176,3256946431,RO 3256946432,3256946687,UA @@ -107031,6 +108065,7 @@ 3256970240,3256970495,AT 3256970496,3256970751,GB 3256970752,3256971007,RU +3256971008,3256971263,PL 3256971264,3256971775,NL 3256971776,3256972031,RU 3256972032,3256972287,DE @@ -108015,6 +109050,7 @@ 3258021888,3258022911,RU 3258022912,3258023167,PL 3258023168,3258023423,DE +3258023424,3258023679,TR 3258023680,3258023935,RU 3258023936,3258056703,DE 3258056704,3258056959,UA @@ -108802,7 +109838,9 @@ 3261213204,3261213439,FR 3261213440,3261213695,AF 3261213696,3261267967,FR -3261267968,3261297663,DE +3261267968,3261280512,DE +3261280513,3261280513,EU +3261280514,3261297663,DE 3261297664,3261297919,RU 3261297920,3261298175,PL 3261298176,3261333503,DE @@ -108835,7 +109873,11 @@ 3261677056,3261685759,GB 3261685760,3261687807,DE 3261687808,3261689855,RO -3261689856,3261691903,GB +3261689856,3261690351,GB +3261690352,3261690352,EU +3261690353,3261690354,SG +3261690355,3261690355,EU +3261690356,3261691903,GB 3261691904,3261692997,EU 3261692998,3261692998,US 3261692999,3261693951,EU @@ -108866,7 +109908,9 @@ 3261767680,3261775871,RS 3261775872,3261776383,PL 3261776384,3261777407,RU -3261777408,3261777663,IR +3261777408,3261777449,IR +3261777450,3261777451,NL +3261777452,3261777663,IR 3261777664,3261777919,GB 3261777920,3261778431,PL 3261778432,3261778943,RU @@ -111829,6 +112873,7 @@ 3263087104,3263087871,DE 3263087872,3263088127,SI 3263088128,3263088383,DE +3263088384,3263088639,LV 3263088640,3263089151,CH 3263089152,3263089407,RO 3263089408,3263089663,RU @@ -112347,7 +113392,7 @@ 3264624128,3264624143,GI 3264624144,3264624383,GB 3264624384,3264624639,MT -3264624640,3264624671,NL +3264624640,3264624671,US 3264624672,3264624895,GB 3264624896,3264625151,NL 3264625152,3264626431,GB @@ -112427,6 +113472,8 @@ 3264753152,3264753663,PL 3264753664,3264754175,IT 3264754176,3264754687,PL +3264754688,3264754943,LU +3264754944,3264755199,PL 3264755200,3264755711,DE 3264755712,3264756223,PL 3264756224,3264756735,FI @@ -112465,6 +113512,7 @@ 3264833024,3264833535,IT 3264833536,3264834047,DE 3264834048,3264834303,GB +3264834304,3264834559,PL 3264834560,3264835327,FR 3264835328,3264835583,AT 3264835584,3264835839,RU @@ -112908,7 +113956,9 @@ 3267059712,3267060735,NL 3267060736,3267061759,LV 3267061760,3267063807,UA -3267063808,3267064831,BE +3267063808,3267064576,BE +3267064577,3267064577,EU +3267064578,3267064831,BE 3267064832,3267065855,PL 3267065856,3267066879,RO 3267066880,3267067903,IT @@ -113433,7 +114483,9 @@ 3268017408,3268017663,KE 3268017664,3268078591,GB 3268078592,3268078847,EU -3268078848,3268149247,GB +3268078848,3268139005,GB +3268139006,3268139006,EU +3268139007,3268149247,GB 3268149248,3268165631,EE 3268165632,3268173823,CH 3268173824,3268182015,MT @@ -114608,7 +115660,9 @@ 3272020992,3272024063,DK 3272024064,3272032255,IE 3272032256,3272040447,SE -3272040448,3272048639,FR +3272040448,3272041885,FR +3272041886,3272041886,EU +3272041887,3272048639,FR 3272048640,3272056831,NL 3272056832,3272065023,RU 3272065024,3272065631,GB @@ -115292,7 +116346,9 @@ 3273026560,3273028607,UA 3273028608,3273029631,PL 3273029632,3273029887,CH -3273029888,3273030143,GB +3273029888,3273029897,GB +3273029898,3273029898,EU +3273029899,3273030143,GB 3273030144,3273030655,RU 3273030656,3273031679,PL 3273031680,3273032191,GB @@ -115687,7 +116743,9 @@ 3273727152,3273727999,GB 3273728000,3273728255,NL 3273728256,3273728511,GB -3273728512,3273732095,NL +3273728512,3273728590,NL +3273728591,3273728592,EU +3273728593,3273732095,NL 3273732096,3273736191,GB 3273736192,3273743359,FR 3273743360,3273743615,JO @@ -115843,7 +116901,9 @@ 3274204096,3274227199,GB 3274227200,3274227455,A2 3274227456,3274244095,GB -3274244096,3274309631,DK +3274244096,3274255106,DK +3274255107,3274255107,EU +3274255108,3274309631,DK 3274309632,3274326015,FR 3274326016,3274334719,RU 3274334720,3274335231,PL @@ -116221,7 +117281,10 @@ 3274850304,3274866687,GB 3274866688,3274883071,DE 3274883072,3274891263,EE -3274891264,3274892287,CH +3274891264,3274891775,CH +3274891776,3274892031,EE +3274892032,3274892287,CH +3274892288,3274899455,EE 3274899456,3274902399,DE 3274902400,3274902423,AT 3274902424,3274902527,EU @@ -120847,7 +121910,9 @@ 3277254728,3277254735,DE 3277254736,3277258751,NL 3277258752,3277324287,TR -3277324288,3277325311,RU +3277324288,3277324799,RU +3277324800,3277325055,KZ +3277325056,3277325311,RU 3277325312,3277326335,IT 3277326336,3277326847,GB 3277326848,3277327359,AT @@ -125088,6 +126153,7 @@ 3283484672,3283484927,UA 3283484928,3283485183,NL 3283485184,3283485439,DE +3283485440,3283485695,RU 3283485696,3283485951,GB 3283485952,3283486128,US 3283486129,3283486129,SE @@ -127710,6 +128776,7 @@ 3286326272,3286327295,PL 3286327296,3286329343,NL 3286329344,3286330367,DE +3286330368,3286331391,RU 3286331392,3286332415,UA 3286332416,3286333439,CH 3286333440,3286334463,PL @@ -128801,7 +129868,6 @@ 3290480640,3290482687,AO 3290482688,3290484735,CF 3290484736,3290486783,ZA -3290486784,3290488831,SC 3290488832,3290489343,NG 3290489344,3290489855,KE 3290489856,3290490367,EG @@ -128865,6 +129931,12 @@ 3291212800,3291213055,MA 3291213056,3291213311,EG 3291213312,3291213567,NG +3291213568,3291213823,KE +3291213824,3291214079,CG +3291214080,3291214335,MZ +3291214336,3291214591,GH +3291214592,3291214847,ZA +3291214848,3291215103,NG 3291216896,3291217919,MU 3291217920,3291230207,ZA 3291230208,3291234303,GH @@ -129085,6 +130157,9 @@ 3302540288,3302540799,UG 3302540800,3302541311,AO 3302541312,3302542335,NG +3302542336,3302543359,MU +3302543360,3302544383,NG +3302550016,3302550527,TZ 3302550528,3302551039,ZA 3302551040,3302551551,MU 3302551552,3302552063,EG @@ -129143,6 +130218,9 @@ 3302955520,3302955775,ZW 3302955776,3302956031,MW 3302956032,3302956287,CD +3302956544,3302957055,ZA +3302957056,3302957311,CG +3304849408,3305111551,ZA 3305111552,3307208703,TN 3307208704,3309305855,EG 3309305856,3312451583,ZA @@ -129153,18 +130231,28 @@ 3314024448,3314286591,KE 3314286592,3314548735,DZ 3314548736,3314810879,MA +3314810880,3314827263,AO +3314843648,3314860031,MG +3314860032,3314868223,CI +3314868224,3314876415,GH 3314876416,3314892799,MG 3314892800,3314909183,NG 3314909184,3314910207,TD 3314910208,3314911231,NG 3314911232,3314912255,CG 3314912256,3314913279,BI +3314913280,3314914303,ZA +3314914304,3314915327,AO 3314925568,3314941951,GN 3314941952,3315073023,EG 3315073024,3315138559,TZ 3315138560,3315204095,MA 3315204096,3315269631,ET -3315335168,3315351551,ZA +3315269632,3315286015,ZA +3315318784,3315322879,LS +3315326976,3315331071,ZW +3315331072,3315333119,GH +3315333120,3315351551,ZA 3315351552,3315367935,ET 3315367936,3315384319,KE 3315384320,3315400703,NG @@ -129243,6 +130331,7 @@ 3321020416,3321022463,TZ 3321022464,3321024511,ZA 3321024512,3321028607,KE +3321028608,3321032703,CI 3321032704,3321036799,NG 3321036800,3321069567,RW 3321069568,3321102335,NA @@ -129273,9 +130362,10 @@ 3321880576,3321884671,KM 3321884672,3321885695,ZA 3321885696,3321886719,NG -3321954304,3321970687,US +3321954304,3321987071,US 3322019840,3322023935,US 3322023936,3322028031,CL +3322036224,3322052607,CA 3322085376,3322167551,US 3322167552,3322167807,GB 3322167808,3322202111,US @@ -129294,14 +130384,17 @@ 3322613760,3322642431,US 3322675200,3322683391,US 3322683392,3322691583,BR +3322691584,3322707967,US 3322740736,3322773503,US 3322806272,3322871807,US 3322873856,3322875903,US 3322880000,3322888191,AU +3322888192,3322904575,US 3322937344,3322938367,US 3322939392,3322940671,US 3322940672,3322940927,AP 3322940928,3322945535,US +3322953728,3322970111,US 3323003136,3323003391,JP 3323003392,3323003647,US 3323003904,3323013631,US @@ -129329,9 +130422,11 @@ 3323201536,3323203583,CA 3323203584,3323207679,US 3323207680,3323215871,CA +3323215872,3323232255,US 3323267072,3323270420,US 3323270421,3323270421,CH 3323270422,3323289599,US +3323297792,3323330559,US 3323330816,3323331071,US 3323331072,3323331839,CA 3323331840,3323342335,US @@ -129350,14 +130445,16 @@ 3323391232,3323391487,CA 3323391488,3323394559,US 3323394560,3323395071,CL -3323395072,3323412479,US +3323395072,3323428863,US 3323461632,3323462655,US 3323462656,3323463167,BR 3323463168,3323464191,US 3323465728,3323469823,US +3323478016,3323494399,US 3323527168,3323659263,US 3323659264,3323660543,NZ 3323662336,3323674623,US +3323674624,3323691007,CA 3323723776,3324011007,US 3324011008,3324011263,KN 3324011264,3324030463,US @@ -129462,14 +130559,15 @@ 3324706560,3324732415,US 3324732416,3324732671,EU 3324732672,3324772351,US -3324837888,3324844543,US +3324837888,3324843799,US +3324843800,3324843801,AP +3324843802,3324844543,US 3324844544,3324844799,EU 3324844800,3324870655,US 3324903424,3325034495,US 3325034496,3325035519,NZ 3325035520,3325059071,US -3325100032,3325116415,US -3325120512,3325128703,US +3325100032,3325128703,US 3325128704,3325129215,TH 3325129216,3325131775,US 3325131776,3325132031,AU @@ -129508,25 +130606,30 @@ 3325285376,3325304831,US 3325304832,3325307647,CA 3325307648,3325307903,BB -3325307904,3325308927,CA +3325307904,3325313023,CA 3325313024,3325321215,US 3325362176,3325427711,CA -3325427712,3325460479,ZA +3325427712,3325452287,ZA +3325452800,3325453311,ZA +3325456384,3325460479,US 3325463808,3325464063,ZA 3325464064,3325465087,NA 3325465088,3325493247,ZA 3325493248,3325497343,US 3325497344,3325501439,PR 3325501440,3325505535,US +3325505536,3325509631,CA 3325509632,3325517823,US 3325526016,3325591551,US 3325624320,3325640703,US 3325640704,3325644799,CA +3325644800,3325648895,US +3325657088,3325689855,US 3325689856,3325690367,JM 3325690368,3325691903,US 3325691904,3325693951,BR -3325693952,3325700095,US -3325706240,3325708287,US +3325693952,3325722623,US +3325722624,3325755391,CA 3325755392,3325956095,US 3325956096,3325960191,CA 3325960192,3325976063,US @@ -129565,8 +130668,9 @@ 3326492240,3326492255,CA 3326492256,3326526463,US 3326526464,3326526719,CA -3326526720,3326574591,US -3326607360,3326640127,US +3326526720,3326631935,US +3326631936,3326640127,CA +3326640128,3326676991,US 3326680832,3326682623,CA 3326682624,3326682879,US 3326682880,3326713343,CA @@ -129598,7 +130702,9 @@ 3327199232,3327200255,BR 3327200256,3327256831,US 3327256832,3327257087,GU -3327257088,3327591237,US +3327257088,3327410175,US +3327426560,3327459327,CA +3327459328,3327591237,US 3327591238,3327591238,A1 3327591239,3327723519,US 3327723520,3327725567,CA @@ -129608,6 +130714,7 @@ 3327803904,3327805695,US 3327807488,3327811583,CA 3327819776,3327885311,US +3327885312,3327918079,CA 3327918080,3327995903,US 3327995904,3327996927,AN 3327996928,3328028671,US @@ -129621,7 +130728,11 @@ 3328241664,3328242943,US 3328242944,3328243199,GB 3328243200,3328245759,CA -3328245760,3328394239,US +3328245760,3328323583,US +3328323584,3328327679,CA +3328327680,3328335871,US +3328344064,3328360447,US +3328376832,3328394239,US 3328394240,3328394495,GB 3328394496,3328414719,US 3328414720,3328414975,CH @@ -129633,7 +130744,7 @@ 3328432640,3328433663,CA 3328433664,3328433919,CH 3328433920,3328475135,US -3328475136,3328477183,CA +3328475136,3328483327,CA 3328507904,3328617983,US 3328617984,3328618239,CA 3328618240,3328629503,US @@ -129645,11 +130756,10 @@ 3328704512,3328774399,US 3328774400,3328775935,CA 3328775936,3328776703,US -3328778240,3328782335,US -3328786432,3328788479,US +3328778240,3328788479,US 3328788480,3328789503,FR 3328789504,3328790015,AP -3328790016,3328790527,US +3328790016,3328794623,US 3328802816,3329230335,US 3329230336,3329230591,JP 3329230592,3329497343,US @@ -129733,7 +130843,9 @@ 3331371328,3331371343,SE 3331371344,3331371375,US 3331371376,3331371391,SE -3331371392,3331563519,US +3331371392,3331527423,US +3331527424,3331527679,GB +3331530752,3331563519,US 3331563520,3331563775,CH 3331563776,3331633407,US 3331633408,3331633919,CH @@ -129832,7 +130944,9 @@ 3333717760,3333718015,NL 3333718016,3333825791,US 3333825792,3333826047,EU -3333826048,3333859839,US +3333826048,3333829657,US +3333829658,3333829658,IN +3333829659,3333859839,US 3333859840,3333860095,BM 3333860096,3333988607,US 3333988608,3333988863,BR @@ -129894,7 +131008,9 @@ 3337053184,3337053695,CA 3337053696,3337055231,US 3337055232,3337060351,CA -3337060352,3337289727,US +3337060352,3337069055,US +3337069056,3337069119,GB +3337069120,3337289727,US 3337289728,3337297919,CA 3337297920,3337302015,US 3337302016,3337304319,CA @@ -130147,7 +131263,9 @@ 3340493568,3340493823,HK 3340493824,3340584703,US 3340584704,3340584959,KW -3340584960,3340664831,US +3340584960,3340648959,US +3340648960,3340649215,A1 +3340649216,3340664831,US 3340664832,3340665855,CA 3340665856,3340677119,US 3340677120,3340679167,CA @@ -130484,8 +131602,8 @@ 3343047968,3343055871,US 3343055872,3343056895,CA 3343056896,3343108863,US -3343108864,3343109375,GB -3343109376,3343153151,US +3343108864,3343109119,EU +3343109120,3343153151,US 3343153152,3343153167,CA 3343153168,3343153175,US 3343153176,3343155199,CA @@ -130505,7 +131623,9 @@ 3343378432,3343378447,BR 3343378448,3343380479,US 3343380480,3343384575,CA -3343384576,3343465471,US +3343384576,3343460863,US +3343460864,3343461375,CA +3343461376,3343465471,US 3343465472,3343466495,JM 3343466496,3343858687,US 3343858688,3343859711,VG @@ -130513,7 +131633,9 @@ 3343922976,3343923007,PA 3343923008,3343923071,US 3343923072,3343923199,HK -3343923200,3344126975,US +3343923200,3344116223,US +3344116224,3344116735,CA +3344116736,3344126975,US 3344126976,3344127999,CA 3344128000,3344138751,US 3344138752,3344139007,GB @@ -130529,14 +131651,21 @@ 3344165664,3344166911,US 3344166912,3344168959,CA 3344168960,3344171007,US -3344171008,3344255999,CA -3344256000,3344261119,US -3344261120,3344268543,CA +3344171008,3344236543,CA +3344236544,3344237055,US +3344237056,3344242175,CA +3344242176,3344242687,US +3344242688,3344255999,CA +3344256000,3344261631,US +3344261888,3344266239,CA +3344266240,3344266751,US +3344266752,3344268543,CA 3344268544,3344269311,US 3344269312,3344288767,CA 3344288768,3344289791,PR 3344289792,3344292863,US 3344292864,3344296447,CA +3344296448,3344296959,US 3344296960,3344297983,GD 3344297984,3344299007,US 3344299264,3344299519,CA @@ -130563,7 +131692,9 @@ 3344408576,3344415679,US 3344415680,3344415743,AR 3344415744,3344415999,ES -3344416000,3344429055,US +3344416000,3344426239,US +3344426240,3344426495,A1 +3344426496,3344429055,US 3344429056,3344429343,CA 3344429344,3344429375,US 3344429376,3344431103,CA @@ -130843,9 +131974,14 @@ 3346525184,3346528255,US 3346528256,3346529279,PR 3346529280,3346530303,CA -3346530304,3346691071,US +3346530304,3346663167,US +3346663168,3346663423,CA +3346663424,3346691071,US 3346691072,3346692095,CA -3346692096,3346923519,US +3346692096,3346793215,US +3346793216,3346793471,CA +3346793472,3346793983,US +3346794496,3346923519,US 3346923520,3346989055,CA 3346989056,3347014255,US 3347014256,3347014271,CY @@ -130874,15 +132010,21 @@ 3349341696,3349341951,CA 3349341952,3349446911,US 3349446912,3349447167,CA -3349447168,3349532671,US +3349447168,3349463039,US +3349463040,3349463295,CA +3349463296,3349479167,US +3349479168,3349479423,CA +3349479424,3349532671,US 3349532672,3349533695,GB 3349533696,3349544959,US -3349544960,3349551103,CA +3349545216,3349545727,CA +3349545728,3349545983,US +3349545984,3349551103,CA 3349551104,3349553663,US 3349553664,3349608447,CA 3349608448,3349609215,US -3349609216,3349610495,CA -3349610496,3349614591,US +3349609216,3349610239,CA +3349610240,3349614591,US 3349614592,3349617663,CA 3349617664,3349637119,US 3349637120,3349639167,CA @@ -130925,10 +132067,12 @@ 3350043136,3350134783,US 3350134784,3350146047,CA 3350146048,3350150143,US -3350150144,3350181887,CA -3350181888,3350182911,US -3350182912,3350200319,CA -3350200320,3350469119,US +3350150144,3350160639,CA +3350160640,3350160895,US +3350160896,3350181887,CA +3350181888,3350183167,US +3350183168,3350200063,CA +3350200064,3350469119,US 3350469632,3350470655,CA 3350470656,3350475775,US 3350475776,3350476799,CA @@ -130954,7 +132098,9 @@ 3350514640,3350514655,GB 3350514656,3350515135,US 3350515136,3350515167,GB -3350515168,3350561279,US +3350515168,3350548735,US +3350548736,3350548991,CA +3350548992,3350561279,US 3350561280,3350561535,AP 3350561536,3350593535,US 3350593536,3350605823,CA @@ -130973,9 +132119,15 @@ 3350646784,3350648831,US 3350648832,3350650879,CA 3350650880,3350790399,US -3350790400,3350825727,CA +3350790400,3350814975,CA +3350814976,3350815231,US +3350815232,3350825727,CA 3350825728,3350825983,GB -3350825984,3350855679,CA +3350825984,3350836223,CA +3350836736,3350836991,US +3350836992,3350843391,CA +3350843392,3350843647,US +3350843648,3350855679,CA 3350855680,3350862079,US 3350862080,3350864639,CL 3350864640,3350952495,US @@ -131248,18 +132400,33 @@ 3353753056,3353753059,BR 3353753060,3353780223,US 3353780224,3353780479,GB -3353780480,3353942527,US +3353780480,3353836543,US +3353836544,3353837567,CA +3353837568,3353855999,US +3353856000,3353858047,CA +3353858048,3353861119,US +3353861120,3353862143,CA +3353862144,3353942527,US 3353942528,3353943039,CA -3353943040,3353979647,US +3353943040,3353960191,US +3353960192,3353960447,CA +3353960448,3353979647,US 3353979648,3353979903,CA 3353979904,3353982719,US 3353982720,3353983231,CA -3353983232,3353993215,US -3354001408,3354066943,US +3353983232,3354066943,US 3354066944,3354132479,CA -3354132480,3354591231,US +3354132480,3354492927,US +3354492928,3354494975,CA +3354494976,3354501119,US +3354501120,3354503167,CA +3354503168,3354591231,US 3354591232,3354656767,CA -3354656768,3354731018,US +3354656768,3354676223,US +3354676224,3354677247,CA +3354677248,3354687487,US +3354687488,3354688511,CA +3354688512,3354731018,US 3354731019,3354731019,EU 3354731020,3354731519,US 3354731520,3354731775,AP @@ -131294,8 +132461,9 @@ 3355319296,3355320319,CA 3355320320,3355324415,US 3355324416,3355328511,CA -3355328512,3355336703,US -3355344896,3355351039,US +3355328512,3355338751,US +3355338752,3355340799,BB +3355340800,3355351039,US 3355351040,3355351295,CA 3355351296,3355372287,US 3355372288,3355372543,CA @@ -131533,7 +132701,6 @@ 3356070656,3356070911,AR 3356070912,3356071423,BR 3356071424,3356072447,CL -3356072448,3356073215,CR 3356073216,3356073471,AR 3356073472,3356075263,BR 3356075264,3356076287,BO @@ -131624,7 +132791,7 @@ 3356150528,3356150783,PA 3356150784,3356151039,AR 3356151040,3356151295,NI -3356151296,3356151807,AR +3356151552,3356151807,AR 3356151808,3356152063,CL 3356152064,3356152575,BR 3356152576,3356152831,CL @@ -131725,7 +132892,7 @@ 3356299264,3356305663,MX 3356305664,3356307455,AR 3356307456,3356316415,MX -3356316416,3356317695,AR +3356316416,3356316671,AR 3356317696,3356328959,MX 3356328960,3356329983,HN 3356329984,3356332031,GF @@ -131736,8 +132903,8 @@ 3356337664,3356337919,SV 3356337920,3356338175,HN 3356338176,3356340223,SV -3356340224,3356340991,HN -3356340992,3356341759,SV +3356340224,3356341247,HN +3356341248,3356341759,SV 3356341760,3356342015,HN 3356342016,3356343295,SV 3356343296,3356343551,HN @@ -131767,7 +132934,8 @@ 3356390656,3356391167,CL 3356391168,3356391423,PA 3356393472,3356426239,CL -3356426240,3356491775,US +3356426240,3356427263,BR +3356427264,3356491775,US 3356491776,3356493823,PE 3356493824,3356495871,ZA 3356495872,3356499967,AR @@ -131899,7 +133067,9 @@ 3357476000,3357476015,VE 3357476016,3357476031,AR 3357476032,3357476047,VE -3357476048,3357476287,AR +3357476048,3357476071,AR +3357476072,3357476079,VE +3357476080,3357476287,AR 3357476288,3357476351,VE 3357476352,3357476479,AR 3357476480,3357476607,EC @@ -131939,7 +133109,8 @@ 3357558784,3357559167,AR 3357559168,3357559295,EC 3357559296,3357559551,CA -3357559552,3357559935,AR +3357559552,3357559807,US +3357559808,3357559935,AR 3357559936,3357560063,VE 3357560064,3357560247,AR 3357560248,3357560255,VE @@ -131971,7 +133142,9 @@ 3358131328,3358131455,CO 3358131456,3358131983,AR 3358131984,3358131999,CO -3358132000,3358133439,AR +3358132000,3358132087,AR +3358132088,3358132095,CO +3358132096,3358133439,AR 3358133440,3358133471,VE 3358133472,3358133631,AR 3358133632,3358133759,VE @@ -132049,8 +133222,8 @@ 3358569472,3358570495,VE 3358570496,3358570751,MX 3358570752,3358571263,PE -3358571264,3358571775,MX -3358571776,3358577151,AR +3358571264,3358572031,MX +3358572032,3358577151,AR 3358577152,3358577407,PE 3358577408,3358578431,AR 3358578432,3358578687,VE @@ -132224,7 +133397,9 @@ 3360399360,3360403455,BO 3360407552,3360423935,PA 3360423936,3360686079,MX -3360686080,3360710655,AR +3360686080,3360710271,AR +3360710272,3360710399,US +3360710400,3360710655,AR 3360710656,3360718847,HT 3360718848,3360760575,AR 3360760576,3360760831,UY @@ -132318,7 +133493,6 @@ 3362476544,3362477055,CR 3362477056,3362478079,AN 3362478080,3362480127,AR -3362484224,3362486271,AR 3362486272,3362488319,HN 3362488320,3362504703,PE 3362504704,3362506751,VE @@ -132362,6 +133536,7 @@ 3362717696,3362815999,CL 3362816000,3362832383,AR 3362836480,3362838527,CO +3362838528,3362840575,EC 3362840576,3362897919,CL 3362897920,3362914303,HT 3362914304,3362930687,CO @@ -132377,7 +133552,10 @@ 3363025152,3363025407,PA 3363025408,3363025663,CO 3363025664,3363025919,AN -3363025920,3363026175,CO +3363025920,3363026431,CO +3363026432,3363026943,HT +3363026944,3363027199,CL +3363027968,3363028991,HN 3363028992,3363045375,AR 3363045376,3363110911,CO 3363110912,3363176447,AR @@ -132392,7 +133570,9 @@ 3363504128,3363512319,PE 3363512320,3363554047,AR 3363554048,3363554175,US -3363554176,3363557375,AR +3363554176,3363556095,AR +3363556096,3363556223,US +3363556224,3363557375,AR 3363569664,3363577855,PA 3363577856,3363586047,CL 3363594240,3363600383,AR @@ -132409,7 +133589,6 @@ 3363651584,3363667967,AR 3363667968,3363676159,EC 3363676160,3363678207,TT -3363678208,3363680255,NI 3363680256,3363682303,GT 3363682304,3363684351,VE 3363684352,3363708927,EC @@ -132419,7 +133598,10 @@ 3363831808,3378511871,BR 3378511872,3383754751,MX 3383754752,3384147967,AR -3384147968,3384213503,PA +3384147968,3384156159,US +3384156160,3384160255,PA +3384160256,3384164351,US +3384164352,3384213503,PA 3384213504,3384279039,EC 3384279040,3384410111,CO 3384410112,3384672255,CL @@ -132469,6 +133651,7 @@ 3386720256,3386728447,TT 3386728448,3386732543,AR 3386732544,3386734591,CL +3386734592,3386734847,AR 3386736640,3386753023,CO 3386753024,3386761215,CL 3386761216,3386769407,PA @@ -132483,9 +133666,17 @@ 3387293696,3387359231,PE 3387359232,3387424767,AR 3387424768,3387555839,CO -3387555840,3387572095,AR +3387555840,3387569351,AR +3387569352,3387569355,PE +3387569356,3387569567,AR +3387569568,3387569583,PE +3387569584,3387572095,AR 3387572096,3387572223,PE -3387572224,3387600895,AR +3387572224,3387575935,AR +3387575936,3387576063,CO +3387576064,3387577727,AR +3387577728,3387577855,EC +3387577856,3387600895,AR 3387600896,3387604991,CO 3387604992,3387608319,AR 3387608320,3387608447,EC @@ -132563,9 +133754,7 @@ 3389036288,3389036543,NZ 3389037056,3389037567,AU 3389037568,3389038591,NC -3389038592,3389042687,HK -3389042688,3389043711,CN -3389043712,3389044735,HK +3389038592,3389044735,HK 3389044736,3389046783,AU 3389046784,3389063167,US 3389063168,3389063679,AU @@ -133053,7 +134242,8 @@ 3390769408,3390769663,IN 3390769664,3390770175,TH 3390770176,3390771199,AU -3390771200,3390790399,NZ +3390771200,3390775295,SG +3390775296,3390790399,NZ 3390790400,3390790655,AU 3390790656,3390801919,NZ 3390801920,3390802431,CN @@ -133297,7 +134487,7 @@ 3392114432,3392114687,KR 3392114688,3392118783,GU 3392118784,3392126975,MY -3392126976,3392135167,HK +3392126976,3392135167,ID 3392135168,3392143359,TH 3392143360,3392208895,JP 3392208896,3392286975,NZ @@ -133677,10 +134867,8 @@ 3393740800,3393741567,US 3393741568,3393741823,MG 3393741824,3393742847,US -3393742848,3393743185,AP -3393743186,3393743186,AU -3393743187,3393743615,AP -3393743616,3393744895,US +3393742848,3393743871,TL +3393743872,3393744895,US 3393744896,3393748991,PH 3393748992,3393765375,AU 3393765376,3393773567,ID @@ -133710,7 +134898,9 @@ 3393855744,3393855999,NZ 3393856000,3393856255,AU 3393856256,3393856511,HK -3393856768,3393857023,SG +3393856768,3393856896,SG +3393856897,3393856897,AP +3393856898,3393857023,SG 3393857024,3393857535,NZ 3393857536,3393858047,HK 3393858048,3393858559,ID @@ -133850,7 +135040,9 @@ 3394478080,3394482175,PK 3394482176,3394484223,AU 3394484224,3394486271,JP -3394486272,3394494463,HK +3394486272,3394489599,HK +3394489600,3394489631,AP +3394489632,3394494463,HK 3394494464,3394498559,JP 3394498560,3394500607,HK 3394500608,3394501631,SG @@ -133923,7 +135115,7 @@ 3394835968,3394836223,AP 3394836224,3394836479,HK 3394836480,3394838527,BT -3394838528,3394846719,NZ +3394838528,3394846719,AU 3394846720,3394850815,IN 3394850816,3394854911,JP 3394855936,3394856959,AU @@ -134164,7 +135356,8 @@ 3397279744,3397283839,AU 3397283840,3397285887,KR 3397285888,3397287935,BD -3397287936,3397304319,HK +3397287936,3397296127,SG +3397296128,3397304319,HK 3397304320,3397308415,NZ 3397308416,3397312511,HK 3397312512,3397320703,JP @@ -134337,7 +135530,7 @@ 3398207488,3398208511,IN 3398213632,3398221823,TW 3398221824,3398230015,JP -3398230016,3398238207,AU +3398230016,3398238207,HK 3398238208,3398279167,IN 3398279168,3398287359,CN 3398287360,3398291455,JP @@ -134391,7 +135584,9 @@ 3398619136,3398621183,AU 3398621184,3398623231,HK 3398623232,3398631423,ID -3398631424,3398637823,JP +3398631424,3398637119,JP +3398637120,3398637183,HK +3398637184,3398637823,JP 3398637824,3398638079,PH 3398638080,3398647807,JP 3398647808,3398668287,AU @@ -134442,7 +135637,6 @@ 3398902016,3398902271,HK 3398902272,3398902783,PH 3398902784,3398903807,AU -3398903808,3398905855,TH 3398905856,3398909951,TW 3398909952,3398918143,GU 3398918144,3398926335,JP @@ -134568,7 +135762,7 @@ 3399826432,3399826943,PH 3399826944,3399827455,IN 3399827456,3399835647,AU -3399835648,3399839743,CN +3399835648,3399839743,AP 3399839744,3399841791,JP 3399841792,3399852031,TW 3399852032,3399856127,JP @@ -134595,8 +135789,7 @@ 3399942144,3399945983,HK 3399945984,3399946239,AU 3399946240,3399950335,HK -3399950336,3399958527,MY -3399958528,3399974911,US +3399950336,3399974911,US 3399974912,3399995391,MY 3399995392,3399999487,KR 3399999488,3400004671,SG @@ -134733,14 +135926,12 @@ 3400608768,3400609791,IN 3400609792,3400630271,JP 3400630272,3400646655,IN -3400646656,3400650239,SG +3400646656,3400648815,SG +3400648816,3400648831,HK +3400648832,3400650239,SG 3400650240,3400650495,AU -3400650496,3400652543,SG -3400652544,3400652799,AU -3400652800,3400654103,SG -3400654104,3400654111,AU -3400654112,3400654591,SG -3400654592,3400654847,AU +3400650496,3400650751,SG +3400650752,3400654847,AU 3400654848,3400663039,IN 3400663040,3400683519,MY 3400683520,3400691711,JP @@ -134766,7 +135957,6 @@ 3400839168,3400847359,JP 3400847360,3400849407,CN 3400849408,3400851455,MN -3400851456,3400859647,AU 3400867840,3400884223,AU 3400884224,3400888319,JP 3400888320,3400892415,CN @@ -134814,11 +136004,7 @@ 3401545728,3401547775,BD 3401547776,3401580543,IN 3401580544,3402629119,CN -3402629120,3403184127,JP -3403184128,3403186175,US -3403186176,3403858175,JP -3403858176,3403859967,US -3403859968,3404506879,JP +3402629120,3404506879,JP 3404506880,3404507135,US 3404507136,3404694271,JP 3404694272,3404694527,US @@ -135158,7 +136344,7 @@ 3406528000,3406528255,CN 3406528256,3406528511,AU 3406528512,3406528767,AP -3406528768,3406530559,AU +3406528768,3406530559,HK 3406530560,3406531583,CN 3406531584,3406531839,AU 3406531840,3406532607,CN @@ -135771,7 +136957,9 @@ 3407523072,3407523327,CN 3407523328,3407523839,AU 3407523840,3407524095,CN -3407524096,3407526143,AU +3407524096,3407524607,AU +3407524608,3407524863,NZ +3407524864,3407526143,AU 3407526144,3407526399,CN 3407526400,3407530495,AU 3407530496,3407531007,CN @@ -136435,7 +137623,7 @@ 3410903040,3410911231,HK 3410911232,3410915327,TH 3410915328,3410919423,ID -3410919424,3410927615,IN +3410919424,3410923519,IN 3410927616,3410931711,NP 3410931712,3410935807,TW 3410935808,3410939903,MY @@ -136496,7 +137684,7 @@ 3411165184,3411173375,MY 3411173376,3411177471,AU 3411181056,3411181311,US -3411181568,3411189759,SG +3411181568,3411189759,JP 3411189760,3411197951,AU 3411197952,3411202047,BD 3411202048,3411204607,AU @@ -136579,18 +137767,14 @@ 3411615744,3411623935,JP 3411623936,3411640319,AU 3411640320,3411641343,JP -3411641344,3411641599,IN -3411641600,3411641855,HK -3411641856,3411642367,IN +3411641344,3411642367,IN 3411642368,3411643391,CN 3411643392,3411644415,VN 3411644416,3411644927,AU 3411644928,3411645951,ID 3411645952,3411646207,SG 3411646208,3411647487,IN -3411647488,3411648511,AU -3411648512,3411656703,NZ -3411656704,3411673087,AU +3411647488,3411673087,AU 3411673088,3411674111,CN 3411674112,3411674623,IN 3411674624,3411675135,HK @@ -137234,7 +138418,6 @@ 3417939968,3417946111,PF 3417946112,3417947135,AU 3417947136,3417947391,IN -3417947392,3417947647,HK 3417947648,3417947903,AU 3417947904,3417948159,IN 3417948160,3417964543,AU @@ -137327,7 +138510,7 @@ 3418306560,3418308607,MN 3418308608,3418324991,CN 3418324992,3418326015,VU -3418326016,3418326527,AU +3418326016,3418326271,AU 3418326528,3418327039,PH 3418327040,3418329087,JP 3418329088,3418333183,CN @@ -137555,7 +138738,11 @@ 3420436480,3420437503,AU 3420437504,3420438527,IN 3420438528,3420454911,HK -3420454912,3422552063,KR +3420454912,3422000533,KR +3422000534,3422000535,AP +3422000536,3422000536,IN +3422000537,3422000537,AP +3422000538,3422552063,KR 3422552064,3422717439,US 3422717440,3422717695,A1 3422717696,3422848511,US @@ -137620,7 +138807,7 @@ 3423265026,3423265026,A2 3423265027,3423265247,US 3423265248,3423265263,EC -3423265264,3423266815,US +3423265264,3423268863,US 3423268864,3423269887,CA 3423269888,3423285247,US 3423285248,3423285535,CA @@ -137979,7 +139166,9 @@ 3423554760,3423554767,CA 3423554768,3423571967,US 3423571968,3423574015,PR -3423574016,3423582207,US +3423574016,3423579135,US +3423579136,3423580159,CA +3423580160,3423582207,US 3423582208,3423584271,CA 3423584272,3423584279,US 3423584280,3423584335,CA @@ -138031,10 +139220,11 @@ 3423602688,3423603711,KN 3423603712,3423604967,US 3423604968,3423604975,BZ -3423604976,3423605759,US -3423606784,3423626239,US +3423604976,3423626239,US 3423626240,3423627263,CA 3423627264,3423629311,US +3423629312,3423630335,AG +3423630336,3423632383,US 3423632384,3423633407,A2 3423633408,3423637503,US 3423637504,3423639551,CA @@ -138159,7 +139349,9 @@ 3426729472,3426729983,CA 3426729984,3426744319,US 3426744320,3426746367,CA -3426746368,3427117055,US +3426746368,3427112447,US +3427112448,3427112703,CN +3427112704,3427117055,US 3427117056,3427117311,CA 3427117312,3427127295,US 3427127296,3427127551,CA @@ -138606,7 +139798,15 @@ 3429411584,3429411839,DE 3429411840,3429500927,US 3429500928,3429502975,A2 -3429502976,3429774599,US +3429502976,3429517407,US +3429517408,3429517411,HK +3429517412,3429518763,US +3429518764,3429518767,SG +3429518768,3429520951,US +3429520952,3429520955,GB +3429520956,3429739175,US +3429739176,3429739179,GB +3429739180,3429774599,US 3429774600,3429774607,BD 3429774608,3429775359,US 3429775360,3429777407,TC @@ -138699,7 +139899,9 @@ 3431526923,3431596287,US 3431596288,3431602687,CA 3431602688,3431602943,US -3431602944,3431613439,CA +3431602944,3431606271,CA +3431606272,3431609343,US +3431609344,3431613439,CA 3431613440,3431613695,US 3431613696,3431620095,CA 3431620096,3431620351,US @@ -139688,9 +140890,9 @@ 3450254080,3450254335,CA 3450254336,3450272511,US 3450272512,3450272767,MX -3450272768,3450275601,US -3450275602,3450275602,FR -3450275603,3450345231,US +3450272768,3450275583,US +3450275584,3450275839,FR +3450275840,3450345231,US 3450345232,3450345247,FR 3450345248,3450345263,IT 3450345264,3450345279,US @@ -140654,7 +141856,17 @@ 3459852992,3459853007,CA 3459853008,3459873807,US 3459873808,3459873823,IT -3459873824,3460104703,US +3459873824,3460057283,US +3460057284,3460057287,TH +3460057288,3460061687,US +3460061688,3460061691,HK +3460061692,3460063175,US +3460063176,3460063179,HK +3460063180,3460070959,US +3460070960,3460070963,GB +3460070964,3460071043,US +3460071044,3460071047,GB +3460071048,3460104703,US 3460104704,3460105215,MX 3460105216,3460108895,US 3460108896,3460108903,FI @@ -140666,7 +141878,9 @@ 3460161536,3460165631,PR 3460165632,3460374527,US 3460374528,3460375551,MX -3460375552,3460453631,US +3460375552,3460411149,US +3460411150,3460411150,EU +3460411151,3460453631,US 3460453632,3460453887,BS 3460453888,3460507647,US 3460507648,3460507903,MX @@ -141257,8 +142471,8 @@ 3463229328,3463229335,US 3463229336,3463243775,CA 3463243776,3463245055,US -3463245056,3463249919,CA -3463249920,3463480063,US +3463245056,3463249663,CA +3463249664,3463480063,US 3463480064,3463480319,CA 3463480320,3463502335,US 3463502336,3463502399,GB @@ -141309,7 +142523,7 @@ 3464196184,3464196191,IT 3464196192,3464196490,US 3464196491,3464196491,ZA -3464196492,3464200191,US +3464196492,3464208383,US 3464208384,3464216575,CA 3464216576,3464309903,US 3464309904,3464309911,CA @@ -141484,7 +142698,7 @@ 3466627040,3466661887,US 3466661888,3466663935,TW 3466663936,3466683135,US -3466683136,3466683391,A2 +3466683136,3466683391,NG 3466683392,3466688511,US 3466688512,3466688767,A2 3466688768,3466734847,US @@ -142678,7 +143892,9 @@ 3471572992,3472375807,US 3472375808,3472392191,PR 3472392192,3472408575,CA -3472408576,3472990207,US +3472408576,3472571647,US +3472571648,3472571903,GH +3472571904,3472990207,US 3472990208,3472990463,AS 3472990464,3473039359,US 3473039360,3473040639,BM @@ -143275,7 +144491,15 @@ 3480907264,3480907775,FR 3480907776,3480968191,US 3480968192,3480968447,AU -3480968448,3481182503,US +3480968448,3481164801,US +3481164802,3481164802,A1 +3481164803,3481165057,US +3481165058,3481165058,A1 +3481165059,3481165313,US +3481165314,3481165314,A1 +3481165315,3481165569,US +3481165570,3481165570,A1 +3481165571,3481182503,US 3481182504,3481182511,CA 3481182512,3481665535,US 3481665536,3481731071,CA @@ -144209,8 +145433,7 @@ 3493903552,3493903567,KW 3493903568,3493914239,US 3493914240,3493914367,CA -3493914368,3493916671,US -3493918720,3493936127,US +3493914368,3493936127,US 3493936128,3493937151,CA 3493937152,3493980159,US 3493980160,3493980447,CA @@ -144606,7 +145829,9 @@ 3494936516,3494938623,US 3494938624,3494939647,CA 3494939648,3494949889,US -3494949890,3494950142,GB +3494949890,3494949898,GB +3494949899,3494949899,US +3494949900,3494950142,GB 3494950143,3494950655,US 3494950656,3494950911,PH 3494950912,3494964223,US @@ -147584,7 +148809,9 @@ 3513670912,3513671167,A2 3513671168,3513778175,US 3513778176,3513794559,CA -3513794560,3514007551,US +3513794560,3513840127,US +3513840128,3513840383,A1 +3513840384,3514007551,US 3514007552,3514040319,CA 3514040320,3514367999,US 3514368000,3514433535,CA @@ -148981,9 +150208,7 @@ 3523699200,3523699711,US 3523699712,3523709183,JP 3523709184,3523709951,CN -3523709952,3523713279,JP -3523713280,3523713535,NL -3523713536,3523739647,JP +3523709952,3523739647,JP 3523739648,3524001791,AU 3524001792,3524132863,CN 3524132864,3524145151,PH @@ -149036,10 +150261,7 @@ 3526926336,3526934527,JP 3526934528,3526942719,CN 3526942720,3526950911,AU -3526950912,3526955904,HK -3526955905,3526955905,JP -3526955906,3526967295,HK -3526967296,3526983679,JP +3526950912,3526983679,JP 3526983680,3527004159,HK 3527004160,3527008255,ID 3527008256,3527016447,KR @@ -149551,7 +150773,9 @@ 3557826560,3557834751,AT 3557834752,3557836287,GB 3557836288,3557836543,IR -3557836544,3557837055,GB +3557836544,3557837026,GB +3557837027,3557837027,IR +3557837028,3557837055,GB 3557837056,3557842943,IR 3557842944,3557851135,FI 3557851136,3557859327,HU @@ -153901,7 +155125,9 @@ 3564560464,3564560479,US 3564560480,3564560511,GB 3564560512,3564560527,US -3564560528,3564560575,GB +3564560528,3564560531,GB +3564560532,3564560532,EU +3564560533,3564560575,GB 3564560576,3564560607,US 3564560608,3564560895,GB 3564560896,3564560903,US @@ -155398,7 +156624,9 @@ 3569123328,3569156095,GB 3569156096,3569156351,NL 3569156352,3569156607,EU -3569156608,3569165311,NL +3569156608,3569157379,NL +3569157380,3569157380,EU +3569157381,3569165311,NL 3569165312,3569165567,EU 3569165568,3569167871,NL 3569167872,3569168127,EU @@ -157646,7 +158874,11 @@ 3578040320,3578040575,EU 3578040576,3578049023,DE 3578049024,3578049055,CH -3578049056,3578159615,DE +3578049056,3578064383,DE +3578064384,3578064508,EU +3578064509,3578064510,DE +3578064511,3578064639,EU +3578064640,3578159615,DE 3578159616,3578159871,EU 3578159872,3578208127,DE 3578208128,3578208191,PK @@ -158662,9 +159894,7 @@ 3583019376,3583023215,CH 3583023216,3583023223,DE 3583023224,3583025151,CH -3583025152,3583030783,A2 -3583030784,3583031039,DZ -3583031040,3583031807,A2 +3583025152,3583031807,A2 3583031808,3583032063,GR 3583032064,3583033343,A2 3583033344,3583041535,FR @@ -159338,11 +160568,7 @@ 3585155072,3585163263,GB 3585163264,3585171455,BE 3585171456,3585179647,RU -3585179648,3585187839,BE -3585187840,3585188095,DZ -3585188096,3585188863,BE -3585188864,3585189119,DZ -3585189120,3585189887,BE +3585179648,3585189887,BE 3585189888,3585190399,DZ 3585190400,3585190527,BE 3585190528,3585190655,DZ @@ -162176,8 +163402,8 @@ 3626382224,3626382227,CN 3626382228,3626382239,US 3626382240,3626382243,NL -3626382244,3626382247,US -3626382248,3626382251,IN +3626382244,3626382248,US +3626382249,3626382251,IN 3626382252,3626382263,US 3626382264,3626382267,CA 3626382268,3626382271,IT @@ -163528,7 +164754,13 @@ 3631713112,3631713119,MX 3631713120,3631713135,US 3631713136,3631713143,UA -3631713144,3631841279,US +3631713144,3631822815,US +3631822816,3631822831,AU +3631822832,3631825647,US +3631825648,3631825663,NZ +3631825664,3631829023,US +3631829024,3631829039,IN +3631829040,3631841279,US 3631841280,3631874047,CA 3631874048,3631879199,US 3631879200,3631879231,CA @@ -165656,7 +166888,9 @@ 3642744832,3642753023,TR 3642753024,3642830671,GB 3642830672,3642830687,A2 -3642830688,3643801599,GB +3642830688,3642858217,GB +3642858218,3642858218,EU +3642858219,3643801599,GB 3643801600,3644063743,DE 3644063744,3644325887,EG 3644325888,3644588031,IT @@ -167653,6 +168887,7 @@ 3650484672,3650486271,PL 3650486272,3650502655,RU 3650502656,3650504703,SE +3650504704,3650506751,RU 3650506752,3650508799,LB 3650508800,3650510847,NL 3650510848,3650519039,GB @@ -168538,7 +169773,7 @@ 3654607616,3654607871,SE 3654607872,3654608127,NO 3654608128,3654608383,SE -3654608384,3654608895,A2 +3654608384,3654608895,PL 3654608896,3654609919,NO 3654609920,3654610431,SE 3654610432,3654610943,FR @@ -168583,11 +169818,7 @@ 3659628544,3659661311,JP 3659661312,3659792383,TW 3659792384,3660054527,KR -3660054528,3660096767,JP -3660096768,3660097791,US -3660097792,3660102143,JP -3660102144,3660102399,US -3660102400,3660578815,JP +3660054528,3660578815,JP 3660578816,3661103103,KR 3661103104,3663986687,CN 3663986688,3663987711,AU diff --git a/installer/resources/install_i2p_service_osx.command b/installer/resources/install_i2p_service_osx.command index 9bfee453c57107a34fd0b8c75b282e98afca7d17..95da7aedc030eddefa81de1a1bf655d5d7d89a2c 100644 --- a/installer/resources/install_i2p_service_osx.command +++ b/installer/resources/install_i2p_service_osx.command @@ -5,13 +5,14 @@ # Author: Meeh cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" shfile="tmp$$.sh" -echo -n 'cat `pwd`/net.i2p.router.plist |' > `pwd`/$shfile +echo -n 'cat `pwd`/net.i2p.router.plist.template |' > `pwd`/$shfile echo -n "sed 's#USERNAME#`whoami`#' " >> `pwd`/$shfile echo -n '| sed "s#COMMAND#`pwd`/i2prouter#" | sed "s#I2PPATH#`pwd`/#" > /Library/LaunchDaemons/net.i2p.router.plist' >> `pwd`/$shfile chmod +x `pwd`/$shfile echo "Please enter your password for sudo privileges to install I2P as a launchd service" sudo ./$shfile -sudo launchctl load -F /Library/LaunchDaemons/net.i2p.router.plist +sudo chown root:wheel /Library/LaunchDaemons/net.i2p.router.plist +sudo launchctl load -wF /Library/LaunchDaemons/net.i2p.router.plist if [ $? == 0 ]; then echo "I2P Router wrapper was successfully installed as a launchd service." else diff --git a/installer/resources/news.xml b/installer/resources/news.xml index 3bec527ca2baadb97071b7fe230f91081aedc3bc..342dfab93713fb28f79a33bbb6b057a778a97a3f 100644 --- a/installer/resources/news.xml +++ b/installer/resources/news.xml @@ -1,14 +1,16 @@ <!-- -<i2p.news date="$Date: 2012-07-30 00:00:00 $"> -<i2p.release version="0.9.1" date="2012/07/30" minVersion="0.6" /> +<i2p.news date="$Date: 2012-09-21 00:00:00 $"> +<i2p.release version="0.9.2" date="2012/09/21" minVersion="0.6" /> --> <div lang="en"> -<h3>2012-07-30: <b>0.9.1 <a href="http://www.i2p2.i2p/release-0.9.1.html">Released</a></b></h3> +<h3>2012-09-21: <b>0.9.2 <a href="http://www.i2p2.i2p/release-0.9.2.html">Released</a></b></h3> <p> -0.9.1 includes a large number of bug fixes and improvements in i2psnark, streaming, and elsewhere. -There are also home page changes, new themes, and translation updates. -Upgrading is recommended. +0.9.2 includes extensive low-level changes to improve the performance and efficiency of the router. +We have updated our UPnP library, to hopefully make UPnP work for more people. +I2PSnark now has DHT support, but it is not yet enabled by default, as we plan to do more +testing during the upcoming 0.9.3 development cycle. +As usual, there's also lots of bug fixes in this release, so updating is recommended. </p><p> Say hello to the volunteers on the <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help IRC channel</a>. <a href="http://www.i2p2.i2p/getinvolved.html">Get involved</a>, diff --git a/installer/resources/themes/console/light/default.css b/installer/resources/themes/console/light/default.css index 157548cee22b7a1b1e2f694796c3595b672cd5d1..d7934b1d5ea2ce58b46bfb1a441a434a52c1b09e 100644 --- a/installer/resources/themes/console/light/default.css +++ b/installer/resources/themes/console/light/default.css @@ -160,7 +160,7 @@ hr { width: 150px; height: 24px; border: 1px solid #447; - padding: 2px; + padding: 2px 3px; margin: 4px 0 2px 0px; font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; font-weight: bold; diff --git a/installer/resources/themes/console/light/i2ptunnel.css b/installer/resources/themes/console/light/i2ptunnel.css index 72a55c737165609ec3d90967c79e5ef7b1564243..dc24b1457b29d2c5091d2a211dd63e41c6c96c34 100644 --- a/installer/resources/themes/console/light/i2ptunnel.css +++ b/installer/resources/themes/console/light/i2ptunnel.css @@ -49,14 +49,11 @@ width: 300px; } -#tunnelEditPage #port { +#tunnelEditPage #port, #tunnelEditPage #targetPort, #tunnelEditPage #clientPort, #tunnelEditPage #tunnelBackupQuantity, #tunnelEditPage #tunnelVariance { + text-align: right; width: 80px; } -#tunnelEditPage #targetPort, #tunnelEditPage #clientPort, #tunnelEditPage #tunnelBackupQuantity, #tunnelEditPage #tunnelVariance { - width: 150px; -} - #tunnelEditPage #shared, #tunnelEditPage #connectDelay, #tunnelEditPage #startOnLoad { width: 16px; } diff --git a/installer/resources/themes/susidns/dark/susidns.css b/installer/resources/themes/susidns/dark/susidns.css index fabec4b5d50f8db14ea9c54e7c622ecef4d70a45..fec7be2a99e9e8b3af970163508f0bf3b5397d87 100644 --- a/installer/resources/themes/susidns/dark/susidns.css +++ b/installer/resources/themes/susidns/dark/susidns.css @@ -133,6 +133,9 @@ p.messages { p.footer { font-size:7pt; text-align: center; +} + +.iframed #footer { display: none; } @@ -314,4 +317,4 @@ textarea { input:focus, textarea:focus { color: #ee9; -} \ No newline at end of file +} diff --git a/installer/resources/themes/susidns/light/susidns.css b/installer/resources/themes/susidns/light/susidns.css index 089b71b829e9fa87620ac4a5f8a823050f9441b3..62e9055fc05155037629f07d16f3bbddaad30311 100644 --- a/installer/resources/themes/susidns/light/susidns.css +++ b/installer/resources/themes/susidns/light/susidns.css @@ -102,6 +102,9 @@ p.messages { p.footer { font-size:7pt; text-align: center; +} + +.iframed #footer { display: none; } diff --git a/installer/resources/themes/susidns/midnight/susidns.css b/installer/resources/themes/susidns/midnight/susidns.css index 65a1b7f75cb58da21d15194cec07eb2ae50986ef..dbe1941cd40489a15ffef83e968f4a3948c2b5a0 100644 --- a/installer/resources/themes/susidns/midnight/susidns.css +++ b/installer/resources/themes/susidns/midnight/susidns.css @@ -133,6 +133,9 @@ p.messages { p.footer { font-size:7pt; text-align: center; +} + +.iframed #footer { display: none; } diff --git a/installer/resources/themes/susimail/dark/susimail.css b/installer/resources/themes/susimail/dark/susimail.css index e9d84a80712dcb6c0f6bc411c59b4e527841a20e..0077bb91646590a65968d096529653650dccb44c 100644 --- a/installer/resources/themes/susimail/dark/susimail.css +++ b/installer/resources/themes/susimail/dark/susimail.css @@ -76,6 +76,9 @@ p.footer { margin-right:10mm; font-size:8pt; line-height:10pt; +} + +.iframed #footer { display: none; } @@ -281,4 +284,4 @@ input:disabled, input:disabled:hover, input:disabled:active { -moz-box-shadow: none; -khtml-box-shadow: none; background: #000 !important; -} \ No newline at end of file +} diff --git a/installer/resources/themes/susimail/light/susimail.css b/installer/resources/themes/susimail/light/susimail.css index 19920d01b109c443e8673703406d5a0efbdfba9b..33f5585fd384a016fdb368bf521211901f6c4c02 100644 --- a/installer/resources/themes/susimail/light/susimail.css +++ b/installer/resources/themes/susimail/light/susimail.css @@ -54,6 +54,9 @@ p.footer { margin-right:10mm; font-size:8pt; line-height:10pt; +} + +.iframed #footer { display: none; } diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java index 79fba4939ab06ec300ffd22744ccd011809c1735..52cbad199943fd00ebc8aaad0a7489829d51b6e9 100644 --- a/router/java/src/net/i2p/router/Blocklist.java +++ b/router/java/src/net/i2p/router/Blocklist.java @@ -91,7 +91,7 @@ public class Blocklist { static final String BLOCKLIST_FILE_DEFAULT = "blocklist.txt"; public void startup() { - if (! Boolean.valueOf(_context.getProperty(PROP_BLOCKLIST_ENABLED, "true")).booleanValue()) + if (! _context.getBooleanPropertyDefaultTrue(PROP_BLOCKLIST_ENABLED)) return; String file = _context.getProperty(PROP_BLOCKLIST_FILE, BLOCKLIST_FILE_DEFAULT); // Maybe someday we'll read in multiple files and merge them @@ -849,6 +849,7 @@ public class Blocklist { return Translate.getString(key, _context, BUNDLE_NAME); } +/**** public static void main(String args[]) { Blocklist b = new Blocklist(); if ( (args != null) && (args.length == 1) ) @@ -861,4 +862,5 @@ public class Blocklist { System.out.println("Testing " + tests[i] + " returns " + b.isBlocklisted(tests[i])); } } +****/ } diff --git a/router/java/src/net/i2p/router/ClientTunnelSettings.java b/router/java/src/net/i2p/router/ClientTunnelSettings.java index cc8c74e6cc059c78e7b4ade8a640476c2bfe2fe1..efed48a9d71152102afd338c682991238e84684d 100644 --- a/router/java/src/net/i2p/router/ClientTunnelSettings.java +++ b/router/java/src/net/i2p/router/ClientTunnelSettings.java @@ -20,12 +20,8 @@ public class ClientTunnelSettings { private TunnelPoolSettings _outboundSettings; public ClientTunnelSettings() { - _inboundSettings = new TunnelPoolSettings(); - _inboundSettings.setIsInbound(true); - _inboundSettings.setIsExploratory(false); - _outboundSettings = new TunnelPoolSettings(); - _outboundSettings.setIsInbound(false); - _outboundSettings.setIsExploratory(false); + _inboundSettings = new TunnelPoolSettings(false, true); + _outboundSettings = new TunnelPoolSettings(false, false); } public TunnelPoolSettings getInboundSettings() { return _inboundSettings; } diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java index d576ea9fdc5c9e2aa03829208fee0f5b962e17a0..ab3b2323c9b2964b2cbcce5fd5ae266c109d8e96 100644 --- a/router/java/src/net/i2p/router/InNetMessagePool.java +++ b/router/java/src/net/i2p/router/InNetMessagePool.java @@ -348,7 +348,7 @@ public class InNetMessagePool implements Service { _dispatchThreaded = DEFAULT_DISPATCH_THREADED; String threadedStr = _context.getProperty(PROP_DISPATCH_THREADED); if (threadedStr != null) { - _dispatchThreaded = Boolean.valueOf(threadedStr).booleanValue(); + _dispatchThreaded = Boolean.parseBoolean(threadedStr); } if (_dispatchThreaded) { _context.statManager().createRateStat("pool.dispatchDataTime", "How long a tunnel dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l }); diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java index e566462d12ea553f5dcc59a76ac97d4d57cda47e..5563eec2151f9af6b5e75438e81edc8b12d7768b 100644 --- a/router/java/src/net/i2p/router/MessageHistory.java +++ b/router/java/src/net/i2p/router/MessageHistory.java @@ -80,7 +80,7 @@ public class MessageHistory { String getFilename() { return _historyFile; } private void updateSettings() { - _doLog = Boolean.valueOf(_context.getProperty(PROP_KEEP_MESSAGE_HISTORY)).booleanValue(); + _doLog = _context.getBooleanProperty(PROP_KEEP_MESSAGE_HISTORY); _historyFile = _context.getProperty(PROP_MESSAGE_HISTORY_FILENAME, DEFAULT_MESSAGE_HISTORY_FILENAME); } diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index d19006843d4d7a6153f24f8350a7c28c713f631a..8b2a414f1d654f624dae838912968c5f7868da4a 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -49,6 +49,7 @@ import net.i2p.util.FortunaRandomSource; import net.i2p.util.I2PAppThread; import net.i2p.util.I2PThread; import net.i2p.util.Log; +import net.i2p.util.OrderedProperties; import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SimpleByteCache; import net.i2p.util.SimpleScheduler; @@ -176,7 +177,7 @@ public class Router implements RouterClock.ClockShiftListener { // 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(); + boolean migrateFiles = Boolean.parseBoolean(migrate); String userDir = WorkingDir.getWorkingDir(envProps, migrateFiles); // Use the router.config file specified in the router.configLocation property @@ -196,7 +197,7 @@ public class Router implements RouterClock.ClockShiftListener { envProps.putAll(_config); // This doesn't work, guess it has to be in the static block above? - // if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue()) + // if (Boolean.parseBoolean(envProps.getProperty("router.disableIPv6"))) // System.setProperty("java.net.preferIPv4Stack", "true"); if (envProps.getProperty("i2p.dir.config") == null) @@ -630,7 +631,7 @@ public class Router implements RouterClock.ClockShiftListener { return true; String h = _context.getProperty(PROP_HIDDEN_HIDDEN); if (h != null) - return Boolean.valueOf(h).booleanValue(); + return Boolean.parseBoolean(h); return _context.commSystem().isInBadCountry(); } @@ -976,44 +977,24 @@ public class Router implements RouterClock.ClockShiftListener { * Save the current config options (returning true if save was * successful, false otherwise) * - * Note that unlike DataHelper.storeProps(), - * this does escape the \r or \n that are unescaped in DataHelper.loadProps(). - * Note that the escaping of \r or \n was probably a mistake and should be taken out. - * * Synchronized with file read in getConfig() */ public boolean saveConfig() { - synchronized(_configFileLock) { - FileOutputStream fos = null; - try { - fos = new SecureFileOutputStream(_configFilename); - StringBuilder buf = new StringBuilder(8*1024); - buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n"); - TreeSet ordered = new TreeSet(_config.keySet()); - for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) { - String key = (String)iter.next(); - String val = _config.get(key); - // Escape line breaks before saving. - // Remember: "\" needs escaping both for regex and string. - // NOOO - see comments in DataHelper - //val = val.replaceAll("\\r","\\\\r"); - //val = val.replaceAll("\\n","\\\\n"); - buf.append(key).append('=').append(val).append('\n'); - } - fos.write(buf.toString().getBytes("UTF-8")); - } catch (IOException ioe) { + try { + Properties ordered = new OrderedProperties(); + synchronized(_configFileLock) { + ordered.putAll(_config); + DataHelper.storeProps(ordered, new File(_configFilename)); + } + } catch (Exception ioe) { // warning, _log will be null when called from constructor if (_log != null) _log.error("Error saving the config to " + _configFilename, ioe); else System.err.println("Error saving the config to " + _configFilename + ": " + ioe); return false; - } finally { - if (fos != null) try { fos.close(); } catch (IOException ioe) {} - } - - return true; } + return true; } /** diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 02a64e9ea0ffbc538efc8c9fe408ea1f175cc032..7f4edb97520b081fa27255ad38c4da1068327822 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,10 +18,10 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 23; + public final static long BUILD = 13; /** for example "-test" */ - public final static String EXTRA = "-rc-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: " + FULL_VERSION); diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java index afcf1c727f9b6c6c6faaef937d73fbed766cfd39..ff8597882230acbddcd400ccbe27649413cbcbce 100644 --- a/router/java/src/net/i2p/router/TunnelPoolSettings.java +++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java @@ -21,8 +21,8 @@ public class TunnelPoolSettings { private int _length; private int _lengthVariance; private int _lengthOverride; - private boolean _isInbound; - private boolean _isExploratory; + private final boolean _isInbound; + private final boolean _isExploratory; private boolean _allowZeroHop; private int _IPRestriction; private final Properties _unknownOptions; @@ -54,7 +54,9 @@ public class TunnelPoolSettings { public static final boolean DEFAULT_ALLOW_ZERO_HOP = true; public static final int DEFAULT_IP_RESTRICTION = 2; // class B (/16) - public TunnelPoolSettings() { + public TunnelPoolSettings(boolean isExploratory, boolean isInbound) { + _isExploratory = isExploratory; + _isInbound = isInbound; _quantity = DEFAULT_QUANTITY; _backupQuantity = DEFAULT_BACKUP_QUANTITY; // _rebuildPeriod = DEFAULT_REBUILD_PERIOD; @@ -130,11 +132,9 @@ public class TunnelPoolSettings { /** is this an inbound tunnel? */ public boolean isInbound() { return _isInbound; } - public void setIsInbound(boolean isInbound) { _isInbound = isInbound; } /** is this an exploratory tunnel (or a client tunnel) */ public boolean isExploratory() { return _isExploratory; } - public void setIsExploratory(boolean isExploratory) { _isExploratory = isExploratory; } // Duration is hardcoded //public int getDuration() { return _duration; } @@ -237,7 +237,7 @@ public class TunnelPoolSettings { private static final boolean getBoolean(String str, boolean defaultValue) { if (str == null) return defaultValue; - boolean v = Boolean.valueOf(str).booleanValue() || + boolean v = Boolean.parseBoolean(str) || (str != null && "YES".equals(str.toUpperCase(Locale.US))); return v; } diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java index 15e4dbd71ee67a04eebe83e40c8c62afdb78a0ff..fc046f3e6cce033b44c07b7b92ed20d87fc4998d 100644 --- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java +++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java @@ -308,6 +308,11 @@ class ClientConnectionRunner { if (_log.shouldLog(Log.WARN)) _log.warn("Error writing out the disconnect message: " + ime); } + // give it a little time to get sent out... + // even better would be to have stopRunning() flush it? + try { + Thread.sleep(50); + } catch (InterruptedException ie) {} stopRunning(); } diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index 71f2fc597e324a80aca0249a2f93e750a337d6d8..c1816bfd0287ad95d58f3b64e86a813e1844d764 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -326,7 +326,7 @@ class ClientManager { if (destHash == null) return true; ClientConnectionRunner runner = getRunner(destHash); if (runner == null) return true; - return !Boolean.valueOf(runner.getConfig().getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY)).booleanValue(); + return !Boolean.parseBoolean(runner.getConfig().getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY)); } /** diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index fa762ecabe1e9c221586155a2e595a0ae0e7828c..6e7f4a04f0504ac7aeb4057bb050d05a3608a167 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -169,7 +169,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi } // Auth, since 0.8.2 - if (_enforceAuth && Boolean.valueOf(_context.getProperty("i2cp.auth")).booleanValue()) { + if (_enforceAuth && _context.getBooleanProperty("i2cp.auth")) { String configUser = _context.getProperty("i2cp.username"); String configPW = _context.getProperty("i2cp.password"); if (configUser != null && configPW != null) { diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java index 349dd7a5499a544e6926bc11c923c62a1e1b525c..f7090eb7ef532ef8f65e100db9979d03656d42cb 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java @@ -452,7 +452,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { // Per-message flag == false overrides session option which is default true String allow = _clientMessage.getSenderConfig().getOptions().getProperty(BUNDLE_REPLY_LEASESET); boolean allowLeaseBundle = SendMessageOptions.getSendLeaseSet(sendFlags) && - (allow == null || Boolean.valueOf(allow).booleanValue()); + (allow == null || Boolean.parseBoolean(allow)); if (allowLeaseBundle) { // If we want an ack, bundle a leaseSet... //replyLeaseSet = getReplyLeaseSet(wantACK); 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 9e05ff9ae8282f111b66a00515e1f3b5b5e3f25c..f21beb47caf900c4672a55e5883af14f0c1bcc56 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java @@ -25,7 +25,7 @@ class FloodfillMonitorJob extends JobImpl { private static final int REQUEUE_DELAY = 60*60*1000; private static final long MIN_UPTIME = 2*60*60*1000; private static final long MIN_CHANGE_DELAY = 6*60*60*1000; - private static final int MIN_FF = 300; + private static final int MIN_FF = 360; private static final int MAX_FF = 999999; private static final String PROP_FLOODFILL_PARTICIPANT = "router.floodfillParticipant"; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java index 0011b2098d0d0ad7855c57fb0e017e702681d0c3..80f48623fbce0e02bf6ef4da2ef87d03f9d67271 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java @@ -45,7 +45,7 @@ class HarvesterJob extends JobImpl { public static final String PROP_ENABLED = "netDb.shouldHarvest"; private boolean harvestDirectly() { - return Boolean.valueOf(getContext().getProperty("netDb.harvestDirectly", "false")).booleanValue(); + return getContext().getBooleanProperty("netDb.harvestDirectly"); } public HarvesterJob(RouterContext context, KademliaNetworkDatabaseFacade facade) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index b246c3afbdda31fab10dfa82c252151511febaa0..9a4aa09c67e8c7e5c5b7d8fd103ca1e57125c182 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -220,7 +220,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } String enforce = _context.getProperty(PROP_ENFORCE_NETID); if (enforce != null) - _enforceNetId = Boolean.valueOf(enforce).booleanValue(); + _enforceNetId = Boolean.parseBoolean(enforce); else _enforceNetId = DEFAULT_ENFORCE_NETID; _ds.restart(); @@ -246,7 +246,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { String dbDir = _context.getProperty(PROP_DB_DIR, DEFAULT_DB_DIR); String enforce = _context.getProperty(PROP_ENFORCE_NETID); if (enforce != null) - _enforceNetId = Boolean.valueOf(enforce).booleanValue(); + _enforceNetId = Boolean.parseBoolean(enforce); else _enforceNetId = DEFAULT_ENFORCE_NETID; 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 c21c7cee2edc0caaae64eadc27a9161d7dfef9d8..590880aaeec2ea1824f8d5cc04cb1f1c586d5873 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java @@ -136,7 +136,7 @@ class SearchJob extends JobImpl { // Returning false essentially enables kademlia as a backup to floodfill for search responses. if (FloodfillNetworkDatabaseFacade.floodfillEnabled(ctx)) return false; - return Boolean.valueOf(ctx.getProperty("netDb.floodfillOnly", DEFAULT_FLOODFILL_ONLY + "")).booleanValue(); + return ctx.getProperty("netDb.floodfillOnly", DEFAULT_FLOODFILL_ONLY); } /*** diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index 7fa12be10149bb398233a78d201204f6b7ed1d83..75b5f12982a5e5285c30989707a22a290dfff0ef 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -527,7 +527,7 @@ public class Reseeder { /****** public static void main(String args[]) { - if ( (args != null) && (args.length == 1) && (!Boolean.valueOf(args[0]).booleanValue()) ) { + if ( (args != null) && (args.length == 1) && (!Boolean.parseBoolean(args[0])) ) { System.out.println("Not reseeding, as requested"); return; // not reseeding on request } diff --git a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java index c6bd62c762d3666b545ae80b7f4ebfa020c54dd4..3af4164b5eb8e0f680fca7525dfd7da05e721e4e 100644 --- a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java +++ b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java @@ -54,7 +54,7 @@ public class BootCommSystemJob extends JobImpl { private void startupDb() { Job bootDb = new BootNetworkDbJob(getContext()); - boolean useTrusted = Boolean.valueOf(getContext().getProperty(PROP_USE_TRUSTED_LINKS)).booleanValue(); + boolean useTrusted = getContext().getBooleanProperty(PROP_USE_TRUSTED_LINKS); if (useTrusted) { _log.debug("Using trusted links..."); getContext().jobQueue().addJob(new BuildTrustedLinksJob(getContext(), bootDb)); diff --git a/router/java/src/net/i2p/router/tasks/OOMListener.java b/router/java/src/net/i2p/router/tasks/OOMListener.java index 6fc9b92cded589b68984105ba2ea98932004b1d8..1662b9ffe8076b1c46773889fb7086184a475e06 100644 --- a/router/java/src/net/i2p/router/tasks/OOMListener.java +++ b/router/java/src/net/i2p/router/tasks/OOMListener.java @@ -1,7 +1,10 @@ package net.i2p.router.tasks; +import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.util.EventLog; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -12,30 +15,47 @@ import net.i2p.util.Log; */ public class OOMListener implements I2PThread.OOMEventListener { private final RouterContext _context; + private final AtomicBoolean _wasCalled = new AtomicBoolean(); public OOMListener(RouterContext ctx) { _context = ctx; } public void outOfMemory(OutOfMemoryError oom) { - // boost priority to help us shut down - Thread.currentThread().setPriority(Thread.MAX_PRIORITY - 1); - Router.clearCaches(); - Log log = _context.logManager().getLog(Router.class); - log.log(Log.CRIT, "Thread ran out of memory, shutting down I2P", oom); - // prevent multiple parallel shutdowns (when you OOM, you OOM a lot...) - if (_context.router().isFinalShutdownInProgress()) - return; - for (int i = 0; i < 5; i++) { // try this 5 times, in case it OOMs - try { - log.log(Log.CRIT, "free mem: " + Runtime.getRuntime().freeMemory() + - " total mem: " + Runtime.getRuntime().totalMemory()); - break; // w00t - } catch (OutOfMemoryError oome) { - // gobble - } - } - log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config"); + try { + // prevent multiple parallel shutdowns (when you OOM, you OOM a lot...) + if (_context.router().isFinalShutdownInProgress()) + return; + } catch (OutOfMemoryError oome) {} + try { + // Only do this once + if (_wasCalled.getAndSet(true)) + return; + } catch (OutOfMemoryError oome) {} + + try { + // boost priority to help us shut down + // this may or may not do anything... + Thread.currentThread().setPriority(Thread.MAX_PRIORITY - 1); + } catch (OutOfMemoryError oome) {} + try { + Router.clearCaches(); + } catch (OutOfMemoryError oome) {} + Log log = null; + try { + log = _context.logManager().getLog(Router.class); + log.log(Log.CRIT, "Thread ran out of memory, shutting down I2P", oom); + log.log(Log.CRIT, "free mem: " + Runtime.getRuntime().freeMemory() + + " total mem: " + Runtime.getRuntime().totalMemory()); + if (_context.hasWrapper()) + log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in $I2P/wrapper.config"); + } catch (OutOfMemoryError oome) {} + try { + ThreadDump.dump(_context, 1); + } catch (OutOfMemoryError oome) {} + try { + _context.router().eventLog().addEvent(EventLog.OOM); + } catch (OutOfMemoryError oome) {} _context.router().shutdown(Router.EXIT_OOM); } } diff --git a/router/java/src/net/i2p/router/tasks/Restarter.java b/router/java/src/net/i2p/router/tasks/Restarter.java index 2d497abb4b4a7fbc54735d7197d77fef79141ad2..c904cad507f6e4f9ac6c92fe1ee4af65a155ff27 100644 --- a/router/java/src/net/i2p/router/tasks/Restarter.java +++ b/router/java/src/net/i2p/router/tasks/Restarter.java @@ -3,6 +3,7 @@ package net.i2p.router.tasks; import net.i2p.router.Router; import net.i2p.router.RouterClock; import net.i2p.router.RouterContext; +import net.i2p.router.util.EventLog; import net.i2p.util.Log; /** @@ -16,6 +17,7 @@ public class Restarter implements Runnable { } public void run() { + _context.router().eventLog().addEvent(EventLog.SOFT_RESTART); Log log = _context.logManager().getLog(Router.class); log.error("Stopping the router for a restart..."); log.logAlways(Log.WARN, "Stopping the client manager"); diff --git a/router/java/src/net/i2p/router/tasks/RouterWatchdog.java b/router/java/src/net/i2p/router/tasks/RouterWatchdog.java index 2cf889162496cd86bd673089de909b9ff418a4db..233c3bd7a055f508b46380df862d9f19b2a90846 100644 --- a/router/java/src/net/i2p/router/tasks/RouterWatchdog.java +++ b/router/java/src/net/i2p/router/tasks/RouterWatchdog.java @@ -64,7 +64,7 @@ public class RouterWatchdog implements Runnable { private boolean shutdownOnHang() { // prop default false - if (!Boolean.valueOf(_context.getProperty("watchdog.haltOnHang")).booleanValue()) + if (!_context.getBooleanProperty("watchdog.haltOnHang")) return false; // Client manager starts complaining after 10 minutes, and we run every minute, @@ -113,16 +113,7 @@ public class RouterWatchdog implements Runnable { // This works on linux... // It won't on windows, and we can't call i2prouter.bat either, it does something // completely different... - if (_context.hasWrapper() && !SystemVersion.isWindows()) { - ShellCommand sc = new ShellCommand(); - File i2pr = new File(_context.getBaseDir(), "i2prouter"); - String[] args = new String[2]; - args[0] = i2pr.getAbsolutePath(); - args[1] = "dump"; - boolean success = sc.executeSilentAndWaitTimed(args, 10); - if (success) - _log.log(Log.CRIT, "Threads dumped to wrapper log"); - } + ThreadDump.dump(_context, 10); } } } diff --git a/router/java/src/net/i2p/router/tasks/ThreadDump.java b/router/java/src/net/i2p/router/tasks/ThreadDump.java new file mode 100644 index 0000000000000000000000000000000000000000..c5d0b948165b3354d213cc0095e8c118813354c1 --- /dev/null +++ b/router/java/src/net/i2p/router/tasks/ThreadDump.java @@ -0,0 +1,43 @@ +package net.i2p.router.tasks; + +import java.io.File; + +import net.i2p.I2PAppContext; +import net.i2p.util.ShellCommand; +import net.i2p.util.Log; +import net.i2p.util.SystemVersion; + +/** + * Only works with wrapper on non-windows platforms + * + * @since 0.9.3 moved from RouterWatchdog + */ +abstract class ThreadDump { + + /** + * Signal the wrapper to asynchronously dump threads to wrapper.log. + * It waits for the signal to complete (which should be fast) + * but does not wait for the dump itself. + * + * @param secondsToWait if <= 0, don't wait + * @return success, false if windows or no wrapper, true if secondsToWait <= 0, + false if timed out, dump result otherwise + */ + public static boolean dump(I2PAppContext context, int secondsToWait) { + if (SystemVersion.isWindows() || !context.hasWrapper()) + return false; + ShellCommand sc = new ShellCommand(); + File i2pr = new File(context.getBaseDir(), "i2prouter"); + String[] args = new String[2]; + args[0] = i2pr.getAbsolutePath(); + args[1] = "dump"; + boolean success = sc.executeSilentAndWaitTimed(args, secondsToWait); + if (secondsToWait <= 0) + success = true; + if (success) { + Log log = context.logManager().getLog(ThreadDump.class); + log.log(Log.CRIT, "Threads dumped to wrapper log"); + } + return success; + } +} diff --git a/router/java/src/net/i2p/router/time/RouterTimestamper.java b/router/java/src/net/i2p/router/time/RouterTimestamper.java index 83576fde100678362f0707bafe385a967c3fc41b..d835b66f9c9bb939b114133f64cccf8934634ab2 100644 --- a/router/java/src/net/i2p/router/time/RouterTimestamper.java +++ b/router/java/src/net/i2p/router/time/RouterTimestamper.java @@ -72,7 +72,7 @@ public class RouterTimestamper extends Timestamper { // 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()) { + if (Boolean.parseBoolean(disabled)) { _initialized = true; return; } @@ -321,7 +321,7 @@ public class RouterTimestamper extends Timestamper { _context.getProperty(PROP_QUERY_FREQUENCY, DEFAULT_QUERY_FREQUENCY)); String disabled = _context.getProperty(PROP_DISABLED, DEFAULT_DISABLED); - _disabled = Boolean.valueOf(disabled).booleanValue(); + _disabled = Boolean.parseBoolean(disabled); _concurringServers = Math.min(4, Math.max(1, _context.getProperty(PROP_CONCURRING_SERVERS, DEFAULT_CONCURRING_SERVERS))); diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index e6a24e2eac3bdcf925056edee5699ff6669a786b..29f3a23d4a42dbe026f5e9bc8413552548f8f428 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -331,7 +331,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { if (_log.shouldLog(Log.INFO)) _log.info("old: " + ohost + " config: " + name + " auto: " + enabled + " status: " + status); if (enabled.equals("always") || - (Boolean.valueOf(enabled).booleanValue() && status == STATUS_OK)) { + (Boolean.parseBoolean(enabled) && status == STATUS_OK)) { String nhost = UDPAddr.getOption(UDPAddress.PROP_HOST); if (_log.shouldLog(Log.INFO)) _log.info("old: " + ohost + " config: " + name + " new: " + nhost); @@ -354,7 +354,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { changed = true; } else if (ohost == null || ohost.length() <= 0) { return; - } else if (Boolean.valueOf(enabled).booleanValue() && status != STATUS_OK) { + } else if (Boolean.parseBoolean(enabled) && 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 diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java index d4ce79ce2f4251b3f65e62c9edea75bbac085380..5b6cc813f32eaf6a2fece1af31a2476dc5a798fa 100644 --- a/router/java/src/net/i2p/router/transport/GeoIP.java +++ b/router/java/src/net/i2p/router/transport/GeoIP.java @@ -91,7 +91,7 @@ class GeoIP { */ /****** public void lookup() { - if (! Boolean.valueOf(_context.getProperty(PROP_GEOIP_ENABLED, "true")).booleanValue()) { + if (! _context.getBooleanPropertyDefaultTrue(PROP_GEOIP_ENABLED)) { _pendingSearch.clear(); return; } @@ -105,7 +105,7 @@ class GeoIP { * 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()) { + if (! _context.getBooleanPropertyDefaultTrue(PROP_GEOIP_ENABLED)) { _pendingSearch.clear(); return; } diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index 79e03112090f555b6c76a1bcf4906be18049bc64..fe44032c0f29e3b7e0253a5ea047e0eb54b81df8 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -362,7 +362,7 @@ public class TransportManager implements TransportEventListener { } // 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()) { + _context.getBooleanProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_PORT)) { Transport udp = getTransport(UDPTransport.STYLE); if (udp != null) port = t.getRequestedPort(); @@ -545,7 +545,7 @@ public class TransportManager implements TransportEventListener { " ").append(_("The number of pending sends which exceed congestion window")).append("<br>\n" + "<b id=\"def.ssthresh\">SST</b>: ").append(_("The slow start threshold")).append("<br>\n" + "<b id=\"def.rtt\">RTT</b>: ").append(_("The round trip time in milliseconds")).append("<br>\n" + - "<b id=\"def.dev\">").append(_("Dev")).append("</b>: ").append(_("The standard deviation of the round trip time in milliseconds")).append("<br>\n" + + //"<b id=\"def.dev\">").append(_("Dev")).append("</b>: ").append(_("The standard deviation of the round trip time in milliseconds")).append("<br>\n" + "<b id=\"def.rto\">RTO</b>: ").append(_("The retransmit timeout in milliseconds")).append("<br>\n" + "<b id=\"def.mtu\">MTU</b>: ").append(_("Current maximum send packet size / estimated maximum receive packet size (bytes)")).append("<br>\n" + "<b id=\"def.send\">").append(_("TX")).append("</b>: ").append(_("The total number of packets sent to the peer")).append("<br>\n" + diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java index 1401b3baab142a89f9571402538fa21519650cd1..abcd8214e7946e0cdf359f29ac7b0a15474f4e8e 100644 --- a/router/java/src/net/i2p/router/transport/UPnP.java +++ b/router/java/src/net/i2p/router/transport/UPnP.java @@ -78,7 +78,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { private volatile boolean thinksWeAreDoubleNatted = false; /** List of ports we want to forward */ - private Set<ForwardPort> portsToForward; + private final Set<ForwardPort> portsToForward; /** List of ports we have actually forwarded */ private final Set<ForwardPort> portsForwarded; /** Callback to call when a forward fails or succeeds */ @@ -88,13 +88,14 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { super(); _context = context; _log = _context.logManager().getLog(UPnP.class); + portsToForward = new HashSet<ForwardPort>(); portsForwarded = new HashSet<ForwardPort>(); addDeviceChangeListener(this); } - public boolean runPlugin() { + public synchronized boolean runPlugin() { synchronized(lock) { - portsToForward = null; + portsToForward.clear(); } return super.start(); } @@ -102,9 +103,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { /** * WARNING - Blocking up to 2 seconds */ - public void terminate() { + public synchronized void terminate() { synchronized(lock) { - portsToForward = null; + portsToForward.clear(); } // this gets spun off in a thread... unregisterPortMappings(); @@ -221,9 +222,10 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { private void registerPortMappings() { Set ports; synchronized(lock) { - ports = portsToForward; + ports = new HashSet(portsForwarded); } - if(ports == null) return; + if (ports.isEmpty()) + return; registerPorts(ports); } @@ -281,6 +283,8 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { synchronized(lock) { ports = new HashSet(portsForwarded); } + if (ports.isEmpty()) + return; this.unregisterPorts(ports); } @@ -528,17 +532,15 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { if(upstreamMaxBitRate > 0) sb.append("<br>").append(_("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate))); synchronized(lock) { - if(portsToForward != null) { - for(ForwardPort port : portsToForward) { - sb.append("<br>"); - if(portsForwarded.contains(port)) - // {0} is TCP or UDP - // {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. - // If you want the digit separator in your locale, translate as {1}. - sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); - else - sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); - } + for(ForwardPort port : portsToForward) { + sb.append("<br>"); + if(portsForwarded.contains(port)) + // {0} is TCP or UDP + // {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. + // If you want the digit separator in your locale, translate as {1}. + sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); + else + sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); } } @@ -726,13 +728,13 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { _log.error("ForwardPortCallback changed from "+forwardCallback+" to "+cb+" - using new value, but this is very strange!"); } forwardCallback = cb; - if(portsToForward == null || portsToForward.isEmpty()) { - portsToForward = ports; + if (portsToForward.isEmpty()) { + portsToForward.addAll(ports); portsToForwardNow = ports; portsToDumpNow = null; } else if(ports.isEmpty()) { portsToDumpNow = portsToForward; - portsToForward = ports; + portsToForward.clear(); portsToForwardNow = null; } else { // Some ports to keep, some ports to dump @@ -760,7 +762,8 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { portsToDumpNow.add(port); } } - portsToForward = ports; + portsToForward.clear(); + portsToForward.addAll(ports); } if(_router == null) { if (_log.shouldLog(Log.WARN)) @@ -768,9 +771,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { return; // When one is found, we will do the forwards } } - if(portsToDumpNow != null) + if(portsToDumpNow != null && !portsToDumpNow.isEmpty()) unregisterPorts(portsToDumpNow); - if(portsToForwardNow != null) + if(portsToForwardNow != null && !portsToForwardNow.isEmpty()) registerPorts(portsToForwardNow); } diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index a76022f2a56e10c59e673759a0a2fc05f01d14b3..aecd726bd3e80b10624ebdbbc75efc2f2017f260 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -6,10 +6,12 @@ package net.i2p.router.transport; import java.net.InetAddress; import java.util.HashSet; +import java.util.Iterator; import java.util.Map; import java.util.Set; import net.i2p.router.RouterContext; +import net.i2p.util.Addresses; import net.i2p.util.Log; import net.i2p.util.Translate; @@ -59,15 +61,42 @@ class UPnPManager { _upnpCallback = new UPnPCallback(); } + /** + * Blocking, may take a while + */ public synchronized void start() { if (_log.shouldLog(Log.DEBUG)) _log.debug("UPnP Start"); - if (!_isRunning) - _isRunning = _upnp.runPlugin(); - if (!_isRunning) - _log.error("UPnP start failed - port conflict?"); + if (!_isRunning) { + long b = _context.clock().now(); + try { + _isRunning = _upnp.runPlugin(); + if (_log.shouldLog(Log.INFO)) + _log.info("UPnP runPlugin took " + (_context.clock().now() - b)); + } catch (Exception e) { + // NPE in UPnP (ticket #728), can't let it bring us down + _log.error("UPnP error, please report", e); + } + } + if (!_isRunning) { + // Do we have a non-loopback, non-broadcast address? + // If not, that's why it failed (HTTPServer won't start) + Set<String> addrs = Addresses.getAddresses(true, false); + addrs.remove("0.0.0.0"); + for (Iterator<String> iter = addrs.iterator(); iter.hasNext(); ) { + if (iter.next().startsWith("127.")) + iter.remove(); + } + if (addrs.isEmpty()) + _log.logAlways(Log.WARN, "UPnP start failed - no network connection?"); + else + _log.error("UPnP start failed - port conflict?"); + } } + /** + * Blocking, may take a while + */ public synchronized void stop() { if (_log.shouldLog(Log.DEBUG)) _log.debug("UPnP Stop"); @@ -86,8 +115,17 @@ class UPnPManager { public void update(Map<String, Integer> ports) { if (_log.shouldLog(Log.DEBUG)) _log.debug("UPnP Update with " + ports.size() + " ports"); - if (!_isRunning) - return; + + //synchronized(this) { + // TODO + // called too often and may block for too long + // may not have started if net was disconnected previously + //if (!_isRunning && !ports.isEmpty()) + // start(); + if (!_isRunning) + return; + //} + Set<ForwardPort> forwards = new HashSet(ports.size()); for (Map.Entry<String, Integer> entry : ports.entrySet()) { String style = entry.getKey(); 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 bee5a6b764fc5f3e6c7f7c9f41c67130e6fdab36..bbf9e4f1f1b0fe92661c9286940a0ab0220545e1 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java @@ -21,6 +21,7 @@ import java.util.concurrent.LinkedBlockingQueue; import net.i2p.I2PAppContext; import net.i2p.data.RouterIdentity; +import net.i2p.router.CommSystemFacade; import net.i2p.router.RouterContext; import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.util.ConcurrentHashSet; @@ -499,7 +500,8 @@ class EventPumper implements Runnable { return; } // BUGFIX for firewalls. --Sponge - chan.socket().setKeepAlive(true); + if (_context.commSystem().getReachabilityStatus() != CommSystemFacade.STATUS_OK) + chan.socket().setKeepAlive(true); SelectionKey ckey = chan.register(_selector, SelectionKey.OP_READ); new NTCPConnection(_context, _transport, chan, ckey); @@ -519,7 +521,8 @@ class EventPumper implements Runnable { _log.debug("processing connect for " + con + ": connected? " + connected); if (connected) { // BUGFIX for firewalls. --Sponge - chan.socket().setKeepAlive(true); + if (_context.commSystem().getReachabilityStatus() != CommSystemFacade.STATUS_OK) + chan.socket().setKeepAlive(true); con.setKey(key); con.outboundConnected(); _context.statManager().addRateData("ntcp.connectSuccessful", 1); 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 c302f7bafe4d558d578054d47ff0f2b643207a7a..f388e1ce70ed1d29b061a5dbe45d264c97b0c52b 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -990,9 +990,10 @@ class NTCPConnection { if (clearMessage) { // see synchronization comments in prepareNextWriteFast() synchronized (_outbound) { - if (_currentOutbound != null) + if (_currentOutbound != null) { msg = _currentOutbound; - _currentOutbound = null; + _currentOutbound = null; + } } if (msg != null) { _lastSendTime = System.currentTimeMillis(); @@ -1065,11 +1066,11 @@ class NTCPConnection { //_sendBps15s = (0.955f)*_sendBps15s + (0.045f)*((float)sent*1000f)/(float)time; //_recvBps15s = (0.955f)*_recvBps15s + (0.045f)*((float)recv*1000)/(float)time; - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Rates updated to " - + _sendBps + '/' + _recvBps + "Bps in/out " - //+ _sendBps15s + "/" + _recvBps15s + "Bps in/out 15s after " - + sent + '/' + recv + " in " + DataHelper.formatDuration(time)); + //if (_log.shouldLog(Log.DEBUG)) + // _log.debug("Rates updated to " + // + _sendBps + '/' + _recvBps + "Bps in/out " + // //+ _sendBps15s + "/" + _recvBps15s + "Bps in/out 15s after " + // + sent + '/' + recv + " in " + DataHelper.formatDuration(time)); } } 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 fde13148cf853e10b8c810f47dd5c92796cf96b2..c063326d43545434dc8de5c79216ddc12c09754e 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -17,6 +17,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.DataHelper; import net.i2p.data.Hash; @@ -68,6 +69,13 @@ public class NTCPTransport extends TransportImpl { private long _lastBadSkew; private static final long[] RATES = { 10*60*1000 }; + /** + * To prevent trouble. To be raised to 1024 in 0.9.4. + * + * @since 0.9.3 + */ + private static final int MIN_PEER_PORT = 500; + // Opera doesn't have the char, TODO check UA //private static final String THINSP = " / "; private static final String THINSP = " / "; @@ -140,7 +148,7 @@ public class NTCPTransport extends TransportImpl { _context.statManager().createRateStat("ntcp.writeError", "", "ntcp", RATES); _establishing = new ConcurrentHashSet(16); _conLock = new Object(); - _conByIdent = new HashMap(64); + _conByIdent = new ConcurrentHashMap(64); _finisher = new NTCPSendFinisher(ctx, this); @@ -160,7 +168,7 @@ public class NTCPTransport extends TransportImpl { _context.statManager().addRateData("ntcp.inboundEstablished", 1); markReachable(con.getRemotePeer().calculateHash(), true); //_context.shitlist().unshitlistRouter(con.getRemotePeer().calculateHash()); - NTCPConnection old = null; + NTCPConnection old; synchronized (_conLock) { old = _conByIdent.put(con.getRemotePeer().calculateHash(), con); } @@ -263,6 +271,7 @@ public class NTCPTransport extends TransportImpl { 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; @@ -299,7 +308,7 @@ public class NTCPTransport extends TransportImpl { return null; } byte[] ip = addr.getIP(); - if ( (addr.getPort() <= 0) || (ip == null) ) { + if ( (addr.getPort() < MIN_PEER_PORT) || (ip == null) ) { _context.statManager().addRateData("ntcp.connectFailedInvalidPort", 1); markUnreachable(peer); //_context.shitlist().shitlistRouter(toAddress.getIdentity().calculateHash(), "Invalid NTCP address", STYLE); @@ -354,26 +363,23 @@ public class NTCPTransport extends TransportImpl { @Override public boolean isEstablished(Hash dest) { - synchronized (_conLock) { NTCPConnection con = _conByIdent.get(dest); return (con != null) && con.isEstablished() && !con.isClosed(); - } } @Override public boolean isBacklogged(Hash dest) { - synchronized (_conLock) { NTCPConnection con = _conByIdent.get(dest); return (con != null) && con.isEstablished() && con.tooBacklogged(); - } } void removeCon(NTCPConnection con) { NTCPConnection removed = null; - synchronized (_conLock) { - RouterIdentity ident = con.getRemotePeer(); - if (ident != null) + RouterIdentity ident = con.getRemotePeer(); + if (ident != null) { + synchronized (_conLock) { removed = _conByIdent.remove(ident.calculateHash()); + } } if ( (removed != null) && (removed != con) ) {// multiple cons, close 'em both if (_log.shouldLog(Log.WARN)) @@ -388,19 +394,17 @@ public class NTCPTransport extends TransportImpl { * */ @Override - public int countActivePeers() { synchronized (_conLock) { return _conByIdent.size(); } } + public int countActivePeers() { return _conByIdent.size(); } + /** * How many peers are we actively sending messages to (this minute) */ @Override public int countActiveSendPeers() { int active = 0; - synchronized (_conLock) { - for (Iterator iter = _conByIdent.values().iterator(); iter.hasNext(); ) { - NTCPConnection con = (NTCPConnection)iter.next(); + for (NTCPConnection con : _conByIdent.values()) { if ( (con.getTimeSinceSend() <= 60*1000) || (con.getTimeSinceReceive() <= 60*1000) ) active++; - } } return active; } @@ -416,16 +420,9 @@ public class NTCPTransport extends TransportImpl { */ @Override public Vector<Long> getClockSkews() { - - Vector<NTCPConnection> peers = new Vector(); Vector<Long> skews = new Vector(); - synchronized (_conLock) { - peers.addAll(_conByIdent.values()); - } - - for (Iterator<NTCPConnection> iter = peers.iterator(); iter.hasNext(); ) { - NTCPConnection con = iter.next(); + for (NTCPConnection con : _conByIdent.values()) { if (con.isEstablished()) skews.addElement(Long.valueOf(con.getClockSkew())); } @@ -551,11 +548,14 @@ public class NTCPTransport extends TransportImpl { ServerSocketChannel chan = ServerSocketChannel.open(); chan.configureBlocking(false); + int port = _myAddress.getPort(); + if (port > 0 && port < 1024) + _log.logAlways(Log.WARN, "Specified NTCP port is " + port + ", ports lower than 1024 not recommended"); InetSocketAddress addr = null; if(bindToAddr==null) { - addr = new InetSocketAddress(_myAddress.getPort()); + addr = new InetSocketAddress(port); } else { - addr = new InetSocketAddress(bindToAddr, _myAddress.getPort()); + addr = new InetSocketAddress(bindToAddr, port); if (_log.shouldLog(Log.WARN)) _log.warn("Binding only to " + bindToAddr); } @@ -603,6 +603,7 @@ public class NTCPTransport extends TransportImpl { void establishing(NTCPConnection con) { _establishing.add(con); } + /** * called in the EventPumper no more than once a second or so, closing * any unconnected/unestablished connections @@ -694,12 +695,10 @@ public class NTCPTransport extends TransportImpl { @Override 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; } @@ -727,17 +726,17 @@ public class NTCPTransport extends TransportImpl { // will this work? 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) { - peers.addAll(_conByIdent.values()); - } - long offsetTotal = 0; + peers.addAll(_conByIdent.values()); + long offsetTotal = 0; float bpsSend = 0; float bpsRecv = 0; long totalUptime = 0; @@ -838,6 +837,7 @@ public class NTCPTransport extends TransportImpl { } private static final NumberFormat _rateFmt = new DecimalFormat("#,##0.00"); + private static String formatRate(float rate) { synchronized (_rateFmt) { return _rateFmt.format(rate); } } @@ -858,14 +858,12 @@ public class NTCPTransport extends TransportImpl { public static final AlphaComparator instance() { return _instance; } } - private static class PeerComparator implements Comparator { - public int compare(Object lhs, Object rhs) { - if ( (lhs == null) || (rhs == null) || !(lhs instanceof NTCPConnection) || !(rhs instanceof NTCPConnection)) - throw new IllegalArgumentException("rhs = " + rhs + " lhs = " + lhs); - return compare((NTCPConnection)lhs, (NTCPConnection)rhs); - } - protected int compare(NTCPConnection l, NTCPConnection r) { + private static class PeerComparator implements Comparator<NTCPConnection> { + public int compare(NTCPConnection l, NTCPConnection r) { + if (l == null || r == null) + throw new IllegalArgumentException(); // base64 retains binary ordering + // UM, no it doesn't, but close enough return l.getRemotePeer().calculateHash().toBase64().compareTo(r.getRemotePeer().calculateHash().toBase64()); } } 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 cba28fbcf454b88a1266805d9d9e1894c5172135..af5bcb0b987ac2afd6ed059d521e76734ba0a204 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/Writer.java +++ b/router/java/src/net/i2p/router/transport/ntcp/Writer.java @@ -80,9 +80,12 @@ class Writer { } private class Runner implements Runnable { - private boolean _stop; - public Runner() { _stop = false; } + private volatile boolean _stop; + + public Runner() {} + public void stop() { _stop = true; } + public void run() { if (_log.shouldLog(Log.INFO)) _log.info("Starting writer"); NTCPConnection con = null; 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 312f8d348e764aa9f555b837054610559760ff3b..f1aedda5ae49a90369dc5e605b683e1c4a75eeb3 100644 --- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java +++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java @@ -28,7 +28,7 @@ class ACKSender implements Runnable { private static final long POISON_PS = -9999999999l; /** how frequently do we want to send ACKs to a peer? */ - static final int ACK_FREQUENCY = 500; + static final int ACK_FREQUENCY = 350; public ACKSender(RouterContext ctx, UDPTransport transport) { _context = ctx; @@ -73,12 +73,12 @@ class ACKSender implements Runnable { _peersToACK.clear(); } - private long ackFrequency(long timeSinceACK, long rtt) { + private static long ackFrequency(long timeSinceACK, long rtt) { // if we are actively pumping lots of data to them, we can depend upon // the unsentACKThreshold to figure out when to send an ACK instead of // using the timer, so we can set the timeout/frequency higher if (timeSinceACK < 2*1000) - return Math.max(rtt/2, 500); + return Math.max(rtt/2, ACK_FREQUENCY); else return ACK_FREQUENCY; } @@ -162,15 +162,15 @@ class ACKSender implements Runnable { } if (!ackBitfields.isEmpty()) { - _context.statManager().addRateData("udp.sendACKCount", ackBitfields.size(), 0); + _context.statManager().addRateData("udp.sendACKCount", ackBitfields.size()); if (remaining > 0) - _context.statManager().addRateData("udp.sendACKRemaining", remaining, 0); + _context.statManager().addRateData("udp.sendACKRemaining", remaining); // set above before the break //now = _context.clock().now(); if (lastSend < 0) lastSend = now - 1; _context.statManager().addRateData("udp.ackFrequency", now-lastSend, now-wanted); - //_context.statManager().getStatLog().addData(peer.getRemoteHostId().toString(), "udp.peer.sendACKCount", ackBitfields.size(), 0); + //_context.statManager().getStatLog().addData(peer.getRemoteHostId().toString(), "udp.peer.sendACKCount", ackBitfields.size()); UDPPacket ack = _builder.buildACK(peer, ackBitfields); ack.markType(1); ack.setFragmentCount(-1); @@ -193,7 +193,7 @@ class ACKSender implements Runnable { ackPeer(peer); } } else { - _context.statManager().addRateData("udp.abortACK", 1, 0); + _context.statManager().addRateData("udp.abortACK", 1); } } } 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 1e597ab078575e192581b8c392d1938432b13536..88e89131fac6bc9b0e2b9a0d004a1e8cf503f308 100644 --- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java +++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.Base64; +import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.RouterAddress; import net.i2p.data.RouterIdentity; @@ -21,7 +22,6 @@ import net.i2p.data.i2np.I2NPMessage; 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.router.transport.crypto.DHSessionKeyBuilder; import static net.i2p.router.transport.udp.InboundEstablishState.InboundState.*; import static net.i2p.router.transport.udp.OutboundEstablishState.OutboundState.*; @@ -86,7 +86,9 @@ class EstablishmentManager { private int _activity; /** max outbound in progress - max inbound is half of this */ - private static final int DEFAULT_MAX_CONCURRENT_ESTABLISH = 30; + private final int DEFAULT_MAX_CONCURRENT_ESTABLISH; + private static final int DEFAULT_LOW_MAX_CONCURRENT_ESTABLISH = 20; + private static final int DEFAULT_HIGH_MAX_CONCURRENT_ESTABLISH = 150; private static final String PROP_MAX_CONCURRENT_ESTABLISH = "i2np.udp.maxConcurrentEstablish"; /** max pending outbound connections (waiting because we are at MAX_CONCURRENT_ESTABLISH) */ @@ -132,6 +134,9 @@ class EstablishmentManager { _outboundByClaimedAddress = new ConcurrentHashMap(); _outboundByHash = new ConcurrentHashMap(); _activityLock = new Object(); + DEFAULT_MAX_CONCURRENT_ESTABLISH = Math.max(DEFAULT_LOW_MAX_CONCURRENT_ESTABLISH, + Math.min(DEFAULT_HIGH_MAX_CONCURRENT_ESTABLISH, + ctx.bandwidthLimiter().getOutboundKBytesPerSecond() / 2)); _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); @@ -142,6 +147,7 @@ class EstablishmentManager { _context.statManager().createRateStat("udp.establishDropped", "Dropped an inbound establish message", "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); + _context.statManager().createRateStat("udp.establishBadIP", "Received IP or port was bad", "udp", UDPTransport.RATES); // following are for PeerState _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); @@ -247,6 +253,7 @@ class EstablishmentManager { _transport.failed(msg, "Remote peer's IP isn't valid"); _transport.markUnreachable(toHash); //_context.shitlist().shitlistRouter(msg.getTarget().getIdentity().calculateHash(), "Invalid SSU address", UDPTransport.STYLE); + _context.statManager().addRateData("udp.establishBadIP", 1); return; } @@ -413,9 +420,9 @@ class EstablishmentManager { * */ void receiveSessionRequest(RemoteHostId from, UDPPacketReader reader) { - if (!_transport.isValid(from.getIP())) { + if (from.getPort() < UDPTransport.MIN_PEER_PORT || !_transport.isValid(from.getIP())) { if (_log.shouldLog(Log.WARN)) - _log.warn("Receive session request from invalid IP: " + from); + _log.warn("Receive session request from invalid: " + from); return; } @@ -435,6 +442,7 @@ class EstablishmentManager { if (_context.blocklist().isBlocklisted(from.getIP())) { if (_log.shouldLog(Log.WARN)) _log.warn("Receive session request from blocklisted IP: " + from); + _context.statManager().addRateData("udp.establishBadIP", 1); return; // drop the packet } if (!_transport.allowConnection()) @@ -450,14 +458,9 @@ class EstablishmentManager { } if (isNew) { - // we don't expect inbound connections when hidden, but it could happen - // 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. // Don't offer to relay to privileged ports. - if ((!_context.router().isHidden()) && (!_transport.introducersRequired()) && _transport.haveCapacity() && - state.getSentPort() >= 1024 && - !((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) { + // TODO if already we have their RI, only offer if they need it (no 'C' cap) + if (_transport.canIntroduce() && state.getSentPort() >= 1024) { // ensure > 0 long tag = 1 + _context.random().nextLong(MAX_TAG_VALUE); state.setSentRelayTag(tag); @@ -573,7 +576,14 @@ class EstablishmentManager { } } + if (_outboundStates.size() < getMaxConcurrentEstablish() && !_queuedOutbound.isEmpty()) { + // in theory shouldn't need locking, but + // getting IllegalStateExceptions on old Java 5, + // which hoses this state. + synchronized(_queuedOutbound) { locked_admitQueued(); + } + } //remaining = _queuedOutbound.size(); //if (admitted > 0) @@ -600,6 +610,7 @@ class EstablishmentManager { // ok, active shrunk, lets let some queued in. Map.Entry<RemoteHostId, List<OutNetMessage>> entry = iter.next(); + // java 5 IllegalStateException here iter.remove(); RemoteHostId to = entry.getKey(); List<OutNetMessage> allQueued = entry.getValue(); @@ -709,7 +720,7 @@ class EstablishmentManager { private void sendInboundComplete(PeerState peer) { // SimpleTimer.getInstance().addEvent(new PublishToNewInbound(peer), 10*1000); if (_log.shouldLog(Log.INFO)) - _log.info("Completing to the peer after confirm: " + peer); + _log.info("Completing to the peer after IB confirm: " + peer); DeliveryStatusMessage dsm = new DeliveryStatusMessage(_context); dsm.setArrival(Router.NETWORK_ID); // overloaded, sure, but future versions can check this // This causes huge values in the inNetPool.droppedDeliveryStatusDelay stat @@ -803,29 +814,10 @@ class EstablishmentManager { /** the relay tag is a 4-byte field in the protocol */ public static final long MAX_TAG_VALUE = 0xFFFFFFFFl; + /** + * This may be called more than once + */ private void sendCreated(InboundEstablishState state) { - long now = _context.clock().now(); - // This is usually handled in receiveSessionRequest() above, except, I guess, - // if the session isn't new and we are going through again. - // Don't offer if we are approaching max connections (see comments above) - // Also don't offer if we are floodfill, as this extends the max idle time - // and we will have lots of incoming conns - if ((!_context.router().isHidden()) && (!_transport.introducersRequired()) && _transport.haveCapacity() && - !((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) { - // offer to relay - // (perhaps we should check our bw usage and/or how many peers we are - // already offering introducing?) - if (state.getSentRelayTag() == 0) { - // ensure > 0 - state.setSentRelayTag(1 + _context.random().nextLong(MAX_TAG_VALUE)); - } else { - // don't change it, since we've already prepared our sig - } - } else { - // don't offer to relay - state.setSentRelayTag(0); - } - if (_log.shouldLog(Log.DEBUG)) _log.debug("Send created to: " + state); @@ -901,15 +893,14 @@ class EstablishmentManager { byte ip[] = new byte[sz]; reader.getRelayResponseReader().readCharlieIP(ip, 0); int port = reader.getRelayResponseReader().readCharliePort(); + if ((!isValid(ip, port)) || (!isValid(bob.getIP(), bob.getPort()))) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Bad relay resp from " + bob + " for " + Addresses.toString(ip, port)); + _context.statManager().addRateData("udp.relayBadIP", 1); + return; + } InetAddress addr = null; try { - if (!_transport.isValid(ip)) - throw new UnknownHostException("non-public IP"); - // let's not relay to a privileged port, sounds like trouble - if (port < 1024 || port > 65535) - throw new UnknownHostException("bad port " + port); - if (Arrays.equals(ip, _transport.getExternalIP())) - throw new UnknownHostException("relay myself"); addr = InetAddress.getByAddress(ip); } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.WARN)) @@ -943,7 +934,20 @@ class EstablishmentManager { } notifyActivity(); } - + + /** + * Are IP and port valid? + * Refuse anybody in the same /16 + * @since 0.9.3 + */ + private boolean isValid(byte[] ip, int port) { + return port >= 1024 && + port <= 65535 && + _transport.isValid(ip) && + (!DataHelper.eq(ip, 0, _transport.getExternalIP(), 0, 2)) && + (!_context.blocklist().isBlocklisted(ip)); + } + /** * Note that while a SessionConfirmed could in theory be fragmented, * in practice a RouterIdentity is 387 bytes and a single fragment is 512 bytes max, diff --git a/router/java/src/net/i2p/router/transport/udp/IPThrottler.java b/router/java/src/net/i2p/router/transport/udp/IPThrottler.java new file mode 100644 index 0000000000000000000000000000000000000000..5f94620621e225cbd58e58f96f9af5e5544fdbf0 --- /dev/null +++ b/router/java/src/net/i2p/router/transport/udp/IPThrottler.java @@ -0,0 +1,44 @@ +package net.i2p.router.transport.udp; + +import net.i2p.util.ObjectCounter; +import net.i2p.util.SimpleScheduler; +import net.i2p.util.SimpleTimer; + +/** + * Count IPs + * + * @since 0.9.3 + */ +class IPThrottler { + private ObjectCounter<Integer> _counter; + private final int _max; + + public IPThrottler(int max, long time) { + _max = max; + _counter = new ObjectCounter(); + SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), time); + } + + /** + * Increments before checking + * @return true if ip.length != 4 + */ + public boolean shouldThrottle(byte[] ip) { + if (ip.length != 4) + return true; + return _counter.increment(toInt(ip)) > _max; + } + + private static Integer toInt(byte ip[]) { + int rv = 0; + for (int i = 0; i < 4; i++) + rv |= (ip[i] & 0xff) << ((3-i)*8); + return Integer.valueOf(rv); + } + + private class Cleaner implements SimpleTimer.TimedEvent { + public void timeReached() { + _counter.clear(); + } + } +} 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 5a36fd83898260cb9230149faba2c3e5396a0958..b49cb0d2612799d6a42d95bcd149c3c42161de55 100644 --- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java +++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java @@ -3,7 +3,6 @@ package net.i2p.router.transport.udp; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -12,6 +11,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.Base64; +import net.i2p.data.DataHelper; import net.i2p.data.RouterAddress; import net.i2p.data.RouterInfo; import net.i2p.data.SessionKey; @@ -43,10 +43,10 @@ class IntroductionManager { private static final int MAX_INBOUND = 20; /** - * TODO this should be enforced in EstablishmentManager, it isn't now. + * This is enforced in EstablishmentManager * @since 0.8.11 */ - private static final int MAX_OUTBOUND = 100; + public static final int MAX_OUTBOUND = 100; /** Max one per target in this time */ private static final long PUNCH_CLEAN_TIME = 5*1000; @@ -64,6 +64,7 @@ class IntroductionManager { 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); + ctx.statManager().createRateStat("udp.relayBadIP", "Received IP or port was bad", "udp", UDPTransport.RATES); } public void reset() { @@ -160,7 +161,7 @@ class IntroductionManager { } byte[] ip = cur.getRemoteIP(); int port = cur.getRemotePort(); - if (ip == null || !TransportImpl.isPubliclyRoutable(ip) || port < 1024 || port > 65535) + if (!isValid(ip, port)) continue; if (_log.shouldLog(Log.INFO)) _log.info("Picking introducer: " + cur); @@ -185,14 +186,15 @@ class IntroductionManager { */ public void pingIntroducers() { // Try to keep the connection up for two hours after we made anybody an introducer - long pingCutoff = _context.clock().now() - (105 * 60 * 1000); - long inactivityCutoff = _context.clock().now() - UDPTransport.MIN_EXPIRE_TIMEOUT; + long now = _context.clock().now(); + long pingCutoff = now - (105 * 60 * 1000); + long inactivityCutoff = now - UDPTransport.MIN_EXPIRE_TIMEOUT; for (PeerState cur : _inbound) { if (cur.getIntroducerTime() > pingCutoff && cur.getLastSendTime() < inactivityCutoff) { if (_log.shouldLog(Log.INFO)) _log.info("Pinging introducer: " + cur); - cur.setLastSendTime(_context.clock().now()); + cur.setLastSendTime(now); _transport.send(_builder.buildPing(cur)); } } @@ -207,6 +209,14 @@ class IntroductionManager { int introducerCount() { return _inbound.size(); } + + /** + * @return number of peers we have volunteered to introduce + * @since 0.9.3 + */ + int introducedCount() { + return _outbound.size(); + } /** * We are Charlie and we got this from Bob. @@ -218,7 +228,7 @@ class IntroductionManager { void receiveRelayIntro(RemoteHostId bob, UDPPacketReader reader) { if (_context.router().isHidden()) return; - _context.statManager().addRateData("udp.receiveRelayIntro", 1, 0); + _context.statManager().addRateData("udp.receiveRelayIntro", 1); if (!_transport.allowConnection()) { if (_log.shouldLog(Log.WARN)) @@ -230,23 +240,25 @@ class IntroductionManager { byte ip[] = new byte[ipSize]; reader.getRelayIntroReader().readIP(ip, 0); int port = reader.getRelayIntroReader().readPort(); + + if ((!isValid(ip, port)) || (!isValid(bob.getIP(), bob.getPort()))) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Bad relay intro from " + bob + " for " + Addresses.toString(ip, port)); + _context.statManager().addRateData("udp.relayBadIP", 1); + return; + } + if (_log.shouldLog(Log.INFO)) _log.info("Receive relay intro from " + bob + " for " + Addresses.toString(ip, port)); InetAddress to = null; try { - if (!_transport.isValid(ip)) - throw new UnknownHostException("non-public IP"); - // let's not punch to a privileged port, sounds like trouble - if (port < 1024 || port > 65535) - throw new UnknownHostException("bad port " + port); - if (Arrays.equals(ip, _transport.getExternalIP())) - throw new UnknownHostException("punch myself"); to = InetAddress.getByAddress(ip); } catch (UnknownHostException uhe) { // shitlist Bob? if (_log.shouldLog(Log.WARN)) _log.warn("IP for alice to hole punch to is invalid", uhe); + _context.statManager().addRateData("udp.relayBadIP", 1); return; } @@ -312,7 +324,23 @@ class IntroductionManager { void receiveRelayRequest(RemoteHostId alice, UDPPacketReader reader) { if (_context.router().isHidden()) return; - long tag = reader.getRelayRequestReader().readTag(); + UDPPacketReader.RelayRequestReader rrReader = reader.getRelayRequestReader(); + long tag = rrReader.readTag(); + int ipSize = rrReader.readIPSize(); + int port = rrReader.readPort(); + + // ip/port inside message should be 0:0, as it's unimplemented on send - + // see PacketBuilder.buildRelayRequest() + if (!isValid(alice.getIP(), alice.getPort()) || ipSize != 0 || port != 0) { + if (_log.shouldLog(Log.WARN)) { + byte ip[] = new byte[ipSize]; + rrReader.readIP(ip, 0); + _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(ip, port)); + } + _context.statManager().addRateData("udp.relayBadIP", 1); + return; + } + PeerState charlie = get(tag); if (charlie == null) { if (_log.shouldLog(Log.INFO)) @@ -337,4 +365,17 @@ class IntroductionManager { // send alice back charlie's info _transport.send(_builder.buildRelayResponse(alice, charlie, reader.getRelayRequestReader().readNonce(), aliceIntroKey)); } + + /** + * Are IP and port valid? + * Refuse anybody in the same /16 + * @since 0.9.3 + */ + private boolean isValid(byte[] ip, int port) { + return port >= 1024 && + port <= 65535 && + _transport.isValid(ip) && + (!DataHelper.eq(ip, 0, _transport.getExternalIP(), 0, 2)) && + (!_context.blocklist().isBlocklisted(ip)); + } } 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 382cab6cbd291ef21ce01bcec1a3a8c606da293c..cb32ac013e3c0264893360c021e6f8c529eddc0e 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java @@ -61,10 +61,10 @@ class MessageReceiver { //_cache = ByteCache.getInstance(64, I2NPMessage.MAX_SIZE); _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.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 oldest ready message has been sitting on the queue (period is the queue size)?", "udp", UDPTransport.RATES); + //_context.statManager().createRateStat("udp.inboundLag", "How long the oldest 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 47922180d7ac73b732a717de5a27053276fde48f..797060c5838bfab1fb5a5d5db1103de39934356e 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java @@ -369,7 +369,7 @@ class OutboundEstablishState { off += 4; DataHelper.toLong(signed, off, 4, _receivedSignedOnTime); boolean valid = _context.dsa().verifySignature(_receivedSignature, signed, _remotePeer.getSigningPublicKey()); - if (!valid || _log.shouldLog(Log.DEBUG)) { + if (_log.shouldLog(Log.DEBUG) || (_log.shouldLog(Log.WARN) && !valid)) { StringBuilder buf = new StringBuilder(128); buf.append("Signed sessionCreated:"); buf.append(" Alice: ").append(Addresses.toString(_aliceIP, _alicePort)); 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 49a44873e44c1fcabf680ec0a17e2a753cc2e3bd..5e8d9a35b4695427995461b0959b994a896bc819 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java @@ -42,10 +42,20 @@ class OutboundMessageState implements CDPQEntry { private long _seqNum; 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); + private static final int CACHE4_BYTES = MAX_MSG_SIZE; + private static final int CACHE3_BYTES = CACHE4_BYTES / 4; + private static final int CACHE2_BYTES = CACHE3_BYTES / 4; + private static final int CACHE1_BYTES = CACHE2_BYTES / 4; + + private static final int CACHE1_MAX = 256; + private static final int CACHE2_MAX = CACHE1_MAX / 4; + private static final int CACHE3_MAX = CACHE2_MAX / 4; + private static final int CACHE4_MAX = CACHE3_MAX / 4; + + private static final ByteCache _cache1 = ByteCache.getInstance(CACHE1_MAX, CACHE1_BYTES); + private static final ByteCache _cache2 = ByteCache.getInstance(CACHE2_MAX, CACHE2_BYTES); + private static final ByteCache _cache3 = ByteCache.getInstance(CACHE3_MAX, CACHE3_BYTES); + private static final ByteCache _cache4 = ByteCache.getInstance(CACHE4_MAX, CACHE4_BYTES); private static final long EXPIRATION = 10*1000; @@ -72,6 +82,7 @@ class OutboundMessageState implements CDPQEntry { * Called from UDPTransport * TODO make two constructors, remove this, and make more things final * @return success + * @throws IAE if too big */ public boolean initialize(I2NPMessage msg, PeerState peer) { if (msg == null) @@ -91,6 +102,7 @@ class OutboundMessageState implements CDPQEntry { * Called from OutboundMessageFragments * TODO make two constructors, remove this, and make more things final * @return success + * @throws IAE if too big */ public boolean initialize(OutNetMessage m, I2NPMessage msg) { if ( (m == null) || (msg == null) ) @@ -110,19 +122,13 @@ class OutboundMessageState implements CDPQEntry { * Called from OutboundMessageFragments * @param m null if msg is "injected" * @return success + * @throws IAE if too big */ private boolean initialize(OutNetMessage m, I2NPMessage msg, PeerState peer) { _message = m; _peer = peer; - if (_messageBuf != null) { - _cache.release(_messageBuf); - _messageBuf = null; - } - - _messageBuf = _cache.acquire(); int size = msg.getRawMessageSize(); - if (size > _messageBuf.getData().length) - throw new IllegalArgumentException("Size too large! " + size + " in " + msg); + acquireBuf(size); try { int len = msg.toRawByteArray(_messageBuf.getData()); _messageBuf.setValid(len); @@ -137,13 +143,49 @@ class OutboundMessageState implements CDPQEntry { // _log.debug("Raw byte array for " + _messageId + ": " + Base64.encode(_messageBuf.getData(), 0, len)); return true; } catch (IllegalStateException ise) { - _cache.release(_messageBuf); - _messageBuf = null; - _released = true; + releaseBuf(); return false; } } + /** + * @throws IAE if too big + * @since 0.9.3 + */ + private void acquireBuf(int size) { + if (_messageBuf != null) + releaseBuf(); + if (size <= CACHE1_BYTES) + _messageBuf = _cache1.acquire(); + else if (size <= CACHE2_BYTES) + _messageBuf = _cache2.acquire(); + else if (size <= CACHE3_BYTES) + _messageBuf = _cache3.acquire(); + else if (size <= CACHE4_BYTES) + _messageBuf = _cache4.acquire(); + else + throw new IllegalArgumentException("Size too large! " + size); + } + + /** + * @since 0.9.3 + */ + private void releaseBuf() { + if (_messageBuf == null) + return; + int size = _messageBuf.getData().length; + if (size == CACHE1_BYTES) + _cache1.release(_messageBuf); + else if (size == CACHE2_BYTES) + _cache2.release(_messageBuf); + else if (size == CACHE3_BYTES) + _cache3.release(_messageBuf); + else if (size == CACHE4_BYTES) + _cache4.release(_messageBuf); + _messageBuf = null; + _released = true; + } + /** * This is synchronized with writeFragment(), * so we do not release (probably due to an ack) while we are retransmitting. @@ -151,8 +193,7 @@ class OutboundMessageState implements CDPQEntry { */ public synchronized void releaseResources() { if (_messageBuf != null && !_released) { - _cache.release(_messageBuf); - _released = true; + releaseBuf(); if (_log.shouldLog(Log.WARN)) _releasedBy = new Exception ("Released on " + new Date() + " by:"); } 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 ff707407bffbcccc92e61ec760406804bf35e3df..96ceec9c0dd21d5631f8d413e10c8fa3d2e4ab0f 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -1,11 +1,14 @@ package net.i2p.router.transport.udp; import java.util.Date; +import java.util.List; +import java.util.Map; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.data.DataHelper; import net.i2p.util.I2PThread; +import net.i2p.util.LHMCache; import net.i2p.util.Log; /** @@ -30,6 +33,8 @@ class PacketHandler { private final IntroductionManager _introManager; private volatile boolean _keepReading; private final Handler[] _handlers; + private final Map<RemoteHostId, Object> _failCache; + private static final Object DUMMY = new Object(); private static final int MIN_NUM_HANDLERS = 1; // unless < 32MB private static final int MAX_NUM_HANDLERS = 1; @@ -46,6 +51,7 @@ class PacketHandler { _inbound = inbound; _testManager = testManager; _introManager = introManager; + _failCache = new LHMCache(24); long maxMemory = Runtime.getRuntime().maxMemory(); if (maxMemory == Long.MAX_VALUE) @@ -143,8 +149,8 @@ class PacketHandler { if (packet == null) break; // keepReading is probably false, or bind failed... packet.received(); - if (_log.shouldLog(Log.INFO)) - _log.info("Received: " + packet); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received: " + packet); _state = 4; long queueTime = packet.getLifetime(); long handleStart = _context.clock().now(); @@ -294,7 +300,7 @@ class PacketHandler { receivePacket(reader, packet, est, false); } else { if (_log.shouldLog(Log.WARN)) - _log.warn("Validation with existing con failed, and validation as reestablish failed too. DROP"); + _log.warn("Validation with existing con failed, and validation as reestablish failed too. DROP " + packet); _context.statManager().addRateData("udp.droppedInvalidReestablish", packet.getLifetime(), packet.getExpiration()); } return; @@ -327,8 +333,70 @@ class PacketHandler { if (!isValid) { // Note that the vast majority of these are NOT corrupted packets, but // packets for which we don't have the PeerState (i.e. SessionKey) + // Case 1: 48 byte destroy packet, we already closed + // Case 2: 369 byte session created packet, re-tx of one that failed validation + // (peer probably doesn't know his correct external port, esp. on <= 0.9.1 + + // Case 3: + // For peers that change ports, look for an existing session with the same IP + // If we find it, and the packet validates with its mac key, tell the transport + // to change the port, and handle the packet. + // All this since 0.9.3. + RemoteHostId remoteHost = packet.getRemoteHost(); + boolean alreadyFailed; + synchronized(_failCache) { + alreadyFailed = _failCache.get(remoteHost) != null; + } + if (!alreadyFailed) { + // this is slow, that's why we cache it above. + List<PeerState> peers = _transport.getPeerStatesByIP(remoteHost); + if (!peers.isEmpty()) { + StringBuilder buf = new StringBuilder(256); + buf.append("Established peers with this IP: "); + boolean foundSamePort = false; + PeerState state = null; + int newPort = remoteHost.getPort(); + for (PeerState ps : peers) { + boolean valid = false; + long now = _context.clock().now(); + if (_log.shouldLog(Log.WARN)) + buf.append(ps.getRemoteHostId().toString()) + .append(" last sent: ").append(now - ps.getLastSendTime()) + .append(" last rcvd: ").append(now - ps.getLastReceiveTime()); + if (ps.getRemotePort() == newPort) { + foundSamePort = true; + } else if (packet.validate(ps.getCurrentMACKey())) { + packet.decrypt(ps.getCurrentCipherKey()); + reader.initialize(packet); + if (_log.shouldLog(Log.WARN)) + buf.append(" VALID type ").append(reader.readPayloadType()).append("; "); + valid = true; + if (state == null) + state = ps; + } else { + if (_log.shouldLog(Log.WARN)) + buf.append(" INVALID; "); + } + } + if (state != null && !foundSamePort) { + _transport.changePeerPort(state, newPort); + if (_log.shouldLog(Log.WARN)) { + buf.append(" CHANGED PORT TO ").append(newPort).append(" AND HANDLED"); + _log.warn(buf.toString()); + } + handlePacket(reader, packet, state, null, null, true); + return; + } + if (_log.shouldLog(Log.WARN)) + _log.warn(buf.toString()); + } + synchronized(_failCache) { + _failCache.put(remoteHost, DUMMY); + } + } if (_log.shouldLog(Log.WARN)) - _log.warn("Cannot validate rcvd pkt (path): " + packet); + _log.warn("Cannot validate rcvd pkt (path) wasCached? " + alreadyFailed + ": " + packet); + _context.statManager().addRateData("udp.droppedInvalidEstablish", packet.getLifetime(), packet.getExpiration()); switch (peerType) { case INBOUND_FALLBACK: 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 694a2740a4ccce393205abe75a15d91e2c35ee23..964e79332896f409869890fd9b8ac0f40ff44049 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -72,6 +72,7 @@ class PeerState { * A positive number means our clock is ahead of theirs. */ private long _clockSkew; + private final Object _clockSkewLock = new Object(); /** what is the current receive second, for congestion control? */ private long _currentReceiveSecond; @@ -79,6 +80,8 @@ class PeerState { private long _lastSendTime; /** when did we last send them a message that was ACKed */ private long _lastSendFullyTime; + /** when did we last send them a ping? */ + private long _lastPingTime; /** when did we last receive a packet from them? */ private long _lastReceiveTime; /** how many consecutive messages have we sent and not received an ACK to */ @@ -137,11 +140,11 @@ class PeerState { /** what IP is the peer sending and receiving packets on? */ private final byte[] _remoteIP; /** cached IP address */ - private transient InetAddress _remoteIPAddress; + private volatile InetAddress _remoteIPAddress; /** what port is the peer sending and receiving packets on? */ - private final int _remotePort; + private volatile int _remotePort; /** cached RemoteHostId, used to find the peerState by remote info */ - private final RemoteHostId _remoteHostId; + private volatile RemoteHostId _remoteHostId; /** if we need to contact them, do we need to talk to an introducer? */ //private boolean _remoteRequiresIntroduction; @@ -284,9 +287,12 @@ class PeerState { */ public static final int LARGE_MTU = 1484; + /** 600 */ private static final int MIN_RTO = 100 + ACKSender.ACK_FREQUENCY; - private static final int INIT_RTO = 4*1000; + private static final int INIT_RTO = 3*1000; + public static final int INIT_RTT = INIT_RTO / 2; private static final int MAX_RTO = 15*1000; + private static final int CLOCK_SKEW_FUDGE = (ACKSender.ACK_FREQUENCY * 2) / 3; public PeerState(RouterContext ctx, UDPTransport transport, byte[] remoteIP, int remotePort, Hash remotePeer, boolean isInbound) { @@ -313,7 +319,7 @@ class PeerState { //_mtuLastChecked = -1; _lastACKSend = -1; _rto = INIT_RTO; - _rtt = INIT_RTO / 2; + _rtt = INIT_RTT; _rttDeviation = _rtt; _inboundMessages = new HashMap(8); _outboundMessages = new ArrayList(32); @@ -325,6 +331,17 @@ class PeerState { _remoteHostId = new RemoteHostId(remoteIP, remotePort); } + /** + * Caller should sync; UDPTransport must remove and add to peersByRemoteHost map + * @since 0.9.3 + */ + public void changePort(int newPort) { + if (newPort != _remotePort) { + _remoteHostId = new RemoteHostId(_remoteIP, newPort); + _remotePort = newPort; + } + } + /** * The peer are we talking to. This should be set as soon as this * state is created if we are initiating a connection, but if we are @@ -342,9 +359,12 @@ class PeerState { * connection is established. */ public SessionKey getCurrentCipherKey() { return _currentCipherKey; } + /** * The pending AES key for verifying packets if we are rekeying the * connection, or null if we are not in the process of rekeying. + * + * @return null always, rekeying unimplemented */ public SessionKey getNextMACKey() { return _nextMACKey; } @@ -352,6 +372,8 @@ class PeerState { * The pending AES key for encrypting/decrypting packets if we are * rekeying the connection, or null if we are not in the process * of rekeying. + * + * @return null always, rekeying unimplemented */ public SessionKey getNextCipherKey() { return _nextCipherKey; } @@ -384,13 +406,20 @@ class PeerState { public long getLastReceiveTime() { return _lastReceiveTime; } /** how many seconds have we sent packets without any ACKs received? */ public int getConsecutiveFailedSends() { return _consecutiveFailedSends; } - /** have we received a packet with the ECN bit set in the current second? */ + + /** + * have we received a packet with the ECN bit set in the current second? + * @return false always + * @deprecated unused, ECNs are never sent, always returns false + */ public boolean getCurrentSecondECNReceived() { return _currentSecondECNReceived; } + /** * have all of the packets received in the current second requested that * the previous second's ACKs be sent? */ //public boolean getRemoteWantsPreviousACKs() { return _remoteWantsPreviousACKs; } + /** how many bytes should we send to the peer in a second */ public int getSendWindowBytes() { return _sendWindowBytes; } /** how many bytes can we send to the peer in the current second */ @@ -504,7 +533,12 @@ class PeerState { * A positive number means our clock is ahead of theirs. */ public void adjustClockSkew(long skew) { - _clockSkew = (long) (0.9*_clockSkew + 0.1*(skew - (_rtt / 2))); + // the real one-way delay is much less than RTT / 2, due to ack delays, + // so add a fudge factor + double adj = 0.1 * (skew + CLOCK_SKEW_FUDGE - (_rtt / 2)); + synchronized(_clockSkewLock) { + _clockSkew = (long) (0.9*_clockSkew + adj); + } } /** what is the current receive second, for congestion control? */ @@ -513,6 +547,21 @@ class PeerState { public void setLastSendTime(long when) { _lastSendTime = when; } /** when did we last receive a packet from them? */ public void setLastReceiveTime(long when) { _lastReceiveTime = when; } + + /** + * Note ping sent. Does not update last send time. + * @since 0.9.3 + */ + public void setLastPingTime(long when) { _lastPingTime = when; } + + /** + * Latest of last sent, last ACK, last ping + * @since 0.9.3 + */ + public long getLastSendOrPingTime() { + return Math.max(Math.max(_lastSendTime, _lastACKSend), _lastPingTime); + } + /** return the smoothed send transfer rate */ public int getSendBps() { return _sendBps; } public int getReceiveBps() { return _receiveBps; } @@ -714,7 +763,8 @@ class PeerState { /** * either they told us to back off, or we had to resend to get * the data through. - * + * Caller should synch on this + * @return true if window shrunk, but nobody uses the return value */ private boolean congestionOccurred() { long now = _context.clock().now(); @@ -722,8 +772,6 @@ class PeerState { return false; // only shrink once every few seconds _lastCongestionOccurred = now; - _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes, _sendBps); - int congestionAt = _sendWindowBytes; //if (true) // _sendWindowBytes -= 10000; @@ -779,7 +827,10 @@ class PeerState { return randomResends; } - /** the ack was sent */ + /** + * The ack was sent. + * Side effect - sets _lastACKSend + */ public void removeACKMessage(Long messageId) { boolean removed = _currentACKs.remove(messageId); if (removed) { @@ -800,15 +851,15 @@ class PeerState { /** * The max number of acks we save to send as duplicates */ - private static final int MAX_RESEND_ACKS = 16; + private static final int MAX_RESEND_ACKS = 64; /** * The max number of duplicate acks sent in each ack-only messge. * Doesn't really matter, we have plenty of room... * @since 0.7.13 */ - private static final int MAX_RESEND_ACKS_LARGE = MAX_RESEND_ACKS; + private static final int MAX_RESEND_ACKS_LARGE = MAX_RESEND_ACKS / 3; /** for small MTU */ - private static final int MAX_RESEND_ACKS_SMALL = MAX_RESEND_ACKS; + private static final int MAX_RESEND_ACKS_SMALL = MAX_RESEND_ACKS / 5; /** * grab a list of ACKBitfield instances, some of which may fully @@ -827,11 +878,11 @@ class PeerState { * See above. Only called by ACKSender with alwaysIncludeRetransmissions = false. * So this is only for ACK-only packets, so all the size limiting is useless. * FIXME. + * Side effect - sets _lastACKSend if rv is non-empty * * @return non-null, possibly empty */ public List<ACKBitfield> retrieveACKBitfields(boolean alwaysIncludeRetransmissions) { - List<ACKBitfield> rv = new ArrayList(MAX_RESEND_ACKS); int bytesRemaining = countMaxACKData(); // Limit the overhead of all the resent acks when using small MTU @@ -843,8 +894,10 @@ class PeerState { maxResendAcks = MAX_RESEND_ACKS_SMALL; else maxResendAcks = MAX_RESEND_ACKS_LARGE; - List<Long> randomResends = new ArrayList(_currentACKsResend); + List<ACKBitfield> rv = new ArrayList(maxResendAcks); + // save to add to currentACKsResend later so we don't include twice + List<Long> currentACKsRemoved = new ArrayList(_currentACKs.size()); // As explained above, we include the acks in any order // since we are unlikely to get backed up - // just take them using the Set iterator. @@ -854,12 +907,13 @@ class PeerState { iter.remove(); long id = val.longValue(); rv.add(new FullACKBitfield(id)); - _currentACKsResend.offer(val); + currentACKsRemoved.add(val); bytesRemaining -= 4; } if (_currentACKs.isEmpty()) _wantACKSendSince = -1; if (alwaysIncludeRetransmissions || !rv.isEmpty()) { + List<Long> randomResends = new ArrayList(_currentACKsResend); // now repeat by putting in some old ACKs // randomly selected from the Resend queue. // Maybe we should only resend each one a certain number of times... @@ -880,6 +934,9 @@ class PeerState { bytesRemaining -= 4; //} } + for (Long val : currentACKsRemoved) { + _currentACKsResend.offer(val); + } } // trim down the resends while (_currentACKsResend.size() > MAX_RESEND_ACKS) @@ -907,7 +964,8 @@ class PeerState { } } - _lastACKSend = _context.clock().now(); + if (!rv.isEmpty()) + _lastACKSend = _context.clock().now(); //if (rv == null) // rv = Collections.EMPTY_LIST; if (partialIncluded > 0) @@ -975,8 +1033,11 @@ class PeerState { public String toString() { return "Full ACK of " + _msgId; } } - /** we sent a message which was ACKed containing the given # of bytes */ - public void messageACKed(int bytesACKed, long lifetime, int numSends) { + /** + * We sent a message which was ACKed containing the given # of bytes. + * Caller should synch on this + */ + private void locked_messageACKed(int bytesACKed, long lifetime, int numSends) { _concurrentMessagesActive--; if (_concurrentMessagesActive < 0) _concurrentMessagesActive = 0; @@ -990,15 +1051,15 @@ class PeerState { if (_sendWindowBytes <= _slowStartThreshold) { _sendWindowBytes += bytesACKed; } else { - if (false) { - _sendWindowBytes += 16; // why 16? - } else { + //if (false) { + // _sendWindowBytes += 16; // why 16? + //} else { float prob = ((float)bytesACKed) / ((float)(_sendWindowBytes<<1)); float v = _context.random().nextFloat(); if (v < 0) v = 0-v; if (v <= prob) _sendWindowBytes += bytesACKed; //512; // bytesACKed; - } + //} } } else { int allow = _concurrentMessagesAllowed - 1; @@ -1011,21 +1072,31 @@ class PeerState { _lastReceiveTime = _context.clock().now(); _lastSendFullyTime = _lastReceiveTime; - if (true) { + //if (true) { if (_sendWindowBytesRemaining + bytesACKed <= _sendWindowBytes) _sendWindowBytesRemaining += bytesACKed; else _sendWindowBytesRemaining = _sendWindowBytes; - } + //} _messagesSent++; if (numSends < 2) { - synchronized (this) { + // caller synchs + //synchronized (this) { recalculateTimeouts(lifetime); adjustMTU(); - } + //} } - else if (_log.shouldLog(Log.INFO)) + } + + /** + * We sent a message which was ACKed containing the given # of bytes. + */ + private void messageACKed(int bytesACKed, long lifetime, int numSends) { + synchronized(this) { + locked_messageACKed(bytesACKed, lifetime, numSends); + } + if (numSends >= 2 && _log.shouldLog(Log.INFO)) _log.info("acked after numSends=" + numSends + " w/ lifetime=" + lifetime + " and size=" + bytesACKed); _context.statManager().addRateData("udp.sendBps", _sendBps, lifetime); @@ -1104,9 +1175,10 @@ class PeerState { _packetsRetransmitted = packets; } *****/ - congestionOccurred(); + _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes, _sendBps); _context.statManager().addRateData("udp.congestedRTO", _rto, _rttDeviation); synchronized (this) { + congestionOccurred(); adjustMTU(); } //_rto *= 2; @@ -1168,10 +1240,14 @@ class PeerState { } /** - * we received a backoff request, so cut our send window + * We received a backoff request, so cut our send window. + * NOTE: ECN sending is unimplemented, this is never called. */ public void ECNReceived() { - congestionOccurred(); + synchronized(this) { + congestionOccurred(); + } + _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes, _sendBps); _currentSecondECNReceived = true; _lastReceiveTime = _context.clock().now(); } @@ -1182,17 +1258,33 @@ class PeerState { /** when did we last send an ACK to the peer? */ public long getLastACKSend() { return _lastACKSend; } + + /** @deprecated unused */ public void setLastACKSend(long when) { _lastACKSend = when; } + public long getWantedACKSendSince() { return _wantACKSendSince; } + /** + * Are we out of room to send all the current unsent acks in a single packet? + * This is a huge threshold (134 for small MTU and 255 for large MTU) + * that is rarely if ever exceeded in practice. + * So just use a fixed threshold of half the resend acks, so that if the + * packet is lost the acks have a decent chance of getting retransmitted. + * Used only by ACKSender. + */ public boolean unsentACKThresholdReached() { - int threshold = countMaxACKData() / 4; - return _currentACKs.size() >= threshold; + //int threshold = countMaxACKData() / 4; + //return _currentACKs.size() >= threshold; + return _currentACKs.size() >= MAX_RESEND_ACKS / 2; } - /** @return MTU - 83 */ + /** + * @return how many bytes available for acks in an ack-only packet, == MTU - 83 + * Max of 1020 + */ private int countMaxACKData() { - return _mtu + return Math.min(PacketBuilder.ABSOLUTE_MAX_ACKS * 4, + _mtu - PacketBuilder.IP_HEADER_SIZE - PacketBuilder.UDP_HEADER_SIZE - UDPPacket.IV_SIZE @@ -1201,7 +1293,7 @@ class PeerState { - 4 // timestamp - 1 // data flag - 1 // # ACKs - - 16; // padding safety + - 16); // padding safety } private int minRTO() { @@ -1213,6 +1305,7 @@ class PeerState { // return MAX_RTO; } + /** @return non-null */ RemoteHostId getRemoteHostId() { return _remoteHostId; } /** @@ -1770,6 +1863,7 @@ class PeerState { /** * Transfer the basic activity/state from the old peer to the current peer * + * @param oldPeer non-null */ public void loadFrom(PeerState oldPeer) { _rto = oldPeer._rto; @@ -1875,6 +1969,9 @@ class PeerState { buf.append(" consecFail: ").append(_consecutiveFailedSends); buf.append(" recv OK/Dup: ").append(_packetsReceived).append('/').append(_packetsReceivedDuplicate); buf.append(" send OK/Dup: ").append(_packetsTransmitted).append('/').append(_packetsRetransmitted); + buf.append(" IBM: ").append(_inboundMessages.size()); + buf.append(" OBQ: ").append(_outboundQueue.size()); + buf.append(" OBL: ").append(_outboundMessages.size()); return buf.toString(); } } 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 2623c07cc4139d069aa91dfec0d3b29b97672eb1..9b00962b385052efafb8375bd3c94b188e0a69c2 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java @@ -14,12 +14,16 @@ import net.i2p.data.RouterInfo; import net.i2p.data.SessionKey; import net.i2p.router.CommSystemFacade; import net.i2p.router.RouterContext; +import static net.i2p.router.transport.udp.PeerTestState.Role.*; import net.i2p.util.Addresses; import net.i2p.util.Log; import net.i2p.util.SimpleScheduler; import net.i2p.util.SimpleTimer; /** + * Entry points are runTest() to start a new test as Alice, + * and receiveTest() for all received test packets. + * * From udp.html on the website: <p>The automation of collaborative reachability testing for peers is @@ -30,12 +34,27 @@ quite simple:</p> <pre> Alice Bob Charlie + + runTest() + sendTestToBob() receiveFromAliceAsBob() PeerTest -------------------> + + sendTestToCharlie() receiveFromBobAsCharlie() PeerTest--------------------> + + receiveFromCharlieAsBob() <-------------------PeerTest + + receiveTestReply() <-------------------PeerTest + + receiveTestReply() <------------------------------------------PeerTest + + receiveFromAliceAsCharlie() PeerTest------------------------------------------> + + receiveTestReply() <------------------------------------------PeerTest </pre> @@ -104,9 +123,27 @@ class PeerTestManager { private boolean _currentTestComplete; /** as Alice */ private final Queue<Long> _recentTests; + private final IPThrottler _throttle; + + private static final int MAX_RELAYED_PER_TEST_ALICE = 9; + private static final int MAX_RELAYED_PER_TEST_BOB = 6; + private static final int MAX_RELAYED_PER_TEST_CHARLIE = 6; /** longest we will keep track of a Charlie nonce for */ - private static final int MAX_CHARLIE_LIFETIME = 10*1000; + private static final int MAX_CHARLIE_LIFETIME = 15*1000; + + /** as Bob/Charlie */ + private static final int MAX_ACTIVE_TESTS = 20; + private static final int MAX_RECENT_TESTS = 40; + + /** for the throttler */ + private static final int MAX_PER_IP = 12; + private static final long THROTTLE_CLEAN_TIME = 10*60*1000; + + /** initial - ContinueTest adds backoff */ + private static final int RESEND_TIMEOUT = 4*1000; + private static final int MAX_TEST_TIME = 30*1000; + private static final long MAX_NONCE = (1l << 32) - 1l; /** * Have seen peer tests (as Alice) get stuck (_currentTest != null) @@ -120,15 +157,12 @@ class PeerTestManager { _activeTests = new ConcurrentHashMap(); _recentTests = new LinkedBlockingQueue(); _packetBuilder = new PacketBuilder(context, transport); + _throttle = new IPThrottler(MAX_PER_IP, THROTTLE_CLEAN_TIME); _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); + _context.statManager().createRateStat("udp.testBadIP", "Received IP or port was bad", "udp", UDPTransport.RATES); } - - private static final int RESEND_TIMEOUT = 5*1000; - private static final int MAX_TEST_TIME = 30*1000; - private static final long MAX_NONCE = (1l << 32) - 1l; - //public void runTest(InetAddress bobIP, int bobPort, SessionKey bobIntroKey) { /** * The next few methods are for when we are Alice @@ -136,42 +170,60 @@ class PeerTestManager { public synchronized void runTest(InetAddress bobIP, int bobPort, SessionKey bobCipherKey, SessionKey bobMACKey) { if (_currentTest != null) { if (_log.shouldLog(Log.WARN)) - _log.warn("We are already running a test with bob = " + _currentTest.getBobIP() + ", aborting test with bob = " + bobIP); + _log.warn("We are already running a test: " + _currentTest + ", aborting test with bob = " + bobIP); return; } - PeerTestState test = new PeerTestState(); - test.setNonce(_context.random().nextLong(MAX_NONCE)); + if (DataHelper.eq(bobIP.getAddress(), 0, _transport.getExternalIP(), 0, 2)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Not running test with Bob too close to us " + bobIP); + return; + } + PeerTestState test = new PeerTestState(ALICE, + _context.random().nextLong(MAX_NONCE), + _context.clock().now()); test.setBobIP(bobIP); test.setBobPort(bobPort); test.setBobCipherKey(bobCipherKey); test.setBobMACKey(bobMACKey); - test.setBeginTime(_context.clock().now()); test.setLastSendTime(test.getBeginTime()); - test.setOurRole(PeerTestState.ALICE); _currentTest = test; _currentTestComplete = false; if (_log.shouldLog(Log.DEBUG)) - _log.debug("Running test with bob = " + bobIP + ":" + bobPort + " " + test.getNonce()); - while (_recentTests.size() > 16) + _log.debug("Start new test: " + test); + while (_recentTests.size() > MAX_RECENT_TESTS) _recentTests.poll(); _recentTests.offer(Long.valueOf(test.getNonce())); + test.incrementPacketsRelayed(); sendTestToBob(); - _context.simpleScheduler().addEvent(new ContinueTest(), RESEND_TIMEOUT); + _context.simpleScheduler().addEvent(new ContinueTest(test.getNonce()), RESEND_TIMEOUT); } private class ContinueTest implements SimpleTimer.TimedEvent { + private final long _nonce; + + public ContinueTest(long nonce) { + _nonce = nonce; + } + public void timeReached() { synchronized (PeerTestManager.this) { PeerTestState state = _currentTest; - if (state == null) { - // already completed + if (state == null || state.getNonce() != _nonce) { + // already completed, possibly on to the next test return; } else if (expired()) { testComplete(true); } else if (_context.clock().now() - state.getLastSendTime() >= RESEND_TIMEOUT) { + int sent = state.incrementPacketsRelayed(); + if (sent > MAX_RELAYED_PER_TEST_ALICE) { + testComplete(false); + if (_log.shouldLog(Log.WARN)) + _log.warn("Sent too many packets: " + state); + return; + } if (state.getReceiveBobTime() <= 0) { // no message from Bob yet, send it again sendTestToBob(); @@ -184,7 +236,8 @@ class PeerTestManager { // second message from Charlie yet sendTestToCharlie(); } - _context.simpleScheduler().addEvent(ContinueTest.this, RESEND_TIMEOUT); + // retx at 4, 10, 17, 25 elapsed time + _context.simpleScheduler().addEvent(ContinueTest.this, RESEND_TIMEOUT + (sent*1000)); } } } @@ -204,19 +257,20 @@ class PeerTestManager { PeerTestState test = _currentTest; if (!expired()) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Sending test to bob: " + test.getBobIP() + ":" + test.getBobPort()); + _log.debug("Sending test to Bob: " + test); _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getBobIP(), test.getBobPort(), test.getBobCipherKey(), test.getBobMACKey(), //_bobIntroKey, test.getNonce(), _transport.getIntroKey())); } else { _currentTest = null; } } + /** call from a synchronized method */ private void sendTestToCharlie() { PeerTestState test = _currentTest; if (!expired()) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Sending test to charlie: " + test.getCharlieIP() + ":" + test.getCharliePort()); + _log.debug("Sending test to Charlie: " + test); _transport.send(_packetBuilder.buildPeerTestFromAlice(test.getCharlieIP(), test.getCharliePort(), test.getCharlieIntroKey(), test.getNonce(), _transport.getIntroKey())); } else { @@ -240,7 +294,7 @@ class PeerTestManager { * test. We are Alice. */ private synchronized void receiveTestReply(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo) { - _context.statManager().addRateData("udp.receiveTestReply", 1, 0); + _context.statManager().addRateData("udp.receiveTestReply", 1); PeerTestState test = _currentTest; if (expired()) return; @@ -270,16 +324,20 @@ class PeerTestManager { InetAddress addr = InetAddress.getByAddress(ip); test.setAliceIP(addr); test.setReceiveBobTime(_context.clock().now()); - test.setAlicePort(testInfo.readPort()); + int testPort = testInfo.readPort(); + if (testPort == 0) + throw new UnknownHostException("port 0"); + test.setAlicePort(testPort); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive test reply from bob @ " + from + " via our " + test.getAlicePort() + "/" + test.getAlicePortFromCharlie()); + _log.debug("Receive test reply from Bob: " + test); if (test.getAlicePortFromCharlie() > 0) testComplete(false); } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.ERROR)) _log.error("Unable to get our IP (length " + ipSize + ") from bob's reply: " + from + ", " + testInfo, uhe); + _context.statManager().addRateData("udp.testBadIP", 1); } } else { // The reply is from Charlie @@ -294,7 +352,7 @@ class PeerTestManager { + _currentTest + ", charlie: " + from + ")"); // why are we doing this instead of calling testComplete() ? _currentTestComplete = true; - _context.statManager().addRateData("udp.statusKnownCharlie", 1, 0); + _context.statManager().addRateData("udp.statusKnownCharlie", 1); honorStatus(CommSystemFacade.STATUS_UNKNOWN); _currentTest = null; return; @@ -302,26 +360,29 @@ class PeerTestManager { if (test.getReceiveCharlieTime() > 0) { // this is our second charlie, yay! - test.setAlicePortFromCharlie(testInfo.readPort()); - byte ip[] = new byte[testInfo.readIPSize()]; - testInfo.readIP(ip, 0); try { + int testPort = testInfo.readPort(); + if (testPort == 0) + throw new UnknownHostException("port 0"); + test.setAlicePortFromCharlie(testPort); + byte ip[] = new byte[testInfo.readIPSize()]; + testInfo.readIP(ip, 0); InetAddress addr = InetAddress.getByAddress(ip); test.setAliceIPFromCharlie(addr); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive test reply from charlie @ " + test.getCharlieIP() + " via our " - + test.getAlicePort() + "/" + test.getAlicePortFromCharlie()); + _log.debug("Receive test reply from Charlie: " + test); if (test.getReceiveBobTime() > 0) testComplete(true); } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.ERROR)) _log.error("Charlie @ " + from + " said we were an invalid IP address: " + uhe.getMessage(), uhe); + _context.statManager().addRateData("udp.testBadIP", 1); } } else { - if (test.getPacketsRelayed() > MAX_RELAYED_PER_TEST) { + if (test.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_ALICE) { testComplete(false); if (_log.shouldLog(Log.WARN)) - _log.warn("Received too many packets on the test: " + test); + _log.warn("Sent too many packets on the test: " + test); return; } @@ -338,11 +399,12 @@ class PeerTestManager { test.setCharlieIP(InetAddress.getByAddress(from.getIP())); test.setCharliePort(from.getPort()); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive test from charlie @ " + from); + _log.debug("Receive test from Charlie: " + test); sendTestToCharlie(); } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.WARN)) _log.warn("Charlie's IP is b0rked: " + from + ": " + testInfo); + _context.statManager().addRateData("udp.testBadIP", 1); } } } @@ -409,44 +471,119 @@ class PeerTestManager { } /** + * Entry point for all incoming packets. Most of the source and dest validation is here. + * * Receive a test message of some sort from the given peer, queueing up any packet * that should be sent in response, or if its a reply to our own current testing, * adjusting our test state. + * * We could be Alice, Bob, or Charlie. */ public void receiveTest(RemoteHostId from, UDPPacketReader reader) { - _context.statManager().addRateData("udp.receiveTest", 1, 0); + _context.statManager().addRateData("udp.receiveTest", 1); + byte[] fromIP = from.getIP(); + int fromPort = from.getPort(); + if (fromPort < 1024 || fromPort > 65535 || + (!_transport.isValid(fromIP)) || + DataHelper.eq(fromIP, 0, _transport.getExternalIP(), 0, 2) || + _context.blocklist().isBlocklisted(fromIP)) { + // spoof check, and don't respond to privileged ports + if (_log.shouldLog(Log.WARN)) + _log.warn("Invalid PeerTest address: " + Addresses.toString(fromIP, fromPort)); + _context.statManager().addRateData("udp.testBadIP", 1); + return; + } UDPPacketReader.PeerTestReader testInfo = reader.getPeerTestReader(); byte testIP[] = null; int testPort = testInfo.readPort(); + + if (testInfo.readIPSize() > 0) { + testIP = new byte[testInfo.readIPSize()]; + testInfo.readIP(testIP, 0); + } + + if ((testPort > 0 && (testPort < 1024 || testPort > 65535)) || + (testIP != null && + ((!_transport.isValid(testIP)) || + _context.blocklist().isBlocklisted(testIP)))) { + // spoof check, and don't respond to privileged ports + if (_log.shouldLog(Log.WARN)) + _log.warn("Invalid address in PeerTest: " + Addresses.toString(testIP, testPort)); + _context.statManager().addRateData("udp.testBadIP", 1); + return; + } + + // The from IP/port and message's IP/port are now validated. + // EXCEPT that either the message's IP could be empty or the message's port could be 0. + // Both of those cases should be checked in receiveXfromY() as appropriate. + // Also, IP could be us, check is below. + long nonce = testInfo.readNonce(); PeerTestState test = _currentTest; if ( (test != null) && (test.getNonce() == nonce) ) { - // we are Alice + // we are Alice, we initiated the test receiveTestReply(from, testInfo); return; } - // we are Bob or Charlie + // we are Bob or Charlie, we are helping Alice - if ( (testInfo.readIPSize() > 0) && (testPort > 0) ) { - testIP = new byte[testInfo.readIPSize()]; - testInfo.readIP(testIP, 0); + if (_throttle.shouldThrottle(fromIP)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("PeerTest throttle from " + Addresses.toString(fromIP, fromPort)); + return; + } + + // use the same counter for both from and to IPs + if (testIP != null && _throttle.shouldThrottle(testIP)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("PeerTest throttle to " + Addresses.toString(testIP, testPort)); + return; + } + + Long lNonce = Long.valueOf(nonce); + PeerTestState state = _activeTests.get(lNonce); + + if (testIP != null && DataHelper.eq(testIP, 0, _transport.getExternalIP(), 0, 2)) { + // spoof check - have to do this after receiveTestReply(), since + // the field should be us there. + // Let's also eliminate anybody in the same /16 + if (_recentTests.contains(lNonce)) { + if (_log.shouldLog(Log.INFO)) + _log.info("Got delayed reply on nonce " + nonce + + " from: " + Addresses.toString(fromIP, fromPort)); + } else { + if (_log.shouldLog(Log.WARN)) + _log.warn("Nearby address in PeerTest: " + Addresses.toString(testIP, testPort) + + " from: " + Addresses.toString(fromIP, fromPort) + + " state? " + state); + _context.statManager().addRateData("udp.testBadIP", 1); + } + return; } - - PeerTestState state = _activeTests.get(Long.valueOf(nonce)); if (state == null) { + // NEW TEST if ( (testIP == null) || (testPort <= 0) ) { // we are bob, since we haven't seen this nonce before AND its coming from alice + if (_activeTests.size() >= MAX_ACTIVE_TESTS) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Too many active tests, droppping from Alice " + Addresses.toString(fromIP, fromPort)); + return; + } if (_log.shouldLog(Log.DEBUG)) _log.debug("test IP/port are blank coming from " + from + ", assuming we are Bob and they are alice"); receiveFromAliceAsBob(from, testInfo, nonce, null); } else { - if (_recentTests.contains(Long.valueOf(nonce))) { + if (_recentTests.contains(lNonce)) { // ignore the packet, as its a holdover from a recently completed locally // initiated test } else { + if (_activeTests.size() >= MAX_ACTIVE_TESTS) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Too many active tests, droppping from Bob " + Addresses.toString(fromIP, fromPort)); + return; + } if (_log.shouldLog(Log.DEBUG)) _log.debug("We are charlie, as the testIP/port is " + Addresses.toString(testIP, testPort) + " and the state is unknown for " + nonce); // we are charlie, since alice never sends us her IP and port, only bob does (and, @@ -455,20 +592,21 @@ class PeerTestManager { } } } else { - if (state.getOurRole() == PeerTestState.BOB) { - if (DataHelper.eq(from.getIP(), state.getAliceIP().getAddress()) && - (from.getPort() == state.getAlicePort()) ) { + // EXISTING TEST + if (state.getOurRole() == BOB) { + if (DataHelper.eq(fromIP, state.getAliceIP().getAddress()) && + (fromPort == state.getAlicePort()) ) { receiveFromAliceAsBob(from, testInfo, nonce, state); - } else if (DataHelper.eq(from.getIP(), state.getCharlieIP().getAddress()) && - (from.getPort() == state.getCharliePort()) ) { + } else if (DataHelper.eq(fromIP, state.getCharlieIP().getAddress()) && + (fromPort == state.getCharliePort()) ) { receiveFromCharlieAsBob(from, state); } else { if (_log.shouldLog(Log.WARN)) _log.warn("Received from a fourth party as bob! alice: " + state.getAliceIP() + ", charlie: " + state.getCharlieIP() + ", dave: " + from); } - } else if (state.getOurRole() == PeerTestState.CHARLIE) { + } else if (state.getOurRole() == CHARLIE) { if ( (testIP == null) || (testPort <= 0) ) { - receiveFromAliceAsCharlie(from, testInfo, nonce); + receiveFromAliceAsCharlie(from, testInfo, nonce, state); } else { receiveFromBobAsCharlie(from, testInfo, nonce, state); } @@ -478,29 +616,34 @@ class PeerTestManager { // Below here are methods for when we are Bob or Charlie - private static final int MAX_RELAYED_PER_TEST = 5; - /** * The packet's IP/port does not match the IP/port included in the message, * so we must be Charlie receiving a PeerTest from Bob. * + * @param state null if new */ private void receiveFromBobAsCharlie(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce, PeerTestState state) { + long now = _context.clock().now(); boolean isNew = false; if (state == null) { isNew = true; - state = new PeerTestState(); - state.setOurRole(PeerTestState.CHARLIE); + state = new PeerTestState(CHARLIE, nonce, now); + } else { + if (state.getReceiveBobTime() > now - (RESEND_TIMEOUT / 2)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Too soon, not retransmitting: " + state); + return; + } } - - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive test as charlie nonce " + nonce); - + + // TODO should only do most of this if isNew int sz = testInfo.readIPSize(); byte aliceIPData[] = new byte[sz]; try { testInfo.readIP(aliceIPData, 0); int alicePort = testInfo.readPort(); + if (alicePort == 0) + throw new UnknownHostException("port 0"); InetAddress aliceIP = InetAddress.getByAddress(aliceIPData); InetAddress bobIP = InetAddress.getByAddress(from.getIP()); SessionKey aliceIntroKey = new SessionKey(new byte[SessionKey.KEYSIZE_BYTES]); @@ -509,12 +652,10 @@ class PeerTestManager { state.setAliceIP(aliceIP); state.setAlicePort(alicePort); state.setAliceIntroKey(aliceIntroKey); - state.setNonce(nonce); state.setBobIP(bobIP); state.setBobPort(from.getPort()); - state.setLastSendTime(_context.clock().now()); - state.setOurRole(PeerTestState.CHARLIE); - state.setReceiveBobTime(_context.clock().now()); + state.setLastSendTime(now); + state.setReceiveBobTime(now); PeerState bob = _transport.getPeerState(from); if (bob == null) { @@ -526,16 +667,15 @@ class PeerTestManager { state.setBobMACKey(bob.getCurrentMACKey()); } - state.incrementPacketsRelayed(); - if (state.getPacketsRelayed() > MAX_RELAYED_PER_TEST) { + // we send two packets below, but increment just once + if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_CHARLIE) { if (_log.shouldLog(Log.WARN)) - _log.warn("Receive from bob (" + from + ") as charlie with alice @ " + aliceIP + ":" + alicePort - + ", but we've already relayed too many packets to that test, so we're dropping it"); + _log.warn("Too many, not retransmitting: " + state); return; } if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive from bob (" + from + ") as charlie, sending back to bob and sending to alice @ " + aliceIP + ":" + alicePort); + _log.debug("Receive from Bob: " + state); if (isNew) { _activeTests.put(Long.valueOf(nonce), state); @@ -550,6 +690,7 @@ class PeerTestManager { } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to build the aliceIP from " + from + ", ip size: " + sz + " ip val: " + Base64.encode(aliceIPData), uhe); + _context.statManager().addRateData("udp.testBadIP", 1); } } @@ -557,20 +698,20 @@ class PeerTestManager { * The PeerTest message came from the peer referenced in the message (or there wasn't * any info in the message), plus we are not acting as Charlie (so we've got to be Bob). * + * testInfo IP/port ignored + * @param state null if new */ private void receiveFromAliceAsBob(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce, PeerTestState state) { // we are Bob, so pick a (potentially) Charlie and send Charlie Alice's info - PeerState charlie = null; + PeerState charlie; RouterInfo charlieInfo = null; if (state == null) { // pick a new charlie charlie = _transport.pickTestPeer(from); - if (charlie != null) - charlieInfo = _context.netDb().lookupRouterInfoLocally(charlie.getRemotePeer()); } else { charlie = _transport.getPeerState(new RemoteHostId(state.getCharlieIP().getAddress(), state.getCharliePort())); - if (charlie != null) - charlieInfo = _context.netDb().lookupRouterInfoLocally(charlie.getRemotePeer()); } + if (charlie != null) + charlieInfo = _context.netDb().lookupRouterInfoLocally(charlie.getRemotePeer()); if ( (charlie == null) || (charlieInfo == null) ) { if (_log.shouldLog(Log.WARN)) @@ -578,6 +719,7 @@ class PeerTestManager { return; } + // TODO should only do most of this if isNew InetAddress aliceIP = null; SessionKey aliceIntroKey = null; try { @@ -597,28 +739,30 @@ class PeerTestManager { //UDPPacket packet = _packetBuilder.buildPeerTestToAlice(aliceIP, from.getPort(), aliceIntroKey, charlieIntroKey, nonce); //_transport.send(packet); + long now = _context.clock().now(); boolean isNew = false; if (state == null) { isNew = true; - state = new PeerTestState(); - state.setBeginTime(_context.clock().now()); + state = new PeerTestState(BOB, nonce, now); + } else { + if (state.getReceiveAliceTime() > now - (RESEND_TIMEOUT / 2)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Too soon, not retransmitting: " + state); + return; + } } state.setAliceIP(aliceIP); state.setAlicePort(from.getPort()); state.setAliceIntroKey(aliceIntroKey); - state.setNonce(nonce); state.setCharlieIP(charlie.getRemoteIPAddress()); state.setCharliePort(charlie.getRemotePort()); state.setCharlieIntroKey(charlieIntroKey); - state.setLastSendTime(_context.clock().now()); - state.setOurRole(PeerTestState.BOB); - state.setReceiveAliceTime(_context.clock().now()); + state.setLastSendTime(now); + state.setReceiveAliceTime(now); - state.incrementPacketsRelayed(); - if (state.getPacketsRelayed() > MAX_RELAYED_PER_TEST) { + if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_BOB) { if (_log.shouldLog(Log.WARN)) - _log.warn("Receive from alice (" + aliceIP + ":" + from.getPort() - + ") as bob, but we've already relayed too many packets to that test, so we're dropping it"); + _log.warn("Too many, not retransmitting: " + state); return; } @@ -634,13 +778,13 @@ class PeerTestManager { charlie.getCurrentMACKey()); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive from alice as bob for " + nonce + ", picking charlie @ " + charlie.getRemoteIPAddress() + ":" - + charlie.getRemotePort() + " for alice @ " + aliceIP + ":" + from.getPort()); + _log.debug("Receive from Alice: " + state); _transport.send(packet); } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to build the aliceIP from " + from, uhe); + _context.statManager().addRateData("udp.testBadIP", 1); } } @@ -648,23 +792,30 @@ class PeerTestManager { * The PeerTest message came from one of the Charlies picked for an existing test, so send Alice the * packet verifying participation. * + * testInfo IP/port ignored + * @param state non-null */ private void receiveFromCharlieAsBob(RemoteHostId from, PeerTestState state) { - state.setReceiveCharlieTime(_context.clock().now()); - - state.incrementPacketsRelayed(); - if (state.getPacketsRelayed() > MAX_RELAYED_PER_TEST) { + long now = _context.clock().now(); + if (state.getReceiveCharlieTime() > now - (RESEND_TIMEOUT / 2)) { if (_log.shouldLog(Log.WARN)) - _log.warn("Received from charlie (" + from + ") as bob (" + state + "), but we've already relayed too many, so drop it"); + _log.warn("Too soon, not retransmitting: " + state); return; } + + if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_BOB) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Too many, not retransmitting: " + state); + return; + } + state.setReceiveCharlieTime(now); UDPPacket packet = _packetBuilder.buildPeerTestToAlice(state.getAliceIP(), state.getAlicePort(), state.getAliceIntroKey(), state.getCharlieIntroKey(), state.getNonce()); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive from charlie @ " + from + " as bob, sending alice back the ok @ " + state.getAliceIP() + ":" + state.getAlicePort()); + _log.debug("Receive from Charlie, sending Alice back the OK: " + state); _transport.send(packet); } @@ -672,32 +823,52 @@ class PeerTestManager { /** * We are charlie, so send Alice her PeerTest message * + * testInfo IP/port ignored + * @param state non-null */ - private void receiveFromAliceAsCharlie(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, long nonce) { + private void receiveFromAliceAsCharlie(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo, + long nonce, PeerTestState state) { + long now = _context.clock().now(); + if (state.getReceiveAliceTime() > now - (RESEND_TIMEOUT / 2)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Too soon, not retransmitting: " + state); + return; + } + + if (state.incrementPacketsRelayed() > MAX_RELAYED_PER_TEST_CHARLIE) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Too many, not retransmitting: " + state); + return; + } + state.setReceiveAliceTime(now); + try { InetAddress aliceIP = InetAddress.getByAddress(from.getIP()); SessionKey aliceIntroKey = new SessionKey(new byte[SessionKey.KEYSIZE_BYTES]); testInfo.readIntroKey(aliceIntroKey.getData(), 0); UDPPacket packet = _packetBuilder.buildPeerTestToAlice(aliceIP, from.getPort(), aliceIntroKey, _transport.getIntroKey(), nonce); - + if (_log.shouldLog(Log.DEBUG)) - _log.debug("Receive from alice as charlie, w/ alice @ " + aliceIP + ":" + from.getPort() + " and nonce " + nonce); + _log.debug("Receive from Alice: " + state); _transport.send(packet); } catch (UnknownHostException uhe) { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to build the aliceIP from " + from, uhe); + _context.statManager().addRateData("udp.testBadIP", 1); } } /** - * forget about charlie's nonce after 60s. + * forget about charlie's nonce after a short while. */ private class RemoveTest implements SimpleTimer.TimedEvent { - private long _nonce; + private final long _nonce; + public RemoveTest(long nonce) { _nonce = nonce; } + public void timeReached() { _activeTests.remove(Long.valueOf(_nonce)); } 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 b5219476c2617340d7accc3dd17bfba0f9e62a8d..e700c77eba885cc31a1f994d55b9e629343790b3 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java @@ -1,15 +1,17 @@ package net.i2p.router.transport.udp; import java.net.InetAddress; +import java.util.concurrent.atomic.AtomicInteger; import net.i2p.data.SessionKey; /** - * + * Track the state of a peer test. + * Used only by PeerTestManager. */ class PeerTestState { - private long _testNonce; - private short _ourRole; + private final long _testNonce; + private final Role _ourRole; private InetAddress _aliceIP; private int _alicePort; private InetAddress _bobIP; @@ -22,22 +24,26 @@ class PeerTestState { private SessionKey _charlieIntroKey; private SessionKey _bobCipherKey; private SessionKey _bobMACKey; - private long _beginTime; + private final long _beginTime; private long _lastSendTime; private long _receiveAliceTime; private long _receiveBobTime; private long _receiveCharlieTime; - private int _packetsRelayed; + private final AtomicInteger _packetsRelayed = new AtomicInteger(); - public static final short ALICE = 1; - public static final short BOB = 2; - public static final short CHARLIE = 3; + public enum Role {ALICE, BOB, CHARLIE}; + public PeerTestState(Role role, long nonce, long now) { + _ourRole = role; + _testNonce = nonce; + _beginTime = now; + } + public long getNonce() { return _testNonce; } - public void setNonce(long nonce) { _testNonce = nonce; } + /** Are we Alice, bob, or Charlie. */ - public short getOurRole() { return _ourRole; } - public void setOurRole(short role) { _ourRole = role; } + public Role getOurRole() { return _ourRole; } + /** * If we are Alice, this will contain the IP that Bob says we * can be reached at - the IP Charlie says we can be reached @@ -79,47 +85,49 @@ class PeerTestState { /** when did this test begin? */ public long getBeginTime() { return _beginTime; } - public void setBeginTime(long when) { _beginTime = when; } + /** when did we last send out a packet? */ public long getLastSendTime() { return _lastSendTime; } public void setLastSendTime(long when) { _lastSendTime = when; } - /** when did we last hear from alice? */ + + /** + * when did we last hear from alice? + */ public long getReceiveAliceTime() { return _receiveAliceTime; } public void setReceiveAliceTime(long when) { _receiveAliceTime = when; } + /** when did we last hear from bob? */ public long getReceiveBobTime() { return _receiveBobTime; } public void setReceiveBobTime(long when) { _receiveBobTime = when; } + /** when did we last hear from charlie? */ public long getReceiveCharlieTime() { return _receiveCharlieTime; } public void setReceiveCharlieTime(long when) { _receiveCharlieTime = when; } - public int getPacketsRelayed() { return _packetsRelayed; } - public void incrementPacketsRelayed() { ++_packetsRelayed; } + /** @return new value */ + public int incrementPacketsRelayed() { return _packetsRelayed.incrementAndGet(); } @Override public String toString() { - StringBuilder buf = new StringBuilder(512); - buf.append("Role: "); - if (_ourRole == ALICE) buf.append("Alice"); - else if (_ourRole == BOB) buf.append("Bob"); - else if (_ourRole == CHARLIE) buf.append("Charlie"); - else buf.append("unkown!"); + StringBuilder buf = new StringBuilder(256); + buf.append("PeerTest ").append(_testNonce) + .append(" as ").append(_ourRole.toString()); if (_aliceIP != null) - buf.append(" alice: ").append(_aliceIP).append(':').append(_alicePort); + buf.append("; Alice: ").append(_aliceIP).append(':').append(_alicePort); if (_aliceIPFromCharlie != null) buf.append(" (fromCharlie ").append(_aliceIPFromCharlie).append(':').append(_alicePortFromCharlie).append(')'); if (_bobIP != null) - buf.append(" bob: ").append(_bobIP).append(':').append(_bobPort); + buf.append("; Bob: ").append(_bobIP).append(':').append(_bobPort); if (_charlieIP != null) - buf.append(" charlie: ").append(_charlieIP).append(':').append(_charliePort); - buf.append(" last send after ").append(_lastSendTime - _beginTime).append("ms"); + buf.append(" Charlie: ").append(_charlieIP).append(':').append(_charliePort); + buf.append("; last send after ").append(_lastSendTime - _beginTime); if (_receiveAliceTime > 0) - buf.append(" receive from alice after ").append(_receiveAliceTime - _beginTime).append("ms"); + buf.append("; rcvd from Alice after ").append(_receiveAliceTime - _beginTime); if (_receiveBobTime > 0) - buf.append(" receive from bob after ").append(_receiveBobTime - _beginTime).append("ms"); + buf.append("; rcvd from Bob after ").append(_receiveBobTime - _beginTime); if (_receiveCharlieTime > 0) - buf.append(" receive from charlie after ").append(_receiveCharlieTime - _beginTime).append("ms"); - buf.append(" packets relayed: ").append(_packetsRelayed); + buf.append("; rcvd from Charlie after ").append(_receiveCharlieTime - _beginTime); + buf.append("; pkts relayed: ").append(_packetsRelayed.get()); return buf.toString(); } } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java index 7bdf756f40333b5ee3e2a6a300c7a38790593c7a..179649de52f62853023553958355ca97e641db17 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java @@ -96,6 +96,8 @@ class UDPEndpoint { private DatagramSocket getSocket() { DatagramSocket socket = null; int port = _listenPort; + if (port > 0 && port < 1024) + _log.logAlways(Log.WARN, "Specified UDP port is " + port + ", ports lower than 1024 not recommended"); for (int i = 0; i < MAX_PORT_RETRIES; i++) { if (port <= 0) { @@ -113,7 +115,7 @@ class UDPEndpoint { break; } catch (SocketException se) { if (_log.shouldLog(Log.WARN)) - _log.warn("Binding to port " + port + " failed: " + se); + _log.warn("Binding to port " + port + " failed", se); } port = -1; } @@ -157,6 +159,7 @@ class UDPEndpoint { * @since 0.9.2 */ public void clearOutbound() { - _sender.clear(); + if (_sender != null) + _sender.clear(); } } 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 d3408db858b6db643f52c95dafaa3f96c110496c..3874a9d4f873fd878f96bcc115a0aee7f3c5295a 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -32,6 +32,7 @@ import net.i2p.router.CommSystemFacade; 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.router.transport.Transport; import net.i2p.router.transport.TransportBid; import net.i2p.router.transport.TransportImpl; @@ -51,6 +52,7 @@ import net.i2p.util.Translate; public class UDPTransport extends TransportImpl implements TimedWeightedPriorityMessageQueue.FailedListener { private final Log _log; private UDPEndpoint _endpoint; + private final Object _addDropLock = new Object(); /** Peer (Hash) to PeerState */ private final Map<Hash, PeerState> _peersByIdent; /** RemoteHostId to PeerState */ @@ -110,6 +112,13 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority */ public static final int DEFAULT_INTERNAL_PORT = 8887; + /** + * To prevent trouble. To be raised to 1024 in 0.9.4. + * + * @since 0.9.3 + */ + static final int MIN_PEER_PORT = 500; + /** Limits on port told to us by others, * We should have an exception if it matches the existing low port. */ @@ -404,7 +413,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority */ SessionKey getIntroKey() { return _introKey; } - public int getLocalPort() { return _externalListenPort; } + /** @deprecated unused */ + public int getLocalPort() { + return _endpoint != null ? _endpoint.getListenPort() : -1; + } + public InetAddress getLocalAddress() { return _externalListenHost; } public int getExternalPort() { return _externalListenPort; } @@ -708,7 +721,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private boolean getIsPortFixed() { String prop = _context.getProperty(PROP_FIXED_PORT); if (prop != null) - return Boolean.valueOf(prop).booleanValue(); + return Boolean.parseBoolean(prop); int status = getReachabilityStatus(); return status != CommSystemFacade.STATUS_REJECT_UNSOLICITED; } @@ -720,6 +733,23 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority PeerState getPeerState(RemoteHostId hostInfo) { return _peersByRemoteHost.get(hostInfo); } + + /** + * Get the states for all peers at the given remote host, ignoring port. + * Used for a last-chance search for a peer that changed port, by PacketHandler. + * @since 0.9.3 + */ + List<PeerState> getPeerStatesByIP(RemoteHostId hostInfo) { + List<PeerState> rv = new ArrayList(4); + byte[] ip = hostInfo.getIP(); + if (ip != null) { + for (PeerState ps : _peersByIdent.values()) { + if (DataHelper.eq(ip, ps.getRemoteIP())) + rv.add(ps); + } + } + return rv; + } /** * get the state for the peer with the given ident, or null @@ -729,6 +759,24 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return _peersByIdent.get(remotePeer); } + /** + * Remove and add to peersByRemoteHost map + * @since 0.9.3 + */ + public void changePeerPort(PeerState peer, int newPort) { + int oldPort; + synchronized (_addDropLock) { + oldPort = peer.getRemotePort(); + if (oldPort != newPort) { + _peersByRemoteHost.remove(peer.getRemoteHostId()); + peer.changePort(newPort); + _peersByRemoteHost.put(peer.getRemoteHostId(), peer); + } + } + if (_log.shouldLog(Log.WARN) && oldPort != newPort) + _log.warn("Changed port from " + oldPort + " to " + newPort + " for " + peer); + } + /** * For IntroductionManager * @return may be null if not started @@ -799,47 +847,69 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority boolean addRemotePeerState(PeerState peer) { if (_log.shouldLog(Log.INFO)) _log.info("Add remote peer state: " + peer); + synchronized(_addDropLock) { + return locked_addRemotePeerState(peer); + } + } + + private boolean locked_addRemotePeerState(PeerState peer) { Hash remotePeer = peer.getRemotePeer(); long oldEstablishedOn = -1; PeerState oldPeer = null; if (remotePeer != null) { - oldPeer = _peersByIdent.put(remotePeer, peer); - if ( (oldPeer != null) && (oldPeer != peer) ) { - // transfer over the old state/inbound message fragments/etc - peer.loadFrom(oldPeer); - oldEstablishedOn = oldPeer.getKeyEstablishedTime(); - } + oldPeer = _peersByIdent.put(remotePeer, peer); + if ( (oldPeer != null) && (oldPeer != peer) ) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Peer already connected (PBID): old=" + oldPeer + " new=" + peer); + // transfer over the old state/inbound message fragments/etc + peer.loadFrom(oldPeer); + oldEstablishedOn = oldPeer.getKeyEstablishedTime(); + } } + RemoteHostId remoteId = peer.getRemoteHostId(); if (oldPeer != null) { oldPeer.dropOutbound(); _introManager.remove(oldPeer); _expireEvent.remove(oldPeer); + RemoteHostId oldID = oldPeer.getRemoteHostId(); + if (!remoteId.equals(oldID)) { + // leak fix, remove old address + if (_log.shouldLog(Log.WARN)) + _log.warn(remotePeer + " changed address FROM " + oldID + " TO " + remoteId); + PeerState oldPeer2 = _peersByRemoteHost.remove(oldID); + // different ones in the two maps? shouldn't happen + if (oldPeer2 != oldPeer) { + oldPeer2.dropOutbound(); + _introManager.remove(oldPeer2); + _expireEvent.remove(oldPeer2); + } + } } - oldPeer = null; - - RemoteHostId remoteId = peer.getRemoteHostId(); - if (remoteId == null) return false; + // Should always be direct... except maybe for hidden mode? // or do we always know the IP by now? if (remoteId.getIP() == null && _log.shouldLog(Log.WARN)) _log.warn("Add indirect: " + peer); - oldPeer = _peersByRemoteHost.put(remoteId, peer); - if ( (oldPeer != null) && (oldPeer != peer) ) { + // don't do this twice + PeerState oldPeer2 = _peersByRemoteHost.put(remoteId, peer); + if (oldPeer2 != null && oldPeer2 != peer && oldPeer2 != oldPeer) { + // this shouldn't happen, should have been removed above + if (_log.shouldLog(Log.WARN)) + _log.warn("Peer already connected (PBRH): old=" + oldPeer2 + " new=" + peer); // transfer over the old state/inbound message fragments/etc - peer.loadFrom(oldPeer); - oldEstablishedOn = oldPeer.getKeyEstablishedTime(); - } - - if (oldPeer != null) { - oldPeer.dropOutbound(); - _introManager.remove(oldPeer); - _expireEvent.remove(oldPeer); + peer.loadFrom(oldPeer2); + oldEstablishedOn = oldPeer2.getKeyEstablishedTime(); + oldPeer2.dropOutbound(); + _introManager.remove(oldPeer2); + _expireEvent.remove(oldPeer2); } - - if ( (oldPeer != null) && (_log.shouldLog(Log.WARN)) ) - _log.warn("Peer already connected: old=" + oldPeer + " new=" + peer, new Exception("dup")); + + if (_log.shouldLog(Log.WARN) && _peersByIdent.size() != _peersByRemoteHost.size()) + _log.warn("Size Mismatch after add: " + peer + + " byIDsz = " + _peersByIdent.size() + + " byHostsz = " + _peersByRemoteHost.size()); _activeThrottle.unchoke(peer.getRemotePeer()); markReachable(peer.getRemotePeer(), peer.isInbound()); @@ -996,15 +1066,20 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority */ _log.info(buf.toString(), new Exception("Dropped by")); } - + synchronized(_addDropLock) { + locked_dropPeer(peer, shouldShitlist, why); + } + if (needsRebuild()) + rebuildExternalAddress(); + } + + private void locked_dropPeer(PeerState peer, boolean shouldShitlist, String why) { peer.dropOutbound(); peer.expireInboundMessages(); _introManager.remove(peer); _fragments.dropPeer(peer); PeerState altByIdent = null; - PeerState altByHost = null; - if (peer.getRemotePeer() != null) { dropPeerCapacities(peer); @@ -1018,9 +1093,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } RemoteHostId remoteId = peer.getRemoteHostId(); - if (remoteId != null) { - altByHost = _peersByRemoteHost.remove(remoteId); - } + PeerState altByHost = _peersByRemoteHost.remove(remoteId); + + if (altByIdent != altByHost && _log.shouldLog(Log.WARN)) + _log.warn("Mismatch on remove, RHID = " + remoteId + + " byID = " + altByIdent + + " byHost = " + altByHost + + " byIDsz = " + _peersByIdent.size() + + " byHostsz = " + _peersByRemoteHost.size()); // unchoke 'em, but just because we'll never talk again... _activeThrottle.unchoke(peer.getRemotePeer()); @@ -1029,12 +1109,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // _flooder.removePeer(peer); _expireEvent.remove(peer); - if (needsRebuild()) - rebuildExternalAddress(); - // deal with races to make sure we drop the peers fully - if ( (altByIdent != null) && (peer != altByIdent) ) dropPeer(altByIdent, shouldShitlist, "recurse"); - if ( (altByHost != null) && (peer != altByHost) ) dropPeer(altByHost, shouldShitlist, "recurse"); + if ( (altByIdent != null) && (peer != altByIdent) ) locked_dropPeer(altByIdent, shouldShitlist, "recurse"); + if ( (altByHost != null) && (peer != altByHost) ) locked_dropPeer(altByHost, shouldShitlist, "recurse"); } private boolean needsRebuild() { @@ -1145,20 +1222,33 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } /** - * Send a session destroy message to everybody - * BLOCKING if OB queue is full. + * Send a session destroy message to everybody. + * BLOCKING for at least 1 sec per 1K peers, more if BW is very low or if OB queue is full. * * @since 0.8.9 */ private void destroyAll() { _endpoint.clearOutbound(); int howMany = _peersByIdent.size(); + // use no more than 1/4 of configured bandwidth + final int burst = 8; + int pps = Math.max(48, (_context.bandwidthLimiter().getOutboundKBytesPerSecond() * 1000 / 4) / 48); + int burstps = pps / burst; + // max of 1000 pps + int toSleep = Math.max(8, (1000 / burstps)); + int count = 0; if (_log.shouldLog(Log.WARN)) _log.warn("Sending destroy to : " + howMany + " peers"); for (PeerState peer : _peersByIdent.values()) { sendDestroy(peer); + // 1000 per second * 48 bytes = 400 KBps + if ((++count) % burst == 0) { + try { + Thread.sleep(toSleep); + } catch (InterruptedException ie) {} + } } - int toSleep = Math.min(howMany / 3, 750); + toSleep = Math.min(howMany / 3, 750); if (toSleep > 0) { try { Thread.sleep(toSleep); @@ -1205,7 +1295,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (addr.getOption("ihost0") == null) { byte[] ip = addr.getIP(); int port = addr.getPort(); - if (ip == null || port <= 0 || + if (ip == null || port < MIN_PEER_PORT || (!isValid(ip)) || Arrays.equals(ip, getExternalIP())) { markUnreachable(to); @@ -1503,7 +1593,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority * it's usually false positives. ****************** String forceIntroducers = _context.getProperty(PROP_FORCE_INTRODUCERS); - if ( (forceIntroducers != null) && (Boolean.valueOf(forceIntroducers).booleanValue()) ) { + if ( (forceIntroducers != null) && (Boolean.parseBoolean(forceIntroducers)) ) { if (_log.shouldLog(Log.INFO)) _log.info("Force introducers specified"); return true; @@ -1526,6 +1616,24 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } + /** + * For EstablishmentManager + * @since 0.9.3 + */ + boolean canIntroduce() { + // we don't expect inbound connections when hidden, but it could happen + // 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. + return + (!_context.router().isHidden()) && + (!introducersRequired()) && + haveCapacity() && + (!((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) && + _introManager.introducedCount() < IntroductionManager.MAX_OUTBOUND && + _introManager.introducedCount() < getMaxConnections() / 4; + } + /** default true */ private boolean allowDirectUDP() { return _context.getBooleanPropertyDefaultTrue(PROP_ALLOW_DIRECT); @@ -1688,7 +1796,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } public boolean allowConnection() { - return _peersByIdent.size() < getMaxConnections(); } @@ -1698,20 +1805,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority */ @Override public Vector<Long> getClockSkews() { - Vector<Long> skews = new Vector(); - Vector<PeerState> peers = new Vector(); - - peers.addAll(_peersByIdent.values()); // If our clock is way off, we may not have many (or any) successful connections, // so try hard in that case to return good data - boolean includeEverybody = _context.router().getUptime() < 10*60*1000 || peers.size() < 10; + boolean includeEverybody = _context.router().getUptime() < 10*60*1000 || _peersByIdent.size() < 10; long now = _context.clock().now(); - for (Iterator<PeerState> iter = peers.iterator(); iter.hasNext(); ) { - PeerState peer = iter.next(); - if ((!includeEverybody) && now - peer.getLastReceiveTime() > 15*60*1000) + for (PeerState peer : _peersByIdent.values()) { + if ((!includeEverybody) && now - peer.getLastReceiveTime() > 5*60*1000) continue; // skip old peers + if (peer.getRTT() > PeerState.INIT_RTT - 250) + continue; // Big RTT makes for a poor calculation skews.addElement(Long.valueOf(peer.getClockSkew() / 1000)); } if (_log.shouldLog(Log.DEBUG)) @@ -1744,7 +1848,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final int FLAG_CWND= 6; private static final int FLAG_SSTHRESH = 7; private static final int FLAG_RTT = 8; - private static final int FLAG_DEV = 9; + //private static final int FLAG_DEV = 9; private static final int FLAG_RTO = 10; private static final int FLAG_MTU = 11; private static final int FLAG_SEND = 12; @@ -1784,9 +1888,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority case FLAG_RTT: rv = RTTComparator.instance(); break; - case FLAG_DEV: - rv = DevComparator.instance(); - break; + //case FLAG_DEV: + // rv = DevComparator.instance(); + // break; case FLAG_RTO: rv = RTOComparator.instance(); break; @@ -1927,6 +2031,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return rv; } } + + /*** private static class DevComparator extends PeerComparator { private static final DevComparator _instance = new DevComparator(); public static final DevComparator instance() { return _instance; } @@ -1939,6 +2045,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return (int)rv; } } + ****/ + + /** */ private static class RTOComparator extends PeerComparator { private static final RTOComparator _instance = new RTOComparator(); public static final RTOComparator instance() { return _instance; } @@ -2088,8 +2197,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append("</th>\n"); buf.append("<th class=\"smallhead\" nowrap><a href=\"#def.rtt\">RTT</a><br>"); appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time"), FLAG_RTT); - buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.dev\">").append(_("Dev")).append("</a><br>"); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time deviation"), FLAG_DEV); + //buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.dev\">").append(_("Dev")).append("</a><br>"); + //appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time deviation"), FLAG_DEV); buf.append("</th><th class=\"smallhead\" nowrap><a href=\"#def.rto\">RTO</a><br>"); appendSortLinks(buf, urlBase, sortFlags, _("Sort by retransmission timeout"), FLAG_RTO); buf.append("</th>\n"); @@ -2212,9 +2321,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append(DataHelper.formatDuration2(rtt)); buf.append("</td>"); - buf.append("<td class=\"cells\" align=\"right\">"); - buf.append(DataHelper.formatDuration2(peer.getRTTDeviation())); - buf.append("</td>"); + //buf.append("<td class=\"cells\" align=\"right\">"); + //buf.append(DataHelper.formatDuration2(peer.getRTTDeviation())); + //buf.append("</td>"); buf.append("<td class=\"cells\" align=\"right\">"); buf.append(DataHelper.formatDuration2(rto)); @@ -2291,7 +2400,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append("</b></td><td> </td>\n" + "<td align=\"center\"><b>"); buf.append(numPeers > 0 ? DataHelper.formatDuration2(rttTotal/numPeers) : '0'); - buf.append("</b></td><td> </td><td align=\"center\"><b>"); + //buf.append("</b></td><td> </td><td align=\"center\"><b>"); + buf.append("</b></td><td align=\"center\"><b>"); buf.append(numPeers > 0 ? DataHelper.formatDuration2(rtoTotal/numPeers) : '0'); buf.append("</b></td><td align=\"center\"><b>").append(_mtu).append("</b></td><td align=\"center\"><b>"); buf.append(sendTotal).append("</b></td><td align=\"center\"><b>").append(recvTotal).append("</b></td>\n" + @@ -2365,9 +2475,18 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } private class ExpirePeerEvent extends SimpleTimer2.TimedEvent { + // TODO why have separate Set, just use _peersByIdent.values() private final Set<PeerState> _expirePeers; private final List<PeerState> _expireBuffer; private volatile boolean _alive; + private int _runCount; + // we've seen firewalls change ports after 40 seconds + private static final long PING_FIREWALL_TIME = 30*1000; + private static final long PING_FIREWALL_CUTOFF = PING_FIREWALL_TIME / 2; + // ping 1/4 of the peers every loop + private static final int SLICES = 4; + private static final long SHORT_LOOP_TIME = PING_FIREWALL_CUTOFF / (SLICES + 1); + private static final long LONG_LOOP_TIME = 25*1000; public ExpirePeerEvent() { super(_context.simpleTimer2()); @@ -2381,10 +2500,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _expireTimeout = Math.min(_expireTimeout + 15*1000, EXPIRE_TIMEOUT); else _expireTimeout = Math.max(_expireTimeout - 45*1000, MIN_EXPIRE_TIMEOUT); - long shortInactivityCutoff = _context.clock().now() - _expireTimeout; - long longInactivityCutoff = _context.clock().now() - EXPIRE_TIMEOUT; - long pingCutoff = _context.clock().now() - (2 * 60*60*1000); + long now = _context.clock().now(); + long shortInactivityCutoff = now - _expireTimeout; + long longInactivityCutoff = now - EXPIRE_TIMEOUT; + long pingCutoff = now - (2 * 60*60*1000); + long pingFirewallCutoff = now - PING_FIREWALL_CUTOFF; + boolean shouldPingFirewall = _reachabilityStatus != CommSystemFacade.STATUS_OK; + boolean pingOneOnly = shouldPingFirewall && _externalListenPort == _endpoint.getListenPort(); + boolean shortLoop = shouldPingFirewall; _expireBuffer.clear(); + _runCount++; for (Iterator<PeerState> iter = _expirePeers.iterator(); iter.hasNext(); ) { PeerState peer = iter.next(); @@ -2397,7 +2522,25 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if ( (peer.getLastReceiveTime() < inactivityCutoff) && (peer.getLastSendTime() < inactivityCutoff) ) { _expireBuffer.add(peer); iter.remove(); - } + } else if (shouldPingFirewall && + ((_runCount ^ peer.hashCode()) & (SLICES - 1)) == 0 && + peer.getLastSendOrPingTime() < pingFirewallCutoff && + peer.getLastReceiveTime() < pingFirewallCutoff) { + // ping if firewall is mapping the port to keep port the same... + // if the port changes we are screwed + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Pinging for firewall: " + peer); + // don't update or idle time won't be right and peer won't get dropped + // TODO if both sides are firewalled should only one ping + // or else session will stay open forever? + //peer.setLastSendTime(now); + send(_destroyBuilder.buildPing(peer)); + peer.setLastPingTime(now); + // If external port is different, it may be changing the port for every + // session, so ping all of them. Otherwise only one. + if (pingOneOnly) + shouldPingFirewall = false; + } } for (PeerState peer : _expireBuffer) { @@ -2407,18 +2550,21 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _expireBuffer.clear(); if (_alive) - schedule(30*1000); + schedule(shortLoop ? SHORT_LOOP_TIME : LONG_LOOP_TIME); } + public void add(PeerState peer) { _expirePeers.add(peer); } + public void remove(PeerState peer) { _expirePeers.remove(peer); } + public void setIsAlive(boolean isAlive) { _alive = isAlive; if (isAlive) { - reschedule(30*1000); + reschedule(LONG_LOOP_TIME); } else { cancel(); _expirePeers.clear(); @@ -2507,8 +2653,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (peerInfo == null) continue; RouterAddress addr = peerInfo.getTargetAddress(STYLE); - if (addr != null) - return peer; + if (addr == null) + continue; + byte[] ip = addr.getIP(); + if (ip == null) + continue; + if (DataHelper.eq(ip, 0, getExternalIP(), 0, 2)) + continue; + return peer; } return null; } 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 34eaee9efab37ed4355633f3b94ea9f56e6afb26..6303b385c4efde96761776569dea8eb7fad55fae 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java @@ -392,6 +392,7 @@ class BuildExecutor implements Runnable { pools.clear(); } catch (RuntimeException e) { _log.log(Log.CRIT, "B0rked in the tunnel builder", e); + try { Thread.sleep(LOOP_TIME); } catch (InterruptedException ie) {} } } 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 7679ed955cdc13a3b675a3f57a62b4f8bdb59671..a1c6f2ab7d21a43e7771f3c4f62d2159c532d96b 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java @@ -460,7 +460,7 @@ public abstract class TunnelPeerSelector { else val = ctx.getProperty(PROP_OUTBOUND_CLIENT_EXCLUDE_UNREACHABLE, DEFAULT_OUTBOUND_CLIENT_EXCLUDE_UNREACHABLE); - boolean rv = (val != null ? Boolean.valueOf(val).booleanValue() : def); + boolean rv = (val != null ? Boolean.parseBoolean(val) : def); //System.err.println("Filter unreachable? " + rv + " (inbound? " + isInbound + ", exploratory? " + isExploratory); return rv; } @@ -490,7 +490,7 @@ public abstract class TunnelPeerSelector { else val = ctx.getProperty(PROP_OUTBOUND_CLIENT_EXCLUDE_SLOW); - boolean rv = (val != null ? Boolean.valueOf(val).booleanValue() : def); + boolean rv = (val != null ? Boolean.parseBoolean(val) : def); //System.err.println("Filter unreachable? " + rv + " (inbound? " + isInbound + ", exploratory? " + isExploratory); return rv; } @@ -519,7 +519,7 @@ public abstract class TunnelPeerSelector { else val = ctx.getProperty(PROP_OUTBOUND_CLIENT_EXCLUDE_UPTIME); - boolean rv = (val != null ? Boolean.valueOf(val).booleanValue() : def); + boolean rv = (val != null ? Boolean.parseBoolean(val) : def); //System.err.println("Filter unreachable? " + rv + " (inbound? " + isInbound + ", exploratory? " + isExploratory); return rv; } 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 1668ecb05bc8abe7e546fc562b25375ded01bebd..8304a1c7098d7d8ae69187c6876e9e2a31926413 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java @@ -75,7 +75,7 @@ public class TunnelPool { * Destination (i.e. for servers or clients w/ persistent key, * or restarting close-on-idle clients) */ - void startup() { + synchronized void startup() { synchronized (_inProgress) { _inProgress.clear(); } @@ -102,7 +102,7 @@ public class TunnelPool { new long[] { 5*60*1000l }); } - void shutdown() { + synchronized void shutdown() { if (_log.shouldLog(Log.WARN)) _log.warn(toString() + ": Shutdown called"); _alive = false; 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 bda1fe727fd3a075aa36580136492185d85adffd..1b6c424eca69dfa9b61a9c8fa7c6e5b736013c99 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -37,8 +37,8 @@ public class TunnelPoolManager implements TunnelManagerFacade { private final Map<Hash, TunnelPool> _clientInboundPools; /** Hash (destination) to TunnelPool */ private final Map<Hash, TunnelPool> _clientOutboundPools; - private TunnelPool _inboundExploratory; - private TunnelPool _outboundExploratory; + private final TunnelPool _inboundExploratory; + private final TunnelPool _outboundExploratory; private final BuildExecutor _executor; private final BuildHandler _handler; private final TunnelPeerSelector _clientPeerSelector; @@ -62,10 +62,15 @@ public class TunnelPoolManager implements TunnelManagerFacade { _clientInboundPools = new ConcurrentHashMap(4); _clientOutboundPools = new ConcurrentHashMap(4); _clientPeerSelector = new ClientPeerSelector(ctx); + + ExploratoryPeerSelector selector = new ExploratoryPeerSelector(_context); + TunnelPoolSettings inboundSettings = new TunnelPoolSettings(true, true); + _inboundExploratory = new TunnelPool(_context, this, inboundSettings, selector); + TunnelPoolSettings outboundSettings = new TunnelPoolSettings(true, false); + _outboundExploratory = new TunnelPool(_context, this, outboundSettings, selector); + // threads will be started in startup() _executor = new BuildExecutor(ctx, this); - I2PThread execThread = new I2PThread(_executor, "BuildExecutor", true); - execThread.start(); _handler = new BuildHandler(ctx, this, _executor); int numHandlerThreads; int share = TunnelDispatcher.getShareBandwidth(ctx); @@ -76,10 +81,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { else numHandlerThreads = 1; _numHandlerThreads = ctx.getProperty("router.buildHandlerThreads", numHandlerThreads); - for (int i = 1; i <= _numHandlerThreads; i++) { - I2PThread hThread = new I2PThread(_handler, "BuildHandler " + i + '/' + numHandlerThreads, true); - hThread.start(); - } // The following are for TestJob ctx.statManager().createRequiredRateStat("tunnel.testFailedTime", "Time for tunnel test failure (ms)", "Tunnels", @@ -104,9 +105,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { * @return null if none */ public TunnelInfo selectInboundTunnel() { - TunnelPool pool = _inboundExploratory; - if (pool == null) return null; - TunnelInfo info = pool.selectTunnel(); + TunnelInfo info = _inboundExploratory.selectTunnel(); if (info == null) { _inboundExploratory.buildFallback(); // still can be null, but probably not @@ -139,13 +138,11 @@ public class TunnelPoolManager implements TunnelManagerFacade { * @return null if none */ public TunnelInfo selectOutboundTunnel() { - TunnelPool pool = _outboundExploratory; - if (pool == null) return null; - TunnelInfo info = pool.selectTunnel(); + TunnelInfo info = _outboundExploratory.selectTunnel(); if (info == null) { - pool.buildFallback(); + _outboundExploratory.buildFallback(); // still can be null, but probably not - info = pool.selectTunnel(); + info = _outboundExploratory.selectTunnel(); } return info; } @@ -176,9 +173,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { * @since 0.8.10 */ public TunnelInfo selectInboundExploratoryTunnel(Hash closestTo) { - TunnelPool pool = _inboundExploratory; - if (pool == null) return null; - TunnelInfo info = pool.selectTunnel(); + TunnelInfo info = _inboundExploratory.selectTunnel(); if (info == null) { _inboundExploratory.buildFallback(); // still can be null, but probably not @@ -222,13 +217,11 @@ public class TunnelPoolManager implements TunnelManagerFacade { * @since 0.8.10 */ public TunnelInfo selectOutboundExploratoryTunnel(Hash closestTo) { - TunnelPool pool = _outboundExploratory; - if (pool == null) return null; - TunnelInfo info = pool.selectTunnel(); + TunnelInfo info = _outboundExploratory.selectTunnel(); if (info == null) { - pool.buildFallback(); + _outboundExploratory.buildFallback(); // still can be null, but probably not - info = pool.selectTunnel(closestTo); + info = _outboundExploratory.selectTunnel(closestTo); } return info; } @@ -261,14 +254,10 @@ public class TunnelPoolManager implements TunnelManagerFacade { if (info != null) return info; } - if (_inboundExploratory != null) { - info = _inboundExploratory.getTunnel(id); - if (info != null) return info; - } - if (_outboundExploratory != null) { - info = _outboundExploratory.getTunnel(id); - if (info != null) return info; - } + info = _inboundExploratory.getTunnel(id); + if (info != null) return info; + info = _outboundExploratory.getTunnel(id); + if (info != null) return info; return null; } @@ -282,9 +271,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { /** @return number of outbound exploratory tunnels */ public int getOutboundTunnelCount() { - if (_outboundExploratory == null) - return 0; - else return _outboundExploratory.size(); } @@ -507,22 +493,15 @@ public class TunnelPoolManager implements TunnelManagerFacade { public synchronized void startup() { _isShutdown = false; if (!_executor.isRunning()) { - I2PThread t = new I2PThread(_executor, "BuildExecutor"); - t.setDaemon(true); + I2PThread t = new I2PThread(_executor, "BuildExecutor", true); t.start(); + for (int i = 1; i <= _numHandlerThreads; i++) { + I2PThread hThread = new I2PThread(_handler, "BuildHandler " + i + '/' + _numHandlerThreads, true); + hThread.start(); + } } - ExploratoryPeerSelector selector = new ExploratoryPeerSelector(_context); - TunnelPoolSettings inboundSettings = new TunnelPoolSettings(); - inboundSettings.setIsExploratory(true); - inboundSettings.setIsInbound(true); - _inboundExploratory = new TunnelPool(_context, this, inboundSettings, selector); _inboundExploratory.startup(); - - TunnelPoolSettings outboundSettings = new TunnelPoolSettings(); - outboundSettings.setIsExploratory(true); - outboundSettings.setIsInbound(false); - _outboundExploratory = new TunnelPool(_context, this, outboundSettings, selector); _context.simpleScheduler().addEvent(new DelayedStartup(_outboundExploratory), 3*1000); // try to build up longer tunnels @@ -554,9 +533,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } private void shutdownExploratory() { - if (_inboundExploratory != null) _inboundExploratory.shutdown(); - if (_outboundExploratory != null) _outboundExploratory.shutdown(); } @@ -564,10 +541,8 @@ public class TunnelPoolManager implements TunnelManagerFacade { public void listPools(List<TunnelPool> out) { out.addAll(_clientInboundPools.values()); out.addAll(_clientOutboundPools.values()); - if (_inboundExploratory != null) - out.add(_inboundExploratory); - if (_outboundExploratory != null) - out.add(_outboundExploratory); + out.add(_inboundExploratory); + out.add(_outboundExploratory); } void tunnelFailed() { _executor.repoll(); } BuildExecutor getExecutor() { return _executor; } @@ -639,12 +614,18 @@ public class TunnelPoolManager implements TunnelManagerFacade { return new HashMap(_clientOutboundPools); } - /** for TunnelRenderer in router console */ + /** + * For TunnelRenderer in router console + * @return non-null + */ public TunnelPool getInboundExploratoryPool() { return _inboundExploratory; } - /** for TunnelRenderer in router console */ + /** + * For TunnelRenderer in router console + * @return non-null + */ public TunnelPool getOutboundExploratoryPool() { return _outboundExploratory; } @@ -658,13 +639,11 @@ public class TunnelPoolManager implements TunnelManagerFacade { * @since 0.8.13 */ public void fail(Hash peer) { - if (_outboundExploratory != null) - failTunnelsWithFirstHop(_outboundExploratory, peer); + failTunnelsWithFirstHop(_outboundExploratory, peer); for (TunnelPool pool : _clientOutboundPools.values()) { failTunnelsWithFirstHop(pool, peer); } - if (_inboundExploratory != null) - failTunnelsWithLastHop(_inboundExploratory, peer); + failTunnelsWithLastHop(_inboundExploratory, peer); for (TunnelPool pool : _clientInboundPools.values()) { failTunnelsWithLastHop(pool, peer); } diff --git a/router/java/src/net/i2p/router/util/EventLog.java b/router/java/src/net/i2p/router/util/EventLog.java index 9a2d9d20e114cfe080d320561f078929613f2114..70eb9ea3db1333532490c36372e4164ccf1f766b 100644 --- a/router/java/src/net/i2p/router/util/EventLog.java +++ b/router/java/src/net/i2p/router/util/EventLog.java @@ -37,9 +37,11 @@ public class EventLog { public static final String CHANGE_PORT = "changePort"; public static final String CLOCK_SHIFT = "clockShift"; public static final String CRASHED = "crashed"; + public static final String CRITICAL = "critical"; public static final String INSTALLED = "installed"; public static final String INSTALL_FAILED = "intallFailed"; public static final String NEW_IDENT = "newIdent"; + public static final String OOM = "oom"; public static final String REKEYED = "rekeyed"; public static final String SOFT_RESTART = "softRestart"; public static final String STARTED = "started"; @@ -48,12 +50,11 @@ public class EventLog { public static final String WATCHDOG = "watchdog"; /** - * @param file must be absolute - * @throws IllegalArgumentException if not absolute + * @param file should be absolute */ public EventLog(I2PAppContext ctx, File file) { - if (!file.isAbsolute()) - throw new IllegalArgumentException(); + //if (!file.isAbsolute()) + // throw new IllegalArgumentException(); _context = ctx; _file = file; _cache = new HashMap(4); @@ -128,7 +129,7 @@ public class EventLog { continue; Long ltime = Long.valueOf(time); String info = s.length > 2 ? s[2] : ""; - rv.put(time, info); + rv.put(ltime, info); } catch (IndexOutOfBoundsException ioobe) { } catch (NumberFormatException nfe) { } diff --git a/router/java/src/net/i2p/router/util/RFC822Date.java b/router/java/src/net/i2p/router/util/RFC822Date.java index 6635bca8cfa3cc02e0500c8e6447ec7502d5189f..2ae4d45696355d73bfc980188421d2adea1ce120 100644 --- a/router/java/src/net/i2p/router/util/RFC822Date.java +++ b/router/java/src/net/i2p/router/util/RFC822Date.java @@ -11,20 +11,24 @@ import java.util.Locale; */ public abstract class RFC822Date { + // SimpleDateFormat is not thread-safe, methods must be synchronized + + private static final SimpleDateFormat OUTPUT_FORMAT = new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US); + /** * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html * Apparently public domain * Probably don't need all of these... */ private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] { + OUTPUT_FORMAT, new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z", Locale.US), new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US), new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US), new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US), new SimpleDateFormat("d MMM yy HH:mm z", Locale.US), new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US), - new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US) + new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US) }; /** @@ -33,7 +37,7 @@ public abstract class RFC822Date { * @param s non-null * @return -1 on failure */ - public static long parse822Date(String s) { + public synchronized static long parse822Date(String s) { for (int i = 0; i < rfc822DateFormats.length; i++) { try { Date date = rfc822DateFormats[i].parse(s); @@ -44,8 +48,12 @@ public abstract class RFC822Date { return -1; } - /** @since 0.8.2 */ - public static String to822Date(long t) { - return (new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)).format(new Date(t)); + /** + * Format is "d MMM yyyy HH:mm:ss z" + * + * @since 0.8.2 + */ + public synchronized static String to822Date(long t) { + return OUTPUT_FORMAT.format(new Date(t)); } }