aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/debian/changelog125
-rw-r--r--contrib/debian/control55
-rw-r--r--contrib/debian/examples/bitcoin.conf14
-rwxr-xr-xcontrib/debian/rules4
-rwxr-xr-xcontrib/devtools/check-doc.py2
-rwxr-xr-xcontrib/devtools/commit-script-check.sh46
-rwxr-xr-xcontrib/devtools/copyright_header.py2
-rwxr-xr-xcontrib/devtools/github-merge.py144
-rwxr-xr-xcontrib/filter-lcov.py25
-rw-r--r--contrib/gitian-descriptors/gitian-linux.yml10
-rw-r--r--contrib/gitian-descriptors/gitian-osx.yml10
-rw-r--r--contrib/gitian-descriptors/gitian-win.yml19
-rw-r--r--contrib/gitian-keys/laanwj-key.pgpbin1713 -> 17689 bytes
-rw-r--r--contrib/init/README.md4
-rw-r--r--contrib/init/bitcoind.openrcconf2
-rw-r--r--contrib/linearize/README.md3
-rw-r--r--contrib/linearize/example-linearize.cfg1
-rwxr-xr-xcontrib/linearize/linearize-hashes.py23
-rwxr-xr-xcontrib/macdeploy/detached-sig-create.sh2
-rwxr-xr-xcontrib/macdeploy/macdeployqtplus6
-rw-r--r--contrib/rpm/README.md2
-rw-r--r--contrib/rpm/bitcoin.if2
-rw-r--r--contrib/rpm/bitcoin.spec6
-rw-r--r--contrib/seeds/README.md2
-rwxr-xr-xcontrib/seeds/makeseeds.py2
-rw-r--r--contrib/seeds/nodes_main.txt2054
-rwxr-xr-xcontrib/testgen/gen_base58_test_vectors.py2
-rw-r--r--contrib/verify-commits/allow-revsig-commits104
-rwxr-xr-xcontrib/verify-commits/gpg.sh45
-rw-r--r--contrib/verify-commits/trusted-keys4
-rw-r--r--contrib/verify-commits/trusted-sha512-root-commit1
-rwxr-xr-xcontrib/verify-commits/verify-commits.sh149
-rw-r--r--contrib/verifybinaries/README.md8
-rwxr-xr-xcontrib/verifybinaries/verify.sh74
-rwxr-xr-xcontrib/windeploy/detached-sig-create.sh34
-rw-r--r--contrib/windeploy/win-codesign.cert99
-rwxr-xr-xcontrib/zmq/zmq_sub.py97
-rwxr-xr-xcontrib/zmq/zmq_sub3.4.py89
38 files changed, 2201 insertions, 1070 deletions
diff --git a/contrib/debian/changelog b/contrib/debian/changelog
index 110bfe03ef..33dab9b638 100644
--- a/contrib/debian/changelog
+++ b/contrib/debian/changelog
@@ -1,3 +1,122 @@
+bitcoin (0.14.1-trusty4) trusty; urgency=medium
+
+ * Re-enable UPnP support.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Fri, 05 May 2017 13:28:00 -0400
+
+bitcoin (0.14.1-trusty3) trusty; urgency=medium
+
+ * Build with qt5 if we are on a non-Ubuntu (ie non-Unity) distro.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 04 May 2017 17:13:00 -0400
+
+bitcoin (0.14.1-trusty2) trusty; urgency=medium
+
+ * Bump minimum boost version in deps.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 04 May 2017 17:12:00 -0400
+
+bitcoin (0.14.1-trusty1) trusty; urgency=medium
+
+ * New upstream release.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Sat, 22 Apr 2017 17:10:00 -0400
+
+bitcoin (0.14.0-trusty1) trusty; urgency=medium
+
+ * New upstream release.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Wed, 08 Mar 2017 10:30:00 -0500
+
+bitcoin (0.13.2-trusty1) trusty; urgency=medium
+
+ * New upstream release.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 05 Jan 2017 09:59:00 -0500
+
+bitcoin (0.13.1-trusty2) trusty; urgency=medium
+
+ * Revert to Qt4, due to https://github.com/bitcoin/bitcoin/issues/9038
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Mon, 31 Oct 2016 11:16:00 -0400
+
+bitcoin (0.13.1-trusty1) trusty; urgency=medium
+
+ * New upstream release.
+ * Backport updated bitcoin-qt.desktop from upstream master
+ * Add zmq dependency
+ * Switch to Qt5 (breaks precise, but that was already broken by C++11)
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 27 Oct 2016 17:32:00 -0400
+
+bitcoin (0.13.0-trusty1) trusty; urgency=medium
+
+ * New upstream release.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Sun, 04 Sep 2016 22:09:00 -0400
+
+bitcoin (0.12.1-trusty1) trusty; urgency=medium
+
+ * New upstream release.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Mon, 18 Apr 2016 14:26:00 -0700
+
+bitcoin (0.12.0-trusty6) trusty; urgency=medium
+
+ * Fix program-options dep.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Fri, 25 Mar 2016 21:41:00 -0700
+
+bitcoin (0.12.0-trusty5) trusty; urgency=medium
+
+ * Test explicit --with-gui
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 23:25:00 -0800
+
+bitcoin (0.12.0-trusty4) trusty; urgency=medium
+
+ * Fix libevent-dev dep.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 23:25:00 -0800
+
+bitcoin (0.12.0-trusty3) trusty; urgency=medium
+
+ * Fix precise boost dep.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 19:55:00 -0800
+
+bitcoin (0.12.0-trusty2) trusty; urgency=medium
+
+ * Fix libevent dep.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 19:53:00 -0800
+
+bitcoin (0.12.0-trusty1) trusty; urgency=medium
+
+ * New upstream release
+ * Various updates to contrib/debian were merged, a few were not
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 19:29:00 -0800
+
+bitcoin (0.11.2-trusty1) trusty; urgency=low
+
+ * New upstream release.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Fri, 13 Nov 2015 18:39:00 -0800
+
+bitcoin (0.11.1-trusty2) trusty; urgency=low
+
+ * Remove minupnpc builddep.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Wed, 14 Oct 2015 23:06:00 -1000
+
+bitcoin (0.11.1-trusty1) trusty; urgency=high
+
+ * New upstream release.
+ * Disable all UPnP support.
+
+ -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Wed, 14 Oct 2015 13:57:00 -1000
+
bitcoin (0.11.0-precise1) precise; urgency=medium
* New upstream release.
@@ -179,7 +298,7 @@ bitcoin (0.5.3-natty0) natty; urgency=low
bitcoin (0.5.2-natty1) natty; urgency=low
* Remove mentions on anonymity in package descriptions and manpage.
- These should never have been there, bitcoin isn't anonymous without
+ These should never have been there, bitcoin isnt anonymous without
a ton of work that virtually no users will ever be willing and
capable of doing
@@ -220,7 +339,7 @@ bitcoin (0.5.0~rc1-natty1) natty; urgency=low
* Add test_bitcoin to build test
* Fix clean
- * Remove unnecessary build-dependancies
+ * Remove uneccessary build-dependancies
-- Matt Corallo <matt@bluematt.me> Wed, 26 Oct 2011 14:37:18 -0400
@@ -380,7 +499,7 @@ bitcoin (0.3.20.01~dfsg-1) unstable; urgency=low
bitcoin (0.3.19~dfsg-6) unstable; urgency=low
- * Fix override aggressive optimizations.
+ * Fix override agressive optimizations.
* Fix tighten build-dependencies to really fit backporting to Lenny:
+ Add fallback build-dependency on libdb4.6++-dev.
+ Tighten unversioned Boost build-dependencies to recent versions,
diff --git a/contrib/debian/control b/contrib/debian/control
index fce6bc0118..0d6ad25e24 100644
--- a/contrib/debian/control
+++ b/contrib/debian/control
@@ -1,27 +1,30 @@
Source: bitcoin
Section: utils
Priority: optional
-Maintainer: Jonas Smedegaard <dr@jones.dk>
-Uploaders: Micah Anderson <micah@debian.org>
+Maintainer: Matt Corallo <matt@mattcorallo.com>
+Uploaders: Matt Corallo <matt@mattcorallo.com>
Build-Depends: debhelper,
devscripts,
automake,
libtool,
bash-completion,
- libboost-system-dev (>> 1.35) | libboost-system1.35-dev,
libdb4.8++-dev,
libssl-dev,
pkg-config,
- libminiupnpc8-dev | libminiupnpc-dev (>> 1.6),
- libboost-filesystem-dev (>> 1.35) | libboost-filesystem1.35-dev,
- libboost-program-options-dev (>> 1.35) | libboost-program-options1.35-dev,
- libboost-thread-dev (>> 1.35) | libboost-thread1.35-dev,
- libboost-test-dev (>> 1.35) | libboost-test1.35-dev,
- qt4-qmake,
- libqt4-dev,
+ libevent-dev,
+ libboost-system1.48-dev | libboost-system-dev (>> 1.47),
+ libboost-filesystem1.48-dev | libboost-filesystem-dev (>> 1.47),
+ libboost-program-options1.48-dev | libboost-program-options-dev (>> 1.47),
+ libboost-thread1.48-dev | libboost-thread-dev (>> 1.47),
+ libboost-test1.48-dev | libboost-test-dev (>> 1.47),
+ libboost-chrono1.48-dev | libboost-chrono-dev (>> 1.47),
+ libminiupnpc8-dev | libminiupnpc-dev,
+ qt4-qmake, libqt4-dev,
+ qttools5-dev-tools, qttools5-dev,
libqrencode-dev,
libprotobuf-dev, protobuf-compiler,
- python
+ python,
+ libzmq3-dev
Standards-Version: 3.9.2
Homepage: https://bitcoincore.org/
Vcs-Git: git://github.com/bitcoin/bitcoin.git
@@ -31,11 +34,11 @@ Package: bitcoind
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: peer-to-peer network based digital currency - daemon
- Bitcoin is an experimental new digital currency that enables instant
- payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer
- technology to operate with no central authority: managing transactions
- and issuing money are carried out collectively by the network. Bitcoin Core
- is the name of the open source software which enables the use of this currency.
+ Bitcoin is a free open source peer-to-peer electronic cash system that
+ is completely decentralized, without the need for a central server or
+ trusted parties. Users hold the crypto keys to their own money and
+ transact directly with each other, with the help of a P2P network to
+ check for double-spending.
.
This package provides the daemon, bitcoind, and the CLI tool
bitcoin-cli to interact with the daemon.
@@ -44,11 +47,11 @@ Package: bitcoin-qt
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: peer-to-peer network based digital currency - Qt GUI
- Bitcoin is an experimental new digital currency that enables instant
- payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer
- technology to operate with no central authority: managing transactions
- and issuing money are carried out collectively by the network. Bitcoin Core
- is the name of the open source software which enables the use of this currency.
+ Bitcoin is a free open source peer-to-peer electronic cash system that
+ is completely decentralized, without the need for a central server or
+ trusted parties. Users hold the crypto keys to their own money and
+ transact directly with each other, with the help of a P2P network to
+ check for double-spending.
.
This package provides Bitcoin-Qt, a GUI for Bitcoin based on Qt.
@@ -56,11 +59,11 @@ Package: bitcoin-tx
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: peer-to-peer digital currency - standalone transaction tool
- Bitcoin is an experimental new digital currency that enables instant
- payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer
- technology to operate with no central authority: managing transactions
- and issuing money are carried out collectively by the network. Bitcoin Core
- is the name of the open source software which enables the use of this currency.
+ Bitcoin is a free open source peer-to-peer electronic cash system that
+ is completely decentralized, without the need for a central server or
+ trusted parties. Users hold the crypto keys to their own money and
+ transact directly with each other, with the help of a P2P network to
+ check for double-spending.
.
This package provides bitcoin-tx, a command-line transaction creation
tool which can be used without a bitcoin daemon. Some means of
diff --git a/contrib/debian/examples/bitcoin.conf b/contrib/debian/examples/bitcoin.conf
index afbc7882e0..1029a51073 100644
--- a/contrib/debian/examples/bitcoin.conf
+++ b/contrib/debian/examples/bitcoin.conf
@@ -116,12 +116,7 @@
# running on another host using this option:
#rpcconnect=127.0.0.1
-# Transaction Fee Changes in 0.10.0
-
-# Send transactions as zero-fee transactions if possible (default: 0)
-#sendfreetransactions=0
-
-# Create transactions that have enough fees (or priority) so they are likely to begin confirmation within n blocks (default: 1).
+# Create transactions that have enough fees so they are likely to begin confirmation within n blocks (default: 6).
# This setting is over-ridden by the -paytxfee option.
#txconfirmtarget=n
@@ -136,6 +131,13 @@
# be validated sooner.
#paytxfee=0.00
+# Enable pruning to reduce storage requirements by deleting old blocks.
+# This mode is incompatible with -txindex and -rescan.
+# 0 = default (no pruning).
+# 1 = allows manual pruning via RPC.
+# >=550 = target to stay under in MiB.
+#prune=550
+
# User interface options
# Start Bitcoin minimized
diff --git a/contrib/debian/rules b/contrib/debian/rules
index 3896d2caa3..6885e38521 100755
--- a/contrib/debian/rules
+++ b/contrib/debian/rules
@@ -12,10 +12,12 @@ override_dh_auto_clean:
if [ -f Makefile ]; then $(MAKE) distclean; fi
rm -rf Makefile.in aclocal.m4 configure src/Makefile.in src/bitcoin-config.h.in src/build-aux src/qt/Makefile.in src/qt/test/Makefile.in src/test/Makefile.in
+QT=$(shell dpkg-vendor --derives-from Ubuntu && echo qt4 || echo qt5)
+
# Yea, autogen should be run on the source archive, but I like doing git archive
override_dh_auto_configure:
./autogen.sh
- ./configure
+ ./configure --with-gui=$(QT)
override_dh_auto_test:
make check
diff --git a/contrib/devtools/check-doc.py b/contrib/devtools/check-doc.py
index 249214e931..3b7a8f9a61 100755
--- a/contrib/devtools/check-doc.py
+++ b/contrib/devtools/check-doc.py
@@ -21,7 +21,7 @@ CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' %s" % (CMD_RO
REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"')
REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")')
# list unsupported, deprecated and duplicate args as they need no documentation
-SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize'])
+SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize', '-dbcrashratio', '-forcecompactdb'])
def main():
used = check_output(CMD_GREP_ARGS, shell=True)
diff --git a/contrib/devtools/commit-script-check.sh b/contrib/devtools/commit-script-check.sh
new file mode 100755
index 0000000000..1c9dbc7f68
--- /dev/null
+++ b/contrib/devtools/commit-script-check.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Copyright (c) 2017 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+# This simple script checks for commits beginning with: scripted-diff:
+# If found, looks for a script between the lines -BEGIN VERIFY SCRIPT- and
+# -END VERIFY SCRIPT-. If no ending is found, it reads until the end of the
+# commit message.
+
+# The resulting script should exactly transform the previous commit into the current
+# one. Any remaining diff signals an error.
+
+if test "x$1" = "x"; then
+ echo "Usage: $0 <commit>..."
+ exit 1
+fi
+
+RET=0
+PREV_BRANCH=`git name-rev --name-only HEAD`
+PREV_HEAD=`git rev-parse HEAD`
+for i in `git rev-list --reverse $1`; do
+ if git rev-list -n 1 --pretty="%s" $i | grep -q "^scripted-diff:"; then
+ git checkout --quiet $i^ || exit
+ SCRIPT="`git rev-list --format=%b -n1 $i | sed '/^-BEGIN VERIFY SCRIPT-$/,/^-END VERIFY SCRIPT-$/{//!b};d'`"
+ if test "x$SCRIPT" = "x"; then
+ echo "Error: missing script for: $i"
+ echo "Failed"
+ RET=1
+ else
+ echo "Running script for: $i"
+ echo "$SCRIPT"
+ eval "$SCRIPT"
+ git --no-pager diff --exit-code $i && echo "OK" || (echo "Failed"; false) || RET=1
+ fi
+ git reset --quiet --hard HEAD
+ else
+ if git rev-list "--format=%b" -n1 $i | grep -q '^-\(BEGIN\|END\)[ a-zA-Z]*-$'; then
+ echo "Error: script block marker but no scripted-diff in title"
+ echo "Failed"
+ RET=1
+ fi
+ fi
+done
+git checkout --quiet $PREV_BRANCH 2>/dev/null || git checkout --quiet $PREV_HEAD
+exit $RET
diff --git a/contrib/devtools/copyright_header.py b/contrib/devtools/copyright_header.py
index 9f35c378bf..6d801d3ac7 100755
--- a/contrib/devtools/copyright_header.py
+++ b/contrib/devtools/copyright_header.py
@@ -32,7 +32,7 @@ EXCLUDE = [
'src/tinyformat.h',
'src/leveldb/util/env_win.cc',
'src/crypto/ctaes/bench.c',
- 'qa/rpc-tests/test_framework/bignum.py',
+ 'test/functional/test_framework/bignum.py',
# python init:
'*__init__.py',
]
diff --git a/contrib/devtools/github-merge.py b/contrib/devtools/github-merge.py
index 0cee0921b1..c664cf81fa 100755
--- a/contrib/devtools/github-merge.py
+++ b/contrib/devtools/github-merge.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Copyright (c) 2016 The Bitcoin Core developers
+# Copyright (c) 2016-2017 Bitcoin Core Developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -18,6 +18,7 @@ from __future__ import division,print_function,unicode_literals
import os
from sys import stdin,stdout,stderr
import argparse
+import hashlib
import subprocess
import json,codecs
try:
@@ -69,6 +70,67 @@ def ask_prompt(text):
print("",file=stderr)
return reply
+def get_symlink_files():
+ files = sorted(subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', 'HEAD']).splitlines())
+ ret = []
+ for f in files:
+ if (int(f.decode('utf-8').split(" ")[0], 8) & 0o170000) == 0o120000:
+ ret.append(f.decode('utf-8').split("\t")[1])
+ return ret
+
+def tree_sha512sum(commit='HEAD'):
+ # request metadata for entire tree, recursively
+ files = []
+ blob_by_name = {}
+ for line in subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', commit]).splitlines():
+ name_sep = line.index(b'\t')
+ metadata = line[:name_sep].split() # perms, 'blob', blobid
+ assert(metadata[1] == b'blob')
+ name = line[name_sep+1:]
+ files.append(name)
+ blob_by_name[name] = metadata[2]
+
+ files.sort()
+ # open connection to git-cat-file in batch mode to request data for all blobs
+ # this is much faster than launching it per file
+ p = subprocess.Popen([GIT, 'cat-file', '--batch'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
+ overall = hashlib.sha512()
+ for f in files:
+ blob = blob_by_name[f]
+ # request blob
+ p.stdin.write(blob + b'\n')
+ p.stdin.flush()
+ # read header: blob, "blob", size
+ reply = p.stdout.readline().split()
+ assert(reply[0] == blob and reply[1] == b'blob')
+ size = int(reply[2])
+ # hash the blob data
+ intern = hashlib.sha512()
+ ptr = 0
+ while ptr < size:
+ bs = min(65536, size - ptr)
+ piece = p.stdout.read(bs)
+ if len(piece) == bs:
+ intern.update(piece)
+ else:
+ raise IOError('Premature EOF reading git cat-file output')
+ ptr += bs
+ dig = intern.hexdigest()
+ assert(p.stdout.read(1) == b'\n') # ignore LF that follows blob data
+ # update overall hash with file hash
+ overall.update(dig.encode("utf-8"))
+ overall.update(" ".encode("utf-8"))
+ overall.update(f)
+ overall.update("\n".encode("utf-8"))
+ p.stdin.close()
+ if p.wait():
+ raise IOError('Non-zero return value executing git cat-file')
+ return overall.hexdigest()
+
+def print_merge_details(pull, title, branch, base_branch, head_branch):
+ print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET))
+ subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch])
+
def parse_arguments():
epilog = '''
In addition, you can set the following git configuration variables:
@@ -112,7 +174,8 @@ def main():
info = retrieve_pr_info(repo,pull)
if info is None:
exit(1)
- title = info['title']
+ title = info['title'].strip()
+ body = info['body'].strip()
# precedence order for destination branch argument:
# - command line argument
# - githubmerge.branch setting
@@ -157,6 +220,9 @@ def main():
subprocess.check_call([GIT,'checkout','-q','-b',local_merge_branch])
try:
+ # Go up to the repository's root.
+ toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip()
+ os.chdir(toplevel)
# Create unsigned merge commit.
if title:
firstline = 'Merge #%s: %s' % (pull,title)
@@ -164,6 +230,7 @@ def main():
firstline = 'Merge #%s' % (pull,)
message = firstline + '\n\n'
message += subprocess.check_output([GIT,'log','--no-merges','--topo-order','--pretty=format:%h %s (%an)',base_branch+'..'+head_branch]).decode('utf-8')
+ message += '\n\nPull request description:\n\n ' + body.replace('\n', '\n ') + '\n'
try:
subprocess.check_call([GIT,'merge','-q','--commit','--no-edit','--no-ff','-m',message.encode('utf-8'),head_branch])
except subprocess.CalledProcessError as e:
@@ -175,14 +242,30 @@ def main():
print("ERROR: Creating merge failed (already merged?).",file=stderr)
exit(4)
- print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET))
- subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch])
+ symlink_files = get_symlink_files()
+ for f in symlink_files:
+ print("ERROR: File %s was a symlink" % f)
+ if len(symlink_files) > 0:
+ exit(4)
+
+ # Put tree SHA512 into the message
+ try:
+ first_sha512 = tree_sha512sum()
+ message += '\n\nTree-SHA512: ' + first_sha512
+ except subprocess.CalledProcessError as e:
+ printf("ERROR: Unable to compute tree hash")
+ exit(4)
+ try:
+ subprocess.check_call([GIT,'commit','--amend','-m',message.encode('utf-8')])
+ except subprocess.CalledProcessError as e:
+ printf("ERROR: Cannot update message.",file=stderr)
+ exit(4)
+
+ print_merge_details(pull, title, branch, base_branch, head_branch)
print()
+
# Run test command if configured.
if testcmd:
- # Go up to the repository's root.
- toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip()
- os.chdir(toplevel)
if subprocess.call(testcmd,shell=True):
print("ERROR: Running %s failed." % testcmd,file=stderr)
exit(5)
@@ -197,12 +280,6 @@ def main():
print("Difference with github ignored.",file=stderr)
else:
exit(6)
- reply = ask_prompt("Press 'd' to accept the diff.")
- if reply.lower() == 'd':
- print("Diff accepted.",file=stderr)
- else:
- print("ERROR: Diff rejected.",file=stderr)
- exit(6)
else:
# Verify the result manually.
print("Dropping you on a shell so you can try building/testing the merged source.",file=stderr)
@@ -211,24 +288,25 @@ def main():
if os.path.isfile('/etc/debian_version'): # Show pull number on Debian default prompt
os.putenv('debian_chroot',pull)
subprocess.call([BASH,'-i'])
- reply = ask_prompt("Type 'm' to accept the merge.")
- if reply.lower() == 'm':
- print("Merge accepted.",file=stderr)
- else:
- print("ERROR: Merge rejected.",file=stderr)
- exit(7)
+
+ second_sha512 = tree_sha512sum()
+ if first_sha512 != second_sha512:
+ print("ERROR: Tree hash changed unexpectedly",file=stderr)
+ exit(8)
# Sign the merge commit.
- reply = ask_prompt("Type 's' to sign off on the merge.")
- if reply == 's':
- try:
- subprocess.check_call([GIT,'commit','-q','--gpg-sign','--amend','--no-edit'])
- except subprocess.CalledProcessError as e:
- print("Error signing, exiting.",file=stderr)
+ print_merge_details(pull, title, branch, base_branch, head_branch)
+ while True:
+ reply = ask_prompt("Type 's' to sign off on the above merge, or 'x' to reject and exit.").lower()
+ if reply == 's':
+ try:
+ subprocess.check_call([GIT,'commit','-q','--gpg-sign','--amend','--no-edit'])
+ break
+ except subprocess.CalledProcessError as e:
+ print("Error while signing, asking again.",file=stderr)
+ elif reply == 'x':
+ print("Not signing off on merge, exiting.",file=stderr)
exit(1)
- else:
- print("Not signing off on merge, exiting.",file=stderr)
- exit(1)
# Put the result in branch.
subprocess.check_call([GIT,'checkout','-q',branch])
@@ -242,9 +320,13 @@ def main():
subprocess.call([GIT,'branch','-q','-D',local_merge_branch],stderr=devnull)
# Push the result.
- reply = ask_prompt("Type 'push' to push the result to %s, branch %s." % (host_repo,branch))
- if reply.lower() == 'push':
- subprocess.check_call([GIT,'push',host_repo,'refs/heads/'+branch])
+ while True:
+ reply = ask_prompt("Type 'push' to push the result to %s, branch %s, or 'x' to exit without pushing." % (host_repo,branch)).lower()
+ if reply == 'push':
+ subprocess.check_call([GIT,'push',host_repo,'refs/heads/'+branch])
+ break
+ elif reply == 'x':
+ exit(1)
if __name__ == '__main__':
main()
diff --git a/contrib/filter-lcov.py b/contrib/filter-lcov.py
new file mode 100755
index 0000000000..299377d691
--- /dev/null
+++ b/contrib/filter-lcov.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python3
+
+import argparse
+
+parser = argparse.ArgumentParser(description='Remove the coverage data from a tracefile for all files matching the pattern.')
+parser.add_argument('--pattern', '-p', action='append', help='the pattern of files to remove', required=True)
+parser.add_argument('tracefile', help='the tracefile to remove the coverage data from')
+parser.add_argument('outfile', help='filename for the output to be written to')
+
+args = parser.parse_args()
+tracefile = args.tracefile
+pattern = args.pattern
+outfile = args.outfile
+
+in_remove = False
+with open(tracefile, 'r') as f:
+ with open(outfile, 'w') as wf:
+ for line in f:
+ for p in pattern:
+ if line.startswith("SF:") and p in line:
+ in_remove = True
+ if not in_remove:
+ wf.write(line)
+ if line == 'end_of_record\n':
+ in_remove = False
diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml
index 6f43119ba2..82f4c7e0a8 100644
--- a/contrib/gitian-descriptors/gitian-linux.yml
+++ b/contrib/gitian-descriptors/gitian-linux.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-linux-0.13"
+name: "bitcoin-linux-0.15"
enable_cache: true
suites:
- "trusty"
@@ -144,6 +144,9 @@ script: |
find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
popd
+ # Workaround for tarball not building with the bare tag version (prep)
+ make -C src obj/build.h
+
ORIGPATH="$PATH"
# Extract the release tarball into a dir for each host and build
for i in ${HOSTS}; do
@@ -154,6 +157,11 @@ script: |
mkdir -p ${INSTALLPATH}
tar --strip-components=1 -xf ../$SOURCEDIST
+ # Workaround for tarball not building with the bare tag version
+ echo '#!/bin/true' >share/genbuild.sh
+ mkdir src/obj
+ cp ../src/obj/build.h src/obj/
+
CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}"
make ${MAKEOPTS}
make ${MAKEOPTS} -C src check-security
diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml
index 991976d59e..35dee579af 100644
--- a/contrib/gitian-descriptors/gitian-osx.yml
+++ b/contrib/gitian-descriptors/gitian-osx.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-osx-0.13"
+name: "bitcoin-osx-0.15"
enable_cache: true
suites:
- "trusty"
@@ -114,6 +114,9 @@ script: |
find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
popd
+ # Workaround for tarball not building with the bare tag version (prep)
+ make -C src obj/build.h
+
ORIGPATH="$PATH"
# Extract the release tarball into a dir for each host and build
for i in ${HOSTS}; do
@@ -124,6 +127,11 @@ script: |
mkdir -p ${INSTALLPATH}
tar --strip-components=1 -xf ../$SOURCEDIST
+ # Workaround for tarball not building with the bare tag version
+ echo '#!/bin/true' >share/genbuild.sh
+ mkdir src/obj
+ cp ../src/obj/build.h src/obj/
+
CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS}
make ${MAKEOPTS}
make install-strip DESTDIR=${INSTALLPATH}
diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml
index fe01b5b957..b396116599 100644
--- a/contrib/gitian-descriptors/gitian-win.yml
+++ b/contrib/gitian-descriptors/gitian-win.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-win-0.13"
+name: "bitcoin-win-0.15"
enable_cache: true
suites:
- "trusty"
@@ -131,6 +131,9 @@ script: |
cp ../$SOURCEDIST $OUTDIR/src
popd
+ # Workaround for tarball not building with the bare tag version (prep)
+ make -C src obj/build.h
+
ORIGPATH="$PATH"
# Extract the release tarball into a dir for each host and build
for i in ${HOSTS}; do
@@ -141,11 +144,17 @@ script: |
mkdir -p ${INSTALLPATH}
tar --strip-components=1 -xf ../$SOURCEDIST
+ # Workaround for tarball not building with the bare tag version
+ echo '#!/bin/true' >share/genbuild.sh
+ mkdir src/obj
+ cp ../src/obj/build.h src/obj/
+
CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}"
make ${MAKEOPTS}
make ${MAKEOPTS} -C src check-security
make deploy
make install DESTDIR=${INSTALLPATH}
+ rename 's/-setup\.exe$/-setup-unsigned.exe/' *-setup.exe
cp -f bitcoin-*setup*.exe $OUTDIR/
cd installed
mv ${DISTNAME}/bin/*.dll ${DISTNAME}/lib/
@@ -159,9 +168,11 @@ script: |
cd ../../
rm -rf distsrc-${i}
done
- cd $OUTDIR
- rename 's/-setup\.exe$/-setup-unsigned.exe/' *-setup.exe
- find . -name "*-setup-unsigned.exe" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz
+ cp -rf contrib/windeploy $BUILD_DIR
+ cd $BUILD_DIR/windeploy
+ mkdir unsigned
+ cp $OUTDIR/bitcoin-*setup-unsigned.exe unsigned/
+ find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz
mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.zip ${OUTDIR}/${DISTNAME}-win64-debug.zip
mv ${OUTDIR}/${DISTNAME}-i686-*-debug.zip ${OUTDIR}/${DISTNAME}-win32-debug.zip
mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip
diff --git a/contrib/gitian-keys/laanwj-key.pgp b/contrib/gitian-keys/laanwj-key.pgp
index 559295109d..eed232a872 100644
--- a/contrib/gitian-keys/laanwj-key.pgp
+++ b/contrib/gitian-keys/laanwj-key.pgp
Binary files differ
diff --git a/contrib/init/README.md b/contrib/init/README.md
index eb5d30acce..1a949f3c07 100644
--- a/contrib/init/README.md
+++ b/contrib/init/README.md
@@ -1,12 +1,12 @@
Sample configuration files for:
-
+```
SystemD: bitcoind.service
Upstart: bitcoind.conf
OpenRC: bitcoind.openrc
bitcoind.openrcconf
CentOS: bitcoind.init
OS X: org.bitcoin.bitcoind.plist
-
+```
have been made available to assist packagers in creating node packages here.
See doc/init.md for more information.
diff --git a/contrib/init/bitcoind.openrcconf b/contrib/init/bitcoind.openrcconf
index 0cbff6d30d..f70e25cb5f 100644
--- a/contrib/init/bitcoind.openrcconf
+++ b/contrib/init/bitcoind.openrcconf
@@ -23,7 +23,7 @@
#BITCOIND_NICE=0
# Additional options (avoid -conf and -datadir, use flags above)
-BITCOIND_OPTS="-disablewallet"
+#BITCOIND_OPTS=""
# The timeout in seconds OpenRC will wait for bitcoind to terminate
# after a SIGTERM has been raised.
diff --git a/contrib/linearize/README.md b/contrib/linearize/README.md
index 0971e7816b..f2a2ab2768 100644
--- a/contrib/linearize/README.md
+++ b/contrib/linearize/README.md
@@ -7,7 +7,8 @@ run using Python 3 but are compatible with Python 2.
$ ./linearize-hashes.py linearize.cfg > hashlist.txt
Required configuration file settings for linearize-hashes:
-* RPC: `rpcuser`, `rpcpassword`
+* RPC: `datadir` (Required if `rpcuser` and `rpcpassword` are not specified)
+* RPC: `rpcuser`, `rpcpassword` (Required if `datadir` is not specified)
Optional config file setting for linearize-hashes:
* RPC: `host` (Default: `127.0.0.1`)
diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg
index 2cc910edfe..d019b06b6c 100644
--- a/contrib/linearize/example-linearize.cfg
+++ b/contrib/linearize/example-linearize.cfg
@@ -1,6 +1,7 @@
# bitcoind RPC settings (linearize-hashes)
rpcuser=someuser
rpcpassword=somepassword
+#datadir=~/.bitcoin
host=127.0.0.1
port=8332
#port=18332
diff --git a/contrib/linearize/linearize-hashes.py b/contrib/linearize/linearize-hashes.py
index 00a54d0820..db8eb7021e 100755
--- a/contrib/linearize/linearize-hashes.py
+++ b/contrib/linearize/linearize-hashes.py
@@ -16,6 +16,8 @@ import json
import re
import base64
import sys
+import os
+import os.path
settings = {}
@@ -93,6 +95,14 @@ def get_block_hashes(settings, max_blocks_per_call=10000):
height += num_blocks
+def get_rpc_cookie():
+ # Open the cookie file
+ with open(os.path.join(os.path.expanduser(settings['datadir']), '.cookie'), 'r') as f:
+ combined = f.readline()
+ combined_split = combined.split(":")
+ settings['rpcuser'] = combined_split[0]
+ settings['rpcpassword'] = combined_split[1]
+
if __name__ == '__main__':
if len(sys.argv) != 2:
print("Usage: linearize-hashes.py CONFIG-FILE")
@@ -122,8 +132,15 @@ if __name__ == '__main__':
settings['max_height'] = 313000
if 'rev_hash_bytes' not in settings:
settings['rev_hash_bytes'] = 'false'
+
+ use_userpass = True
+ use_datadir = False
if 'rpcuser' not in settings or 'rpcpassword' not in settings:
- print("Missing username and/or password in cfg file", file=stderr)
+ use_userpass = False
+ if 'datadir' in settings and not use_userpass:
+ use_datadir = True
+ if not use_userpass and not use_datadir:
+ print("Missing datadir or username and/or password in cfg file", file=stderr)
sys.exit(1)
settings['port'] = int(settings['port'])
@@ -133,4 +150,8 @@ if __name__ == '__main__':
# Force hash byte format setting to be lowercase to make comparisons easier.
settings['rev_hash_bytes'] = settings['rev_hash_bytes'].lower()
+ # Get the rpc user and pass from the cookie if the datadir is set
+ if use_datadir:
+ get_rpc_cookie()
+
get_block_hashes(settings)
diff --git a/contrib/macdeploy/detached-sig-create.sh b/contrib/macdeploy/detached-sig-create.sh
index 5022ea88bc..7f017bb4f1 100755
--- a/contrib/macdeploy/detached-sig-create.sh
+++ b/contrib/macdeploy/detached-sig-create.sh
@@ -10,7 +10,7 @@ BUNDLE="${ROOTDIR}/Bitcoin-Qt.app"
CODESIGN=codesign
TEMPDIR=sign.temp
TEMPLIST=${TEMPDIR}/signatures.txt
-OUT=signature.tar.gz
+OUT=signature-osx.tar.gz
OUTROOT=osx
if [ ! -n "$1" ]; then
diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus
index 5995f9f438..23a568ad13 100755
--- a/contrib/macdeploy/macdeployqtplus
+++ b/contrib/macdeploy/macdeployqtplus
@@ -302,7 +302,6 @@ def copyFramework(framework, path, verbose):
if os.path.exists(fromContentsDir):
toContentsDir = os.path.join(path, framework.destinationVersionContentsDirectory)
shutil.copytree(fromContentsDir, toContentsDir, symlinks=True)
- contentslinkfrom = os.path.join(path, framework.destinationContentsDirectory)
if verbose >= 3:
print("Copied Contents:", fromContentsDir)
print(" to:", toContentsDir)
@@ -675,9 +674,8 @@ else:
if verbose >= 2:
print("+ Installing qt.conf +")
-f = open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb")
-f.write(qt_conf.encode())
-f.close()
+with open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") as f:
+ f.write(qt_conf.encode())
# ------------------------------------------------
diff --git a/contrib/rpm/README.md b/contrib/rpm/README.md
index e1fd0b317b..4ab2f35680 100644
--- a/contrib/rpm/README.md
+++ b/contrib/rpm/README.md
@@ -181,5 +181,5 @@ knows what they are getting when installing the GUI package.
As far as minor differences, I generally prefer to assign the file permissions
in the `%files` portion of an RPM spec file rather than specifying the
-permissions of a file during `%install` and other minor things like that that
+permissions of a file during `%install` and other minor things like that
are largely just cosmetic.
diff --git a/contrib/rpm/bitcoin.if b/contrib/rpm/bitcoin.if
index 2b096c24dc..b206866cc5 100644
--- a/contrib/rpm/bitcoin.if
+++ b/contrib/rpm/bitcoin.if
@@ -121,7 +121,7 @@ interface(`bitcoin_manage_lib_dirs',`
########################################
## <summary>
## All of the rules required to administrate
-## an bitcoin environment
+## a bitcoin environment
## </summary>
## <param name="domain">
## <summary>
diff --git a/contrib/rpm/bitcoin.spec b/contrib/rpm/bitcoin.spec
index 516f42334e..cc54fcaf3d 100644
--- a/contrib/rpm/bitcoin.spec
+++ b/contrib/rpm/bitcoin.spec
@@ -311,10 +311,8 @@ rm -f %{buildroot}%{_bindir}/test_*
%check
make check
-pushd src
-srcdir=. test/bitcoin-util-test.py
-popd
-qa/pull-tester/rpc-tests.py -extended
+srcdir=src test/bitcoin-util-test.py
+test/functional/test_runner.py --extended
%post libs -p /sbin/ldconfig
diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md
index afe902fd7f..139c03181f 100644
--- a/contrib/seeds/README.md
+++ b/contrib/seeds/README.md
@@ -8,7 +8,7 @@ and remove old versions as necessary.
The seeds compiled into the release are created from sipa's DNS seed data, like this:
- curl -s http://bitcoin.sipa.be/seeds.txt > seeds_main.txt
+ curl -s http://bitcoin.sipa.be/seeds.txt.gz | gzip -dc > seeds_main.txt
python3 makeseeds.py < seeds_main.txt > nodes_main.txt
python3 generate-seeds.py . > ../../src/chainparamsseeds.h
diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py
index 34f0f57671..877a7836ef 100755
--- a/contrib/seeds/makeseeds.py
+++ b/contrib/seeds/makeseeds.py
@@ -30,7 +30,7 @@ import collections
PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$")
PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$")
PATTERN_ONION = re.compile(r"^([abcdefghijklmnopqrstuvwxyz234567]{16}\.onion):(\d+)$")
-PATTERN_AGENT = re.compile(r"^(/Satoshi:0.12.(0|1|99)/|/Satoshi:0.13.(0|1|2|99)/)$")
+PATTERN_AGENT = re.compile(r"^(/Satoshi:0.13.(1|2|99)/|/Satoshi:0.14.(0|1|2|99)/)$")
def parseline(line):
sline = line.split()
diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt
index 0451771dae..60b34216cd 100644
--- a/contrib/seeds/nodes_main.txt
+++ b/contrib/seeds/nodes_main.txt
@@ -1,1168 +1,1450 @@
-2.7.8.12:8333
2.228.70.198:8333
-5.39.64.7:8333
-5.45.80.34:38333
-5.51.160.38:8333
-5.61.33.33:8333
-5.61.37.12:8333
-5.95.80.47:8333
-5.102.164.173:8333
-5.175.71.130:8333
-5.189.165.22:8333
-5.199.130.228:8333
-5.228.100.222:8333
+4.15.180.29:8333
+4.15.180.30:8333
+5.2.67.110:8333
+5.39.224.103:8333
+5.43.124.154:8333
+5.189.165.102:8333
+5.226.149.145:8333
+5.228.7.146:8333
+5.228.64.71:8333
+5.249.152.101:8333
+5.254.124.55:8333
5.255.64.231:8333
-13.93.6.133:8333
-18.85.34.10:8333
-18.241.0.63:8333
+5.255.90.234:8333
+14.192.8.27:21301
+18.62.3.86:8333
+18.85.35.80:8333
23.28.128.65:8333
-23.248.113.52:8333
-23.253.151.73:8333
-24.4.96.121:8333
-24.69.65.191:8333
-24.87.8.43:8333
-24.150.224.110:8333
+23.108.83.12:8333
+23.233.2.238:8333
+24.27.65.168:8333
+24.56.241.219:8333
+24.64.75.132:8333
+24.73.70.26:8333
+24.121.154.140:8333
+24.203.96.72:8333
+24.225.34.62:8333
24.227.69.146:8333
-27.0.235.33:8333
-31.170.106.203:8333
-31.184.197.96:8333
-31.214.240.56:8333
-37.1.202.134:8333
-37.18.74.232:8333
-37.34.48.17:8333
+24.232.136.119:8333
+31.16.123.235:8333
+31.19.205.53:8333
+31.132.136.35:8333
+31.184.234.85:8333
+31.211.102.161:8333
37.48.64.140:8333
37.97.141.116:8333
+37.120.160.12:8333
37.120.164.16:8333
-37.120.169.123:8333
-37.143.9.128:8333
-37.153.172.227:8333
-37.193.227.16:8333
-37.205.8.78:8333
-37.220.0.114:8333
-37.232.218.199:8333
-38.140.161.53:8333
-40.87.70.120:8333
-41.162.163.93:8333
-42.2.198.48:8333
-45.20.67.1:8333
-45.55.197.77:8333
+37.134.226.181:8333
+37.147.110.43:8333
+37.194.10.30:8333
+37.247.22.53:8333
+38.27.65.158:8333
+38.133.141.34:8333
+43.248.160.151:8333
+45.32.130.19:8333
+45.32.193.157:8333
+45.46.161.121:8333
45.56.97.63:8333
-45.58.38.162:8333
-45.63.1.33:8333
-45.79.2.70:8333
+45.116.178.79:8188
46.16.240.98:8333
-46.19.137.74:8333
-46.28.206.146:8333
-46.32.252.197:8333
+46.20.246.100:8333
+46.21.97.135:8333
+46.59.10.237:8333
46.59.13.59:8333
-46.59.39.195:8333
46.148.16.210:8333
-46.160.195.121:8333
-46.166.142.21:8333
-46.166.160.29:8330
+46.166.160.96:8333
46.188.44.20:8333
46.229.238.187:8333
46.231.16.149:8333
+47.88.35.181:8333
47.88.100.130:8333
-47.89.192.134:8333
-47.185.194.160:8333
-47.189.129.218:8333
-49.65.2.140:8333
-50.3.72.129:8333
-50.31.99.225:8333
-51.175.33.95:8333
-52.1.165.219:8333
-52.10.170.186:8333
-52.51.128.216:8333
-54.197.130.244:8333
-58.59.2.22:8333
-58.84.6.81:8333
-59.125.8.143:8333
-59.167.130.139:8333
+47.184.129.94:8333
+47.199.68.204:8333
+50.30.38.203:8333
+50.63.162.242:8333
+50.97.133.208:8333
+50.114.227.224:8333
+51.15.0.17:8333
+51.174.69.239:8333
+52.7.135.69:8333
+52.14.64.82:8333
+52.204.105.25:8333
+54.255.160.87:8333
61.47.2.20:8333
+61.125.131.55:8333
62.43.130.178:8333
-62.76.96.6:8333
+62.106.16.111:8333
62.107.200.30:8333
-62.133.15.58:8333
+62.109.20.99:8333
62.133.194.2:8333
62.133.194.156:8333
-62.138.1.95:8333
-62.216.238.3:8333
-62.238.34.125:8333
-63.137.40.207:8333
-63.231.96.109:8333
-64.78.240.150:8333
-64.83.225.146:8333
-64.137.236.68:8833
-64.156.193.120:8333
-66.79.160.82:8333
-66.91.230.231:8333
-66.135.128.121:8333
-66.172.10.4:8333
+62.176.6.94:8333
+62.182.169.222:8333
+62.205.132.245:8333
+62.216.238.133:8333
+63.231.239.212:8333
+64.34.231.140:8333
+64.203.102.86:8333
+64.233.245.39:8333
+65.183.76.73:8333
+66.96.199.166:8333
66.194.38.250:8333
66.194.38.253:8333
-66.215.34.26:8333
-66.240.237.155:8333
-67.205.96.108:8333
-67.205.128.5:8333
-67.219.233.140:8333
+66.196.12.63:8333
+67.215.6.34:8333
67.221.193.55:8333
-68.100.196.118:8333
+68.66.193.192:8333
+68.69.235.230:8333
+68.111.10.219:8333
+68.119.138.175:8333
68.132.193.222:8333
-68.168.118.234:8333
+68.194.42.76:8333
+68.235.41.204:8333
69.11.97.43:8333
-69.30.229.10:8333
-69.50.171.205:8333
-69.125.193.145:8333
-69.162.139.125:8333
-70.35.98.39:8333
+69.41.3.212:8333
+69.41.171.35:8333
+69.41.171.36:8333
+69.55.64.216:8333
+69.84.42.56:8333
+70.48.48.250:8333
70.112.32.29:8333
-71.126.181.146:8333
-72.180.32.105:8333
-73.226.64.145:8333
-74.83.140.242:8333
-74.84.128.158:9333
+70.250.74.20:8333
+71.93.161.162:8333
+71.198.0.126:8333
+72.5.167.41:8333
+72.224.11.103:8333
+73.72.160.213:8333
74.122.237.124:8333
-74.215.133.145:8333
-75.76.101.169:8333
-75.85.13.8:8333
-75.86.168.13:8333
-75.170.97.25:8333
-75.177.137.134:8333
+75.86.137.34:8333
+75.165.99.144:8333
+76.64.74.193:8333
76.76.227.136:8333
-77.53.136.6:8333
-77.110.11.52:8333
-78.25.32.206:8333
-78.34.8.120:8333
-78.46.32.99:8333
-78.56.9.214:8333
-78.56.229.177:8333
-78.129.237.245:8333
+76.173.161.44:8333
+76.178.22.44:8333
+77.47.137.27:8333
+77.77.46.250:8333
+77.91.193.152:8333
+77.95.226.194:8333
+77.120.246.254:8333
+77.163.136.136:8333
+77.203.13.57:8333
+77.236.37.214:8333
+77.239.37.12:8333
+77.247.179.44:8333
+78.34.14.52:8333
+78.109.163.153:8333
78.196.172.45:8333
79.132.230.144:8333
-79.169.35.235:8333
-79.172.194.219:8333
-80.64.65.87:8333
-80.89.137.115:8333
-80.93.36.173:8333
-80.101.167.100:8333
-80.114.34.158:8333
-80.127.136.50:8333
-80.188.139.82:8333
-80.222.39.77:8333
-80.223.105.69:8333
-80.229.151.187:8333
-80.240.129.221:8333
+79.160.2.105:8333
+80.82.77.138:8333
+80.100.203.151:8333
+80.147.68.237:8333
+80.237.240.102:8333
+81.2.246.127:8333
+81.7.7.86:8333
81.7.10.238:8333
-81.7.13.84:8333
-81.27.96.92:8333
-81.35.143.98:8333
-81.82.201.5:8333
+81.27.96.37:8333
81.83.96.5:8333
-81.169.227.36:8333
-81.171.2.119:8333
-81.171.38.130:8333
-81.175.255.118:8333
-81.207.8.49:8333
81.228.194.187:8333
-82.9.1.77:8333
-82.11.33.229:8333
-82.102.13.117:8333
-82.116.203.240:8333
-82.130.103.16:8333
-82.136.65.227:8333
-82.158.227.238:8333
-82.197.212.25:8333
+82.45.69.216:8333
+82.69.44.183:8333
+82.72.198.68:8333
+82.95.204.10:8333
+82.118.236.127:8333
+82.118.242.4:8333
+82.134.66.146:8333
+82.193.109.199:8333
+82.197.210.65:8333
82.199.102.10:8333
-82.200.204.41:8333
-82.200.204.119:8333
-82.221.105.223:8333
+82.200.205.30:8333
82.221.108.27:8333
-82.221.111.136:8333
+82.221.128.81:8333
82.221.139.97:8333
+82.232.202.246:8333
+83.60.64.252:8333
+83.61.8.228:8333
+83.128.41.48:8333
+83.128.111.69:8333
83.137.41.10:8333
-83.143.130.19:8333
-83.150.9.196:8333
+83.150.43.17:8333
83.169.2.43:8333
-83.217.203.130:8333
-83.249.88.52:8333
-84.26.162.92:8333
+83.174.209.87:8333
+83.255.43.163:8333
84.42.193.6:8333
-84.134.194.115:8333
-84.201.32.115:8333
-84.212.232.71:8333
-84.238.140.176:8333
-85.10.104.34:8333
+84.52.145.231:8333
+84.52.234.70:8333
+84.85.102.113:8333
+84.92.92.247:8333
+84.146.35.123:8333
+84.212.198.222:8333
+84.217.163.135:8333
+84.245.27.185:8333
+84.251.203.5:8333
85.21.144.226:8333
85.25.194.12:8333
-85.144.79.190:8333
-85.145.228.192:8333
-85.194.238.130:8333
-85.228.201.80:8333
-85.229.228.174:8333
-85.236.233.87:8333
-86.80.204.185:8333
-86.105.227.190:8333
-86.135.39.40:8333
-87.106.139.127:8333
+85.25.194.28:8333
+85.144.119.222:8333
+85.183.140.62:8333
+85.214.228.203:8333
+85.214.234.254:8333
+85.218.150.1:8333
+85.228.196.10:8333
+86.15.2.235:8333
+86.61.6.210:8333
+87.92.115.194:8333
87.120.8.5:8333
87.120.37.230:8333
+87.233.181.146:8333
87.239.101.102:8333
-87.243.197.82:8333
-88.112.112.173:8333
+88.87.78.126:8333
+88.98.198.130:8333
+88.98.225.214:8333
+88.99.58.194:8333
88.150.192.17:8333
-88.185.155.134:8333
-88.202.202.221:8333
-88.202.230.87:8333
-88.208.39.182:8333
+88.196.136.31:17556
+88.208.58.193:8333
+88.208.58.194:8333
+89.22.96.132:8333
+89.22.104.48:8333
+89.25.80.98:8333
89.34.99.41:8333
+89.142.195.112:8333
89.163.224.187:8333
-89.169.233.150:8333
-89.184.65.85:8333
-89.212.91.219:8333
-89.249.178.36:8333
+89.163.224.195:8333
+89.238.79.235:8333
+90.46.240.214:8333
+90.65.232.129:8333
+90.71.117.90:8333
90.149.38.172:8333
-91.65.97.157:8333
-91.107.64.143:8333
-91.114.35.107:8333
+90.156.97.145:8333
+90.177.48.104:8333
+91.106.194.97:8333
91.135.0.187:8333
-91.145.110.95:8333
-91.157.38.151:8333
+91.150.189.155:8333
+91.185.198.216:8333
+91.196.11.45:8333
91.197.44.133:8333
-91.205.176.54:8333
-91.206.203.10:8333
-91.206.203.18:8333
-91.215.35.130:8333
-91.219.239.159:8333
-91.223.133.2:8333
-91.223.133.40:8333
+91.224.0.227:8333
91.226.10.90:8333
+91.228.45.130:8333
+91.229.77.239:8333
+91.238.100.249:8333
91.240.141.169:8333
92.27.7.209:8333
-92.89.67.207:8333
-92.221.201.138:8333
-93.95.187.122:8333
-93.103.73.187:8333
+92.54.16.135:8333
+93.89.84.93:8333
+93.100.51.48:8333
+93.100.76.151:8333
+93.104.214.235:8333
+93.115.86.246:8333
93.123.80.47:8333
+93.174.88.211:8333
93.188.224.253:8333
93.190.69.242:8333
-94.19.12.244:8333
-94.156.128.116:8333
-94.177.171.73:8333
+94.74.81.93:8333
+94.156.35.8:8333
+94.176.237.241:8333
94.181.44.104:8333
-94.237.26.173:8333
-94.242.229.158:8333
-94.255.128.98:8333
-95.79.35.50:8333
-95.91.41.39:8333
-95.110.234.93:8333
-95.128.48.209:8333
+94.227.43.171:8333
+95.79.102.208:8333
+95.79.102.209:8333
+95.154.237.24:8333
+95.183.48.62:8333
95.183.48.71:8333
-96.23.67.85:8333
-97.64.177.10:8333
-97.104.201.95:8333
-98.29.197.149:8333
-98.169.2.107:8333
-99.232.48.72:8333
-101.100.141.55:8333
-103.7.32.40:8333
-103.53.225.69:8333
-103.249.106.74:8333
-104.128.224.13:8333
-104.128.228.252:8333
-104.155.1.158:8333
-104.168.128.50:8333
-104.199.160.228:8333
-104.204.109.11:8333
-104.219.251.118:8333
-104.223.3.129:8333
-104.223.3.219:8333
-104.238.130.182:8333
-104.245.99.227:8333
-106.38.234.89:8333
-106.104.134.218:8333
-107.136.6.71:8333
+95.213.161.2:8333
+95.213.201.94:8333
+96.20.227.39:8333
+96.28.41.91:8333
+98.127.130.17:8333
+100.36.48.101:8333
+101.0.81.42:8333
+101.0.81.43:8333
+103.11.64.46:8333
+103.24.244.69:8333
+103.47.210.50:8333
+103.76.41.169:8333
+103.80.168.57:8333
+103.203.51.186:8333
+103.224.118.79:8333
+103.250.4.74:8333
+104.192.170.202:8333
+104.196.0.99:8333
+104.199.192.85:8333
+104.219.251.46:8333
+104.223.108.33:8333
+104.237.2.189:8333
+104.247.230.28:8333
107.150.45.210:8333
-107.151.144.103:8333
-107.170.44.99:8333
-107.181.137.133:8333
-107.191.102.13:8333
-108.58.252.82:8333
-108.59.9.167:8333
+107.174.34.77:8333
+107.174.34.78:8333
+107.180.71.47:8333
108.59.12.163:8333
-108.162.106.215:8333
-108.168.133.164:8333
-108.173.202.101:8333
-108.180.110.190:8333
-109.29.75.40:8333
-109.120.194.136:8333
-109.230.230.88:8333
-109.235.67.115:8333
-109.235.69.120:8333
-109.236.90.199:8333
+108.168.37.13:8333
+108.175.3.18:8333
+108.234.193.106:8333
+109.9.173.13:8333
+109.101.220.151:8333
+109.172.104.119:8333
+109.195.193.138:8333
+109.206.177.21:8333
+109.226.35.28:8333
109.255.0.107:8333
-110.10.130.12:8333
-110.10.176.94:8333
-110.132.172.251:8333
-111.90.158.17:8333
+113.29.183.143:8333
+114.145.97.73:8333
115.66.205.171:8333
-116.31.123.139:8333
-118.192.48.46:8333
-118.193.164.98:8333
-119.29.156.231:8333
-119.63.44.133:19980
-119.81.99.27:8333
-119.106.12.169:8333
-119.147.137.155:19980
-119.185.1.182:8333
-120.55.193.136:8333
-121.254.173.23:8333
+118.67.201.40:8333
+118.194.226.168:8333
+119.28.70.144:8333
+120.24.166.73:9998
+120.76.244.201:10022
+121.82.4.232:8333
121.254.173.40:8333
-123.56.129.45:8333
123.203.163.128:8333
-123.206.32.198:8333
-124.189.160.221:8333
-124.189.192.232:8333
-128.140.224.162:8333
-128.199.68.205:8333
-130.234.207.115:8333
-131.113.41.123:8333
-131.114.72.104:8333
-132.204.108.155:8333
-134.119.13.230:8333
-134.213.133.206:8333
-134.213.133.207:8333
-135.23.5.3:8333
-137.74.0.66:8333
-138.68.1.45:8333
-138.68.2.194:8333
+124.171.70.45:8333
+125.63.57.7:8333
+125.128.35.41:8333
+128.208.244.124:8333
+128.230.208.73:8333
+131.114.10.233:8333
+131.114.10.235:8333
+132.239.36.105:8333
+134.213.214.233:8333
+136.61.238.121:8333
+136.62.86.140:8333
+136.144.128.49:8333
+137.48.144.52:8333
+137.116.160.176:8333
+137.117.193.113:8333
+138.19.79.208:8333
138.68.64.19:8333
-138.68.64.28:8333
-139.59.42.248:8333
-139.220.240.153:8333
-140.112.107.118:8333
-140.186.224.112:8333
-141.52.64.141:8333
-142.68.237.107:8333
-142.217.12.106:8333
-146.60.204.92:8333
-146.185.161.209:8333
+139.59.96.16:8333
+139.162.160.232:8333
+141.136.115.230:8333
+142.59.232.111:8333
+142.111.2.74:8333
+142.162.128.23:8333
+143.107.116.5:8333
+143.229.22.74:8333
+143.229.36.71:8333
+144.2.105.60:8333
+144.76.224.214:8333
+146.185.19.30:8333
+147.32.30.25:8333
+147.229.13.210:8333
148.103.7.119:8333
-149.210.133.244:8333
+150.101.114.194:8333
150.229.0.143:8333
-151.231.238.25:8333
-151.248.160.227:8333
-153.230.228.15:8333
-155.133.43.249:8333
-158.58.238.145:8333
-158.109.79.13:34821
-159.203.70.208:8333
+154.66.207.126:8333
+158.129.212.236:8333
+158.129.212.251:8333
160.16.206.31:8333
162.209.1.233:8333
162.209.4.125:8333
-162.216.192.231:8333
-162.243.100.111:8333
-162.246.11.194:8333
-162.248.102.117:8333
-162.252.46.83:8333
-163.172.33.78:8333
-163.172.194.30:8333
-169.229.198.106:8333
+162.220.246.225:8333
+163.172.218.186:8333
+166.230.70.145:8333
+168.235.74.45:8333
+169.44.34.88:8333
170.75.195.168:8333
-172.103.205.197:8333
-172.245.225.126:8333
-173.179.37.8:8333
-173.208.203.74:8333
-173.252.46.16:8333
-174.117.141.124:8333
-175.126.38.158:8333
-175.126.38.177:8333
-175.139.106.119:8333
-175.140.232.66:8333
-176.9.117.100:8333
-176.36.33.121:8333
+172.112.2.67:8333
+173.94.164.38:8333
+173.183.232.109:8333
+173.208.176.122:8333
+173.212.194.114:8333
+173.232.228.146:8333
+175.126.124.92:8333
+175.145.109.51:8333
+176.24.198.205:8333
+176.36.37.62:8333
176.36.99.222:8333
-176.56.227.36:8333
-176.100.100.206:8333
176.106.144.183:8333
-176.123.7.148:8333
-176.126.167.10:8333
-176.223.201.198:8333
-178.62.68.62:8333
-178.62.102.56:8333
-178.62.203.185:8333
-178.124.197.101:8333
+177.33.1.40:8333
+178.162.214.225:8333
+178.164.109.83:8333
178.170.138.202:8333
-178.175.129.18:8333
-178.188.47.62:8333
-178.199.240.22:8333
+178.175.136.122:8333
178.218.209.162:8333
-178.237.35.34:8333
-178.238.224.242:8333
+178.254.2.64:8333
178.254.34.144:8333
-178.254.34.161:8333
-179.43.183.2:8333
+178.255.41.21:8333
+178.255.144.163:8333
+180.181.208.42:8333
180.200.128.58:8333
-182.93.34.130:8333
-185.8.238.197:8333
-185.11.139.172:8333
+180.235.50.14:8333
+181.215.148.154:8333
+184.64.13.43:8333
+184.94.164.170:8333
+184.152.107.251:8333
+184.182.233.206:8333
+185.4.24.199:8333
+185.20.99.49:8333
185.24.97.11:8333
-185.24.233.100:8333
+185.25.48.27:8333
185.25.48.71:8333
-185.25.48.114:8333
+185.26.196.249:8333
185.28.76.179:8333
-185.70.105.152:8339
-185.77.128.69:8333
-185.77.128.241:8333
-185.86.79.87:8333
-185.89.102.2:3333
-185.89.102.53:3333
-185.109.144.155:8333
-185.117.75.50:8333
+185.35.139.250:8333
+185.41.113.69:8333
+185.50.213.123:8333
+185.50.213.124:8333
+185.50.232.114:8333
+185.51.192.40:8333
+185.53.129.244:8333
+185.71.177.100:8333
+185.77.129.176:8333
+185.82.201.51:8333
185.121.173.223:8333
-185.128.41.157:8333
-185.130.226.106:8333
-185.145.130.76:8333
-188.63.192.104:8333
+185.140.252.253:8333
+185.145.129.184:8333
+185.145.130.163:8333
+185.154.156.50:8333
+185.162.124.69:8333
+185.170.42.2:8333
+186.149.197.96:8333
+188.65.212.138:8333
+188.65.213.48:8333
+188.93.209.192:8333
+188.113.79.45:8333
+188.113.84.116:8333
188.113.164.231:8333
-188.166.229.112:8333
-188.214.128.77:8333
-190.10.8.211:8333
-190.81.160.184:8333
-190.111.231.19:8333
-192.131.44.93:8333
+188.122.16.153:8333
+188.165.224.28:8333
+188.175.239.227:8333
+188.214.128.18:8333
+188.227.64.19:8333
+188.253.2.125:8333
+189.45.203.166:8333
+190.184.198.34:8333
+192.151.145.250:8333
192.206.202.6:8333
-192.227.245.133:8333
-192.241.74.123:8333
-192.241.74.126:8333
-192.254.71.222:8333
-193.10.64.85:8333
-193.46.80.101:8333
+192.228.101.157:8333
+193.2.76.41:8333
+193.27.209.100:8333
+193.33.237.187:8333
+193.46.83.17:8333
193.49.43.219:8333
-193.93.79.215:8333
-193.183.99.46:8333
-193.234.224.195:8333
-193.239.80.155:8333
-194.63.140.208:8333
-194.87.1.232:8333
-194.187.227.18:8333
-194.247.12.136:8333
-195.91.176.86:8333
-196.28.98.20:8333
-198.44.249.35:8333
-198.84.172.252:8333
-198.204.224.106:8333
-198.211.97.46:8333
-199.66.64.198:8333
-199.101.100.58:8333
-199.101.100.59:8333
+194.24.182.27:8333
+194.28.206.201:8333
+194.63.143.197:8333
+194.71.109.91:8333
+194.79.8.36:8333
+194.135.93.38:8333
+194.186.160.253:8333
+195.9.140.134:8333
+195.39.206.29:8333
+195.67.36.89:8333
+195.169.99.82:8333
+195.214.214.253:8333
+195.223.71.147:8333
+198.37.118.11:8333
+198.54.113.125:8333
+198.101.12.139:8333
+198.143.12.105:8333
+198.251.83.19:8333
199.127.224.50:8333
-200.46.241.71:8333
+200.12.138.146:8333
200.116.98.185:8333
-203.9.225.13:8333
-203.177.142.37:8333
-205.200.247.149:8333
-205.209.131.150:13838
-206.53.64.74:8333
-206.72.192.69:8333
-206.123.112.180:8333
-208.66.208.153:8333
-208.68.174.76:8333
+200.122.128.130:8333
+202.29.6.48:8333
+202.133.115.115:8333
+203.59.17.160:8333
+204.15.11.4:8333
+204.111.241.195:8333
+205.251.85.151:8333
+207.244.70.40:8333
+207.254.50.72:8333
+208.76.93.83:8333
208.107.97.242:8333
-208.111.48.132:8333
+208.110.73.107:8333
208.118.235.190:8333
-209.6.205.126:8333
-209.40.96.121:8333
-209.58.130.137:8333
209.73.142.226:8333
-209.90.224.4:8333
-209.126.69.243:8333
-209.126.108.91:8333
-209.195.4.18:8333
+209.81.9.223:8333
+209.126.107.166:8333
+209.177.86.19:8333
209.250.6.190:8333
-210.54.37.225:8333
+210.1.219.155:8333
+210.211.109.165:8333
210.223.3.44:8333
-211.149.234.109:8333
+211.21.129.69:8333
+212.50.98.161:8333
212.51.140.183:8333
+212.56.108.81:8333
+212.83.35.173:8333
212.90.179.206:8333
212.93.226.90:8333
212.110.171.118:8333
-212.202.132.17:8333
+213.5.36.58:8333
+213.5.181.205:8333
+213.17.16.251:8333
213.91.205.134:8333
-213.165.68.218:8333
-213.196.200.213:8333
+213.91.211.17:8333
+213.155.3.216:8333
+213.168.13.151:8333
+213.186.170.109:8334
+213.222.208.150:8333
+216.32.213.112:8333
216.59.4.212:8333
-216.74.32.109:8333
-216.158.225.70:8333
-216.164.138.13:8333
-216.167.236.247:8333
+216.126.193.163:8333
216.197.79.74:8333
-217.11.225.189:8333
+216.218.147.140:8333
+216.227.39.84:8333
+216.245.206.181:8333
+216.249.92.230:8333
217.12.199.207:8333
-217.20.130.72:8333
-217.23.6.148:8333
-217.23.140.103:8333
-217.28.96.180:8333
+217.23.2.177:8333
+217.23.5.68:8333
+217.28.194.2:8333
217.35.130.42:8333
-217.111.66.79:8333
-217.158.9.102:8333
+217.64.47.138:8333
+217.101.72.242:8333
+217.145.81.229:8333
217.168.143.169:8333
-217.209.32.219:8333
-218.161.33.165:8333
-221.121.144.138:8333
-[2001:0:4137:9e76:2048:3a84:bb91:e846]:8333
-[2001:0:4137:9e76:2066:e9e:b489:f8b8]:8333
-[2001:0:4137:9e76:3854:1211:b5ac:a96b]:8333
-[2001:0:4137:9e76:4e3:1f66:cd4c:829f]:8333
-[2001:0:4137:9e76:ad:1f4:9ea9:fa2e]:8333
-[2001:0:4137:9e76:e5:baa:b66f:f418]:8333
-[2001:0:53aa:64c:20a2:59c4:ad22:93ea]:8333
+217.169.7.111:8333
+217.182.192.7:8333
+219.88.232.229:8333
+219.113.244.52:8333
+220.130.128.58:8333
+220.244.225.239:8333
+221.141.3.12:8333
+222.166.176.99:8333
+223.252.173.147:8333
+[2001:0:4137:9e76:1025:4e5:acb0:22cd]:8333
+[2001:0:4137:9e76:1078:18a6:5d2c:2461]:8333
+[2001:0:4137:9e76:10ec:236a:bd3b:f3c0]:8333
+[2001:0:4137:9e76:186d:3f17:b7ad:95cf]:8333
+[2001:0:4137:9e76:1870:242:ac03:aaf9]:8333
+[2001:0:4137:9e76:18a6:1102:2abf:eb70]:8333
+[2001:0:4137:9e76:1ce5:248c:4ff5:2b1d]:8333
+[2001:0:4137:9e76:200f:156a:bc77:3acd]:8333
+[2001:0:4137:9e76:2418:19d1:cddc:b1af]:8333
+[2001:0:4137:9e76:2857:3d78:aaf8:eb28]:8333
+[2001:0:4137:9e76:28b2:1b84:64fb:2d6a]:8333
+[2001:0:4137:9e76:2c70:d51:d046:1209]:8333
+[2001:0:4137:9e76:2cac:2fcf:46bb:be0d]:8333
+[2001:0:4137:9e76:305e:20ee:a94f:6f69]:8333
+[2001:0:4137:9e76:30cd:849:adfe:6e67]:8333
+[2001:0:4137:9e76:345b:f12:ae1e:2948]:8333
+[2001:0:4137:9e76:3c40:146e:9741:5a3a]:8333
+[2001:0:4137:9e76:3c9e:3c3e:9d6e:7340]:8333
+[2001:0:4137:9e76:499:29a8:d047:7ea1]:8333
+[2001:0:4137:9e76:51:24:81b2:59e3]:8333
+[2001:0:4137:9e76:889:2d7c:b61b:bf0d]:8333
+[2001:0:4137:9e76:c9f:379c:add2:c938]:8333
+[2001:0:4137:9e76:cd6:2eb4:b82b:addb]:8333
+[2001:0:4137:9e76:cf0:2e3a:b29d:6207]:8333
+[2001:0:53aa:64c:1485:fbf9:a798:1ffe]:8333
[2001:0:53aa:64c:59:617f:a10d:e0]:8333
-[2001:0:5ef5:79fb:200f:3ae5:3cbc:74c9]:8333
-[2001:0:5ef5:79fb:38f2:13b4:b208:5604]:8333
-[2001:0:5ef5:79fd:200b:22a7:cc50:f52d]:8333
-[2001:0:5ef5:79fd:24ef:1aef:a994:303d]:8333
-[2001:0:5ef5:79fd:24fc:b5d:ad4f:4db2]:8333
-[2001:0:5ef5:79fd:28bf:2d23:e02e:c3ef]:8333
-[2001:0:5ef5:79fd:3cd0:3c2e:da44:a759]:8333
-[2001:0:5ef5:79fd:87e:fd7:b1c2:1b4]:8333
-[2001:0:9d38:6ab8:18db:3bda:ab90:e81e]:8333
-[2001:0:9d38:6ab8:4e7:1660:862f:a6d7]:8333
-[2001:0:9d38:6ab8:6:2b:5074:9588]:8333
-[2001:0:9d38:6abd:10f8:a7d7:bb90:f524]:8333
-[2001:13d8:1c01:1000::11]:8333
-[2001:15c0:65ff:610::2]:8333
-[2001:1608:10:156:ae::4adb]:8333
-[2001:1620:b1b:8888:20d:b9ff:fe41:6710]:8333
-[2001:1620:b1b:face:20d:b9ff:fe41:6710]:8333
-[2001:1620:f00:282::2]:8333
-[2001:1620:f00:8282::1]:8333
-[2001:1680:101:1ae::1]:8333
-[2001:16d8:ff00:85de:20c:29ff:fe52:9594]:8333
-[2001:19f0:4400:434d:5400:ff:fe42:2678]:8333
+[2001:0:5ef5:79fb:1020:2cd0:4750:eb12]:8333
+[2001:0:5ef5:79fb:1036:1d50:3881:6930]:8333
+[2001:0:5ef5:79fb:10a4:27d8:9c0a:cfa9]:8333
+[2001:0:5ef5:79fb:10ae:5a8:524b:dcc4]:8333
+[2001:0:5ef5:79fb:1892:3e3a:3f74:affa]:8333
+[2001:0:5ef5:79fb:1c95:1a60:d1f5:215b]:8333
+[2001:0:5ef5:79fb:200b:16ef:b9cf:9860]:8333
+[2001:0:5ef5:79fb:28e4:fbff:3237:992]:8333
+[2001:0:5ef5:79fb:2ce8:1d9e:b3bf:b53e]:8333
+[2001:0:5ef5:79fb:300a:2e20:4750:eb12]:8333
+[2001:0:5ef5:79fb:30a2:1ad9:5324:836a]:8333
+[2001:0:5ef5:79fb:3409:1996:bcac:241f]:8333
+[2001:0:5ef5:79fb:344b:2bd4:bb3e:e26]:8333
+[2001:0:5ef5:79fb:34b3:11db:e7da:d461]:8333
+[2001:0:5ef5:79fb:3839:2e0c:ba30:288e]:8333
+[2001:0:5ef5:79fb:3880:ef4:b5f0:ee4d]:8333
+[2001:0:5ef5:79fb:389f:52:9c0c:1f41]:8333
+[2001:0:5ef5:79fb:3c73:304a:9d8b:99d5]:8333
+[2001:0:5ef5:79fb:3cac:33e4:39ca:38c]:8333
+[2001:0:5ef5:79fb:6f:3667:5398:538f]:8333
+[2001:0:5ef5:79fb:88c:3e6:9454:3331]:8333
+[2001:0:5ef5:79fb:89:3b55:9fcc:8e66]:8333
+[2001:0:5ef5:79fb:c9b:3d65:bdf4:5d58]:8333
+[2001:0:5ef5:79fb:cb7:8cc:b8ee:6806]:8333
+[2001:0:5ef5:79fd:24f6:37b5:b9d2:2aa7]:8333
+[2001:0:5ef5:79fd:3c63:82e:aabc:bd39]:8333
+[2001:0:5ef5:79fd:3cf5:2eb7:c966:561d]:8333
+[2001:0:5ef5:79fd:cf4:28e2:aabd:b766]:8333
+[2001:0:9d38:6ab8:10f6:453:3ca4:1a8e]:8333
+[2001:0:9d38:6ab8:14dd:298b:431c:bfec]:8333
+[2001:0:9d38:6ab8:3051:1561:b62d:73a5]:8333
+[2001:0:9d38:6ab8:3467:ffa:b612:e9c6]:8333
+[2001:0:9d38:6ab8:8e8:1e26:e8e3:eed7]:8333
+[2001:0:9d38:6ab8:c82:37b3:47ee:3ae2]:8333
+[2001:0:9d38:6abd:1052:3cd8:a89b:e67]:8333
+[2001:0:9d38:6abd:144d:23f3:abcb:8bcb]:8333
+[2001:0:9d38:6abd:1c2e:31df:adf1:e616]:8333
+[2001:0:9d38:6abd:1c41:213b:facc:9c6b]:8333
+[2001:0:9d38:6abd:2093:12b5:8cbf:4f57]:8333
+[2001:0:9d38:6abd:243a:2394:fd91:712c]:8333
+[2001:0:9d38:6abd:2833:9f8:c94c:6881]:8333
+[2001:0:9d38:6abd:2c84:29d3:ae5a:f6f0]:8333
+[2001:0:9d38:6abd:2ce4:d50:cb22:3672]:8333
+[2001:0:9d38:6abd:3824:816:c30d:e9d4]:8333
+[2001:0:9d38:6abd:389a:24e9:cb5c:a1cd]:8333
+[2001:0:9d38:6abd:38bd:88f:2193:4932]:8333
+[2001:0:9d38:6abd:3c4f:cb1:d65b:d775]:8333
+[2001:0:9d38:6abd:3c51:280b:b1e9:ffd]:8333
+[2001:0:9d38:6abd:3c5a:2e2:2193:4932]:8333
+[2001:0:9d38:6abd:3c5e:3ebf:3dc0:703a]:8333
+[2001:0:9d38:6abd:4c9:12fc:d1d9:dc21]:8333
+[2001:0:9d38:6abd:6e:34e7:d0a7:6772]:8333
+[2001:0:9d38:6abd:8de:1f29:2aea:f96f]:8333
+[2001:0:9d38:6abd:c5f:2674:a467:787c]:8333
+[2001:0:9d38:6abd:cc0:23a4:ad7c:c998]:8333
+[2001:0:9d38:78cf:20c0:2097:d188:9c3b]:8333
+[2001:0:9d38:78cf:2420:dda:4ff6:8794]:8333
+[2001:0:9d38:78cf:2892:fcb:26b2:22ac]:8333
+[2001:0:9d38:78cf:3020:1ad7:26b2:22ac]:8333
+[2001:0:9d38:78cf:30ae:211b:e717:7788]:8333
+[2001:0:9d38:78cf:30d0:6edd:a418:a9e9]:8333
+[2001:0:9d38:78cf:30d9:3278:b004:65a7]:8333
+[2001:0:9d38:78cf:387a:17d5:dacb:bdf1]:8333
+[2001:0:9d38:78cf:3c38:c41:433c:7b87]:8333
+[2001:0:9d38:78cf:467:193:a8b0:a122]:8333
+[2001:0:9d38:78cf:c65:fb96:97d2:a9b0]:8333
+[2001:0:9d38:78cf:c9f:2633:d169:9999]:8333
+[2001:0:9d38:78cf:ce2:aba:d120:90db]:8333
+[2001:0:9d38:90d7:105d:26f2:a241:7339]:8333
+[2001:0:9d38:90d7:1062:3f95:e065:fc21]:8333
+[2001:0:9d38:90d7:10a6:19f6:ab95:ebcb]:8333
+[2001:0:9d38:90d7:14e2:22cb:738f:9489]:8333
+[2001:0:9d38:90d7:18fb:3da9:893d:1d57]:8333
+[2001:0:9d38:90d7:1cc3:2534:e020:53fa]:8333
+[2001:0:9d38:90d7:206d:2b34:d0cb:9de8]:8333
+[2001:0:9d38:90d7:20cb:2cb:b9a7:ca5e]:8333
+[2001:0:9d38:90d7:245c:2753:4382:704b]:8333
+[2001:0:9d38:90d7:24d6:225f:793b:bf5]:8333
+[2001:0:9d38:90d7:24da:8f0:bbf9:9c93]:8333
+[2001:0:9d38:90d7:28a2:107b:438e:b08d]:8333
+[2001:0:9d38:90d7:2c16:d58:b381:b61]:8333
+[2001:0:9d38:90d7:2c68:3068:cb59:3be7]:8333
+[2001:0:9d38:90d7:2c90:3855:b94f:c926]:8333
+[2001:0:9d38:90d7:2ca2:3592:c111:dd82]:8333
+[2001:0:9d38:90d7:2cce:1f6e:b381:8605]:8333
+[2001:0:9d38:90d7:3435:3915:2bcc:6cc7]:8333
+[2001:0:9d38:90d7:3438:2b9f:ad57:a721]:8333
+[2001:0:9d38:90d7:3474:1df1:e732:e5e3]:8333
+[2001:0:9d38:90d7:38c4:37af:ab0a:f5ef]:8333
+[2001:0:9d38:90d7:3a:39fd:a43b:5591]:8333
+[2001:0:9d38:90d7:3c9d:2a45:d537:3bd6]:8333
+[2001:0:9d38:90d7:3cfb:2cf5:5254:4d1e]:8333
+[2001:0:9d38:90d7:43f:337:adb4:6310]:8333
+[2001:0:9d38:90d7:493:995:d2e9:39be]:8333
+[2001:0:9d38:90d7:5b:ce3:b275:92ab]:8333
+[2001:0:9d38:90d7:8a8:59d:d0cb:d585]:8333
+[2001:0:9d38:90d7:c8e:1ba0:c5a9:dace]:8333
+[2001:0:9d38:90d7:cdb:365f:2302:f729]:8333
+[2001:0:9d38:90d7:cf5:222e:893e:716c]:8333
+[2001:0:9d38:90d7:d6:1085:b8dd:41c2]:8333
+[2001:0:9d38:953c:101a:23b3:6b98:f888]:8333
+[2001:0:9d38:953c:1805:f38:3eb2:2121]:8333
+[2001:0:9d38:953c:1858:16f9:3833:da19]:8333
+[2001:0:9d38:953c:18ea:2735:e73d:adc5]:8333
+[2001:0:9d38:953c:1c44:2b70:9de7:a7cc]:8333
+[2001:0:9d38:953c:200a:3f95:bb7c:c09f]:8333
+[2001:0:9d38:953c:200c:3473:b85d:ddd]:8333
+[2001:0:9d38:953c:200f:5a0:47c6:5507]:8333
+[2001:0:9d38:953c:2097:204a:47c5:5881]:8333
+[2001:0:9d38:953c:248f:24cd:aaf5:dee3]:8333
+[2001:0:9d38:953c:287d:168e:3caf:47af]:8333
+[2001:0:9d38:953c:28c1:58d:b721:94c1]:8333
+[2001:0:9d38:953c:2c31:30a3:39d3:528]:8188
+[2001:0:9d38:953c:2c3d:309b:d2db:8288]:8333
+[2001:0:9d38:953c:2c47:1b36:52c1:3c73]:8333
+[2001:0:9d38:953c:304a:10e1:b739:822a]:8333
+[2001:0:9d38:953c:30a3:29fd:33f6:eaab]:8333
+[2001:0:9d38:953c:3427:859b:b525:1069]:8333
+[2001:0:9d38:953c:3459:2541:3651:d675]:8333
+[2001:0:9d38:953c:4f5:9c88:af91:d3d3]:8333
+[2001:0:9d38:953c:cd1:1d54:b80a:42f4]:8333
+[2001:0:9d38:953c:cfa:37e6:9d8e:7474]:8333
+[2001:13d8:1c01:2000:2470::1]:8333
+[2001:1470:fffd:202c:225:90ff:fe8f:5f62]:8333
+[2001:14ba:200:0:543c:42ce:a48b:b0d0]:8333
+[2001:14ba:2fc:700:41b2:df51:efd8:f581]:8333
[2001:19f0:5000:8c8b:5400:ff:fe1f:c023]:8333
-[2001:19f0:5000:8ce6:5400:ff:fe1b:24a9]:8333
-[2001:19f0:5:314:5400:ff:fe2c:42e8]:8333
-[2001:19f0:5:51b:5400:ff:fe49:fe5b]:8333
+[2001:19f0:5:749:5400:ff:fe71:c3fc]:8333
[2001:19f0:5:bc:5400:ff:fe3b:9339]:8333
-[2001:1af8:4020:a020:5::]:8333
+[2001:19f0:7402:42c:5400:ff:fe6c:b9b8]:8333
+[2001:1af8:4010:a08f:f811:e5f0:3f63:e753]:8333
+[2001:1af8:4010:a094:3333::8c38]:8333
+[2001:1af8:4070:a016:3333::5afb]:8333
+[2001:1af8:4700:a071:4444::e26e]:8333
[2001:1bc8:1a0:590e:2e0:f4ff:fe16:3a39]:8333
-[2001:1c04:1401:8f00:f4fe:4fff:fe0c:df40]:8333
+[2001:2040:77::89]:8333
+[2001:288:1001:107:294e:5581:74bd:42f9]:8333
+[2001:3c8:c103:a001::48]:8333
[2001:4128:6135:10:20c:29ff:fe69:9e81]:8333
[2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333
[2001:4128:6135:e001:5054:ff:fe37:e9eb]:8333
-[2001:41d0:1000:1024::]:8333
-[2001:41d0:1000:1433::]:8333
-[2001:41d0:1004:22ae::]:8333
-[2001:41d0:1004:2996::]:8333
-[2001:41d0:1008:11e0::1a5c:6d9d]:8333
-[2001:41d0:1008:11e0::b74:baf7]:8333
-[2001:41d0:1008:237a::]:8333
+[2001:4178:6:1427:62:116:188:85]:8333
+[2001:41d0:1004:20f0::]:8333
[2001:41d0:1008:2752::]:8333
-[2001:41d0:1008:494::]:8333
-[2001:41d0:1:45d8::1]:8333
-[2001:41d0:1:5630::1]:8333
+[2001:41d0:1:4722::1]:8333
[2001:41d0:1:6f57::1]:8333
-[2001:41d0:1:801e::1]:8333
-[2001:41d0:1:8852::1]:8333
+[2001:41d0:1:7353::1]:8333
+[2001:41d0:1:7469::1]:8333
+[2001:41d0:1:7d09::1]:8333
[2001:41d0:1:8b26::1]:8333
-[2001:41d0:1:a5b8::1]:8333
-[2001:41d0:1:b26b::1]:8333
-[2001:41d0:1:c139::1]:8333
-[2001:41d0:1:c8d7::1]:8333
+[2001:41d0:1:c129::1]:8333
[2001:41d0:1:d227::]:8333
-[2001:41d0:1:dbc4::1]:8333
-[2001:41d0:1:dc5d::1]:8333
[2001:41d0:1:e13b::1]:8333
-[2001:41d0:1:ef5b::1]:8333
+[2001:41d0:1:e623::1]:8333
[2001:41d0:2:16be::1]:8333
[2001:41d0:2:203c::1]:8333
-[2001:41d0:2:38c5::1]:8333
-[2001:41d0:2:519::]:8333
+[2001:41d0:2:3242::]:8333
+[2001:41d0:2:8a0f::]:8333
+[2001:41d0:2:8c65::]:8333
+[2001:41d0:2:8d13::]:8333
+[2001:41d0:2:9459::]:8333
+[2001:41d0:2:950a:ffff:ffff:0:3]:8333
[2001:41d0:2:9c94::1]:8333
-[2001:41d0:2:b792::]:8333
+[2001:41d0:2:a212::]:8333
+[2001:41d0:2:a232::]:8333
+[2001:41d0:2:ab1c::]:8333
[2001:41d0:2:bf2a::]:8333
[2001:41d0:2:c793::]:8333
-[2001:41d0:2:c9bf::]:8333
-[2001:41d0:303:4f0::]:8333
-[2001:41d0:8:1a8a::1]:8333
-[2001:41d0:8:3fa9::1]:8333
-[2001:41d0:8:4670::1]:8333
-[2001:41d0:8:4f48::1]:8333
-[2001:41d0:8:6728::]:8333
-[2001:41d0:8:72c2:d:242:ac11:2]:8333
-[2001:41d0:8:8007::]:8333
-[2001:41d0:8:a71c::]:8333
-[2001:41d0:8:bccc::1]:8333
+[2001:41d0:302:1000::fa25]:8333
+[2001:41d0:303:1907::]:8333
+[2001:41d0:52:d00::6e2]:8333
+[2001:41d0:52:d00::6e3]:8333
+[2001:41d0:8:1b29::]:8333
+[2001:41d0:8:3d4b::1]:8333
+[2001:41d0:8:4d4d::1]:8333
+[2001:41d0:8:7a38::1]:8333
+[2001:41d0:8:8f46::1]:8333
+[2001:41d0:8:ba87::1]:8333
[2001:41d0:8:bd45::1]:8333
+[2001:41d0:8:bed3::]:8333
[2001:41d0:8:c67c::]:8333
+[2001:41d0:8:d844:1337::1017]:8333
+[2001:41d0:8:ddb::1]:8333
+[2001:41d0:8:ddf::1]:8333
[2001:41d0:8:de3d::1]:8333
-[2001:41d0:8:e257::1]:8333
[2001:41d0:8:e3e4::1]:8333
-[2001:41d0:a:14cc::1]:8333
-[2001:41d0:a:15b2::1]:8333
-[2001:41d0:a:1ac9::1]:8333
-[2001:41d0:a:2496::1]:8333
-[2001:41d0:a:308c::]:8333
-[2001:41d0:a:5879::]:8333
+[2001:41d0:a:4e3f::1c7d:6b01]:8333
+[2001:41d0:a:635b::1]:8333
[2001:41d0:a:6810::1]:8333
-[2001:41d0:a:682d::1]:8333
[2001:41d0:a:6c29::1]:8333
-[2001:41d0:a:f52a::1]:8333
+[2001:41d0:a:6fd0::]:8333
+[2001:41d0:a:fac7::1]:8333
[2001:41d0:d:111c::]:8333
+[2001:41d0:d:2ac8::]:8333
[2001:41d0:e:1388::1]:8333
-[2001:41d0:e:26b::1]:8333
-[2001:41d0:e:f73::1]:8333
-[2001:41d0:fc8c:a200:7a24:afff:fe9d:c69b]:8333
[2001:41f0:61:0:72f3:95ff:fe09:7521]:8333
[2001:41f0:61::7]:8333
-[2001:4428:200:8171:db6:2ff4:9c0e:a2da]:8333
[2001:470:1f07:151c:baac:6fff:feb7:3ba9]:8333
-[2001:470:1f0b:ad6:a60:6eff:fec6:2323]:8333
-[2001:470:1f11:617::10f]:8333
-[2001:470:1f14:73e::2]:8333
-[2001:470:1f14:7d::2]:8333
+[2001:470:1f0b:8c4::5]:8333
+[2001:470:1f0b:967::11]:8333
[2001:470:1f15:11f8::10]:8333
[2001:470:1f15:1b95:2c3e:8a9a:24e1:7084]:8333
-[2001:470:1f15:e9b::3ef]:8333
+[2001:470:1f15:f28::3]:8333
+[2001:470:1f1a:172::2]:8333
+[2001:470:1f1c:b07::2]:8333
[2001:470:1f1d:3a9::10]:8333
[2001:470:25:482::2]:8333
-[2001:470:27:19f::2]:8333
-[2001:470:27:665::2]:8333
[2001:470:28:365::4]:8333
-[2001:470:41:6::2]:8333
-[2001:470:727b::11:14]:8333
-[2001:470:7:2f0::2]:8333
-[2001:470:7:65::2]:8333
-[2001:470:7f85::2]:8333
-[2001:470:8:2e1:5825:39df:3e4c:54a8]:8333
-[2001:470:8:2e1::43]:8333
-[2001:470:8:2e1:ae2a:e257:4470:6350]:8333
+[2001:470:754f:42::17a]:8333
+[2001:470:7:b74::2]:8333
+[2001:470:7dda:1::1]:8333
+[2001:470:8:c70:20c:29ff:fe6a:8fdc]:8333
+[2001:470:8:c70::54]:8333
[2001:470:a:c13::2]:8333
+[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333
+[2001:470:dbf2:aaaa::b17:c01c]:8333
+[2001:470:f457:8000::a6]:8333
[2001:4801:7819:74:b745:b9d5:ff10:a61a]:8333
[2001:4801:7819:74:b745:b9d5:ff10:aaec]:8333
[2001:4801:7828:104:be76:4eff:fe10:1325]:8333
-[2001:4802:7800:2:30d7:1775:ff20:1858]:8333
-[2001:4ba0:babe:832::]:8333
-[2001:4ba0:cafe:379::1]:8333
-[2001:4ba0:ffee:33::10]:8333
-[2001:4dd0:ff00:9a67::9]:8333
-[2001:610:1b19::3]:8333
-[2001:610:600:a41::2]:8333
-[2001:678:174:4021::2:8333]:8333
-[2001:67c:16dc:1201:5054:ff:fe17:4dac]:8333
+[2001:4ba0:cafe:13c0::1]:8333
+[2001:4ba0:cafe:418::1]:8333
+[2001:558:6045:23:1830:896c:d901:190d]:8333
+[2001:67c:1220:80c::93e5:dd2]:8333
[2001:67c:2128:ffff:6062:36ff:fe30:6532]:8333
-[2001:67c:2564:331:3547:6e28:85a4:fb27]:8333
-[2001:6a0:200:368::2]:8333
-[2001:718:801:311:5054:ff:fe19:c483]:8333
-[2001:7b8:2ff:8f::2]:8333
-[2001:8d8:8a6:4400::3f:86c]:8333
[2001:8d8:923:8400::87:ebd]:8333
-[2001:960:66d::2]:8333
+[2001:981:4452:1::100]:8333
[2001:981:46:1:ba27:ebff:fe5b:edee]:8333
-[2001:ba8:1f1:f069::2]:8333
+[2001:981:bdbd:1:c506:7d38:4b47:da15]:8333
+[2001:985:79af:20::35]:8333
[2001:bc8:225f:10e:505:6573:7573:d0a]:8333
-[2001:bc8:2706::1]:8333
[2001:bc8:323c:100::53]:8333
[2001:bc8:323c:100::80:4]:8333
[2001:bc8:323c:100::cafe]:8333
[2001:bc8:3680:4242::1]:8333
[2001:bc8:399f:f000::1]:8333
-[2001:bc8:3cbf::5]:8333
-[2001:bc8:4700:2300::19:807]:8333
-[2001:e42:102:1805:160:16:206:31]:8333
-[2002:12f1:3f::12f1:3f]:8333
-[2002:1e2:5349::1e2:5349]:8333
+[2002:1e2:5587::1e2:5587]:8333
[2002:1e2:5588::1e2:5588]:8333
-[2002:2501:cf62::2501:cf62]:8333
-[2002:268c:a135::268c:a135]:8333
-[2002:2a33:99db::2a33:99db]:8332
-[2002:2ebc:2c14::7]:8333
-[2002:2f59:2c9c::2f59:2c9c]:11885
-[2002:2f5a:3619::2f5a:3619]:8333
-[2002:2f5a:36a4::2f5a:36a4]:8333
-[2002:2f5a:429::2f5a:429]:8333
+[2002:2a33:21c4::2a33:21c4]:8333
+[2002:2e04:784b::2e04:784b]:8333
+[2002:2ebc:2c14::16]:8333
+[2002:2f5a:3c1c::2f5a:3c1c]:10011
[2002:2f5a:562a::2f5a:562a]:8333
-[2002:3a3b:216::3a3b:216]:8333
-[2002:3dfa:5d23::3dfa:5d23]:8333
-[2002:424f:a052::424f:a052]:8333
-[2002:451e:e922::451e:e922]:8333
+[2002:2f5b:a5f9::2f5b:a5f9]:8333
+[2002:3141:28c::3141:28c]:8333
+[2002:323f:a2f2::323f:a2f2]:8333
+[2002:323f:fbd::323f:fbd]:8333
+[2002:33ff:69a0::1]:8333
+[2002:3e6a:106f::3e6a:106f]:8333
+[2002:3e70:bbc::3e70:bbc]:8333
+[2002:3e7a:6727::3e7a:6727]:8333
+[2002:3f62:e6bb::3f62:e6bb]:8333
[2002:4540:4b30::4540:4b30]:8333
-[2002:51ab:7cc::51ab:7cc]:8333
-[2002:527:de11::527:de11]:8333
-[2002:5395:7d01::5395:7d01]:8333
-[2002:5395:7d2a::5395:7d2a]:8333
-[2002:5669:e3be::5669:e3be]:8333
-[2002:566a:5d6d::566a:5d6d]:8333
-[2002:59b9:f820::59b9:f820]:8333
-[2002:59f8:ac69::59f8:ac69]:8333
-[2002:5bd4:b65a::5bd4:b65a]:8333
-[2002:5c3f:39db::5c3f:39db]:8333
-[2002:5d33:8d03::5d33:8d03]:8333
-[2002:5d67:49bb::5d67:49bb]:8333
-[2002:5dae:5d5f::5dae:5d5f]:8333
+[2002:4e6b:c745::1]:8333
+[2002:5052:4d8a::5052:4d8a]:8333
+[2002:51a9:9cc9::51a9:9cc9]:8333
+[2002:54fb:cb05::1]:8333
+[2002:5bc2:5428::5bc2:5428]:8333
+[2002:5bce:1253::5bce:1253]:8333
+[2002:5bdb:19e8::5bdb:19e8]:8333
+[2002:5c3f:3912::5c3f:3912]:8333
+[2002:5dbd:91a9::5dbd:91a9]:8333
[2002:5dbe:8cc6::5dbe:8cc6]:8333
-[2002:5dbe:9503::5dbe:9503]:8333
[2002:5fd3:8944::5fd3:8944]:8333
-[2002:5fd3:9467::5fd3:9467]:8333
-[2002:67f9:6a48::67f9:6a48]:8333
-[2002:67f9:6a4a::67f9:6a4a]:8333
-[2002:67f9:6a95::67f9:6a95]:8333
+[2002:65c8:a018::65c8:a018]:8333
+[2002:6750:a839::6750:a839]:8333
+[2002:67fa:44b::67fa:44b]:8333
[2002:6a0e:3ea8::6a0e:3ea8]:10011
-[2002:6b96:375a::6b96:375a]:8333
-[2002:6ca8:cffb::6ca8:cffb]:8333
-[2002:6caf:234::6caf:234]:8333
-[2002:6dec:58f5::6dec:58f5]:8333
+[2002:6a0f:2497::6a0f:2497]:8333
[2002:6dec:5ac7::6dec:5ac7]:8333
-[2002:7237:4a02::7237:4a02]:20033
-[2002:7237:94fd::7237:94fd]:10011
-[2002:7237:e428::7237:e428]:8333
+[2002:704a:d6d4::704a:d6d4]:9997
[2002:7237:fcf6::7237:fcf6]:20188
-[2002:76c0:96e6::76c0:96e6]:8333
+[2002:76b2:7f40::76b2:7f40]:8333
[2002:7819:7e80::7819:7e80]:7743
-[2002:781a:ea86::781a:ea86]:8333
-[2002:781a:f3c2::781a:f3c2]:14475
-[2002:784c:c2c0::784c:c2c0]:8333
-[2002:784c:ec97::784c:ec97]:8333
-[2002:792b:261a::792b:261a]:8333
-[2002:88f3:8cca::88f3:8cca]:8333
-[2002:88f3:a83c::88f3:a83c]:8333
-[2002:8ac9:516f::8ac9:516f]:8333
-[2002:8b81:6d78::8b81:6d78]:50344
-[2002:8b81:6e5c::8b81:6e5c]:38176
-[2002:8bc4:90a6::8bc4:90a6]:8333
+[2002:781b:8db8::781b:8db8]:8333
+[2002:7b38:cd00::7b38:cd00]:8333
[2002:ac52:b854::ac52:b854]:8333
-[2002:add0:c14a::add0:c14a]:8333
-[2002:b07e:a70a::b07e:a70a]:8333
-[2002:b27c:c565:1::250]:8333
-[2002:b27c:c565::1]:8333
-[2002:b94d:80f1::b94d:80f1]:8333
-[2002:b982:e26a::b982:e26a]:8333
-[2002:bcd5:3145::bcd5:3145]:8333
-[2002:c08a:d22b::c08a:d22b]:8333
-[2002:c0c7:f8e3::c0c7:f8e3]:32771
-[2002:c1a9:fc5a::c1a9:fc5a]:8333
+[2002:b610:1ca3::b610:1ca3]:8333
+[2002:b946:694a::b946:694a]:8339
+[2002:b994:9167::b994:9167]:8333
+[2002:bc28:6b92::bc28:6b92]:8333
[2002:c23f:8fc5::c23f:8fc5]:8333
-[2002:d395:ea6d::d395:ea6d]:8333
-[2002:d917:ca5::d917:ca5]:8333
-[2002:d917:e91::d917:e91]:8333
+[2002:c338:3f0a::c338:3f0a]:8333
+[2002:d1b1:5615::d1b1:5615]:8333
+[2002:d2d3:6da5::d2d3:6da5]:8333
+[2002:d917:2b1::d917:2b1]:8333
[2002:db71:f434::db71:f434]:8333
-[2400:2651:161:1000:6847:d40f:aaa3:4848]:8333
-[2400:8901::f03c:91ff:fec8:4280]:8333
-[2401:1800:7800:102:be76:4eff:fe1c:a7d]:8333
+[2003:a:36f:4f01::1]:8333
+[2003:a:37f:ef4f:dead:babe:b00b:beef]:8333
+[2400:8901::f03c:91ff:fe2c:63d8]:8333
+[2400:8902::f03c:91ff:fed5:9d8d]:8333
[2401:2500:203:10:153:120:156:83]:8333
[2401:a400:3200:5600:14ee:f361:4bdc:1f7c]:8333
+[2402:1f00:8100:36::]:8333
[2403:4200:403:2::ff]:8333
+[2405:9800:b440:947f:59a5:f379:1876:858c]:8333
[2405:aa00:2::40]:8333
+[2406:da14:445:5201::4]:8333
+[2406:da18:f7c:4351:1a58:81fe:6ed0:1103]:8333
+[2406:da18:f7c:4351:22aa:2585:fe88:7d58]:8333
+[2406:da18:f7c:4351:2674:33bb:25d6:cbba]:8333
+[2406:da18:f7c:4351:2e19:a8c7:a36a:bde0]:8333
+[2406:da18:f7c:4351:3cc8:43d:fbcc:5067]:8333
+[2406:da18:f7c:4351:5228:2b53:bb9a:edf5]:8333
+[2406:da18:f7c:4351:5729:102:998c:d41a]:8333
+[2406:da18:f7c:4351:591b:4881:3986:3703]:8333
+[2406:da18:f7c:4351:59b9:b50:f47f:b560]:8333
+[2406:da18:f7c:4351:61f2:cfb0:8c45:5fdd]:8333
+[2406:da18:f7c:4351:6356:68e0:73fc:ac0b]:8333
+[2406:da18:f7c:4351:660e:f6bc:3563:ba8e]:8333
+[2406:da18:f7c:4351:691:9e:f2df:227d]:8333
+[2406:da18:f7c:4351:721c:83d2:6765:4300]:8333
+[2406:da18:f7c:4351:7237:9be:4601:bc15]:8333
+[2406:da18:f7c:4351:7a3b:c203:fd11:6c7d]:8333
+[2406:da18:f7c:4351:7a74:a80e:889a:ba42]:8333
+[2406:da18:f7c:4351:7ee3:a181:f25c:fa79]:8333
+[2406:da18:f7c:4351:8a25:9084:140:4549]:8333
+[2406:da18:f7c:4351:8bc0:c6fd:ecfb:f074]:8333
+[2406:da18:f7c:4351:91ce:d0ba:1b9e:c27b]:8333
+[2406:da18:f7c:4351:9336:44e7:84b4:85b9]:8333
+[2406:da18:f7c:4351:936c:c3b9:a1d0:848]:8333
+[2406:da18:f7c:4351:93ef:1eef:65c8:766d]:8333
+[2406:da18:f7c:4351:94e0:5b27:78c2:5111]:8333
+[2406:da18:f7c:4351:9815:a202:18a3:2a36]:8333
+[2406:da18:f7c:4351:9e1b:135c:7472:9d9]:8333
+[2406:da18:f7c:4351:9f84:278:68f5:b8ea]:8333
+[2406:da18:f7c:4351:a062:493f:a6f8:ca75]:8333
+[2406:da18:f7c:4351:a192:b98:3066:8f11]:8333
+[2406:da18:f7c:4351:a1cb:2f19:4a54:38c9]:8333
+[2406:da18:f7c:4351:a4a2:4c9:c43a:98ae]:8333
+[2406:da18:f7c:4351:a7e9:cd48:fa90:46d3]:8333
+[2406:da18:f7c:4351:a88:99:6671:fce4]:8333
+[2406:da18:f7c:4351:abe1:2e48:eb97:2ab5]:8333
+[2406:da18:f7c:4351:acf5:2b21:5d2a:6b31]:8333
+[2406:da18:f7c:4351:b51f:8966:74a5:6c53]:8333
+[2406:da18:f7c:4351:b8e3:f3ca:e412:daa5]:8333
+[2406:da18:f7c:4351:ba7c:6da8:da59:b1b6]:8333
+[2406:da18:f7c:4351:be04:6f8e:8f93:c555]:8333
+[2406:da18:f7c:4351:c82d:2a0b:31a5:e28d]:8333
+[2406:da18:f7c:4351:c993:eb06:bd2c:1e65]:8333
+[2406:da18:f7c:4351:d4b9:bff8:c4d4:1e05]:8333
+[2406:da18:f7c:4351:d70d:a73d:1ddd:439e]:8333
+[2406:da18:f7c:4351:e103:f456:b296:9f29]:8333
+[2406:da18:f7c:4351:ea3b:27ec:7c2:aebc]:8333
+[2406:da18:f7c:4351:f62c:5013:379b:363e]:8333
[240b:10:ca20:f0:224:e8ff:fe1f:60d9]:8333
[240b:250:1e0:2400:b9ef:8fe3:a69a:7378]:8333
-[240d:1a:302:8600:8876:a36d:12ee:f285]:8333
+[2600:1f14:34a:fe00:13f4:ceb6:a9db:4f47]:8333
+[2600:1f14:34a:fe00:2550:9366:a5d9:78a5]:8333
+[2600:1f14:34a:fe00:27d:6ed:7c8d:7bee]:8333
+[2600:1f14:34a:fe00:2ed6:8a19:4eb:36c1]:8333
+[2600:1f14:34a:fe00:34c7:2e9e:e60e:f823]:8333
+[2600:1f14:34a:fe00:38de:442:72df:6346]:8333
+[2600:1f14:34a:fe00:3a1e:878f:991a:9582]:8333
+[2600:1f14:34a:fe00:3d88:1805:54e3:f4c8]:8333
+[2600:1f14:34a:fe00:3f3e:58bd:ec82:5dac]:8333
+[2600:1f14:34a:fe00:449a:9515:8436:f407]:8333
+[2600:1f14:34a:fe00:4f84:277f:e64d:1f06]:8333
+[2600:1f14:34a:fe00:5229:de84:8226:7257]:8333
+[2600:1f14:34a:fe00:5743:42c3:951b:e97a]:8333
+[2600:1f14:34a:fe00:5a29:85b:86b5:fa0e]:8333
+[2600:1f14:34a:fe00:5de8:81e:6d79:330b]:8333
+[2600:1f14:34a:fe00:5fca:ad1e:5b9c:5265]:8333
+[2600:1f14:34a:fe00:68c4:ca1b:813e:1bce]:8333
+[2600:1f14:34a:fe00:6:de9e:7b5e:a558]:8333
+[2600:1f14:34a:fe00:6c72:1fcd:433:dc97]:8333
+[2600:1f14:34a:fe00:77ee:629f:bc13:fb4f]:8333
+[2600:1f14:34a:fe00:79d0:85d6:516f:3293]:8333
+[2600:1f14:34a:fe00:81:422f:9ef3:4579]:8333
+[2600:1f14:34a:fe00:822b:5f05:ec8d:48c6]:8333
+[2600:1f14:34a:fe00:82a:76a2:fdc9:845e]:8333
+[2600:1f14:34a:fe00:83ca:cef6:e04c:50c0]:8333
+[2600:1f14:34a:fe00:8ba2:a36c:8687:d5aa]:8333
+[2600:1f14:34a:fe00:8c80:5c67:3b47:90b3]:8333
+[2600:1f14:34a:fe00:8eb8:f47f:6d53:e3ae]:8333
+[2600:1f14:34a:fe00:989c:f8f8:a922:1b9a]:8333
+[2600:1f14:34a:fe00:98c9:1eb3:ea12:a8f0]:8333
+[2600:1f14:34a:fe00:9ee5:a8f6:6b2a:866e]:8333
+[2600:1f14:34a:fe00:a46b:7bd5:629f:f75c]:8333
+[2600:1f14:34a:fe00:a627:8299:8784:d439]:8333
+[2600:1f14:34a:fe00:ad0b:955e:b4e5:d97d]:8333
+[2600:1f14:34a:fe00:ae82:7117:9d69:7c86]:8333
+[2600:1f14:34a:fe00:ccee:365a:43f8:b871]:8333
+[2600:1f14:34a:fe00:d5ee:a3e2:2f85:e593]:8333
+[2600:1f14:34a:fe00:d5f0:1fe0:6bd5:18a8]:8333
+[2600:1f14:34a:fe00:e4a7:5aba:af87:4cdb]:8333
+[2600:1f14:34a:fe00:e8e5:2d0:fb6f:2f5]:8333
+[2600:1f14:34a:fe00:e9ef:4690:a5ac:92be]:8333
+[2600:1f14:34a:fe00:efba:2260:6997:fcf7]:8333
+[2600:1f14:34a:fe00:f107:2d08:c67:e5dd]:8333
+[2600:1f14:34a:fe00:f1b9:88fb:f3db:a86e]:8333
+[2600:1f14:34a:fe00:f79c:17b7:6f75:95b7]:8333
+[2600:1f14:6ae:d900:6550:3fc5:e074:a72c]:8333
+[2600:1f16:625:e00:1243:38b3:caa:d62e]:8333
+[2600:1f16:625:e00:166d:a956:1041:f97d]:8333
+[2600:1f16:625:e00:35f2:2428:fc57:d638]:8333
+[2600:1f16:625:e00:3c75:333e:b7f:8cc0]:8333
+[2600:1f16:625:e00:3fbf:31f:1b57:8b18]:8333
+[2600:1f16:625:e00:5617:7575:379:a8cc]:8333
+[2600:1f16:625:e00:58fa:fce6:30:a5dc]:8333
+[2600:1f16:625:e00:5e74:70dc:af78:6b77]:8333
+[2600:1f16:625:e00:7036:f651:2ee:39cd]:8333
+[2600:1f16:625:e00:7fc:9004:e7be:ffe2]:8333
+[2600:1f16:625:e00:814a:23f6:e996:5e64]:8333
+[2600:1f16:625:e00:822c:a88b:f9c:57e3]:8333
+[2600:1f16:625:e00:8314:b91e:a7ba:702]:8333
+[2600:1f16:625:e00:88bb:ee9a:10de:12]:8333
+[2600:1f16:625:e00:8c30:56f5:a29a:91de]:8333
+[2600:1f16:625:e00:8fdf:6517:7718:8c42]:8333
+[2600:1f16:625:e00:91fd:78b1:62a3:193]:8333
+[2600:1f16:625:e00:930d:93ed:76a6:3285]:8333
+[2600:1f16:625:e00:93c2:615f:a79a:c11f]:8333
+[2600:1f16:625:e00:a780:8bc8:a1f6:d417]:8333
+[2600:1f16:625:e00:a951:e663:4046:8c3a]:8333
+[2600:1f16:625:e00:ab19:5fe3:f155:1371]:8333
+[2600:1f16:625:e00:aefd:9cc7:d3:6e86]:8333
+[2600:1f16:625:e00:b031:e86e:8604:324a]:8333
+[2600:1f16:625:e00:b6e:4399:9dc2:6b45]:8333
+[2600:1f16:625:e00:b7c7:58c6:21a1:fd41]:8333
+[2600:1f16:625:e00:c169:6282:178c:27d6]:8333
+[2600:1f16:625:e00:c94e:58b:bd35:d815]:8333
+[2600:1f16:625:e00:caa5:7369:73a4:5711]:8333
+[2600:1f16:625:e00:cd15:b9f2:6e3e:6fd1]:8333
+[2600:1f16:625:e00:d6f3:775:66b7:3e92]:8333
+[2600:1f16:625:e00:dbec:f7d9:e15:f8e0]:8333
+[2600:1f16:625:e00:dbf4:4d41:594e:bc20]:8333
+[2600:1f16:625:e00:e11b:4589:a0c3:9cc7]:8333
+[2600:1f16:625:e00:ed68:15b0:3a97:be0c]:8333
+[2600:1f16:625:e00:eef3:bce0:84ee:a98b]:8333
+[2600:1f16:625:e00:ef3a:f66e:f059:d03f]:8333
+[2600:1f16:625:e00:f67c:d398:5b6:d34f]:8333
+[2600:1f16:625:e00:fe35:5099:3a8e:d123]:8333
+[2600:1f18:64d9:1603:6f6f:eef9:b595:1958]:8333
+[2600:3c00::f03c:91ff:fe84:d650]:8333
+[2600:3c00::f03c:91ff:fe89:7438]:8333
[2600:3c00::f03c:91ff:fe91:3e49]:8333
[2600:3c00::f03c:91ff:febb:981e]:8333
-[2600:3c01::f03c:91ff:fe18:6adf]:8333
[2600:3c01::f03c:91ff:fe69:89e9]:8333
[2600:3c01::f03c:91ff:fe91:6a29]:8333
-[2600:3c01::f03c:91ff:fef1:1eaa]:8333
-[2600:3c03::f03c:91ff:fe18:da80]:8333
[2600:3c03::f03c:91ff:fe28:1445]:8333
-[2600:3c03::f03c:91ff:fe67:d2e]:8333
-[2600:3c03::f03c:91ff:fe89:116f]:8333
-[2600:3c03::f03c:91ff:feb0:5fc4]:8333
[2600:3c03::f03c:91ff:fee0:233e]:8333
-[2600:3c03::f03c:91ff:fee0:51]:8333
+[2600:6c55:7200:24d:cf4:811c:7cb3:f7a7]:8333
[2600:8805:2400:14e:226:4aff:fe02:2ba4]:8333
-[2600:8807:5080:3301:1487:83b7:33d7:eb97]:8333
-[2601:186:c100:6bcd:16bd:cea1:235d:1c19]:8333
-[2601:18c:4200:28d0:e4d:e9ff:fec5:76d0]:8333
-[2601:247:8201:6251:30e6:7b95:69bf:9248]:8333
+[2601:18d:4600:3cc2:20e7:b3ff:fecf:a99]:8333
+[2601:1c2:1702:5241:47d:4016:ec42:6705]:8333
+[2601:441:4101:70cd:4e3:8e81:3250:1f0b]:8333
[2601:602:9980:f78:211:11ff:fec5:1ae]:8333
-[2602:ae:1993:de00:2c50:9a44:8f11:77a5]:8333
-[2602:ff68:0:1:21e:bff:feca:db72]:8333
-[2602:ff68:0:1:2bd:27ff:feb0:adf8]:8333
-[2602:ff68:0:1::5]:8333
-[2602:ff68:0:5:2bd:27ff:feb0:adf8]:8333
-[2602:ffc5:1f::1f:2d61]:8333
-[2602:ffc5:1f::1f:9211]:8333
-[2602:ffc5::9e63:27a2]:8333
+[2601:646:4103:179f:5809:1bff:fe55:6678]:8333
+[2602:4c:323:b101:35a3:9de8:6984:ef56]:8333
+[2602:ff62:104:ac1:8000::]:8333
+[2602:ffc5:40::1:711e]:8333
[2602:ffc5::c30:1c75]:8333
-[2602:ffc5::ffc5:b844]:8333
-[2602:ffe8:100:2::457:936b]:8333
-[2604:180:2:eee::ca46]:8333
-[2604:880:d:85::be37]:8333
-[2604:9a00:2100:a009:2::]:8333
-[2604:a880:2:d0::301:8001]:8333
-[2604:a880:2:d0::4a9:1001]:8333
-[2604:a880:2:d0::53a:c001]:8333
+[2604:a880:2:d0::17e9:2001]:8333
+[2604:a880:2:d0::22f8:f001]:8333
+[2604:a880:2:d0::22f9:1]:8333
+[2604:a880:2:d0::22f9:c001]:8333
+[2604:a880:2:d0::22f9:d001]:8333
+[2604:a880:2:d0::22f9:e001]:8333
+[2604:a880:2:d0::22fa:2001]:8333
+[2604:a880:2:d0::22fa:3001]:8333
+[2604:a880:400:d0::1684:5001]:8333
+[2604:a880:400:d0::1ac4:b001]:8333
+[2604:a880:400:d0::2004:4001]:8333
+[2604:a880:400:d0::2004:5001]:8333
+[2604:a880:400:d0::2004:6001]:8333
+[2604:a880:400:d0::2004:c001]:8333
+[2604:a880:400:d0::2004:d001]:8333
+[2604:a880:400:d0::2004:e001]:8333
+[2604:a880:400:d0::2004:f001]:8333
+[2604:a880:400:d0::2005:1]:8333
+[2604:a880:400:d0::2005:3001]:8333
+[2604:a880:400:d0::261f:6001]:8333
+[2604:a880:400:d0::28b8:5001]:8333
[2604:a880:400:d0::ad7:e001]:8333
-[2604:a880:400:d0::dcf:f001]:8333
[2605:4d00::50]:8333
-[2605:6000:edc8:300::ddfe]:8333
-[2605:6000:ffc0:70:74d5:225c:f553:5bb8]:8333
-[2606:6000:c148:7003:5054:ff:fe78:66ff]:8333
-[2606:6000:e6d6:d701:d428:5e44:a2c9:3ff6]:8333
-[2606:c680:1:4a:2016:d1ff:fe93:52a7]:8333
+[2605:5d80:2002::245]:8333
+[2605:9880:0:953:225:90ff:fed2:c0b4]:8333
+[2606:c380::215:17ff:feb3:3ec]:8333
+[2607:1c00:a:6:3c1c:1b0d:ba4:8ea9]:8333
+[2607:1c00:a:6::1000]:8333
+[2607:4480:2:2000:250:56ff:fe86:6449]:8333
+[2607:5300:120:671::]:8333
+[2607:5300:120:962::]:8333
+[2607:5300:201:2000::1:556]:8333
[2607:5300:203:118:3733::1414]:8333
-[2607:5300:60:13bb::1]:8333
-[2607:5300:60:1966::1]:8333
-[2607:5300:60:2218::]:8333
-[2607:5300:60:3775::]:8333
+[2607:5300:60:10aa::1]:8333
+[2607:5300:60:1e83::]:8333
+[2607:5300:60:1e83::1000]:8333
+[2607:5300:60:1e83::2000]:8333
+[2607:5300:60:2d0::1]:8333
[2607:5300:60:3ddf::]:8333
-[2607:5300:60:a654::]:8333
-[2607:5300:60:a7a3::]:8333
+[2607:5300:60:3f3c::]:8333
+[2607:5300:60:5428::]:8333
[2607:5300:60:ac0::1]:8333
-[2607:5300:60:cf97::]:8333
-[2607:f0d0:1901:19::6]:8333
-[2607:f128:40:1202:69:162:139:125]:8333
-[2607:f128:40:1703::2]:8333
-[2607:f178:0:8::106]:8333
-[2607:f1c0:84d:8900::7e:cad]:8333
+[2607:5300:61:f4b::1]:8333
+[2607:9000:0:1:5054:ff:fe5d:264e]:8333
+[2607:f1c0:846:9a00::87:d00e]:8333
+[2607:f2d8:4005:d:a8a2:eeff:fee0:a859]:8333
[2607:f948:0:1::1:40]:8333
-[2607:fcd0:100:2302::6094:635a]:8333
-[2607:fcd0:100:6a00::3a96:1]:8333
-[2607:fcd0:100:6a02::7ff0:1]:8333
-[2607:fcd0:100:8203::8c58:dbc]:8333
-[2607:fea8:1360:9c2:221a:6ff:fe47:776d]:8333
-[2607:fea8:4da0:9ce:5114:a8ec:20f5:a50b]:8333
-[2607:fea8:5df:fda0:feaa:14ff:feda:c79a]:8333
-[2607:fea8:84c0:163:f42c:baff:fecc:6bbf]:8333
+[2607:fa18:3a01::50]:8333
+[2607:fea8:3ca0:926::2]:8333
+[2607:fea8:4da0:3b0::2]:8333
[2607:ff10:c5:502:225:90ff:fe32:d446]:8333
-[2607:ff48:aa81:800::96cf:1]:8333
-[2620:11c:5001:1118:d267:e5ff:fee9:e673]:8333
+[2607:ff28:9005:1::2567:57e0]:8333
+[2620:71:4000:0:192:30:120:110]:8333
[2620:b8:4000:1000::93:1]:8333
[2800:1a0::9]:8333
-[2a00:1178:2:43:19fd:d43e:b77:edeb]:8333
-[2a00:1178:2:43:b4e3:e562:f811:d761]:8333
-[2a00:14f0:e000:80d2:cd1a::1]:8333
-[2a00:1630:14::101]:8333
-[2a00:1630:2:1802:188:122:91:11]:8333
-[2a00:1630:2:500::4]:8333
+[2801:84:0:1034:76d4:35ff:fe7f:5033]:8333
+[2a00:16d8:c::5b6a:c261]:8333
[2a00:1768:2001:24::148:218]:8333
-[2a00:1768:2001:27::142:21]:8333
+[2a00:19e0:1:1:225:90ff:fea5:fc0]:8333
[2a00:1a48:7810:101:be76:4eff:fe08:c774]:8333
-[2a00:1ca8:37::a5fc:40d1]:8333
-[2a00:1ca8:37::ab6d:ce2c]:8333
-[2a00:1dc0:2255:10::2]:8333
+[2a00:6340:2004:0:5054:ff:fe54:38c]:8333
+[2a00:7b80:477:21::1c8c:83a6]:8333
[2a00:7c80:0:71::8]:8333
[2a00:7c80:0:97::7]:8333
-[2a00:bbe0:0:42:222:64ff:fe9a:e206]:8333
-[2a00:c98:2050:a020:3::110]:8333
-[2a00:dcc0:eda:98:183:193:1d24:b53a]:8333
-[2a00:dcc0:eda:98:183:193:c382:6bdb]:8333
-[2a00:dcc0:eda:98:183:193:f72e:d943]:8333
-[2a00:f90:ff0:c100:53c4:97a7:8b59:796a]:8333
-[2a01:238:435c:de00:b110:38cf:192d:b2c]:28333
-[2a01:348:6:7cf::2]:8333
-[2a01:368:e012:8888:216:3eff:fe24:1162]:8333
+[2a01:238:4363:4900:d85e:c1d9:2b32:61d0]:8333
[2a01:488:66:1000:53a9:22b:0:1]:8333
-[2a01:488:67:1000:523:ffa7:0:1]:8333
+[2a01:488:67:1000:5bfa:5526:0:1]:8333
[2a01:488:67:1000:b01c:3379:0:1]:8333
-[2a01:4f8:100:34ce::2]:8333
-[2a01:4f8:100:44e7::2]:8333
-[2a01:4f8:10a:2e4::2]:8333
-[2a01:4f8:10a:34e::2]:8333
-[2a01:4f8:10a:51d::2]:8333
-[2a01:4f8:10a:622::2]:8333
-[2a01:4f8:10a:85f::2]:8333
-[2a01:4f8:10a:864::2]:8333
-[2a01:4f8:10a:d04::2]:8333
-[2a01:4f8:110:334c::2]:8333
+[2a01:4d60:3:1:5::1]:8333
+[2a01:4f8:10a:1d8f::2]:8333
+[2a01:4f8:10a:1e81::2]:8333
+[2a01:4f8:10a:2261::2]:8833
+[2a01:4f8:10a:239c::2]:9002
+[2a01:4f8:10a:294a::2]:8333
+[2a01:4f8:10a:31d3::2]:8333
+[2a01:4f8:10a:3fe6::2]:8333
+[2a01:4f8:10a:b2e::2]:8333
+[2a01:4f8:10b:12d7::2]:8333
+[2a01:4f8:10b:d50::2]:8333
+[2a01:4f8:10b:e2d::2]:8333
+[2a01:4f8:10b:ee1::2]:8333
+[2a01:4f8:110:5107::2]:8333
+[2a01:4f8:110:5292::2]:8333
[2a01:4f8:110:536e::2]:8333
[2a01:4f8:120:43e4::2]:8333
-[2a01:4f8:120:702e::2]:8333
-[2a01:4f8:121:4346::2]:8333
[2a01:4f8:130:3332::2]:8333
+[2a01:4f8:130:430b::2]:8333
+[2a01:4f8:130:618e::2]:8333
+[2a01:4f8:130:71d2::2]:8333
+[2a01:4f8:130:7422::2]:8333
[2a01:4f8:131:33ad::2]:8333
[2a01:4f8:131:33ad:fea1::666]:8333
-[2a01:4f8:140:31b0::2]:8333
-[2a01:4f8:140:4088::2]:8333
+[2a01:4f8:131:3428::2]:8333
+[2a01:4f8:140:1326::2]:8333
+[2a01:4f8:140:524a::2]:8333
+[2a01:4f8:140:6055::2]:8333
+[2a01:4f8:140:7410::2]:8333
[2a01:4f8:140:931a::2]:8333
-[2a01:4f8:140:93b0::2]:8333
-[2a01:4f8:141:13ad::c451]:8333
-[2a01:4f8:141:186::2]:8333
+[2a01:4f8:141:2254::2]:8333
[2a01:4f8:141:22ae::2]:8333
-[2a01:4f8:141:322c::2]:8333
[2a01:4f8:150:11d4::2]:8333
-[2a01:4f8:150:440f::2]:8333
-[2a01:4f8:150:61ee::2]:8333
+[2a01:4f8:150:70a4::2]:8333
[2a01:4f8:150:726b::2]:8333
-[2a01:4f8:151:30c9::2]:15000
-[2a01:4f8:151:41a2::2]:8333
-[2a01:4f8:151:41cc::2]:8333
-[2a01:4f8:151:52c6::154]:8333
-[2a01:4f8:151:600b::1:1]:8333
+[2a01:4f8:150:72ee::4202]:8333
+[2a01:4f8:150:90ca::2]:8333
+[2a01:4f8:151:30c9::2]:8333
+[2a01:4f8:151:334d::3]:8333
[2a01:4f8:151:7175::2]:8333
[2a01:4f8:160:41f0::1:33]:8333
-[2a01:4f8:160:5328::27f0:187a]:8333
-[2a01:4f8:160:814f::2]:8333
-[2a01:4f8:161:21ad::333:30]:8333
+[2a01:4f8:160:636e::2]:8333
[2a01:4f8:161:7026::2]:8333
-[2a01:4f8:162:4110::2]:8333
-[2a01:4f8:162:4348::2]:8333
+[2a01:4f8:162:2108::2]:8333
+[2a01:4f8:162:3121::50]:8333
+[2a01:4f8:162:424c::2]:8333
[2a01:4f8:171:1c1b::2]:8333
[2a01:4f8:171:1c3::2]:8333
[2a01:4f8:171:2258::2]:8333
-[2a01:4f8:171:2a70::2]:8333
-[2a01:4f8:171:2e1b::2]:8333
+[2a01:4f8:171:27d6::2]:8333
[2a01:4f8:171:2f28::2]:8333
-[2a01:4f8:171:3248::2]:8333
-[2a01:4f8:171:380c::2]:8333
-[2a01:4f8:171:b93::2]:8333
-[2a01:4f8:171:d0a::2]:8333
-[2a01:4f8:172:116c::2]:8333
-[2a01:4f8:172:1287::2]:8333
-[2a01:4f8:172:17a9::2]:8333
-[2a01:4f8:172:1ca7::2]:8333
-[2a01:4f8:172:2159::2]:8333
-[2a01:4f8:172:3a41::2]:8333
-[2a01:4f8:172:3b42::2]:8333
-[2a01:4f8:172:3ec1::2]:8333
-[2a01:4f8:172:3ec2::2]:8333
-[2a01:4f8:172:aeb::2]:8333
-[2a01:4f8:172:aec::2]:8333
-[2a01:4f8:173:10ab::2]:8333
-[2a01:4f8:173:1551::2]:8333
-[2a01:4f8:173:1bca::2]:8333
-[2a01:4f8:173:1e2e::2]:8333
-[2a01:4f8:173:2162::2]:8333
-[2a01:4f8:173:21e6::2]:8333
+[2a01:4f8:171:d23::2]:8333
+[2a01:4f8:172:10da::2]:8333
+[2a01:4f8:172:504::2]:8333
+[2a01:4f8:173:1622::2]:8333
[2a01:4f8:173:42::2]:8333
-[2a01:4f8:173:cc1::2]:8333
-[2a01:4f8:190:1253::2]:8333
[2a01:4f8:190:24eb::2]:8333
-[2a01:4f8:190:34f0::2]:8333
[2a01:4f8:190:528d::2]:8333
-[2a01:4f8:190:91ce::2]:8333
-[2a01:4f8:191:2194::83]:8333
-[2a01:4f8:191:40e8::2]:8333
-[2a01:4f8:191:8165::2]:22556
+[2a01:4f8:190:61f3::2]:8333
+[2a01:4f8:191:418f::2]:3333
+[2a01:4f8:191:63b4:5000::1]:8333
[2a01:4f8:191:81b7::2]:8333
[2a01:4f8:191:8328::3]:8333
-[2a01:4f8:192:11b2::2]:8343
-[2a01:4f8:192:216c::2]:8333
-[2a01:4f8:192:22af::2]:8333
-[2a01:4f8:192:2422::2]:8333
-[2a01:4f8:192:34d0::2]:8333
-[2a01:4f8:192:440b::2]:8333
+[2a01:4f8:192:4a5::2]:8333
[2a01:4f8:192:5230::2]:8333
-[2a01:4f8:192:db::2]:8333
[2a01:4f8:200:1012::2]:8333
+[2a01:4f8:200:32a6::2]:8333
[2a01:4f8:200:414e::2]:8333
[2a01:4f8:200:416a::2]:8333
-[2a01:4f8:201:21a7::2]:8333
-[2a01:4f8:201:4017::11]:8333
+[2a01:4f8:200:90c3::2]:8333
+[2a01:4f8:201:148d::2]:8333
+[2a01:4f8:201:2cc::2]:8333
+[2a01:4f8:201:3e3::2]:8333
+[2a01:4f8:201:53cc::2]:8333
[2a01:4f8:201:6011::4]:8333
-[2a01:4f8:201:60d5::2]:8333
-[2a01:4f8:202:12d6::2]:8333
+[2a01:4f8:202:3030::2]:8333
[2a01:4f8:202:31e3::2]:8333
[2a01:4f8:202:32c6::2]:8333
-[2a01:4f8:202:53c3::2]:8333
-[2a01:4f8:211:14cf::2]:8333
+[2a01:4f8:202:6035::2]:8333
+[2a01:4f8:210:5488::2]:8333
+[2a01:4f8:211:1e17::2]:8333
[2a01:4f8:211:1ec5::2]:8333
-[2a01:4f8:211:483::2]:8333
-[2a01:4f8:211:d99::8]:8333
[2a01:4f8:212:1826::2]:8333
-[2a01:4f8:212:27a8::2]:8333
-[2a01:4f8:221:801::2]:8333
-[2a01:4f8:a0:12cc::2]:8333
-[2a01:4f8:a0:746a:101:1:1:2]:8333
-[2a01:4f8:a0:828a::2]:8333
-[2a01:4f8:c17:2eef::2]:8333
-[2a01:4f8:c17:2f3c::2]:3333
+[2a01:4f8:221:f59::2]:8333
+[2a01:4f8:c0c:1026::2]:8333
+[2a01:4f8:c0c:1028::2]:8333
+[2a01:4f8:c0c:1029::2]:8333
+[2a01:4f8:c0c:105f::2]:8333
+[2a01:4f8:c0c:1064::2]:8333
+[2a01:4f8:c0c:106b::2]:8333
+[2a01:4f8:c0c:106d::2]:8333
+[2a01:4f8:c0c:1070::2]:8333
+[2a01:4f8:c0c:1105::2]:8333
+[2a01:4f8:c0c:1106::2]:8333
+[2a01:4f8:c0c:1134::2]:8333
+[2a01:4f8:c0c:1135::2]:8333
+[2a01:4f8:c0c:113c::2]:8333
+[2a01:4f8:c0c:115c::2]:8333
+[2a01:4f8:c0c:115e::2]:8333
+[2a01:4f8:c0c:1170::2]:8333
+[2a01:4f8:c0c:1172::2]:8333
+[2a01:4f8:c0c:117b::2]:8333
+[2a01:4f8:c0c:117c::2]:8333
+[2a01:4f8:c0c:1180::2]:8333
+[2a01:4f8:c0c:1181::2]:8333
+[2a01:4f8:c0c:1185::2]:8333
+[2a01:4f8:c0c:1186::2]:8333
+[2a01:4f8:c0c:1187::2]:8333
+[2a01:4f8:c0c:1188::2]:8333
+[2a01:4f8:c0c:1189::2]:8333
+[2a01:4f8:c0c:121::2]:8333
+[2a01:4f8:c0c:122::2]:8333
+[2a01:4f8:c0c:15a8::2]:8333
+[2a01:4f8:c0c:1da4::2]:8333
+[2a01:4f8:c0c:1ff7::2]:8333
+[2a01:4f8:c0c:2262::2]:8333
+[2a01:4f8:c0c:73d::2]:8333
+[2a01:4f8:c0c:790::2]:8333
+[2a01:4f8:c0c:7a8::2]:8333
+[2a01:4f8:c0c:7a9::2]:8333
+[2a01:4f8:c0c:7e9::2]:8333
+[2a01:4f8:c0c:816::2]:8333
+[2a01:4f8:c0c:817::2]:8333
+[2a01:4f8:c0c:818::2]:8333
+[2a01:4f8:c0c:820::2]:8333
+[2a01:4f8:c0c:821::2]:8333
+[2a01:4f8:c0c:822::2]:8333
+[2a01:4f8:c0c:896::2]:8333
+[2a01:4f8:c0c:8c6::2]:8333
+[2a01:4f8:c0c:8c9::2]:8333
+[2a01:4f8:c0c:8d1::2]:8333
+[2a01:4f8:c0c:8d2::2]:8333
+[2a01:4f8:c0c:8d9::2]:8333
+[2a01:4f8:c0c:8da::2]:8333
+[2a01:4f8:c0c:8dc::2]:8333
+[2a01:4f8:c0c:8f1::2]:8333
+[2a01:4f8:c0c:91e::2]:8333
+[2a01:4f8:c0c:927::2]:8333
+[2a01:4f8:c0c:939::2]:8333
+[2a01:4f8:c0c:944::2]:8333
+[2a01:4f8:c0c:951::2]:8333
+[2a01:4f8:c0c:967::2]:8333
+[2a01:4f8:c0c:96f::2]:8333
+[2a01:4f8:c0c:97d::2]:8333
+[2a01:4f8:c0c:982::2]:8333
+[2a01:4f8:c0c:9fc::2]:8333
+[2a01:4f8:c0c:b35::2]:8333
+[2a01:4f8:c0c:b4c::2]:8333
+[2a01:4f8:c0c:bfe::2]:8333
+[2a01:4f8:c0c:c08::2]:8333
+[2a01:4f8:c0c:c13::2]:8333
+[2a01:4f8:c0c:c14::2]:8333
+[2a01:4f8:c0c:c16::2]:8333
+[2a01:4f8:c0c:c19::2]:8333
+[2a01:4f8:c0c:c32::2]:8333
+[2a01:4f8:c0c:c36::2]:8333
+[2a01:4f8:c0c:c39::2]:8333
+[2a01:4f8:c0c:c58::2]:8333
+[2a01:4f8:c0c:c5e::2]:8333
+[2a01:4f8:c0c:c70::2]:8333
+[2a01:4f8:c0c:c72::2]:8333
+[2a01:4f8:c0c:c79::2]:8333
+[2a01:4f8:c0c:cb1::2]:8333
+[2a01:4f8:c0c:cf5::2]:8333
+[2a01:4f8:c0c:cff::2]:8333
+[2a01:4f8:c0c:d0e::2]:8333
+[2a01:4f8:c0c:d1b::2]:8333
+[2a01:4f8:c0c:d67::2]:8333
+[2a01:4f8:c0c:d68::2]:8333
+[2a01:4f8:c0c:d81::2]:8333
+[2a01:4f8:c0c:e2d::2]:8333
+[2a01:4f8:c0c:e30::2]:8333
+[2a01:4f8:c0c:e4f::2]:8333
+[2a01:4f8:c0c:e5b::2]:8333
+[2a01:4f8:c0c:e88::2]:8333
+[2a01:4f8:c0c:f69::2]:8333
+[2a01:4f8:c0c:f76::2]:8333
+[2a01:4f8:c0c:f77::2]:8333
+[2a01:4f8:c0c:f78::2]:8333
+[2a01:4f8:c0c:f89::2]:8333
+[2a01:4f8:c0c:f8a::2]:8333
+[2a01:4f8:c0c:fd6::2]:8333
+[2a01:4f8:c0c:fea::2]:8333
+[2a01:4f8:c17:24ee::2]:8333
+[2a01:4f8:c17:2c16::2]:8333
+[2a01:4f8:c17:330f::2]:8333
+[2a01:4f8:c17:34f0::2]:8333
+[2a01:4f8:c17:3986::2]:8333
[2a01:4f8:c17:3b02::2]:8333
-[2a01:4f8:c17:4245::2]:8333
-[2a01:4f8:c17:464f::2]:8333
-[2a01:4f8:c17:4a1c::2]:8333
-[2a01:4f8:c17:4c5d::2]:8333
+[2a01:4f8:c17:3d85::2]:8333
+[2a01:4f8:c17:4271::2]:8333
+[2a01:4f8:c17:5dc0::2]:8333
+[2a01:4f8:c17:63a0::2]:8333
[2a01:4f8:c17:67f8::2]:8333
-[2a01:4f8:c17:6dd0::2]:8333
[2a01:4f8:c17:710b::2]:8333
-[2a01:4f8:c17:714::2]:8333
-[2a01:4f8:c17:72c6::2]:8333
-[2a01:608:ffff:a009:8bf5:879d:e51a:f837]:8333
+[2a01:4f8:c17:e00::2]:8333
[2a01:680:10:10::1]:8333
[2a01:6f0:ffff:120::8dcb]:8333
-[2a01:79c:cebc:857c:98c1:88ff:fef5:90de]:8333
-[2a01:79d:7377:2629:7e57:7e57:1:1]:8333
-[2a01:7c8:aaac:43d:5054:ff:fe4e:3dd4]:8333
+[2a01:79d:b7dd:ffb4:5d86:70b8:fc7f:f253]:8333
+[2a01:7a0:2:1374::4]:8333
+[2a01:7a0:2:1374::5]:8333
+[2a01:7a0:2:137c::3]:8333
+[2a01:7c8:aaaa:373:5054:ff:feb3:2947]:8333
+[2a01:7c8:aaaa:3a0:5054:ff:fe8c:974c]:8333
+[2a01:7c8:aab0:4b7:910d:625e:a13e:c342]:8333
[2a01:7c8:aab5:3e6:5054:ff:fed7:4e54]:8333
+[2a01:7c8:aab5:41e:5054:ff:fe38:f4fb]:8333
+[2a01:7c8:aaba:343::8333]:8333
+[2a01:7c8:aabc:18c:5054:ff:fefd:3b49]:8333
[2a01:7c8:aabd:3d5:5054:ff:fe95:f586]:8333
-[2a01:7c8:aac1:453:d0d2:af96:fa88:5d0e]:8333
-[2a01:7c8:aac3:663:5054:ff:fe25:8c69]:8333
-[2a01:7c8:aac3:97:5054:ff:fea7:3780]:8333
-[2a01:7c8:aac4:567:5054:ff:fedc:518a]:8333
-[2a01:7e00::f03c:91ff:fe26:8c87]:8333
[2a01:7e00::f03c:91ff:fe50:94b8]:8333
-[2a01:7e00::f03c:91ff:fe55:2c]:8333
-[2a01:7e00::f03c:91ff:fe89:1143]:8333
-[2a01:7e00::f03c:91ff:fe89:53fd]:8333
-[2a01:7e00::f03c:91ff:fedf:b70f]:8333
-[2a01:b000::4166:515b:ef9e:b3]:8333
+[2a01:8e01:b943:3a63:d250:99ff:fe1f:4fb2]:8333
[2a01:b2e0:2::40]:8333
-[2a01:e34:ec29:24c0:f3:ddaf:9f59:586f]:8333
+[2a01:d0:0:1c::245]:8333
+[2a01:d0:8fc3::2]:8333
+[2a01:e34:ec29:e8d0:25c7:c1ce:b7a3:d238]:8333
+[2a01:e34:ec4a:c2d0:1cf3:40d2:a79f:3901]:8333
[2a01:e34:eed7:6670:ec1b:bf7c:b012:6069]:8333
+[2a01:e35:2433:e320:9c8e:6ff0:990f:f06e]:8333
[2a01:e35:2ee5:610:21f:d0ff:fe4e:7460]:8333
-[2a01:e35:8a3f:47c0:c617:feff:fe3c:9fbd]:8333
-[2a01:e35:8bff:70b0:1e1b:dff:fe0b:236d]:8333
-[2a02:1205:34c3:a4e0:d63d:7eff:fe98:10c8]:8333
-[2a02:1205:34da:aa00:5882:249d:ddbf:bc43]:8333
[2a02:1205:5051:a640:d6ae:52ff:fea3:ac]:8333
-[2a02:1205:c689:d980:baae:edff:feea:9445]:8333
[2a02:120b:2c2a:5ec0:10dd:31ff:fe42:5079]:8333
-[2a02:120b:2c35:69d0:219:99ff:fe6b:4ec3]:8333
-[2a02:120b:c3c2:ff60:21f:5bff:fec3:a7ad]:24312
-[2a02:13b8:4000:1000:216:e6ff:fe92:8619]:8333
-[2a02:13b8:4000:1000::27]:8333
-[2a02:17d0:2a:4400:40f:3dd4:b053:47ad]:8333
-[2a02:180:1:1::517:afb]:8333
+[2a02:168:6273::614]:8333
[2a02:180:6:1::18]:8333
-[2a02:1810:1d11:f900:6872:f28e:8126:f635]:8333
-[2a02:27a8:0:1:52e5:49ff:fee3:3b49]:8333
-[2a02:348:86:3011::1]:8333
+[2a02:180:6:1::ed]:8333
+[2a02:1811:b707:116:8c1f:c5be:bf3a:54df]:8333
+[2a02:20c8:1422:1::a3]:8333
+[2a02:2168:d05:2c00:216:3eff:fef7:a099]:8333
+[2a02:27f8:2012:0:e9f7:268f:c441:6129]:8333
+[2a02:2808:5401:0:225:90ff:fe4e:ee42]:8333
[2a02:390:9000:0:218:7dff:fe10:be33]:8333
-[2a02:582:78c1:7600:2d49:6212:29d3:abb]:8333
-[2a02:6080::1:190b:69e3]:8333
-[2a02:750:7:3305::575]:8333
-[2a02:752:100:3::53]:8333
-[2a02:7aa0:1201::7501:d950]:8333
-[2a02:7aa0:1201::deb3:81a2]:8333
-[2a02:7aa0:1619::a037:69a6]:8333
-[2a02:810d:14c0:8694:d250:99ff:fe81:23d9]:8333
-[2a02:a50::dacb:8aff:fe36:8d2d]:8333
-[2a02:c200:0:10:3:0:2591:1]:8333
-[2a02:c200:1:10:2:5:9982:1]:8333
-[2a02:c200:1:10:3:0:9290:1]:8333
-[2a02:c205:3000:7158::1]:8333
-[2a02:c205:3001:4522::1]:8333
-[2a02:c205:3001:6549::1]:8333
-[2a02:c207:2008:3772::1]:8333
-[2a02:c207:2008:6519::1]:8333
+[2a02:7aa0:1201::bd4e:1219]:8333
+[2a02:7aa0:1619::590:eba2]:8333
+[2a02:7aa0:1619::a7a2:7e86]:8333
+[2a02:c200:1:10:2:5:800:1]:8333
+[2a02:c205:2002:2550::17]:8333
+[2a02:c205:2008:272::1]:8333
+[2a02:c205:2010:5484::1]:8333
+[2a02:c205:3001:6710::1]:8333
+[2a02:c205:3001:7714::2]:8333
+[2a02:c205:3002:888::1]:8333
+[2a02:c207:2002:9013::1]:8333
+[2a02:c207:2008:3392::1]:8333
+[2a02:c207:2008:8337::1]:8333
[2a02:c207:2009:213::1]:8333
-[2a02:c207:2009:7858::1]:8333
-[2a02:c207:2010:302::1]:8333
+[2a02:c207:2010:7751::1]:8333
+[2a02:c207:2010:7986::1]:8333
+[2a02:c207:2011:7829::1]:8333
+[2a02:c207:2011:8299::1]:8333
+[2a02:c207:2012:2133::1]:8333
+[2a02:c207:2012:263::1]:8333
+[2a02:c207:2012:2682::1]:8333
+[2a02:c207:2012:3635::1]:8333
+[2a02:c207:2012:4826::1]:8333
+[2a02:c207:2012:5668::1]:8333
[2a02:c207:3001:5824::1]:8333
+[2a02:c207:3001:7776::1]:8333
+[2a02:c207:3002:621::1]:8333
[2a02:ce80:0:20::1]:8333
+[2a03:2260:11e:301::8]:8333
+[2a03:2260:11e:302::3]:8333
[2a03:4000:2:496::8]:8333
+[2a03:4000:6:12e7::1]:8333
[2a03:4000:6:416c::53]:8333
-[2a03:4000:6:8009::1]:8333
-[2a03:4000:9:8e::1]:8333
-[2a03:7380:2140:17:51fe:3519:b571:4a13]:8333
-[2a03:b0c0:0:1010::7a3:1001]:8333
-[2a03:b0c0:0:1010::7aa:4001]:8333
+[2a03:b0c0:3:d0::1219:6001]:8333
[2a03:b0c0:3:d0::1b99:c001]:8333
[2a03:b0c0:3:d0::1b99:e001]:8333
[2a03:b0c0:3:d0::1b9a:3001]:8333
-[2a03:b0c0:3:d0::2208:6001]:8333
[2a03:b0c0:3:d0::23f7:1001]:8333
+[2a03:b0c0:3:d0::23f7:2001]:8333
+[2a03:b0c0:3:d0::23f7:4001]:8333
+[2a03:b0c0:3:d0::23f7:5001]:8333
+[2a03:b0c0:3:d0::23f7:7001]:8333
[2a03:b0c0:3:d0::23f7:9001]:8333
+[2a03:b0c0:3:d0::23fb:1001]:8333
[2a03:b0c0:3:d0::23fb:2001]:8333
[2a03:b0c0:3:d0::23fb:3001]:8333
[2a03:b0c0:3:d0::23fb:5001]:8333
-[2a03:b0c0:3:d0::23fb:7001]:8333
+[2a03:b0c0:3:d0::23fb:6001]:8333
+[2a03:b0c0:3:d0::23fb:8001]:8333
+[2a03:b0c0:3:d0::23ff:b001]:8333
[2a03:b0c0:3:d0::2400:1]:8333
[2a03:b0c0:3:d0::2400:3001]:8333
+[2a03:b0c0:3:d0::2400:4001]:8333
[2a03:b0c0:3:d0::2400:e001]:8333
+[2a03:b0c0:3:d0::2400:f001]:8333
[2a03:b0c0:3:d0::2401:e001]:8333
+[2a03:b0c0:3:d0::2402:1]:8333
[2a03:b0c0:3:d0::2402:2001]:8333
[2a03:b0c0:3:d0::2402:8001]:8333
[2a03:b0c0:3:d0::2402:9001]:8333
[2a03:b0c0:3:d0::2402:b001]:8333
[2a03:b0c0:3:d0::2402:d001]:8333
+[2a03:b0c0:3:d0::2402:e001]:8333
[2a03:b0c0:3:d0::2403:1001]:8333
[2a03:b0c0:3:d0::2403:2001]:8333
+[2a03:b0c0:3:d0::2403:3001]:8333
[2a03:b0c0:3:d0::2403:4001]:8333
[2a03:b0c0:3:d0::2403:6001]:8333
[2a03:b0c0:3:d0::2403:a001]:8333
[2a03:b0c0:3:d0::2403:b001]:8333
+[2a03:b0c0:3:d0::2403:e001]:8333
[2a03:b0c0:3:d0::2403:f001]:8333
+[2a03:b0c0:3:d0::2404:1]:8333
+[2a03:b0c0:3:d0::2404:3001]:8333
+[2a03:b0c0:3:d0::2404:4001]:8333
[2a03:b0c0:3:d0::2404:6001]:8333
+[2a03:b0c0:3:d0::2404:8001]:8333
+[2a03:b0c0:3:d0::2404:9001]:8333
[2a03:b0c0:3:d0::2404:b001]:8333
-[2a03:f80:ed15:149:154:155:235:1]:8333
-[2a04:1980:3100:1aac:e61d:2dff:fe29:f241]:8333
-[2a04:1980:3100:1aac:e61d:2dff:fe29:f251]:8333
-[2a04:2180:0:1::5a49:3c06]:8333
-[2a04:2180:1:7::3]:8333
-[2a04:2e00:5:2e:9a4b:e1ff:fe62:6dc0]:8333
+[2a03:b0c0:3:d0::2405:2001]:8333
+[2a03:b0c0:3:d0::2405:3001]:8333
+[2a03:b0c0:3:d0::2405:8001]:8333
+[2a03:b0c0:3:d0::2405:9001]:8333
+[2a03:b0c0:3:d0::2405:a001]:8333
+[2a03:b0c0:3:d0::44b8:9001]:8333
+[2a03:b0c0:3:d0::44b8:e001]:8333
+[2a03:b0c0:3:d0::44b8:f001]:8333
+[2a03:b0c0:3:d0::44b9:1]:8333
+[2a03:b0c0:3:d0::44b9:1001]:8333
+[2a03:b0c0:3:d0::44b9:2001]:8333
+[2a03:b0c0:3:d0::44b9:4001]:8333
+[2a04:2180:0:2::94]:8333
[2a04:3542:1000:910:8492:b8ff:fe91:711d]:8333
-[2a04:dbc3:fffe:0:e61f:13ff:fe95:8401]:8333
+[2a04:52c0:101:122::ba8e]:8333
+[2a05:3580:d400:140d:da6e:826e:e771:4100]:8333
[2a06:9fc0:2a06:9fc0:2a06:9fc1:67c:e706]:8333
-[2c0f:f738:2004:82::]:8333
-2hryb3uh3tzwgnya.onion:8333
-3nmbbakinewlgdln.onion:8333
-3qeri3tmhzmpegyv.onion:8333
-4wdknmecghcmclq5.onion:8333
-53tsjt6zq3iasv5q.onion:8333
-5cg7qeywvwo6vxpt.onion:8333
-5gbcrgqxcbxj253s.onion:8333
-6cn4ilbwkrkh7gwo.onion:8333
-6e4jrnn7igeqxmlf.onion:8333
-6ymgbvnn6d5nfmv4.onion:8333
-6zsh3bfduhpo7ldl.onion:8333
-72fq6phv4fg4rhvh.onion:8333
-7gdqp6npusk4lfwk.onion:8333
-a7emxol55e623lqc.onion:8333
-assbiydziq77zaki.onion:8333
+226eupdnaouu4h2v.onion:8333
+2frgxpe5mheghyom.onion:8333
+3ihjnsvwc3x6dp2o.onion:8333
+3w77hrilg6q64opl.onion:8333
+4ls4o6iszcd7mkfw.onion:8333
+4p3abjxqppzxi7qi.onion:8333
+546esc6botbjfbxb.onion:8333
+5msftytzlsskr4ut.onion:8333
+5ty6rxpgrkmdnk4a.onion:8333
+akmqyuidrf56ip26.onion:8333
+alhlegtjkdmbqsvt.onion:8333
bafk5ioatlgt7dgl.onion:8333
-bk7yp6epnmcllq72.onion:8333
-brwqezn6le54w2bb.onion:8333
-bs4bq6s6qkvt5hpi.onion:8333
bup5n5e3kurvjzf3.onion:8333
-c2tpqkaz4ihjzwgb.onion:8333
-cernrmrk5zomzozn.onion:8333
-cfyegj64ht3jpodr.onion:8333
-cg5vg54cazzpvoug.onion:8333
-cgk4u2lxrvml4jvb.onion:8333
cjygd7pu5lqkky5j.onion:8333
-d6wubsdtr46dd5ki.onion:8333
-dfq6yjc3aelplwr4.onion:8333
+cyvpgt25274i5b7c.onion:8333
+dekj4wacywpqsad3.onion:8333
dqpxwlpnv3z3hznl.onion:8333
-eamfospuveabaimd.onion:8333
-ep2mjzox3kvb6ax4.onion:8333
-fpbxb4wjudiw2w5a.onion:8333
-fu5hfsbbf5jwsvhv.onion:8333
-g4freoibsczujle3.onion:8333
+drarzpycbtxwbcld.onion:8333
+drp4pvejybx2ejdr.onion:8333
+dxkmtmwiq7ddtgul.onion:8333
+e6j57zkyibu2smad.onion:8333
+ejcqevujcqltqn7d.onion:8333
+eqgbt2ghfvsshbvo.onion:8333
+fgizgkdnndilo6ka.onion:8333
+fqxup4oev33eeidg.onion:8333
gb5ypqt63du3wfhn.onion:8333
ggdy2pb2avlbtjwq.onion:8333
-gh2aiddzxmvyrnue.onion:8333
-gnxgylbgzvaazkq7.onion:8333
-hnizdxnejel64ubk.onion:8333
-htvdcmlc3abji2ab.onion:8443
-hwuboois4gslupgx.onion:8333
-hxz6gowludlj6d5a.onion:8333
-j6umo4bnsztpsonc.onion:8333
-jdunmaocwbbnw565.onion:8333
-ktv3qlxl7xvmdlf4.onion:8333
+hahhloezyfqh3hci.onion:8333
+ihdv6bzz2gx72fs7.onion:8333
+in7r5ieo7ogkxbne.onion:8333
kvd44sw7skb5folw.onion:8333
-kwimnzm6vd4zakvl.onion:8333
-la5xhk3lprxzxmz2.onion:8333
-lc7cx67end26uutp.onion:8352
-mwu5og2agcspmgkx.onion:8333
-mzxkipiyekaoh7my.onion:8333
-n6rwlrtwpqc7qwo7.onion:8333
-nj36424yccqph62z.onion:8333
-o256w7t3vcgktmxk.onion:8333
+mn744hbioayn3ojs.onion:8333
+ms4ntrrisfxzpvmy.onion:8333
+n5lqwpjabqg62ihx.onion:8333
o4sl5na6jeqgi3l6.onion:8333
-okdzjarwekbshnof.onion:8333
-oyebydl2pacx6v26.onion:8333
-p5mx2imj75dpmime.onion:8333
+omjv24nbck4k5ud6.onion:8333
+po3j2hfkmf7sh36o.onion:8333
psco6bxjewljrczx.onion:8333
-pxtgswet6tlgrbwj.onion:8333
-rb4v3fhgx2zr4rre.onion:8333
+qi5yr6lvlckzffor.onion:8333
+qlv6py6hdtzipntn.onion:8333
+qynmpgdbp23xyfnj.onion:8333
+rhtawcs7xak4gi3t.onion:8333
+rjacws757ai66lre.onion:8333
rjlnp3hwvrsmap6e.onion:8333
+rkdvqcrtfv6yt4oy.onion:8333
rlafimkctvz63llg.onion:8333
-rxjvy5eyttep5tts.onion:8333
+rlj4ppok4dnsdu5n.onion:8333
seoskudzk6vn6mqz.onion:8333
-tpgdufxxsw3jkrdf.onion:8333
-tuiyvqgi3o675pjb.onion:8333
+tayqi57tfiy7x3vk.onion:8333
+tchop676j6yppwwm.onion:8333
+trrtyp3sirmwttyu.onion:8333
tx4zd7d5exonnblh.onion:8333
-uokg6avfgbhofls3.onion:8333
-v3gjphgqy5hygcml.onion:8333
-vhdoxqq63xr53ol7.onion:8333
+u4ecb7txxi6l3gix.onion:8333
+umcxcmfycvejw264.onion:8333
+v7xqd42ocemalurd.onion:8333
+vb267mt3lnwfdmdb.onion:8333
+vev3n5fxfrtqj6e5.onion:8333
visevrizz3quyagj.onion:8333
-vqpye2k5rcqvj5mq.onion:8333
-wfsx2gi7djhy22hk.onion:8333
-wg6vwmbrzyyzapun.onion:8333
-xub4w3w4wwk56xiq.onion:8333
+vpg6p5e5ln33dqtp.onion:8333
+vr2ruasinafoy3fl.onion:8333
+x6pthvd5x6abyfo7.onion:8333
+xbwbzrspvav7u5ie.onion:8333
+xfcevnql2chnawko.onion:8333
ycivnom44dmxx4ob.onion:8333
-ywskufc62bf2fum4.onion:8333
-z4fax2vxg23t2ddf.onion:8333
-zo5dklwelmdrpo5n.onion:8333
+yzdvlv5daitafekn.onion:8333
diff --git a/contrib/testgen/gen_base58_test_vectors.py b/contrib/testgen/gen_base58_test_vectors.py
index ac0701e6be..86366eb8e3 100755
--- a/contrib/testgen/gen_base58_test_vectors.py
+++ b/contrib/testgen/gen_base58_test_vectors.py
@@ -13,7 +13,7 @@ Usage:
# Released under MIT License
import os
from itertools import islice
-from base58 import b58encode, b58decode, b58encode_chk, b58decode_chk, b58chars
+from base58 import b58encode_chk, b58decode_chk, b58chars
import random
from binascii import b2a_hex
diff --git a/contrib/verify-commits/allow-revsig-commits b/contrib/verify-commits/allow-revsig-commits
index e69de29bb2..f0088cdca4 100644
--- a/contrib/verify-commits/allow-revsig-commits
+++ b/contrib/verify-commits/allow-revsig-commits
@@ -0,0 +1,104 @@
+a06ede9a138d0fb86b0de17c42b936d9fe6e2158
+923dc447eaa8e017985b2afbbb12dd1283fbea0e
+71148b8947fe8b4d756822420a7f31c380159425
+6696b4635ceb9b47aaa63244bff9032fa7b08354
+812714fd80e96e28cd288c553c83838cecbfc2d9
+8a445c5651edb9a1f51497055b7ddf4402be9188
+e126d0c12ca66278d9e7b12187c5ff4fc02a7e6c
+3908fc4728059719bed0e1c7b1c8b388c2d4a8da
+8b66bf74e2a349e71eaa183af81fa63eaee76ad2
+05950427d310654774031764a7141a1a4fd9c6e4
+07fd147b9f12e9205afd66a624edce357977d615
+12e31127948fa4bb01c3bddc1b8c85b432f7465b
+8c87f175d335e9d9e93f987d871ae9f05f6a10a7
+46b249e578e8a3dfbe85bc7253a12e82ef4b658b
+a55716abe5662ec74c2f8af93023f1e7cca901fc
+f646275b90b1de93bc62b4c4d045d75ac0b96eee
+c252685aa5867631e9a5ef07ccae7c7c25cae8ff
+a7d55c93385359952d85decd5037843ac70ba3d4
+7dac1e5e9e887f5f6ff146e812a05bd3bf281eae
+2a524b8e8fe69ef487fd8ea1b4f7a03f473ed201
+ce5c1f4acae43477989cdf9a82ed33703919cda2
+2db4cbcc437f51f5dac82cc4de46f383b92e6f11
+7aa700424cbda387536373d8dfec88aee43f950e
+b99a093afed880f23fb279c443cc6ae5e379cc43
+b83264d9c7a8ddb79f64bd9540caddc8632ef31f
+57e337d40e94ba33d8cd265c134d6ef857b32b59
+a1dcf2e1087beaf3981739fd2bb74f35ecad630a
+d38b0d7a6b6056cba26999b702815775e2437d87
+815640ec6af9a38d6a2da4a4400056e2f4105080
+09c4fd157c5b88df2d97fad4826c79b094db90c9
+2efcfa5acfacb958973d9e8125e1d81f102e2dfd
+dc6dee41f7cf2ba93fcd0fea7c157e4b2775d439
+ad826b3df9f763b49f1e3e3d50c4efdd438c7547
+c1a52276848d8caa9a9789dff176408c1aa6b1ed
+3bf06e9bac57b5b5a746677b75e297a7b154bdbd
+72ae6f8cf0224370e8121d6769b21e612ca15d6f
+a143b88dbd4971ecfdd1d39a494489c8f2db0344
+76fec09d878d6dbf214bdb6228d480bd9195db4c
+93566e0c37c5ae104095474fea89f00dcb40f551
+407d9232ef5cb1ebf6cff21f3d13e07ea4158eeb
+9346f8429957e356d21c665bab59fe45bcf1f74e
+6eeac6e30d65f9a972067c1ea8c49978c8e631ac
+dc6b9406bdfab2af8c86cb080cb3e6cf8f2385d8
+9f554e03ebe5701c1b75ff03b3d6152095c0cad3
+05009935f9ac070197113954d680bc2c9150b9b3
+508404de98a8a5435f52916cef8f328e82651961
+ed0cc50afed146c27f6d8129c683c225fb940093
+6429cfa8a70308241c576aeb92ffe3db5203b2ef
+6898213409811b140843c3d89af43328c3b22fad
+5b2ea29cf4fd298346437bb16a54407f8c1f9dca
+e2a1a1ee895149c544d4ae295466611f0cec3094
+e82fb872ff5cc8fd22d43327c1ee3e755f61c562
+19b0f33de0efd9da788e8e4f3fdc2a9e159abdb1
+89de1538ce1f8c00f80e8d11f43e1b77e24d7dea
+de07fdcf77e97b8613091285e4d0a734f5de7492
+01680195f8aa586c55c44767397380def3a23b54
+05e1c85fb687c82ae477c72d4a7e2d6b0c692167
+c072b8fd95cd4fa84f08189a0cd8b173ea2dbb8e
+9a0ed08b40b15ae2b791aa8549b53e69934b4ea7
+53f8f226bd1d627c4a6dec5862a1d4ea5a933e45
+9d0f43b7ca7241d8a018fd35dd3bc01555235ec6
+f12d2b5a8ac397e4bcaefcc19898f8ff5705dea5
+8250de13587ed05ca45df3e12c5dc9bcb1500e2c
+d727f77e390426e9e463336bda08d50c451c7086
+484312bda2d43e3ea60047be076332299463adf8
+c7e05b35ab0a791c7a8e2d863e716fdec6f3f671
+b9c1cd81848da9de1baf9c2f29c19c50e549de13
+8ea7d31e384975019733b5778feabbd9955c79d8
+f798b891bcecea9548eedacae70eeb9906c1ddbf
+ebefe7a00b46579cdd1e033a8c7fd8ce9aa578e4
+ad087638ee4864d6244ec9381ff764bfa6ee5086
+66db2d62d59817320c9182fc18e75a93b76828ea
+7ce9ac5c83b1844a518ef2e12e87aae3cacdfe58
+4286f43025149cf44207c3ad98e4a1f068520ada
+cd0c5135ab2291aaa5410ac919bad3fc87249a4a
+66ed450d771a8fc01c159a8402648ebd1c35eb4c
+a82f03393a32842d49236e8666ee57805ca701f8
+f972b04d63eb8af79ff3cec1dc561ed13dfa6053
+ec45cc5e27668171b55271b0c735194c70e7da41
+715e9fd7454f7a48d7adba7d42f662c20a3e3367
+2e0a99037dcc35bc63ba0d54371bc678af737c8e
+7fa8d758598407f3bf0beb0118dc122ea5340736
+6a22373771edbc3c7513cacb9355f880c73c2cbf
+b89ef131147f71a96152a7b5c4374266cdf539b2
+01d8359983e2f77b5118fede3ffa947072c666c8
+58f0c929a3d70a4bff79cc200f1c186f71ef1675
+950be19727a581970591d8f8138dfe4725750382
+425278d17bd0edf8a3a7cc81e55016f7fd8e7726
+c028c7b7557da2baff7af8840108e8be4db8e0c6
+47a7cfb0aa2498f6801026d258a59f9de48f60b0
+f6b7df3155ddb4cedfbcf5d3eb3383d4614b3a85
+d72098038f3b55a714ed8adb34fab547b15eb0d5
+c49c825bd9f4764536b45df5a684d97173673fc7
+33799afe83eec4200ff140e9bf5eae83701a4d7f
+5c3f8ddcaa1164079105c452429fccf8127b01b6
+1f01443567b03ac75a91c810f1733f5c21b5699d
+b3e42b6d02e8d19658a9135e427ebceab5367779
+69b3a6dd9d9a0adf5506c8b9fde42187356bd4a8
+bafd075c5e6a1088ef0f1aa0b0b224e026a3d3e0
+7daa3adb242d9c8728fdb15c6af6596aaad5502f
+514993554c370f4cf30a109ac28d5d64893dbf0a
+c8d2473e6cb042e7275a10c49d3f6a4a91bf0166
+386f4385ab04b0b2c3d47bddc0dc0f2de7354964
+9f33dba05c01ecc5c56eb1284ab7d64d42f55171
diff --git a/contrib/verify-commits/gpg.sh b/contrib/verify-commits/gpg.sh
index 09ff237544..abd8f5fd9f 100755
--- a/contrib/verify-commits/gpg.sh
+++ b/contrib/verify-commits/gpg.sh
@@ -8,21 +8,48 @@ VALID=false
REVSIG=false
IFS='
'
-for LINE in $(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null); do
+if [ "$BITCOIN_VERIFY_COMMITS_ALLOW_SHA1" = 1 ]; then
+ GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)"
+else
+ # Note how we've disabled SHA1 with the --weak-digest option, disabling
+ # signatures - including selfsigs - that use SHA1. While you might think that
+ # collision attacks shouldn't be an issue as they'd be an attack on yourself,
+ # in fact because what's being signed is a commit object that's
+ # semi-deterministically generated by untrusted input (the pull-req) in theory
+ # an attacker could construct a pull-req that results in a commit object that
+ # they've created a collision for. Not the most likely attack, but preventing
+ # it is pretty easy so we do so as a "belt-and-suspenders" measure.
+ GPG_RES=""
+ for LINE in "$(gpg --version)"; do
+ case "$LINE" in
+ "gpg (GnuPG) 1.4.1"*|"gpg (GnuPG) 2.0."*)
+ echo "Please upgrade to at least gpg 2.1.10 to check for weak signatures" > /dev/stderr
+ GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)"
+ ;;
+ # We assume if you're running 2.1+, you're probably running 2.1.10+
+ # gpg will fail otherwise
+ # We assume if you're running 1.X, it is either 1.4.1X or 1.4.20+
+ # gpg will fail otherwise
+ esac
+ done
+ [ "$GPG_RES" = "" ] && GPG_RES="$(echo "$INPUT" | gpg --trust-model always --weak-digest sha1 "$@" 2>/dev/null)"
+fi
+for LINE in $(echo "$GPG_RES"); do
case "$LINE" in
"[GNUPG:] VALIDSIG "*)
while read KEY; do
- case "$LINE" in "[GNUPG:] VALIDSIG $KEY "*) VALID=true;; esac
+ [ "${LINE#?GNUPG:? VALIDSIG * * * * * * * * * }" = "$KEY" ] && VALID=true
done < ./contrib/verify-commits/trusted-keys
;;
"[GNUPG:] REVKEYSIG "*)
[ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1
- while read KEY; do
- case "$LINE" in "[GNUPG:] REVKEYSIG ${KEY#????????????????????????} "*)
- REVSIG=true
- GOODREVSIG="[GNUPG:] GOODSIG ${KEY#????????????????????????} "
- esac
- done < ./contrib/verify-commits/trusted-keys
+ REVSIG=true
+ GOODREVSIG="[GNUPG:] GOODSIG ${LINE#* * *}"
+ ;;
+ "[GNUPG:] EXPKEYSIG "*)
+ [ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1
+ REVSIG=true
+ GOODREVSIG="[GNUPG:] GOODSIG ${LINE#* * *}"
;;
esac
done
@@ -30,7 +57,7 @@ if ! $VALID; then
exit 1
fi
if $VALID && $REVSIG; then
- echo "$INPUT" | gpg --trust-model always "$@" | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" 2>/dev/null
+ echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)"
echo "$GOODREVSIG"
else
echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
diff --git a/contrib/verify-commits/trusted-keys b/contrib/verify-commits/trusted-keys
index 75242c2a97..5610692616 100644
--- a/contrib/verify-commits/trusted-keys
+++ b/contrib/verify-commits/trusted-keys
@@ -1,4 +1,4 @@
71A3B16735405025D447E8F274810B012346C9A6
-3F1888C6DCA92A6499C4911FDBA1A67379A1A931
+133EAC179436F14A5CF1B794860FEB804E669320
32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC
-FE09B823E6D83A3BC7983EAA2D7F2372E50FE137
+B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B
diff --git a/contrib/verify-commits/trusted-sha512-root-commit b/contrib/verify-commits/trusted-sha512-root-commit
new file mode 100644
index 0000000000..7d41f90ad7
--- /dev/null
+++ b/contrib/verify-commits/trusted-sha512-root-commit
@@ -0,0 +1 @@
+309bf16257b2395ce502017be627186b749ee749
diff --git a/contrib/verify-commits/verify-commits.sh b/contrib/verify-commits/verify-commits.sh
index b2cebdf1a0..74b7f38375 100755
--- a/contrib/verify-commits/verify-commits.sh
+++ b/contrib/verify-commits/verify-commits.sh
@@ -3,61 +3,130 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-# Not technically POSIX-compliant due to use of "local", but almost every
-# shell anyone uses today supports it, so its probably fine
-
DIR=$(dirname "$0")
[ "/${DIR#/}" != "$DIR" ] && DIR=$(dirname "$(pwd)/$0")
+echo "Using verify-commits data from ${DIR}"
+
VERIFIED_ROOT=$(cat "${DIR}/trusted-git-root")
+VERIFIED_SHA512_ROOT=$(cat "${DIR}/trusted-sha512-root-commit")
REVSIG_ALLOWED=$(cat "${DIR}/allow-revsig-commits")
HAVE_FAILED=false
-IS_SIGNED () {
- if [ $1 = $VERIFIED_ROOT ]; then
- return 0;
+
+HAVE_GNU_SHA512=1
+[ ! -x "$(which sha512sum)" ] && HAVE_GNU_SHA512=0
+
+if [ x"$1" = "x" ]; then
+ CURRENT_COMMIT="HEAD"
+else
+ CURRENT_COMMIT="$1"
+fi
+
+if [ "${CURRENT_COMMIT#* }" != "$CURRENT_COMMIT" ]; then
+ echo "Commit must not contain spaces?" > /dev/stderr
+ exit 1
+fi
+
+VERIFY_TREE=0
+if [ x"$2" = "x--tree-checks" ]; then
+ VERIFY_TREE=1
+fi
+
+NO_SHA1=1
+PREV_COMMIT=""
+
+while true; do
+ if [ "$CURRENT_COMMIT" = $VERIFIED_ROOT ]; then
+ echo "There is a valid path from "$CURRENT_COMMIT" to $VERIFIED_ROOT where all commits are signed!"
+ exit 0;
+ fi
+
+ if [ "$CURRENT_COMMIT" = $VERIFIED_SHA512_ROOT ]; then
+ if [ "$VERIFY_TREE" = "1" ]; then
+ echo "All Tree-SHA512s matched up to $VERIFIED_SHA512_ROOT" > /dev/stderr
+ fi
+ VERIFY_TREE=0
+ NO_SHA1=0
fi
- if [ "${REVSIG_ALLOWED#*$1}" != "$REVSIG_ALLOWED" ]; then
+
+ if [ "$NO_SHA1" = "1" ]; then
+ export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=0
+ else
+ export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=1
+ fi
+
+ if [ "${REVSIG_ALLOWED#*$CURRENT_COMMIT}" != "$REVSIG_ALLOWED" ]; then
export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=1
else
export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=0
fi
- if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null 2>&1; then
- return 1;
- fi
- local PARENTS
- PARENTS=$(git show -s --format=format:%P $1)
- for PARENT in $PARENTS; do
- if IS_SIGNED $PARENT; then
- return 0;
+
+ if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit "$CURRENT_COMMIT" > /dev/null; then
+ if [ "$PREV_COMMIT" != "" ]; then
+ echo "No parent of $PREV_COMMIT was signed with a trusted key!" > /dev/stderr
+ echo "Parents are:" > /dev/stderr
+ PARENTS=$(git show -s --format=format:%P $PREV_COMMIT)
+ for PARENT in $PARENTS; do
+ git show -s $PARENT > /dev/stderr
+ done
+ else
+ echo "$CURRENT_COMMIT was not signed with a trusted key!" > /dev/stderr
fi
- break
- done
- if ! "$HAVE_FAILED"; then
- echo "No parent of $1 was signed with a trusted key!" > /dev/stderr
- echo "Parents are:" > /dev/stderr
- for PARENT in $PARENTS; do
- git show -s $PARENT > /dev/stderr
- done
- HAVE_FAILED=true
+ exit 1
fi
- return 1;
-}
-if [ x"$1" = "x" ]; then
- TEST_COMMIT="HEAD"
-else
- TEST_COMMIT="$1"
-fi
+ # We always verify the top of the tree
+ if [ "$VERIFY_TREE" = 1 -o "$PREV_COMMIT" = "" ]; then
+ IFS_CACHE="$IFS"
+ IFS='
+'
+ for LINE in $(git ls-tree --full-tree -r "$CURRENT_COMMIT"); do
+ case "$LINE" in
+ "12"*)
+ echo "Repo contains symlinks" > /dev/stderr
+ IFS="$IFS_CACHE"
+ exit 1
+ ;;
+ esac
+ done
+ IFS="$IFS_CACHE"
+
+ FILE_HASHES=""
+ for FILE in $(git ls-tree --full-tree -r --name-only "$CURRENT_COMMIT" | LC_ALL=C sort); do
+ if [ "$HAVE_GNU_SHA512" = 1 ]; then
+ HASH=$(git cat-file blob "$CURRENT_COMMIT":"$FILE" | sha512sum | { read FIRST OTHER; echo $FIRST; } )
+ else
+ HASH=$(git cat-file blob "$CURRENT_COMMIT":"$FILE" | shasum -a 512 | { read FIRST OTHER; echo $FIRST; } )
+ fi
+ [ "$FILE_HASHES" != "" ] && FILE_HASHES="$FILE_HASHES"'
+'
+ FILE_HASHES="$FILE_HASHES$HASH $FILE"
+ done
+
+ if [ "$HAVE_GNU_SHA512" = 1 ]; then
+ TREE_HASH="$(echo "$FILE_HASHES" | sha512sum)"
+ else
+ TREE_HASH="$(echo "$FILE_HASHES" | shasum -a 512)"
+ fi
+ HASH_MATCHES=0
+ MSG="$(git show -s --format=format:%B "$CURRENT_COMMIT" | tail -n1)"
-IS_SIGNED "$TEST_COMMIT"
-RES=$?
-if [ "$RES" = 1 ]; then
- if ! "$HAVE_FAILED"; then
- echo "$TEST_COMMIT was not signed with a trusted key!"
+ case "$MSG -" in
+ "Tree-SHA512: $TREE_HASH")
+ HASH_MATCHES=1;;
+ esac
+
+ if [ "$HASH_MATCHES" = "0" ]; then
+ echo "Tree-SHA512 did not match for commit $CURRENT_COMMIT" > /dev/stderr
+ exit 1
+ fi
fi
-else
- echo "There is a valid path from $TEST_COMMIT to $VERIFIED_ROOT where all commits are signed!"
-fi
-exit $RES
+ PARENTS=$(git show -s --format=format:%P "$CURRENT_COMMIT")
+ for PARENT in $PARENTS; do
+ PREV_COMMIT="$CURRENT_COMMIT"
+ CURRENT_COMMIT="$PARENT"
+ break
+ done
+done
diff --git a/contrib/verifybinaries/README.md b/contrib/verifybinaries/README.md
index ed3e14fb6c..3ffe0a2f28 100644
--- a/contrib/verifybinaries/README.md
+++ b/contrib/verifybinaries/README.md
@@ -26,6 +26,14 @@ The script returns 0 if everything passes the checks. It returns 1 if either the
./verify.sh bitcoin-core-0.13.0-rc3
```
+If you only want to download the binaries of certain platform, add the corresponding suffix, e.g.:
+
+```sh
+./verify.sh bitcoin-core-0.11.2-osx
+./verify.sh 0.12.0-linux
+./verify.sh bitcoin-core-0.13.0-rc3-win64
+```
+
If you do not want to keep the downloaded binaries, specify anything as the second parameter.
```sh
diff --git a/contrib/verifybinaries/verify.sh b/contrib/verifybinaries/verify.sh
index e20770c96a..409f517c9f 100755
--- a/contrib/verifybinaries/verify.sh
+++ b/contrib/verifybinaries/verify.sh
@@ -3,7 +3,8 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-### This script attempts to download the signature file SHA256SUMS.asc from bitcoin.org
+### This script attempts to download the signature file SHA256SUMS.asc from
+### bitcoincore.org and bitcoin.org and compares them.
### It first checks if the signature passes, and then downloads the files specified in
### the file, and checks if the hashes of these files match those that are specified
### in the signature file.
@@ -22,7 +23,9 @@ TMPFILE="hashes.tmp"
SIGNATUREFILENAME="SHA256SUMS.asc"
RCSUBDIR="test"
-BASEDIR="https://bitcoin.org/bin/"
+HOST1="https://bitcoincore.org"
+HOST2="https://bitcoin.org"
+BASEDIR="/bin/"
VERSIONPREFIX="bitcoin-core-"
RCVERSIONSTRING="rc"
@@ -42,13 +45,36 @@ if [ -n "$1" ]; then
VERSION="$VERSIONPREFIX$1"
fi
- #now let's see if the version string contains "rc", and strip it off if it does
- # and simultaneously add RCSUBDIR to BASEDIR, where we will look for SIGNATUREFILENAME
- if [[ $VERSION == *"$RCVERSIONSTRING"* ]]; then
- BASEDIR="$BASEDIR${VERSION/%-$RCVERSIONSTRING*}/"
- BASEDIR="$BASEDIR$RCSUBDIR.$RCVERSIONSTRING${VERSION: -1}/"
+ STRIPPEDLAST="${VERSION%-*}"
+
+ #now let's see if the version string contains "rc" or a platform name (e.g. "osx")
+ if [[ "$STRIPPEDLAST-" == "$VERSIONPREFIX" ]]; then
+ BASEDIR="$BASEDIR$VERSION/"
else
+ # let's examine the last part to see if it's rc and/or platform name
+ STRIPPEDNEXTTOLAST="${STRIPPEDLAST%-*}"
+ if [[ "$STRIPPEDNEXTTOLAST-" == "$VERSIONPREFIX" ]]; then
+
+ LASTSUFFIX="${VERSION##*-}"
+ VERSION="$STRIPPEDLAST"
+
+ if [[ $LASTSUFFIX == *"$RCVERSIONSTRING"* ]]; then
+ RCVERSION="$LASTSUFFIX"
+ else
+ PLATFORM="$LASTSUFFIX"
+ fi
+
+ else
+ RCVERSION="${STRIPPEDLAST##*-}"
+ PLATFORM="${VERSION##*-}"
+
+ VERSION="$STRIPPEDNEXTTOLAST"
+ fi
+
BASEDIR="$BASEDIR$VERSION/"
+ if [[ $RCVERSION == *"$RCVERSIONSTRING"* ]]; then
+ BASEDIR="$BASEDIR$RCSUBDIR.$RCVERSION/"
+ fi
fi
SIGNATUREFILE="$BASEDIR$SIGNATUREFILENAME"
@@ -58,7 +84,7 @@ else
fi
#first we fetch the file containing the signature
-WGETOUT=$(wget -N "$BASEDIR$SIGNATUREFILENAME" 2>&1)
+WGETOUT=$(wget -N "$HOST1$BASEDIR$SIGNATUREFILENAME" 2>&1)
#and then see if wget completed successfully
if [ $? -ne 0 ]; then
@@ -69,6 +95,22 @@ if [ $? -ne 0 ]; then
exit 2
fi
+WGETOUT=$(wget -N -O "$SIGNATUREFILENAME.2" "$HOST2$BASEDIR$SIGNATUREFILENAME" 2>&1)
+if [ $? -ne 0 ]; then
+ echo "bitcoin.org failed to provide signature file, but bitcoincore.org did?"
+ echo "wget output:"
+ echo "$WGETOUT"|sed 's/^/\t/g'
+ clean_up $SIGNATUREFILENAME
+ exit 3
+fi
+
+SIGFILEDIFFS="$(diff $SIGNATUREFILENAME $SIGNATUREFILENAME.2)"
+if [ "$SIGFILEDIFFS" != "" ]; then
+ echo "bitcoin.org and bitcoincore.org signature files were not equal?"
+ clean_up $SIGNATUREFILENAME $SIGNATUREFILENAME.2
+ exit 4
+fi
+
#then we check it
GPGOUT=$(gpg --yes --decrypt --output "$TMPFILE" "$SIGNATUREFILENAME" 2>&1)
@@ -88,17 +130,27 @@ if [ $RET -ne 0 ]; then
echo "gpg output:"
echo "$GPGOUT"|sed 's/^/\t/g'
- clean_up $SIGNATUREFILENAME $TMPFILE
+ clean_up $SIGNATUREFILENAME $SIGNATUREFILENAME.2 $TMPFILE
exit "$RET"
fi
+if [ -n "$PLATFORM" ]; then
+ grep $PLATFORM $TMPFILE > "$TMPFILE-plat"
+ TMPFILESIZE=$(stat -c%s "$TMPFILE-plat")
+ if [ $TMPFILESIZE -eq 0 ]; then
+ echo "error: no files matched the platform specified" && exit 3
+ fi
+ mv "$TMPFILE-plat" $TMPFILE
+fi
+
#here we extract the filenames from the signature file
FILES=$(awk '{print $2}' "$TMPFILE")
#and download these one by one
for file in $FILES
do
- wget --quiet -N "$BASEDIR$file"
+ echo "Downloading $file"
+ wget --quiet -N "$HOST1$BASEDIR$file"
done
#check hashes
@@ -116,7 +168,7 @@ fi
if [ -n "$2" ]; then
echo "Clean up the binaries"
- clean_up $FILES $SIGNATUREFILENAME $TMPFILE
+ clean_up $FILES $SIGNATUREFILENAME $SIGNATUREFILENAME.2 $TMPFILE
else
echo "Keep the binaries in $WORKINGDIR"
clean_up $TMPFILE
diff --git a/contrib/windeploy/detached-sig-create.sh b/contrib/windeploy/detached-sig-create.sh
new file mode 100755
index 0000000000..bf4978d143
--- /dev/null
+++ b/contrib/windeploy/detached-sig-create.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Copyright (c) 2014-2015 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+if [ -z "$OSSLSIGNCODE" ]; then
+ OSSLSIGNCODE=osslsigncode
+fi
+
+if [ ! -n "$1" ]; then
+ echo "usage: $0 <osslcodesign args>"
+ echo "example: $0 -key codesign.key"
+ exit 1
+fi
+
+OUT=signature-win.tar.gz
+SRCDIR=unsigned
+WORKDIR=./.tmp
+OUTDIR="${WORKDIR}/out"
+OUTSUBDIR="${OUTDIR}/win"
+TIMESERVER=http://timestamp.comodoca.com
+CERTFILE="win-codesign.cert"
+
+mkdir -p "${OUTSUBDIR}"
+basename -a `ls -1 "${SRCDIR}"/*-unsigned.exe` | while read UNSIGNED; do
+ echo Signing "${UNSIGNED}"
+ "${OSSLSIGNCODE}" sign -certs "${CERTFILE}" -t "${TIMESERVER}" -in "${SRCDIR}/${UNSIGNED}" -out "${WORKDIR}/${UNSIGNED}" "$@"
+ "${OSSLSIGNCODE}" extract-signature -pem -in "${WORKDIR}/${UNSIGNED}" -out "${OUTSUBDIR}/${UNSIGNED}.pem" && rm "${WORKDIR}/${UNSIGNED}"
+done
+
+rm -f "${OUT}"
+tar -C "${OUTDIR}" -czf "${OUT}" .
+rm -rf "${WORKDIR}"
+echo "Created ${OUT}"
diff --git a/contrib/windeploy/win-codesign.cert b/contrib/windeploy/win-codesign.cert
new file mode 100644
index 0000000000..200b30a3f0
--- /dev/null
+++ b/contrib/windeploy/win-codesign.cert
@@ -0,0 +1,99 @@
+-----BEGIN CERTIFICATE-----
+MIIFTTCCBDWgAwIBAgIRALlW05RLwG2hMQMX5d/o5J8wDQYJKoZIhvcNAQELBQAw
+fTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAhBgNV
+BAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMB4XDTE2MDIwMzAwMDAwMFoX
+DTE5MDMwNTIzNTk1OVowgbUxCzAJBgNVBAYTAlVTMQ4wDAYDVQQRDAU5ODEwNDEL
+MAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAkMB1N0ZSAzMDAx
+FzAVBgNVBAkMDjcxIENvbHVtYmlhIFN0MSUwIwYDVQQKDBxUaGUgQml0Y29pbiBG
+b3VuZGF0aW9uLCBJbmMuMSUwIwYDVQQDDBxUaGUgQml0Y29pbiBGb3VuZGF0aW9u
+LCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw37Vrv9Gbku0
++kuV0t89TuyxtAcmT7QE4GcwESKKjmkxfzD9a0qlhqk8GfQ+fw4DHNN+nLKNv7xB
+bk6aS7J2v2DcXkOjrP99P9jqgTkp7MC04VtG3OqVRGB+gum0pptRovYZUQXIdkY7
+GJOok/NDagwKiiUe2V2meZ7UctsZNvYeilQdTgKIIhrMB9NowCOhT8ocVL4Ki55/
+l7hukJn3fueCM3fHTwY2/1gaGsOHoCkFRsD7vokjAVpiY+8rUgvHjb0gxgojiVGd
+6a6/F5XJwKJacvUyN4Hfc2K5lRMQjTTmo4aWNWIa0iJ3TK9BHpdSLJBqerMPvmnM
+kkapS+ZTNQIDAQABo4IBjTCCAYkwHwYDVR0jBBgwFoAUKZFg/4pN+uv5pmq4z/nm
+S71JzhIwHQYDVR0OBBYEFONpQ+cV82URVe+V8G57377KxxexMA4GA1UdDwEB/wQE
+AwIHgDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGCWCGSAGG
++EIBAQQEAwIEEDBGBgNVHSAEPzA9MDsGDCsGAQQBsjEBAgEDAjArMCkGCCsGAQUF
+BwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8ubmV0L0NQUzBDBgNVHR8EPDA6MDig
+NqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FDb2RlU2lnbmlu
+Z0NBLmNybDB0BggrBgEFBQcBAQRoMGYwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQu
+Y29tb2RvY2EuY29tL0NPTU9ET1JTQUNvZGVTaWduaW5nQ0EuY3J0MCQGCCsGAQUF
+BzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQELBQADggEB
+AGnBSi9K/9rgTAyKFKrfGWSfNOwAghmsnsvpZSQ7QyoGWBFKSgCs/70kErl18oHA
+g7Y8loQB1yukZmJaCa3OvGud7smn45TCh0TMf4EpP20Wxf4rMQTxwAatasHL3+vi
+I+Nl5bsRZ09kWjvayqLII5upjS/yq0JfpmyGl5k2C/fIpztq0iOLvqWlXcL4+51r
+cMUAfX6E6EaZQm//ikp+w2+7MEXTKguOuV3gwsrTy0DsvkZl4YDgx/FA4ImzXopv
+d+3KJPLvO+OSBqUD3JPwXHnuJqGAbLBFyyCa/feGUjLlR8cxcNWLWdp4qxtoIUPG
+3wTsC9YgrglS0F7FKMXlNRY=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIQLnyHzA6TSlL+lP0ct800rzANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTMwNTA5
+MDAwMDAwWhcNMjgwNTA4MjM1OTU5WjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25p
+bmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmmJBjd5E0f4rR
+3elnMRHrzB79MR2zuWJXP5O8W+OfHiQyESdrvFGRp8+eniWzX4GoGA8dHiAwDvth
+e4YJs+P9omidHCydv3Lj5HWg5TUjjsmK7hoMZMfYQqF7tVIDSzqwjiNLS2PgIpQ3
+e9V5kAoUGFEs5v7BEvAcP2FhCoyi3PbDMKrNKBh1SMF5WgjNu4xVjPfUdpA6M0ZQ
+c5hc9IVKaw+A3V7Wvf2pL8Al9fl4141fEMJEVTyQPDFGy3CuB6kK46/BAW+QGiPi
+XzjbxghdR7ODQfAuADcUuRKqeZJSzYcPe9hiKaR+ML0btYxytEjy4+gh+V5MYnmL
+Agaff9ULAgMBAAGjggFRMIIBTTAfBgNVHSMEGDAWgBS7r34CPfqm8TyEjq3uOJjs
+2TIy1DAdBgNVHQ4EFgQUKZFg/4pN+uv5pmq4z/nmS71JzhIwDgYDVR0PAQH/BAQD
+AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYD
+VR0gBAowCDAGBgRVHSAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuY29t
+b2RvY2EuY29tL0NPTU9ET1JTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHEG
+CCsGAQUFBwEBBGUwYzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5j
+b20vQ09NT0RPUlNBQWRkVHJ1c3RDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v
+Y3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAAj8COcPu+Mo7id4M
+bU2x8U6ST6/COCwEzMVjEasJY6+rotcCP8xvGcM91hoIlP8l2KmIpysQGuCbsQci
+GlEcOtTh6Qm/5iR0rx57FjFuI+9UUS1SAuJ1CAVM8bdR4VEAxof2bO4QRHZXavHf
+WGshqknUfDdOvf+2dVRAGDZXZxHNTwLk/vPa/HUX2+y392UJI0kfQ1eD6n4gd2HI
+TfK7ZU2o94VFB696aSdlkClAi997OlE5jKgfcHmtbUIgos8MbAOMTM1zB5TnWo46
+BLqioXwfy2M6FafUFRunUkcyqfS/ZEfRqh9TTjIwc8Jvt3iCnVz/RrtrIh2IC/gb
+qjSm/Iz13X9ljIwxVzHQNuxHoc/Li6jvHBhYxQZ3ykubUa9MCEp6j+KjUuKOjswm
+5LLY5TjCqO3GgZw1a6lYYUoKl7RLQrZVnb6Z53BtWfhtKgx/GWBfDJqIbDCsUgmQ
+Fhv/K53b0CDKieoofjKOGd97SDMe12X4rsn4gxSTdn1k0I7OvjV9/3IxTZ+evR5s
+L6iPDAZQ+4wns3bJ9ObXwzTijIchhmH+v1V04SF3AwpobLvkyanmz1kl63zsRQ55
+ZmjoIs2475iFTZYRPAmK0H+8KCgT+2rKVI2SXM3CZZgGns5IW9S1N5NGQXwH3c/6
+Q++6Z2H/fUnguzB9XIDj5hY5S6c=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
+hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
+BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
+EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
+6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
+pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
+9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
+/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
+Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
+qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
+SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
+u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
+Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
+crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
+/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
+wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
+4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
+2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
+FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
+CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
+boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
+jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
+S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
+QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
+0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
+NVOFBkpdn627G190
+-----END CERTIFICATE-----
diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py
index 5707188f23..ea398a27ea 100755
--- a/contrib/zmq/zmq_sub.py
+++ b/contrib/zmq/zmq_sub.py
@@ -1,43 +1,84 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
# Copyright (c) 2014-2016 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""
+ ZMQ example using python3's asyncio
+
+ Bitcoin should be started with the command line arguments:
+ bitcoind -testnet -daemon \
+ -zmqpubhashblock=tcp://127.0.0.1:28332 \
+ -zmqpubrawtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashblock=tcp://127.0.0.1:28332
+
+ We use the asyncio library here. `self.handle()` installs itself as a
+ future at the end of the function. Since it never returns with the event
+ loop having an empty stack of futures, this creates an infinite loop. An
+ alternative is to wrap the contents of `handle` inside `while True`.
+
+ A blocking example using python 2.7 can be obtained from the git history:
+ https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
+
import binascii
+import asyncio
import zmq
+import zmq.asyncio
+import signal
import struct
+import sys
+
+if not (sys.version_info.major >= 3 and sys.version_info.minor >= 5):
+ print("This example only works with Python 3.5 and greater")
+ exit(1)
port = 28332
-zmqContext = zmq.Context()
-zmqSubSocket = zmqContext.socket(zmq.SUB)
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashblock")
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashtx")
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawblock")
-zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawtx")
-zmqSubSocket.connect("tcp://127.0.0.1:%i" % port)
-
-try:
- while True:
- msg = zmqSubSocket.recv_multipart()
- topic = str(msg[0])
+class ZMQHandler():
+ def __init__(self):
+ self.loop = zmq.asyncio.install()
+ self.zmqContext = zmq.asyncio.Context()
+
+ self.zmqSubSocket = self.zmqContext.socket(zmq.SUB)
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx")
+ self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port)
+
+ async def handle(self) :
+ msg = await self.zmqSubSocket.recv_multipart()
+ topic = msg[0]
body = msg[1]
sequence = "Unknown"
if len(msg[-1]) == 4:
msgSequence = struct.unpack('<I', msg[-1])[-1]
sequence = str(msgSequence)
- if topic == "hashblock":
- print '- HASH BLOCK ('+sequence+') -'
- print binascii.hexlify(body)
- elif topic == "hashtx":
- print '- HASH TX ('+sequence+') -'
- print binascii.hexlify(body)
- elif topic == "rawblock":
- print '- RAW BLOCK HEADER ('+sequence+') -'
- print binascii.hexlify(body[:80])
- elif topic == "rawtx":
- print '- RAW TX ('+sequence+') -'
- print binascii.hexlify(body)
-
-except KeyboardInterrupt:
- zmqContext.destroy()
+ if topic == b"hashblock":
+ print('- HASH BLOCK ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"hashtx":
+ print('- HASH TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"rawblock":
+ print('- RAW BLOCK HEADER ('+sequence+') -')
+ print(binascii.hexlify(body[:80]))
+ elif topic == b"rawtx":
+ print('- RAW TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ # schedule ourselves to receive the next message
+ asyncio.ensure_future(self.handle())
+
+ def start(self):
+ self.loop.add_signal_handler(signal.SIGINT, self.stop)
+ self.loop.create_task(self.handle())
+ self.loop.run_forever()
+
+ def stop(self):
+ self.loop.stop()
+ self.zmqContext.destroy()
+
+daemon = ZMQHandler()
+daemon.start()
diff --git a/contrib/zmq/zmq_sub3.4.py b/contrib/zmq/zmq_sub3.4.py
new file mode 100755
index 0000000000..1cb7eec0c0
--- /dev/null
+++ b/contrib/zmq/zmq_sub3.4.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+# Copyright (c) 2014-2016 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+"""
+ ZMQ example using python3's asyncio
+
+ Bitcoin should be started with the command line arguments:
+ bitcoind -testnet -daemon \
+ -zmqpubhashblock=tcp://127.0.0.1:28332 \
+ -zmqpubrawtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashtx=tcp://127.0.0.1:28332 \
+ -zmqpubhashblock=tcp://127.0.0.1:28332
+
+ We use the asyncio library here. `self.handle()` installs itself as a
+ future at the end of the function. Since it never returns with the event
+ loop having an empty stack of futures, this creates an infinite loop. An
+ alternative is to wrap the contents of `handle` inside `while True`.
+
+ The `@asyncio.coroutine` decorator and the `yield from` syntax found here
+ was introduced in python 3.4 and has been deprecated in favor of the `async`
+ and `await` keywords respectively.
+
+ A blocking example using python 2.7 can be obtained from the git history:
+ https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py
+"""
+
+import binascii
+import asyncio
+import zmq
+import zmq.asyncio
+import signal
+import struct
+import sys
+
+if not (sys.version_info.major >= 3 and sys.version_info.minor >= 4):
+ print("This example only works with Python 3.4 and greater")
+ exit(1)
+
+port = 28332
+
+class ZMQHandler():
+ def __init__(self):
+ self.loop = zmq.asyncio.install()
+ self.zmqContext = zmq.asyncio.Context()
+
+ self.zmqSubSocket = self.zmqContext.socket(zmq.SUB)
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock")
+ self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx")
+ self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port)
+
+ @asyncio.coroutine
+ def handle(self) :
+ msg = yield from self.zmqSubSocket.recv_multipart()
+ topic = msg[0]
+ body = msg[1]
+ sequence = "Unknown"
+ if len(msg[-1]) == 4:
+ msgSequence = struct.unpack('<I', msg[-1])[-1]
+ sequence = str(msgSequence)
+ if topic == b"hashblock":
+ print('- HASH BLOCK ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"hashtx":
+ print('- HASH TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ elif topic == b"rawblock":
+ print('- RAW BLOCK HEADER ('+sequence+') -')
+ print(binascii.hexlify(body[:80]))
+ elif topic == b"rawtx":
+ print('- RAW TX ('+sequence+') -')
+ print(binascii.hexlify(body))
+ # schedule ourselves to receive the next message
+ asyncio.ensure_future(self.handle())
+
+ def start(self):
+ self.loop.add_signal_handler(signal.SIGINT, self.stop)
+ self.loop.create_task(self.handle())
+ self.loop.run_forever()
+
+ def stop(self):
+ self.loop.stop()
+ self.zmqContext.destroy()
+
+daemon = ZMQHandler()
+daemon.start()